setHeaders(); $this->outputHeader(); $this->getOutput()->addModuleStyles( 'mediawiki.special.pagesWithProp' ); $request = $this->getRequest(); $propname = $request->getVal( 'propname', $par ); $this->reverse = $request->getBool( 'reverse' ); $this->sortByValue = $request->getBool( 'sortbyvalue' ); $propnames = $this->getExistingPropNames(); $form = HTMLForm::factory( 'ooui', [ 'propname' => [ 'type' => 'combobox', 'name' => 'propname', 'options' => $propnames, 'default' => $propname, 'label-message' => 'pageswithprop-prop', 'required' => true, ], 'reverse' => [ 'type' => 'check', 'name' => 'reverse', 'default' => $this->reverse, 'label-message' => 'pageswithprop-reverse', 'required' => false, ], 'sortbyvalue' => [ 'type' => 'check', 'name' => 'sortbyvalue', 'default' => $this->sortByValue, 'label-message' => 'pageswithprop-sortbyvalue', 'required' => false, ] ], $this->getContext() ); $form->setMethod( 'get' ); $form->setSubmitCallback( [ $this, 'onSubmit' ] ); $form->setWrapperLegendMsg( 'pageswithprop-legend' ); $form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() ); $form->setSubmitTextMsg( 'pageswithprop-submit' ); $form->prepareForm(); $form->displayForm( false ); if ( $propname !== '' && $propname !== null ) { $form->trySubmit(); } } public function onSubmit( $data, $form ) { $this->propName = $data['propname']; parent::execute( $data['propname'] ); } /** * Return an array of subpages beginning with $search that this special page will accept. * * @param string $search Prefix to search for * @param int $limit Maximum number of results to return * @param int $offset Number of pages to skip * @return string[] Matching subpages */ public function prefixSearchSubpages( $search, $limit, $offset ) { $subpages = array_keys( $this->queryExistingProps( $limit, $offset ) ); // We've already limited and offsetted, set to N and 0 respectively. return self::prefixSearchArray( $search, count( $subpages ), $subpages, 0 ); } /** * Disable RSS/Atom feeds * @return bool */ function isSyndicated() { return false; } public function getQueryInfo() { return [ 'tables' => [ 'page_props', 'page' ], 'fields' => [ 'page_id' => 'pp_page', 'page_namespace', 'page_title', 'page_len', 'page_is_redirect', 'page_latest', 'pp_value', ], 'conds' => [ 'pp_propname' => $this->propName, ], 'join_conds' => [ 'page' => [ 'INNER JOIN', 'page_id = pp_page' ] ], 'options' => [] ]; } function getOrderFields() { $sort = [ 'page_id' ]; if ( $this->sortByValue ) { array_unshift( $sort, 'pp_sortkey' ); } return $sort; } /** * @return bool */ public function sortDescending() { return !$this->reverse; } /** * @param Skin $skin * @param object $result Result row * @return string */ function formatResult( $skin, $result ) { $title = Title::newFromRow( $result ); $ret = $this->getLinkRenderer()->makeKnownLink( $title ); if ( $result->pp_value !== '' ) { // Do not show very long or binary values on the special page $valueLength = strlen( $result->pp_value ); $isBinary = strpos( $result->pp_value, "\0" ) !== false; $isTooLong = $valueLength > 1024; if ( $isBinary || $isTooLong ) { $message = $this ->msg( $isBinary ? 'pageswithprop-prophidden-binary' : 'pageswithprop-prophidden-long' ) ->params( $this->getLanguage()->formatSize( $valueLength ) ); $propValue = Html::element( 'span', [ 'class' => 'prop-value-hidden' ], $message->text() ); } else { $propValue = Html::element( 'span', [ 'class' => 'prop-value' ], $result->pp_value ); } $ret .= $this->msg( 'colon-separator' )->escaped() . $propValue; } return $ret; } public function getExistingPropNames() { if ( $this->existingPropNames === null ) { $this->existingPropNames = $this->queryExistingProps(); } return $this->existingPropNames; } protected function queryExistingProps( $limit = null, $offset = 0 ) { $opts = [ 'DISTINCT', 'ORDER BY' => 'pp_propname' ]; if ( $limit ) { $opts['LIMIT'] = $limit; } if ( $offset ) { $opts['OFFSET'] = $offset; } $res = wfGetDB( DB_REPLICA )->select( 'page_props', 'pp_propname', '', __METHOD__, $opts ); $propnames = []; foreach ( $res as $row ) { $propnames[$row->pp_propname] = $row->pp_propname; } return $propnames; } protected function getGroupName() { return 'pages'; } }