From: Bartosz DziewoƄski Date: Mon, 25 Aug 2014 14:19:45 +0000 (+0200) Subject: TablePager: Modernize style loading X-Git-Tag: 1.31.0-rc.0~14212 X-Git-Url: http://git.cyclocoop.org/url?a=commitdiff_plain;h=1683741e7177eeff63e4653f4a4a633a90c9cf64;p=lhc%2Fweb%2Fwiklou.git TablePager: Modernize style loading * Create a CSS module for pager styling (table and navigation), pulling in existing styles for shared.css. Load it on all pages where the pager itself is shown. * Build a ParserOutput object encapsulating the return HTML and required modules, rather than only providing the HTML. Added some hacks for backwards-compatibility with old-style calls and soft-deprecated them (there are many usages in extensions). Other cleanup: * Remove styles in oldshared.css, they were all overwritten by shared.css or by styles for .mw-datatable. * Remove inline styles where possible, explain them where impossible. * On SpecialListFiles, display navigation bar above the table as well as below (this seems to be the convention for other pages). Change-Id: Iae976f854b96b5c61691918787c4dff7db089c28 --- diff --git a/RELEASE-NOTES-1.24 b/RELEASE-NOTES-1.24 index 1205cebe15..c5b6cd45fd 100644 --- a/RELEASE-NOTES-1.24 +++ b/RELEASE-NOTES-1.24 @@ -432,6 +432,8 @@ changes to languages because of Bugzilla reports. stylesheet. It was ignored by most browsers these days anyway. * SpecialSearchNoResults hook has been removed. SpecialSearchResults is now called unconditionally. +* TablePager::getBody() is now 'final' and can't be overridden in subclasses. +* TablePager::getBody() is deprecated, use getBodyOutput() or getFullOutput(). ==== Renamed classes ==== * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression diff --git a/includes/pager/TablePager.php b/includes/pager/TablePager.php index 19538c6ac8..518540d677 100644 --- a/includes/pager/TablePager.php +++ b/includes/pager/TablePager.php @@ -50,6 +50,62 @@ abstract class TablePager extends IndexPager { parent::__construct(); } + /** + * Get the formatted result list. Calls getStartBody(), formatRow() and getEndBody(), concatenates + * the results and returns them. + * + * Also adds the required styles to our OutputPage object (this means that if context wasn't + * passed to constructor or otherwise set up, you will get a pager with missing styles). + * + * This method has been made 'final' in 1.24. There's no reason to override it, and if there exist + * any subclasses that do, the style loading hack is probably broken in them. Let's fail fast + * rather than mysteriously render things wrong. + * + * @deprecated since 1.24, use getBodyOutput() or getFullOutput() instead + * @return string + */ + final public function getBody() { + $this->getOutput()->addModuleStyles( $this->getModuleStyles() ); + return parent::getBody(); + } + + /** + * Get the formatted result list. + * + * Calls getBody() and getModuleStyles() and builds a ParserOutput object. (This is a bit hacky + * but works well.) + * + * @since 1.24 + * @return ParserOutput + */ + public function getBodyOutput() { + $body = parent::getBody(); + + $pout = new ParserOutput; + $pout->setText( $body ); + $pout->addModuleStyles( $this->getModuleStyles() ); + return $pout; + } + + /** + * Get the formatted result list, with navigation bars. + * + * Calls getBody(), getNavigationBar() and getModuleStyles() and + * builds a ParserOutput object. (This is a bit hacky but works well.) + * + * @since 1.24 + * @return ParserOutput + */ + public function getFullOutput() { + $navigation = $this->getNavigationBar(); + $body = parent::getBody(); + + $pout = new ParserOutput; + $pout->setText( $navigation . $body . $navigation ); + $pout->addModuleStyles( $this->getModuleStyles() ); + return $pout; + } + /** * @protected * @return string @@ -99,7 +155,6 @@ abstract class TablePager extends IndexPager { $tableClass = $this->getTableClass(); $ret = Html::openElement( 'table', array( - 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) ); $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) ); @@ -281,12 +336,24 @@ abstract class TablePager extends IndexPager { $s .= Html::openElement( 'tr' ) . "\n"; $width = 100 / count( $links ) . '%'; foreach ( $labels as $type => $label ) { - $s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n"; + // We want every cell to have the same width. We could use table-layout: fixed; in CSS, + // but it only works if we specify the width of a cell or the table and we don't want to. + // There is no better way. + $s .= Html::rawElement( 'td', array( 'style' => "width: $width;" ), $links[$type] ) . "\n"; } $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n"; return $s; } + /** + * ResourceLoader modules that must be loaded to provide correct styling for this pager + * @since 1.24 + * @return string[] + */ + public function getModuleStyles() { + return array( 'mediawiki.pager.tablePager' ); + } + /** * Get a "