Version 4.5.0
This commit is contained in:
1 parent
1a0c7fd3c2
commit
f79dcf067a
3791 files changed
+248032
-76372
No files matched your search
@@ -11,7 +11,7 @@
|
||||
namespace IPS\Helpers\Table;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
@@ -29,6 +29,8 @@ const HEADER = 8;
|
||||
const SEARCH_RADIO = 9;
|
||||
const SEARCH_NUMERIC_TEXT = 10;
|
||||
const SEARCH_QUERY_TEXT = 11;
|
||||
const SEARCH_CHECKBOX = 12;
|
||||
|
||||
/**
|
||||
* List Table Builder
|
||||
*/
|
||||
@@ -198,7 +200,7 @@ abstract class _Table
|
||||
{
|
||||
return array( ... ); // Same format as IPS\Helpers\Table::$rootButtons
|
||||
}
|
||||
* @code
|
||||
* @endcode
|
||||
*/
|
||||
public $rowButtons = NULL;
|
||||
|
||||
@@ -255,7 +257,8 @@ abstract class _Table
|
||||
|
||||
if ( \IPS\Request::i()->$parameter )
|
||||
{
|
||||
$this->page = intval( \IPS\Request::i()->$parameter );
|
||||
$this->page = \intval( \IPS\Request::i()->$parameter );
|
||||
|
||||
if ( !$this->page OR $this->page < 1 )
|
||||
{
|
||||
$this->page = 1;
|
||||
@@ -279,7 +282,7 @@ abstract class _Table
|
||||
}
|
||||
|
||||
/* Set base URL */
|
||||
$this->baseUrl = $baseUrl->setQueryString( array( 'filter' => $this->filter, 'sortby' => $this->sortBy, 'sortdirection' => $this->sortDirection, $this->paginationKey => $this->page ) );
|
||||
$this->baseUrl = $baseUrl->setQueryString( array( 'filter' => $this->filter, 'sortby' => $this->sortBy, 'sortdirection' => $this->sortDirection ) )->setPage( $this->paginationKey, $this->page );
|
||||
|
||||
/* Templates */
|
||||
$this->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'tables', 'core' ), 'table' );
|
||||
@@ -315,7 +318,7 @@ abstract class _Table
|
||||
|
||||
if ( \IPS\Request::i()->$value )
|
||||
{
|
||||
$this->page = intval( \IPS\Request::i()->$value );
|
||||
$this->page = \intval( \IPS\Request::i()->$value );
|
||||
if ( !$this->page OR $this->page < 1 )
|
||||
{
|
||||
$this->page = 1;
|
||||
@@ -331,9 +334,7 @@ abstract class _Table
|
||||
* For example, we might allow array( 'last_post', 'author' ) but the $this->sortBy property is often set as "app_table.last_post" meaning
|
||||
* that the filter drop down doesn't show the selected value correctly.
|
||||
*
|
||||
* @param string $property Property we are updating
|
||||
* @param mixed $value Value being set
|
||||
* @return void
|
||||
* @return string
|
||||
*/
|
||||
public function getSortByColumn()
|
||||
{
|
||||
@@ -363,7 +364,7 @@ abstract class _Table
|
||||
foreach ( $this->advancedSearch as $k => $type )
|
||||
{
|
||||
$options = array();
|
||||
if ( is_array( $type ) )
|
||||
if ( \is_array( $type ) )
|
||||
{
|
||||
$options = $type[1];
|
||||
$type = $type[0];
|
||||
@@ -383,13 +384,13 @@ abstract class _Table
|
||||
$form->add( new \IPS\Helpers\Form\Custom( $this->langPrefix . $k, NULL, FALSE, array(
|
||||
'getHtml' => function( $element )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate( 'forms', 'core' )->select( "{$element->name}[0]", $element->value[0], $element->required, array(
|
||||
return \IPS\Theme::i()->getTemplate( 'forms', 'core' )->select( "{$element->name}[0]", ( \is_array( $element->value ) AND isset( $element->value[0] ) ) ? $element->value[0] : NULL, $element->required, array(
|
||||
'c' => \IPS\Member::loggedIn()->language()->addToStack('contains'),
|
||||
'bw' => \IPS\Member::loggedIn()->language()->addToStack('begins_with'),
|
||||
'eq' => \IPS\Member::loggedIn()->language()->addToStack('exactly'),
|
||||
) )
|
||||
. ' '
|
||||
. \IPS\Theme::i()->getTemplate( 'forms', 'core', 'global' )->text( "{$element->name}[1]", 'text', $element->value[1], $element->required, NULL, FALSE, NULL, NULL, NULL, '', NULL, FALSE, NULL, array(), array(), array( $element->name . '-qty' ) );
|
||||
. \IPS\Theme::i()->getTemplate( 'forms', 'core', 'global' )->text( "{$element->name}[1]", 'text', ( \is_array( $element->value ) AND isset( $element->value[1] ) ) ? $element->value[1] : NULL, $element->required, NULL, FALSE, NULL, NULL, NULL, '', NULL, FALSE, NULL, array(), array(), array( $element->name . '-qty' ) );
|
||||
}
|
||||
) ) );
|
||||
break;
|
||||
@@ -419,7 +420,7 @@ abstract class _Table
|
||||
$form->add( new \IPS\Helpers\Form\Custom( $this->langPrefix . $k, NULL, FALSE, array(
|
||||
'getHtml' => function( $element )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate( 'forms', 'core' )->select( "{$element->name}[0]", $element->value[0], $element->required, array(
|
||||
return \IPS\Theme::i()->getTemplate( 'forms', 'core' )->select( "{$element->name}[0]", ( \is_array( $element->value ) AND isset( $element->value[0] ) ) ? $element->value[0] : NULL, $element->required, array(
|
||||
'any' => \IPS\Member::loggedIn()->language()->addToStack('any'),
|
||||
'gt' => \IPS\Member::loggedIn()->language()->addToStack('gt'),
|
||||
'lt' => \IPS\Member::loggedIn()->language()->addToStack('lt'),
|
||||
@@ -435,11 +436,14 @@ abstract class _Table
|
||||
'eq' => array( $element->name . '-qty' ),
|
||||
) )
|
||||
. ' '
|
||||
. \IPS\Theme::i()->getTemplate( 'forms', 'core', 'global' )->number( "{$element->name}[1]", $element->value[1], $element->required, NULL, FALSE, NULL, NULL, NULL, 0, NULL, FALSE, NULL, array(), array(), array( $element->name . '-qty' ) );
|
||||
. \IPS\Theme::i()->getTemplate( 'forms', 'core', 'global' )->number( "{$element->name}[1]", ( \is_array( $element->value ) AND isset( $element->value[1] ) ) ? $element->value[1] : NULL, $element->required, NULL, FALSE, NULL, NULL, NULL, 0, NULL, FALSE, NULL, array(), array(), array( $element->name . '-qty' ) );
|
||||
}
|
||||
) ) );
|
||||
break;
|
||||
|
||||
|
||||
case SEARCH_CHECKBOX:
|
||||
$form->add( new \IPS\Helpers\Form\Checkbox( $this->langPrefix . $k, NULL, FALSE, $options ) );
|
||||
break;
|
||||
case SEARCH_BOOL:
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( $this->langPrefix . $k, TRUE, FALSE, $options ) );
|
||||
break;
|
||||
@@ -448,7 +452,7 @@ abstract class _Table
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
@@ -482,36 +486,46 @@ abstract class _Table
|
||||
}
|
||||
|
||||
/* Get rows */
|
||||
$rows = $this->getRows( $advancedSearchValues );
|
||||
$rows = $this->getRows( $advancedSearchValues ) ?? array();
|
||||
|
||||
/* Check we're on a valid page (must come after getRows() as this is where $this->pages is set) */
|
||||
if ( $this->page )
|
||||
{
|
||||
if ( $this->pages and $this->page > $this->pages )
|
||||
{
|
||||
\IPS\Output::i()->redirect( $this->baseUrl->setQueryString( $this->paginationKey, 1 ), NULL, 303 );
|
||||
\IPS\Output::i()->redirect( $this->baseUrl->setPage( $this->paginationKey, 1 ), NULL, 303 );
|
||||
}
|
||||
}
|
||||
|
||||
/* Add link tags */
|
||||
if ( $this->page != 1 )
|
||||
{
|
||||
\IPS\Output::i()->linkTags['canonical'] = (string) $this->baseUrl->setQueryString( $this->paginationKey, $this->page );
|
||||
\IPS\Output::i()->linkTags['first'] = (string) $this->baseUrl->setQueryString( $this->paginationKey, 1 );
|
||||
\IPS\Output::i()->linkTags['prev'] = (string) $this->baseUrl->setQueryString( $this->paginationKey, $this->page - 1 );
|
||||
if( !isset( \IPS\Output::i()->linkTags['canonical'] ) )
|
||||
{
|
||||
\IPS\Output::i()->linkTags['canonical'] = (string) $this->baseUrl->setPage( $this->paginationKey, $this->page );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->linkTags['first'] = (string) $this->baseUrl->setPage( $this->paginationKey, 1 );
|
||||
\IPS\Output::i()->linkTags['prev'] = (string) $this->baseUrl->setPage( $this->paginationKey, $this->page - 1 );
|
||||
}
|
||||
/* If we literally requested ?page=1 add canonical tag to get rid of the page query string param */
|
||||
elseif( isset( $this->baseUrl->data[ \IPS\Http\Url::COMPONENT_QUERY ][ $this->paginationKey ] ) )
|
||||
{
|
||||
\IPS\Output::i()->linkTags['canonical'] = (string) $this->baseUrl->stripQueryString( $this->paginationKey );
|
||||
\IPS\Output::i()->linkTags['canonical'] = (string) $this->baseUrl->setPage();
|
||||
}
|
||||
if ( $this->pages > $this->page )
|
||||
{
|
||||
\IPS\Output::i()->linkTags['next'] = (string) $this->baseUrl->setQueryString( $this->paginationKey, $this->page + 1 );
|
||||
\IPS\Output::i()->linkTags['next'] = (string) $this->baseUrl->setPage( $this->paginationKey, $this->page + 1 );
|
||||
}
|
||||
if ( $this->pages != $this->page )
|
||||
{
|
||||
\IPS\Output::i()->linkTags['last'] = (string) $this->baseUrl->setQueryString( $this->paginationKey, $this->pages );
|
||||
\IPS\Output::i()->linkTags['last'] = (string) $this->baseUrl->setPage( $this->paginationKey, $this->pages );
|
||||
}
|
||||
|
||||
/* No rows to show? Add a noindex but follow for crawling later to check if content exists */
|
||||
if ( ! \count( $rows ) )
|
||||
{
|
||||
\IPS\Output::i()->metaTags['robots'] = 'noindex, follow';
|
||||
}
|
||||
|
||||
/* Get table headers */
|
||||
@@ -521,9 +535,10 @@ abstract class _Table
|
||||
$resortKey = $this->resortKey;
|
||||
if( \IPS\Request::i()->isAjax() and \IPS\Request::i()->$resortKey )
|
||||
{
|
||||
if ( count( $rows ) )
|
||||
if ( \count( $rows ) )
|
||||
{
|
||||
$rowHtml = call_user_func( $this->rowsTemplate, $this, $headers, $rows, $this->mainColumn, $this->rootButtons, array() );
|
||||
$rowsTemplate = $this->rowsTemplate;
|
||||
$rowHtml = $rowsTemplate( $this, $headers, $rows, $this->mainColumn, $this->rootButtons, array() );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -545,7 +560,8 @@ abstract class _Table
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'global_core.js', 'core', 'global' ) );
|
||||
|
||||
/* Build table */
|
||||
return call_user_func( $this->tableTemplate, $this, $headers, $rows, ( is_array( $this->quickSearch ) ? $this->quickSearch[1] : $this->quickSearch ), !empty( $this->advancedSearch ) );
|
||||
$tableTemplate = $this->tableTemplate;
|
||||
return $tableTemplate( $this, $headers, $rows, ( \is_array( $this->quickSearch ) ? $this->quickSearch[1] : $this->quickSearch ), !empty( $this->advancedSearch ) );
|
||||
}
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
@@ -569,7 +585,7 @@ abstract class _Table
|
||||
$return = array();
|
||||
foreach( $values as $k => $v )
|
||||
{
|
||||
if ( is_array( $v ) )
|
||||
if ( \is_array( $v ) )
|
||||
{
|
||||
$return[ $k ] = $this->_convertSearchValuesForQueryString( $v );
|
||||
}
|
||||
@@ -690,6 +706,15 @@ abstract class _Table
|
||||
$advancedSearchValues = array();
|
||||
$advancedSearchValuesQuery = array();
|
||||
|
||||
/* Store these to prevent URL from being rebuilt on subsequent calls */
|
||||
$storeSearchValues = FALSE;
|
||||
|
||||
if ( $this->advancedSearchValues === NULL )
|
||||
{
|
||||
$storeSearchValues = TRUE;
|
||||
$this->advancedSearchValues = array();
|
||||
}
|
||||
|
||||
if ( !empty( $this->advancedSearch ) )
|
||||
{
|
||||
/* Are we displaying the advanced search form? */
|
||||
@@ -703,9 +728,8 @@ abstract class _Table
|
||||
$form = $this->advancedSearch();
|
||||
|
||||
/* Store these to prevent URL from being rebuilt on subsequent calls */
|
||||
if ( $this->advancedSearchValues === NULL )
|
||||
if ( $storeSearchValues === TRUE )
|
||||
{
|
||||
$this->advancedSearchValues = array();
|
||||
foreach ( $values as $k => $v )
|
||||
{
|
||||
if( array_key_exists( $k, $form->hiddenValues ) )
|
||||
|
||||
Reference in new issue
Block a user