X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FPager.php;h=438a99ae8458a3bb5b0e84f6fa8ba19ecf01bc95;hb=d7f7a6234b36a3ab64df46ff46319f22d9f9ff1a;hp=41e950116db70bd3f10a3675972a9ef5eb82d3b8;hpb=54dd841a6f32ca1eb8f580294fb57b557d1db72d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Pager.php b/includes/Pager.php index 41e950116d..438a99ae84 100644 --- a/includes/Pager.php +++ b/includes/Pager.php @@ -1,11 +1,30 @@ mIndexField ), $this->mExtraSortFields ); if ( $descending ) { - $options['ORDER BY'] = implode( ',', $sortColumns ); + $options['ORDER BY'] = $sortColumns; $operator = '>'; } else { $orderBy = array(); foreach ( $sortColumns as $col ) { $orderBy[] = $col . ' DESC'; } - $options['ORDER BY'] = implode( ',', $orderBy ); + $options['ORDER BY'] = $orderBy; $operator = '<'; } if ( $offset != '' ) { @@ -366,9 +385,10 @@ abstract class IndexPager extends ContextSource implements Pager { * @param $text String: text displayed on the link * @param $query Array: associative array of paramter to be in the query string * @param $type String: value of the "rel" attribute + * * @return String: HTML fragment */ - function makeLink($text, $query = null, $type=null) { + function makeLink( $text, array $query = null, $type = null ) { if ( $query === null ) { return $text; } @@ -382,6 +402,7 @@ abstract class IndexPager extends ContextSource implements Pager { if( $type ) { $attrs['class'] = "mw-{$type}link"; } + return Linker::linkKnown( $this->getTitle(), $text, @@ -433,7 +454,7 @@ abstract class IndexPager extends ContextSource implements Pager { * By default, all parameters passed in the URL are used, except for a * short blacklist. * - * @return Associative array + * @return array Associative array */ function getDefaultQuery() { if ( !isset( $this->mDefaultQuery ) ) { @@ -472,7 +493,7 @@ abstract class IndexPager extends ContextSource implements Pager { } # Don't announce the limit everywhere if it's the default - $urlLimit = $this->mLimit == $this->mDefaultLimit ? '' : $this->mLimit; + $urlLimit = $this->mLimit == $this->mDefaultLimit ? null : $this->mLimit; if ( $this->mIsFirst ) { $prev = false; @@ -526,6 +547,7 @@ abstract class IndexPager extends ContextSource implements Pager { function getPagingLinks( $linkTexts, $disabledTexts = array() ) { $queries = $this->getPagingQueries(); $links = array(); + foreach ( $queries as $type => $query ) { if ( $query !== false ) { $links[$type] = $this->makeLink( @@ -539,6 +561,7 @@ abstract class IndexPager extends ContextSource implements Pager { $links[$type] = $linkTexts[$type]; } } + return $links; } @@ -559,48 +582,6 @@ abstract class IndexPager extends ContextSource implements Pager { return $links; } - /** - * Assembles an HTMLForm for the Pager and returns the HTML - * - * @return string - */ - public function buildHTMLForm() { - if ( $this->getHTMLFormFields() === null ) { - throw new MWException( __METHOD__ . " was called without any form fields being defined" ); - } - - $form = new HTMLForm( $this->getHTMLFormFields(), $this->getContext() ); - $form->setMethod( 'get' ); - $form->setWrapperLegendMsg( $this->getHTMLFormLegend() ); - $form->setSubmitTextMsg( $this->getHTMLFormSubmit() ); - $this->addHiddenFields( $form ); - $this->modifyHTMLForm( $form ); - $form->prepareForm(); - - return $form->getHTML( '' ); - } - - /** - * Adds hidden elements to forms for things that are in the query string. - * This is so that parameters like offset stick through form submissions - * - * @param HTMLForm $form - */ - protected function addHiddenFields( HTMLForm $form ) { - $query = $this->getRequest()->getQueryValues(); - $fieldsBlacklist = array( 'title' ); - $fields = $form->getFlatFields(); - foreach ( $fields as $name => $field ) { - $fieldsBlacklist[] = $field->getName(); - } - foreach ( $query as $name => $value ) { - if ( in_array( $name, $fieldsBlacklist ) ) { - continue; - } - $form->addHiddenField( $name, $value ); - } - } - /** * Abstract formatting function. This should return an HTML string * representing the result row $row. Rows will be concatenated and @@ -677,43 +658,6 @@ abstract class IndexPager extends ContextSource implements Pager { * @return Boolean */ protected function getDefaultDirections() { return false; } - - /** - * Returns an array for HTMLForm fields for the pager - * - * Only used if the pager makes use of HTMLForms - * - * @return array|null - */ - protected function getHTMLFormFields() { return null; } - - /** - * Message name for the fieldset legend text - * - * Only used if the pager makes use of HTMLForms - * - * @return string - */ - protected function getHTMLFormLegend() { return ''; } - - /** - * Message name for the submit button text - * - * Only used if the pager makes use of HTMLForms - * - * @return string - */ - protected function getHTMLFormSubmit() { return ''; } - - /** - * If the pager needs to do any modifications to the Form, override this - * function. - * - * Only used if the pager makes use of HTMLForms - * - * @param HTMLForm $form - */ - protected function modifyHTMLForm( HTMLForm $form ) {} } @@ -730,7 +674,9 @@ abstract class AlphabeticPager extends IndexPager { * @return String HTML */ function getNavigationBar() { - if ( !$this->isNavigationBarShown() ) return ''; + if ( !$this->isNavigationBarShown() ) { + return ''; + } if( isset( $this->mNavigationBar ) ) { return $this->mNavigationBar; @@ -758,13 +704,13 @@ abstract class AlphabeticPager extends IndexPager { $limitLinks = $this->getLimitLinks(); $limits = $lang->pipeList( $limitLinks ); - $this->mNavigationBar = - "(" . $lang->pipeList( + $this->mNavigationBar = wfMessage( 'parentheses' )->rawParams( + $lang->pipeList( array( $pagingLinks['first'], - $pagingLinks['last'] ) - ) . ") " . + $pagingLinks['last'] ) + ) )->escaped() . " " . wfMsgHtml( 'viewprevnext', $pagingLinks['prev'], - $pagingLinks['next'], $limits ); + $pagingLinks['next'], $limits ); if( !is_array( $this->getIndexField() ) ) { # Early return to avoid undue nesting @@ -792,7 +738,8 @@ abstract class AlphabeticPager extends IndexPager { } if( $extra !== '' ) { - $this->mNavigationBar .= " ($extra)"; + $extra = ' ' . wfMessage( 'parentheses' )->rawParams( $extra )->escaped(); + $this->mNavigationBar .= $extra; } return $this->mNavigationBar; @@ -848,24 +795,28 @@ abstract class ReverseChronologicalPager extends IndexPager { $pagingLinks = $this->getPagingLinks( $linkTexts ); $limitLinks = $this->getLimitLinks(); $limits = $this->getLanguage()->pipeList( $limitLinks ); - - $this->mNavigationBar = "({$pagingLinks['first']}" . + $firstLastLinks = wfMessage( 'parentheses' )->rawParams( "{$pagingLinks['first']}" . wfMsgExt( 'pipe-separator' , 'escapenoentities' ) . - "{$pagingLinks['last']}) " . + "{$pagingLinks['last']}" )->escaped(); + + $this->mNavigationBar = $firstLastLinks . ' ' . wfMsgHTML( 'viewprevnext', $pagingLinks['prev'], $pagingLinks['next'], $limits ); + return $this->mNavigationBar; } function getDateCond( $year, $month ) { - $year = intval($year); - $month = intval($month); + $year = intval( $year ); + $month = intval( $month ); + // Basic validity checks $this->mYear = $year > 0 ? $year : false; - $this->mMonth = ($month > 0 && $month < 13) ? $month : false; + $this->mMonth = ( $month > 0 && $month < 13 ) ? $month : false; + // Given an optional year and month, we need to generate a timestamp // to use as "WHERE rev_timestamp <= result" // Examples: year = 2006 equals < 20070101 (+000000) @@ -874,6 +825,7 @@ abstract class ReverseChronologicalPager extends IndexPager { if ( !$this->mYear && !$this->mMonth ) { return; } + if ( $this->mYear ) { $year = $this->mYear; } else { @@ -884,6 +836,7 @@ abstract class ReverseChronologicalPager extends IndexPager { $year--; } } + if ( $this->mMonth ) { $month = $this->mMonth + 1; // For December, we want January 1 of the next year @@ -896,14 +849,18 @@ abstract class ReverseChronologicalPager extends IndexPager { $month = 1; $year++; } + // Y2K38 bug if ( $year > 2032 ) { $year = 2032; } + $ymd = (int)sprintf( "%04d%02d01", $year, $month ); + if ( $ymd > 20320101 ) { $ymd = 20320101; } + $this->mOffset = $this->mDb->timestamp( "${ymd}000000" ); } } @@ -916,7 +873,7 @@ abstract class TablePager extends IndexPager { var $mSort; var $mCurrentRow; - function __construct( IContextSource $context = null ) { + public function __construct( IContextSource $context = null ) { if ( $context ) { $this->setContext( $context ); } @@ -934,6 +891,10 @@ abstract class TablePager extends IndexPager { parent::__construct(); } + /** + * @protected + * @return string + */ function getStartBody() { global $wgStylePath; $tableClass = htmlspecialchars( $this->getTableClass() ); @@ -967,7 +928,7 @@ abstract class TablePager extends IndexPager { $image = htmlspecialchars( "$wgStylePath/common/images/$image" ); $link = $this->makeLink( "\"$alt\"" . - htmlspecialchars( $name ), $query ); + htmlspecialchars( $name ), $query ); $s .= "$link\n"; } else { $s .= '' . $this->makeLink( htmlspecialchars( $name ), $query ) . "\n"; @@ -980,10 +941,18 @@ abstract class TablePager extends IndexPager { return $s; } + /** + * @protected + * @return string + */ function getEndBody() { return "\n"; } + /** + * @protected + * @return string + */ function getEmptyBody() { $colspan = count( $this->getFieldNames() ); $msgEmpty = wfMsgHtml( 'table_pager_empty' ); @@ -991,28 +960,36 @@ abstract class TablePager extends IndexPager { } /** - * @param $row Array + * @protected + * @param stdClass $row * @return String HTML */ function formatRow( $row ) { - $this->mCurrentRow = $row; # In case formatValue etc need to know + $this->mCurrentRow = $row; // In case formatValue etc need to know $s = Xml::openElement( 'tr', $this->getRowAttrs( $row ) ); $fieldNames = $this->getFieldNames(); + foreach ( $fieldNames as $field => $name ) { $value = isset( $row->$field ) ? $row->$field : null; $formatted = strval( $this->formatValue( $field, $value ) ); + if ( $formatted == '' ) { $formatted = ' '; } + $s .= Xml::tags( 'td', $this->getCellAttrs( $field, $value ), $formatted ); } + $s .= "\n"; + return $s; } /** * Get a class name to be applied to the given row. * + * @protected + * * @param $row Object: the database result row * @return String */ @@ -1023,6 +1000,8 @@ abstract class TablePager extends IndexPager { /** * Get attributes to be applied to the given row. * + * @protected + * * @param $row Object: the database result row * @return Array of => */ @@ -1041,6 +1020,8 @@ abstract class TablePager extends IndexPager { * take this as an excuse to hardcode styles; use classes and * CSS instead. Row context is available in $this->mCurrentRow * + * @protected + * * @param $field String The column * @param $value String The cell contents * @return Array of attr => value @@ -1049,18 +1030,34 @@ abstract class TablePager extends IndexPager { return array( 'class' => 'TablePager_col_' . $field ); } + /** + * @protected + * @return string + */ function getIndexField() { return $this->mSort; } + /** + * @protected + * @return string + */ function getTableClass() { return 'TablePager'; } + /** + * @protected + * @return string + */ function getNavClass() { return 'TablePager_nav'; } + /** + * @protected + * @return string + */ function getSortHeaderClass() { return 'TablePager_sort'; } @@ -1069,7 +1066,7 @@ abstract class TablePager extends IndexPager { * A navigation bar with images * @return String HTML */ - function getNavigationBar() { + public function getNavigationBar() { global $wgStylePath; if ( !$this->isNavigationBarShown() ) { @@ -1125,7 +1122,7 @@ abstract class TablePager extends IndexPager { * * @return String: HTML fragment */ - function getLimitSelect() { + public function getLimitSelect() { # Add the current limit from the query string # to avoid that the limit is lost after clicking Go next time if ( !in_array( $this->mLimit, $this->mLimitsShown ) ) { @@ -1150,27 +1147,6 @@ abstract class TablePager extends IndexPager { return $s; } - /** - * Returns an HTMLFormField definition for the "Items per page:" dropdown - * - * @return array - */ - protected function getHTMLFormLimitSelect() { - $f = array( - 'class' => 'HTMLItemsPerPageField', - 'label-message' => 'table_pager_limit_label', - 'options' => array(), - 'default' => $this->mDefaultLimit, - 'name' => 'limit', - ); - - foreach( $this->mLimitsShown as $limit ) { - $f['options'][$this->getLanguage()->formatNum( $limit )] = $limit; - } - - return $f; - } - /** * Get elements for use in a method="get" form. * Resubmits all defined elements of the query string, except for a @@ -1239,13 +1215,19 @@ abstract class TablePager extends IndexPager { * The current result row is available as $this->mCurrentRow, in case you * need more context. * + * @protected + * * @param $name String: the database field name * @param $value String: the value retrieved from the database */ abstract function formatValue( $name, $value ); /** - * The database field name used as a default sort order + * The database field name used as a default sort order. + * + * @protected + * + * @return string */ abstract function getDefaultSort(); @@ -1258,30 +1240,3 @@ abstract class TablePager extends IndexPager { */ abstract function getFieldNames(); } - -/** - * Items per page dropdown for HTMLForm - */ -class HTMLItemsPerPageField extends HTMLSelectField { - /** - * Basically don't do any validation. If it's a number that's fine. Also, - * add it to the list if it's not there already - * - * @param $value - * @param $alldata - * @return bool - */ - function validate( $value, $alldata ) { - if ( $value == '' ) { - return true; - } - - if ( !in_array( $value, $this->mParams['options'] ) ) { - $this->mParams['options'][ $this->mParent->getLanguage()->formatNum( $value ) ] = intval($value); - asort( $this->mParams['options'] ); - } - - return true; - } - -} \ No newline at end of file