diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/Page/ListPager.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/src/Page/ListPager.php | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/Page/ListPager.php b/www/wiki/extensions/SemanticMediaWiki/src/Page/ListPager.php new file mode 100644 index 00000000..b900a8db --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/src/Page/ListPager.php @@ -0,0 +1,195 @@ +<?php + +namespace SMW\Page; + +use Html; +use SMW\Localizer; +use SMW\Message; +use Title; + +/** + * @license GNU GPL v2+ + * @since 3.0 + * + * @author mwjames + */ +class ListPager { + + /** + * @var string + */ + public static $language = ''; + + /** + * @since 2.4 + */ + public static function pagination( Title $title, $limit, $offset = 0, $count = 0, array $query = [], $prefix = '' ) { + return Html::rawElement( + 'div', + [ + 'class' => 'smw-ui-pagination' + ], + self::getPagingLinks( $title, $limit, $offset, $count, $query, $prefix ) + ); + } + + /** + * @since 3.0 + * + * @param Title $title + * @param integer $limit + * @param integer $offset + * + * @return string + */ + public static function filter( Title $title, $limit = 0, $offset = 0, $filter = '' ) { + + $form = \Xml::tags( + 'form', + [ + 'id' => 'search', + 'name' => 'foo', + 'action' => $GLOBALS['wgScript'] + ], + Html::hidden( + 'title', + strtok( $title->getPrefixedText(), '/' ) + ) . Html::hidden( + 'limit', + $limit + ) . Html::hidden( + 'offset', + $offset + ) + ); + + $label = Message::get( 'smw-filter', Message::TEXT, Message::USER_LANGUAGE ); + + $form .= Html::rawElement( + 'label', + [], + $label . + Html::rawElement( + 'input', + [ + 'type' => 'search', + 'name' => 'filter', + 'value' => $filter, + 'form' => 'search', + 'autocomplete' => 'off', + 'placeholder' => '...' + ] + ) + ); + + return Html::rawElement( + 'div', + [ + 'class' => 'smw-ui-input-filter' + ], + $form + ); + } + + /** + * Generate (prev x| next x) (20|50|100...) type links for paging + * + * @param Title $title Title object to link + * @param int $offset + * @param int $limit + * @param integer $count + * @param array $query Optional URL query parameter string + * @return string + */ + public static function getPagingLinks( Title $title, $limit, $offset, $count = 0, array $query = [], $prefix = '' ) { + + $list = []; + $limit = (int)$limit; + $offset = (int)$offset; + $count = (int)$count; + + $atend = $count < $limit; + $disabled = $count > 0 ? '' : ' disabled'; + + if ( self::$language === '' ) { + $language = Localizer::getInstance()->getUserLanguage(); + } else { + $language = Localizer::getInstance()->getLanguage( self::$language ); + } + + if ( $prefix !== '' ) { + $prefix = Html::rawElement( 'a', [ 'class' => 'page-link link-disabled' ], $prefix ); + } + + # Make 'previous' link + $prev = wfMessage( 'prevn' )->inLanguage( $language )->title( $title )->numParams( $limit )->text(); + + if ( $offset > 0 ) { + $plink = self::numLink( $title, max( $offset - $limit, 0 ), $limit, $query, $prev, 'prevn-title', 'mw-prevlink', $disabled, $language ); + } else { + $plink = Html::element( 'a', [ 'class' => 'page-link link-disabled' ], htmlspecialchars( $prev ) ); + } + + # Make 'next' link + $next = wfMessage( 'nextn' )->inLanguage( $language )->title( $title )->numParams( $limit )->text(); + + if ( $atend ) { + $nlink = Html::element( 'a', [ 'class' => 'page-link link-disabled' ], htmlspecialchars( $next ) ); + } else { + $nlink = self::numLink( $title, $offset + $limit, $limit, $query, $next, 'nextn-title', 'mw-nextlink', $disabled, $language ); + } + + # Make links to set number of items per page + + foreach ( [ 20, 50, 100, 250, 500 ] as $num ) { + $list[] = self::numLink( + $title, + $offset, + $num, + $query, + $language->formatNum( $num ), + 'shown-title', + 'mw-numlink', + $disabled, + $language, + $num === $limit + ); + } + + return $prefix . $plink . implode( '', $list ) . $nlink; + } + + /** + * Helper function for viewPrevNext() that generates links + * + * @param Title $title Title object to link + * @param int $offset + * @param int $limit + * @param array $query Extra query parameters + * @param string $link Text to use for the link; will be escaped + * @param string $tooltipMsg Name of the message to use as tooltip + * @param string $class Value of the "class" attribute of the link + * @return string HTML fragment + */ + private static function numLink( Title $title, $offset, $limit, array $query, $link, $tooltipMsg, $class, $disabled, $language, $active = false ) { + $query = [ 'limit' => $limit, 'offset' => $offset ] + $query; + + $tooltip = wfMessage( $tooltipMsg )->inLanguage( $language )->title( $title )->numParams( $limit )->text(); + $target = ''; + + if ( isset( $query['_target' ] ) ) { + $target = $query['_target' ]; + unset( $query['_target' ] ); + } + + return Html::element( 'a', + [ + 'href' => $title->getLocalURL( $query ) . $target, + 'title' => $tooltip, + 'class' => 'page-link' . ( $active ? ' link-active' : '' ) + ], + $link + ); + } + +} |