/** * As with QueryPage, this is the actual workhorse. It does everything * needed to make a real, honest-to-gosh query page. * * @param $offset database query offset * @param $limit database query limit * @param $shownavigation show navigation like "next 200"? */ function doQuery($offset, $limit, $shownavigation = true) { global $wgUser, $wgOut, $wgContLang; $this->offset = $offset; $this->limit = $limit; $sname = $this->getName(); $fname = get_class($this) . '::doQuery'; $sk = $wgUser->getSkin(); $wgOut->setSyndicated($this->isSyndicated()); $query = MwRdf::Query($this->getQuery(), $this->getBaseUrl(), $this->getQueryLanguage()); $librdf_res = $query->execute(MwRdf::StoredModel()); # let's just dump the tuples into a normal php array shall # we? This will avoid memory management hassels. $res = array(); foreach ($librdf_res as $tuple) { $res[] = $tuple; } $num = count($res); $res = $this->preprocessResults($res); if ($shownavigation) { $wgOut->addHTML($this->getPageHeader()); $top = wfShowingResults($offset, $num); $wgOut->addHTML("<p>{$top}\n"); # often disable 'next' link when we reach the end $atend = $num < $limit; $sl = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($sname), wfArrayToCGI($this->linkParameters()), $atend); $wgOut->addHTML("<br />{$sl}</p>\n"); } if ($num > 0) { $s = array(); if (!$this->listoutput) { $s[] = "<ol start='" . ($offset + 1) . "' class='special'>"; } # here's where we do the offset and limit for ($i = $offset; $i < $num && $i < $offset + $limit; $i++) { $format = $this->formatResult($sk, $res[$i]); if ($format) { $s[] = $this->listoutput ? $format : "<li>{$format}</li>\n"; } } if (!$this->listoutput) { $s[] = '</ol>'; } $str = $this->listoutput ? $wgContLang->listToText($s) : implode('', $s); $wgOut->addHTML($str); } if ($shownavigation) { $wgOut->addHTML("<p>{$sl}</p>\n"); } return $num; }
/** * This is the actual workhorse. It does everything needed to make a * real, honest-to-gosh query page. * Alas, we need to overwrite the whole beast since we do not assume * an SQL-based storage backend. * * @param $offset database query offset * @param $limit database query limit */ function doQuery($offset = false, $limit = false) { global $wgOut, $wgContLang; $options = new SMWRequestOptions(); $options->limit = $limit; $options->offset = $offset; $options->sort = true; $res = $this->getResults($options); $num = count($res); $sk = $this->getSkin(); $sname = $this->getName(); $wgOut->addHTML($this->getPageHeader()); // if list is empty, show it if ($num == 0) { $wgOut->addHTML('<p>' . wfMsgHTML('specialpage-empty') . '</p>'); return; } $top = wfShowingResults($offset, $num); $wgOut->addHTML("<p>{$top}\n"); // often disable 'next' link when we reach the end $atend = $num < $limit; $sl = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($sname), wfArrayToCGI($this->linkParameters()), $atend); $wgOut->addHTML("<br />{$sl}</p>\n"); if ($num > 0) { $s = array(); if (!$this->listoutput) { $s[] = $this->openList($offset); } foreach ($res as $r) { $format = $this->formatResult($sk, $r); if ($format) { $s[] = $this->listoutput ? $format : "<li>{$format}</li>\n"; } } if (!$this->listoutput) { $s[] = $this->closeList(); } $str = $this->listoutput ? $wgContLang->listToText($s) : implode('', $s); $wgOut->addHTML($str); } $wgOut->addHTML("<p>{$sl}</p>\n"); return $num; }
/** * This is the actual workhorse. It does everything needed to make a * real, honest-to-gosh query page. * * @param $offset database query offset * @param $limit database query limit * @param $shownavigation show navigation like "next 200"? */ function doQuery($offset, $limit, $shownavigation = true) { global $wgUser, $wgOut, $wgLang, $wgContLang; $this->offset = $offset; $this->limit = $limit; $sname = $this->getName(); $fname = get_class($this) . '::doQuery'; $dbr = wfGetDB(DB_SLAVE); $wgOut->setSyndicated($this->isSyndicated()); if (!$this->isCached()) { $sql = $this->getSQL(); } else { # Get the cached result $querycache = $dbr->tableName('querycache'); $type = $dbr->strencode($sname); $sql = "SELECT qc_type as type, qc_namespace as namespace,qc_title as title, qc_value as value\n\t\t\t\t FROM {$querycache} WHERE qc_type='{$type}'"; if (!$this->listoutput) { # Fetch the timestamp of this update $tRes = $dbr->select('querycache_info', array('qci_timestamp'), array('qci_type' => $type), $fname); $tRow = $dbr->fetchObject($tRes); if ($tRow) { $updated = $wgLang->timeanddate($tRow->qci_timestamp, true, true); $updateddate = $wgLang->date($tRow->qci_timestamp, true, true); $updatedtime = $wgLang->time($tRow->qci_timestamp, true, true); $wgOut->addMeta('Data-Cache-Time', $tRow->qci_timestamp); $wgOut->addInlineScript("var dataCacheTime = '{$tRow->qci_timestamp}';"); $wgOut->addWikiMsg('perfcachedts', $updated, $updateddate, $updatedtime); } else { $wgOut->addWikiMsg('perfcached'); } # If updates on this page have been disabled, let the user know # that the data set won't be refreshed for now global $wgDisableQueryPageUpdate; if (is_array($wgDisableQueryPageUpdate) && in_array($this->getName(), $wgDisableQueryPageUpdate)) { $wgOut->addWikiMsg('querypage-no-updates'); } } } $sql .= $this->getOrder(); $sql = $dbr->limitResult($sql, $limit, $offset); $res = $dbr->query($sql); $num = $dbr->numRows($res); $this->preprocessResults($dbr, $res); $wgOut->addHTML(Xml::openElement('div', array('class' => 'mw-spcontent'))); # Top header and navigation if ($shownavigation) { $wgOut->addHTML($this->getPageHeader()); if ($num > 0) { $wgOut->addHTML('<p>' . wfShowingResults($offset, $num) . '</p>'); # Disable the "next" link when we reach the end $paging = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($sname), wfArrayToCGI($this->linkParameters()), $num < $limit); $wgOut->addHTML('<p>' . $paging . '</p>'); } else { # No results to show, so don't bother with "showing X of Y" etc. # -- just let the user know and give up now $wgOut->addHTML('<p>' . wfMsgHtml('specialpage-empty') . '</p>'); $wgOut->addHTML(Xml::closeElement('div')); return; } } # The actual results; specialist subclasses will want to handle this # with more than a straight list, so we hand them the info, plus # an OutputPage, and let them get on with it $this->outputResults($wgOut, $wgUser->getSkin(), $dbr, $res, $dbr->numRows($res), $offset); # Repeat the paging links at the bottom if ($shownavigation) { $wgOut->addHTML('<p>' . $paging . '</p>'); } $wgOut->addHTML(Xml::closeElement('div')); return $num; }
/** * This is the actual workhorse. It does everything needed to make a * real, honest-to-gosh query page. */ function execute($par) { global $wgUser, $wgOut, $wgLang, $wgRequest; if (!$this->userCanExecute($wgUser)) { $this->displayRestrictionError(); return; } if ($this->limit == 0 && $this->offset == 0) { list($this->limit, $this->offset) = $wgRequest->getLimitOffset(); } $dbr = wfGetDB(DB_SLAVE); $this->setHeaders(); $wgOut->setSyndicated($this->isSyndicated()); if ($this->isCached() && !$this->isCacheable()) { $wgOut->setSyndicated(false); $wgOut->addWikiMsg('querypage-disabled'); return 0; } // TODO: Use doQuery() // $res = null; if (!$this->isCached()) { $res = $this->reallyDoQuery($this->limit, $this->offset); } else { # Get the cached result $res = $this->fetchFromCache($this->limit, $this->offset); if (!$this->listoutput) { # Fetch the timestamp of this update $ts = $this->getCachedTimestamp(); if ($ts) { $updated = $wgLang->timeanddate($ts, true, true); $updateddate = $wgLang->date($ts, true, true); $updatedtime = $wgLang->time($ts, true, true); $wgOut->addMeta('Data-Cache-Time', $ts); $wgOut->addInlineScript("var dataCacheTime = '{$ts}';"); $wgOut->addWikiMsg('perfcachedts', $updated, $updateddate, $updatedtime); } else { $wgOut->addWikiMsg('perfcached'); } # If updates on this page have been disabled, let the user know # that the data set won't be refreshed for now global $wgDisableQueryPageUpdate; if (is_array($wgDisableQueryPageUpdate) && in_array($this->getName(), $wgDisableQueryPageUpdate)) { $wgOut->addWikiMsg('querypage-no-updates'); } } } $this->numRows = $dbr->numRows($res); $this->preprocessResults($dbr, $res); $wgOut->addHTML(Xml::openElement('div', array('class' => 'mw-spcontent'))); # Top header and navigation if ($this->shownavigation) { $wgOut->addHTML($this->getPageHeader()); if ($this->numRows > 0) { $wgOut->addHTML('<p>' . wfShowingResults($this->offset, $this->numRows) . '</p>'); # Disable the "next" link when we reach the end $paging = wfViewPrevNext($this->offset, $this->limit, $this->getTitle($par), wfArrayToCGI($this->linkParameters()), $this->numRows < $this->limit); $wgOut->addHTML('<p>' . $paging . '</p>'); } else { # No results to show, so don't bother with "showing X of Y" etc. # -- just let the user know and give up now $wgOut->addHTML('<p>' . wfMsgHtml('specialpage-empty') . '</p>'); $wgOut->addHTML(Xml::closeElement('div')); return; } } # The actual results; specialist subclasses will want to handle this # with more than a straight list, so we hand them the info, plus # an OutputPage, and let them get on with it $this->outputResults($wgOut, $this->getSkin(), $dbr, $res, $this->numRows, $this->offset); # Repeat the paging links at the bottom if ($this->shownavigation) { $wgOut->addHTML('<p>' . $paging . '</p>'); } $wgOut->addHTML(Xml::closeElement('div')); return $this->numRows; }
protected function formHeader($term, $resultsShown, $totalNum) { global $wgContLang, $wgLang; $out = Xml::openElement('div', array('class' => 'mw-search-formheader')); $bareterm = $term; if ($this->startsWithImage($term)) { // Deletes prefixes $bareterm = substr($term, strpos($term, ':') + 1); } $profiles = $this->getSearchProfiles(); // Outputs XML for Search Types $out .= Xml::openElement('div', array('class' => 'search-types')); $out .= Xml::openElement('ul'); foreach ($profiles as $id => $profile) { $tooltipParam = isset($profile['namespace-messages']) ? $wgLang->commaList($profile['namespace-messages']) : null; $out .= Xml::tags('li', array('class' => $this->active == $id ? 'current' : 'normal'), $this->makeSearchLink($bareterm, $profile['namespaces'], wfMsg($profile['message']), wfMsg($profile['tooltip'], $tooltipParam), isset($profile['parameters']) ? $profile['parameters'] : array())); } $out .= Xml::closeElement('ul'); $out .= Xml::closeElement('div'); // Results-info if ($resultsShown > 0) { if ($totalNum > 0) { $top = wfMsgExt('showingresultsheader', array('parseinline'), $wgLang->formatNum($this->offset + 1), $wgLang->formatNum($this->offset + $resultsShown), $wgLang->formatNum($totalNum), wfEscapeWikiText($term), $wgLang->formatNum($resultsShown)); } elseif ($resultsShown >= $this->limit) { $top = wfShowingResults($this->offset, $this->limit); } else { $top = wfShowingResultsNum($this->offset, $this->limit, $resultsShown); } $out .= Xml::tags('div', array('class' => 'results-info'), Xml::tags('ul', null, Xml::tags('li', null, $top))); } $out .= Xml::element('div', array('style' => 'clear:both'), '', false); $out .= Xml::closeElement('div'); // Adds hidden namespace fields if (!$this->searchAdvanced) { foreach ($this->namespaces as $ns) { $out .= Xml::hidden("ns{$ns}", '1'); } } return $out; }
public function outputResults($skin, $data) { global $wgContLang, $wgLang, $wgOut; wfProfileIn(__METHOD__); $num = 0; $html = array(); if ($this->mShow) { $wgOut->addHTML(XML::openElement('div', array('class' => 'mw-spcontent'))); } if (isset($data) && $data['numrec'] > 0) { $num = $data['numrec']; if ($this->mShow) { $html[] = XML::openElement('ol', array('start' => $this->offset + 1, 'class' => 'special')); } if ($data['numrec'] <= self::ORDER_ROWS) { arsort($data['order']); } $loop = 0; $skip = 0; foreach ($data['order'] as $city_id => $ordered) { # check loop if ($loop >= $this->offset && $loop < $this->limit + $this->offset) { list($page_id, $page_url, $page_server) = $data['rows'][$city_id]; # page url if (empty($page_url) || empty($page_server)) { $oGTitle = GlobalTitle::newFromText($this->mPageTitle, $this->mPageNS, $city_id); if (is_object($oGTitle)) { $page_url = $oGTitle->getFullURL(); $page_server = $oGTitle->getServer(); } if (empty($page_url) || empty($page_server)) { $skip++; continue; } } # check Wiki if (!empty($city_id)) { $oWikia = WikiFactory::getWikiByID($city_id); if (empty($oWikia) || empty($oWikia->city_public)) { continue; } } if (empty($this->mShow)) { $res = ""; $this->data[$city_id] = array('city_id' => $city_id, 'page_id' => $page_id, 'url' => $page_url); } else { $res = wfSpecialList(Xml::openElement('a', array('href' => $page_url)) . $page_url . Xml::closeElement('a'), ""); } $html[] = $this->mShow ? Xml::openElement('li') . $res . Xml::closeElement('li') : ""; } $loop++; } $num = $num - $skip; if ($this->mShow) { $html[] = XML::closeElement('ol'); } } # Top header and navigation if ($this->mShow) { $wgOut->addHTML('<p>' . wfMsgExt('multiwikirecords', array(), $num) . '</p>'); if ($num > 0) { $wgOut->addHTML('<p>' . wfShowingResults($this->offset, $num) . '</p>'); # Disable the "next" link when we reach the end $paging = $wgLang->viewPrevNext(SpecialPage::getTitleFor($this->mName), $this->offset, $this->limit, $this->linkParameters(), $num < $this->limit); $wgOut->addHTML('<p>' . $paging . '</p>'); } else { $wgOut->addHTML(XML::closeElement('div')); return; } } $html = $this->mShow ? implode('', $html) : $wgContLang->listToText($html); $wgOut->addHTML($html); # Repeat the paging links at the bottom if ($this->mShow) { $wgOut->addHTML('<p>' . $paging . '</p>'); } $wgOut->addHTML(XML::closeElement('div')); wfProfileOut(__METHOD__); return $num; }
protected function formHeader($resultsShown, $totalNum) { global $wgLang; $out = Xml::openElement('div', array('class' => 'mw-search-formheader')); // Results-info if ($resultsShown > 0) { if ($totalNum > 0) { $top = wfMsgExt('showingresultsheader', array('parseinline'), $wgLang->formatNum($this->offset + 1), $wgLang->formatNum($this->offset + $resultsShown), $wgLang->formatNum($totalNum), $wgLang->formatNum($resultsShown)); } elseif ($resultsShown >= $this->limit) { $top = wfShowingResults($this->offset, $this->limit); } else { $top = wfShowingResultsNum($this->offset, $this->limit, $resultsShown); } $out .= Xml::tags('div', array('class' => 'results-info'), Xml::tags('ul', null, Xml::tags('li', null, $top))); } $out .= Xml::element('div', array('style' => 'clear:both'), '', false); $out .= Xml::closeElement('div'); return $out; }
/** * This is the actual workhorse. It does everything needed to make a * real, honest-to-gosh query page. * * @param $offset database query offset * @param $limit database query limit * @param $shownavigation show navigation like "next 200"? */ function doQuery($offset, $limit, $shownavigation = true) { global $wgUser, $wgOut, $wgLang, $wgContLang; $this->offset = $offset; $this->limit = $limit; $sname = $this->getName(); $fname = get_class($this) . '::doQuery'; $sql = $this->getSQL(); $dbr =& wfGetDB(DB_SLAVE); $querycache = $dbr->tableName('querycache'); $wgOut->setSyndicated($this->isSyndicated()); if ($this->isCached()) { $type = $dbr->strencode($sname); $sql = "SELECT qc_type as type, qc_namespace as namespace,qc_title as title, qc_value as value\n\t\t\t\t FROM {$querycache} WHERE qc_type='{$type}'"; if (!$this->listoutput) { # Fetch the timestamp of this update $tRes = $dbr->select('querycache_info', array('qci_timestamp'), array('qci_type' => $type), $fname); $tRow = $dbr->fetchObject($tRes); if ($tRow) { $updated = $wgLang->timeAndDate($tRow->qci_timestamp, true, true); $cacheNotice = wfMsg('perfcachedts', $updated); $wgOut->addMeta('Data-Cache-Time', $tRow->qci_timestamp); $wgOut->addScript('<script language="JavaScript">var dataCacheTime = \'' . $tRow->qci_timestamp . '\';</script>'); } else { $cacheNotice = wfMsg('perfcached'); } $wgOut->addWikiText($cacheNotice); } } $sql .= $this->getOrder(); $sql = $dbr->limitResult($sql, $limit, $offset); $res = $dbr->query($sql); $num = $dbr->numRows($res); $this->preprocessResults($dbr, $res); $sk = $wgUser->getSkin(); if ($shownavigation) { $wgOut->addHTML($this->getPageHeader()); $top = wfShowingResults($offset, $num); $wgOut->addHTML("<p>{$top}\n"); # often disable 'next' link when we reach the end $atend = $num < $limit; $sl = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($sname), wfArrayToCGI($this->linkParameters()), $atend); $wgOut->addHTML("<br />{$sl}</p>\n"); } if ($num > 0) { $s = array(); if (!$this->listoutput) { $s[] = "<ol start='" . ($offset + 1) . "' class='special'>"; } # Only read at most $num rows, because $res may contain the whole 1000 for ($i = 0; $i < $num && ($obj = $dbr->fetchObject($res)); $i++) { $format = $this->formatResult($sk, $obj); if ($format) { $attr = isset($obj->usepatrol) && $obj->usepatrol && $obj->patrolled == 0 ? ' class="not-patrolled"' : ''; $s[] = $this->listoutput ? $format : "<li{$attr}>{$format}</li>\n"; } } if ($this->tryLastResult()) { // flush the very last result $obj = null; $format = $this->formatResult($sk, $obj); if ($format) { $attr = isset($obj->usepatrol) && $obj->usepatrol && $obj->patrolled == 0 ? ' class="not-patrolled"' : ''; $s[] = "<li{$attr}>{$format}</li>\n"; } } $dbr->freeResult($res); if (!$this->listoutput) { $s[] = '</ol>'; } $str = $this->listoutput ? $wgContLang->listToText($s) : implode('', $s); $wgOut->addHTML($str); } if ($shownavigation) { $wgOut->addHTML("<p>{$sl}</p>\n"); } return $num; }
/** * @param string $term * @access public */ function showResults($term) { $fname = 'SpecialSearch::showResults'; wfProfileIn($fname); $this->setupPage($term); global $wgUser, $wgOut; $sk = $wgUser->getSkin(); $wgOut->addWikiText(wfMsg('searchresulttext')); #if ( !$this->parseQuery() ) { if ('' === trim($term)) { $wgOut->setSubtitle(''); $wgOut->addHTML($this->powerSearchBox($term)); wfProfileOut($fname); return; } global $wgDisableTextSearch; if ($wgDisableTextSearch) { global $wgForwardSearchUrl; if ($wgForwardSearchUrl) { $url = str_replace('$1', urlencode($term), $wgForwardSearchUrl); $wgOut->redirect($url); return; } global $wgInputEncoding; $wgOut->addHTML(wfMsg('searchdisabled')); $wgOut->addHTML(wfMsg('googlesearch', htmlspecialchars($term), htmlspecialchars($wgInputEncoding), htmlspecialchars(wfMsg('search')))); wfProfileOut($fname); return; } $search =& SearchEngine::create(); $search->setLimitOffset($this->limit, $this->offset); $search->setNamespaces($this->namespaces); $titleMatches = $search->searchTitle($term); $textMatches = $search->searchText($term); $num = ($titleMatches ? $titleMatches->numRows() : 0) + ($textMatches ? $textMatches->numRows() : 0); if ($num >= $this->limit) { $top = wfShowingResults($this->offset, $this->limit); } else { $top = wfShowingResultsNum($this->offset, $this->limit, $num); } $wgOut->addHTML("<p>{$top}</p>\n"); if ($num || $this->offset) { $prevnext = wfViewPrevNext($this->offset, $this->limit, 'Special:Search', wfArrayToCGI($this->powerSearchOptions(), array('search' => $term))); $wgOut->addHTML("<br />{$prevnext}\n"); } if ($titleMatches) { if ($titleMatches->numRows()) { $wgOut->addWikiText('==' . wfMsg('titlematches') . "==\n"); $wgOut->addHTML($this->showMatches($titleMatches)); } else { $wgOut->addWikiText('==' . wfMsg('notitlematches') . "==\n"); } } if ($textMatches) { if ($textMatches->numRows()) { $wgOut->addWikiText('==' . wfMsg('textmatches') . "==\n"); $wgOut->addHTML($this->showMatches($textMatches)); } elseif ($num == 0) { # Don't show the 'no text matches' if we received title matches $wgOut->addWikiText('==' . wfMsg('notextmatches') . "==\n"); } } if ($num == 0) { $wgOut->addWikiText(wfMsg('nonefound')); } if ($num || $this->offset) { $wgOut->addHTML("<p>{$prevnext}</p>\n"); } $wgOut->addHTML($this->powerSearchBox($term)); wfProfileOut($fname); }
function doQuery($offset, $limit, $shownavigation = true) { global $wgOut, $wgContLang; $res = $this->getIntervalResults($offset, $limit); $num = count($res); if ($shownavigation) { $wgOut->addHTML($this->getPageHeader()); // if list is empty, display a warning if ($num == 0) { $wgOut->addHTML('<p>' . wfMsgHTML('specialpage-empty') . '</p>'); return; } $top = wfShowingResults($offset, $num); $wgOut->addHTML("<p>{$top}\n"); // often disable 'next' link when we reach the end $atend = $num < $limit; $sl = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($this->queryPageName()), wfArrayToCGI($this->linkParameters()), $atend); $wgOut->addHTML("<br />{$sl}</p>\n"); } if ($num > 0) { $s = array(); if (!$this->listoutput) { $s[] = $this->openList($offset); } foreach ($res as $r) { $format = $this->formatResult($r); if ($format) { $s[] = $this->listoutput ? $format : "<li>{$format}</li>\n"; } } if (!$this->listoutput) { $s[] = $this->closeList(); } $str = $this->listoutput ? $wgContLang->listToText($s) : implode('', $s); $wgOut->addHTML($str); } if ($shownavigation) { $wgOut->addHTML("<p>{$sl}</p>\n"); } return $num; }
/** * This is the actual workhorse. It does everything needed to make a * real, honest-to-gosh query page. * * @param $offset database query offset * @param $limit database query limit * @param $shownavigation show navigation like "next 200"? */ function doQuery($offset, $limit, $shownavigation = true) { global $wgUser, $wgOut, $wgLang, $wgRequest, $wgContLang; global $wgMiserMode; $sname = $this->getName(); $fname = get_class($this) . '::doQuery'; $sql = $this->getSQL(); $dbr =& wfGetDB(DB_SLAVE); $dbw =& wfGetDB(DB_MASTER); $querycache = $dbr->tableName('querycache'); $wgOut->setSyndicated($this->isSyndicated()); if ($this->isExpensive()) { // Disabled recache parameter due to retry problems -- TS if ($wgMiserMode) { $type = $dbr->strencode($sname); $sql = "SELECT qc_type as type, qc_namespace as namespace,qc_title as title, qc_value as value\n\t\t\t\t\t FROM {$querycache} WHERE qc_type='{$type}'"; $wgOut->addWikiText(wfMsg('perfcached')); } } $res = $dbr->query($sql . $this->getOrder() . $dbr->limitResult($limit, $offset), $fname); $num = $dbr->numRows($res); $sk = $wgUser->getSkin(); if ($shownavigation) { $wgOut->addHTML($this->getPageHeader()); $top = wfShowingResults($offset, $num); $wgOut->addHTML("<p>{$top}\n"); # often disable 'next' link when we reach the end if ($num < $limit) { $atend = true; } else { $atend = false; } $sl = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($sname), wfArrayToCGI($this->linkParameters()), $atend); $wgOut->addHTML("<br />{$sl}</p>\n"); } if ($num > 0) { $s = "<ol start='" . ($offset + 1) . "' class='special'>"; # Only read at most $num rows, because $res may contain the whole 1000 for ($i = 0; $i < $num && ($obj = $dbr->fetchObject($res)); $i++) { $format = $this->formatResult($sk, $obj); if ($format) { $attr = isset($obj->usepatrol) && $obj->usepatrol && $obj->patrolled == 0 ? ' class="not-patrolled"' : ''; $s .= "<li{$attr}>{$format}</li>\n"; } } if ($this->tryLastResult()) { // flush the very last result $obj = null; $format = $this->formatResult($sk, $obj); if ($format) { $attr = isset($obj->usepatrol) && $obj->usepatrol && $obj->patrolled == 0 ? ' class="not-patrolled"' : ''; $s .= "<li{$attr}>{$format}</li>\n"; } } $dbr->freeResult($res); $s .= '</ol>'; $wgOut->addHTML($s); } if ($shownavigation) { $wgOut->addHTML("<p>{$sl}</p>\n"); } return $num; }
/** * @param string $term * @public */ function showResults($term) { $fname = 'SpecialSearch::showResults'; wfProfileIn($fname); $this->setupPage($term); global $wgOut; $wgOut->addWikiMsg('searchresulttext'); if ('' === trim($term)) { // Empty query -- straight view of search form $wgOut->setSubtitle(''); $wgOut->addHTML($this->powerSearchBox($term)); $wgOut->addHTML($this->powerSearchFocus()); wfProfileOut($fname); return; } global $wgDisableTextSearch; if ($wgDisableTextSearch) { global $wgForwardSearchUrl; if ($wgForwardSearchUrl) { $url = str_replace('$1', urlencode($term), $wgForwardSearchUrl); $wgOut->redirect($url); return; } global $wgInputEncoding; $wgOut->addHTML(wfMsg('searchdisabled')); $wgOut->addHTML(wfMsg('googlesearch', htmlspecialchars($term), htmlspecialchars($wgInputEncoding), htmlspecialchars(wfMsg('searchbutton')))); wfProfileOut($fname); return; } $search = SearchEngine::create(); $search->setLimitOffset($this->limit, $this->offset); $search->setNamespaces($this->namespaces); $search->showRedirects = $this->searchRedirects; $titleMatches = $search->searchTitle($term); // Sometimes the search engine knows there are too many hits if ($titleMatches instanceof SearchResultTooMany) { $wgOut->addWikiText('==' . wfMsg('toomanymatches') . "==\n"); $wgOut->addHTML($this->powerSearchBox($term)); $wgOut->addHTML($this->powerSearchFocus()); wfProfileOut($fname); return; } $textMatches = $search->searchText($term); $num = ($titleMatches ? $titleMatches->numRows() : 0) + ($textMatches ? $textMatches->numRows() : 0); if ($num > 0) { if ($num >= $this->limit) { $top = wfShowingResults($this->offset, $this->limit); } else { $top = wfShowingResultsNum($this->offset, $this->limit, $num); } $wgOut->addHTML("<p>{$top}</p>\n"); } if ($num || $this->offset) { $prevnext = wfViewPrevNext($this->offset, $this->limit, SpecialPage::getTitleFor('Search'), wfArrayToCGI($this->powerSearchOptions(), array('search' => $term)), $num < $this->limit); $wgOut->addHTML("<br />{$prevnext}\n"); } if ($titleMatches) { if ($titleMatches->numRows()) { $wgOut->wrapWikiMsg("==\$1==\n", 'titlematches'); $wgOut->addHTML($this->showMatches($titleMatches)); } else { $wgOut->wrapWikiMsg("==\$1==\n", 'notitlematches'); } $titleMatches->free(); } if ($textMatches) { if ($textMatches->numRows()) { $wgOut->wrapWikiMsg("==\$1==\n", 'textmatches'); $wgOut->addHTML($this->showMatches($textMatches)); } elseif ($num == 0) { # Don't show the 'no text matches' if we received title matches $wgOut->wrapWikiMsg("==\$1==\n", 'notextmatches'); } $textMatches->free(); } if ($num == 0) { $wgOut->addWikiMsg('nonefound'); } if ($num || $this->offset) { $wgOut->addHTML("<p>{$prevnext}</p>\n"); } $wgOut->addHTML($this->powerSearchBox($term)); wfProfileOut($fname); }
/** * @param string $term * @public */ function showResults($term) { wfProfileIn(__METHOD__); global $wgOut, $wgUser; $sk = $wgUser->getSkin(); $search = SearchEngine::create(); $search->setLimitOffset($this->limit, $this->offset); $search->setNamespaces($this->namespaces); $search->showRedirects = $this->searchRedirects; $search->prefix = $this->mPrefix; $term = $search->transformSearchTerm($term); $this->setupPage($term); $rewritten = $search->replacePrefixes($term); $titleMatches = $search->searchTitle($rewritten); $textMatches = $search->searchText($rewritten); // did you mean... suggestions if ($textMatches && $textMatches->hasSuggestion()) { $st = SpecialPage::getTitleFor('Search'); $stParams = wfArrayToCGI(array('search' => $textMatches->getSuggestionQuery(), 'fulltext' => wfMsg('search')), $this->powerSearchOptions()); $suggestLink = $sk->makeKnownLinkObj($st, $textMatches->getSuggestionSnippet(), $stParams); $wgOut->addHTML('<div class="searchdidyoumean">' . wfMsg('search-suggest', $suggestLink) . '</div>'); } $wgOut->addWikiMsg('searchresulttext'); if ('' === trim($term)) { // Empty query -- straight view of search form $wgOut->setSubtitle(''); $wgOut->addHTML($this->powerSearchBox($term)); $wgOut->addHTML($this->powerSearchFocus()); wfProfileOut(__METHOD__); return; } global $wgDisableTextSearch; if ($wgDisableTextSearch) { global $wgSearchForwardUrl; if ($wgSearchForwardUrl) { $url = str_replace('$1', urlencode($term), $wgSearchForwardUrl); $wgOut->redirect($url); wfProfileOut(__METHOD__); return; } global $wgInputEncoding; $wgOut->addHTML(Xml::openElement('fieldset') . Xml::element('legend', null, wfMsg('search-external')) . Xml::element('p', array('class' => 'mw-searchdisabled'), wfMsg('searchdisabled')) . wfMsg('googlesearch', htmlspecialchars($term), htmlspecialchars($wgInputEncoding), htmlspecialchars(wfMsg('searchbutton'))) . Xml::closeElement('fieldset')); wfProfileOut(__METHOD__); return; } $wgOut->addHTML($this->shortDialog($term)); // Sometimes the search engine knows there are too many hits if ($titleMatches instanceof SearchResultTooMany) { $wgOut->addWikiText('==' . wfMsg('toomanymatches') . "==\n"); $wgOut->addHTML($this->powerSearchBox($term)); $wgOut->addHTML($this->powerSearchFocus()); wfProfileOut(__METHOD__); return; } // show number of results $num = ($titleMatches ? $titleMatches->numRows() : 0) + ($textMatches ? $textMatches->numRows() : 0); $totalNum = 0; if ($titleMatches && !is_null($titleMatches->getTotalHits())) { $totalNum += $titleMatches->getTotalHits(); } if ($textMatches && !is_null($textMatches->getTotalHits())) { $totalNum += $textMatches->getTotalHits(); } if ($num > 0) { if ($totalNum > 0) { $top = wfMsgExt('showingresultstotal', array('parseinline'), $this->offset + 1, $this->offset + $num, $totalNum, $num); } elseif ($num >= $this->limit) { $top = wfShowingResults($this->offset, $this->limit); } else { $top = wfShowingResultsNum($this->offset, $this->limit, $num); } $wgOut->addHTML("<p class='mw-search-numberresults'>{$top}</p>\n"); } // prev/next links if ($num || $this->offset) { $prevnext = wfViewPrevNext($this->offset, $this->limit, SpecialPage::getTitleFor('Search'), wfArrayToCGI($this->powerSearchOptions(), array('search' => $term)), $num < $this->limit); $wgOut->addHTML("<p class='mw-search-pager-top'>{$prevnext}</p>\n"); wfRunHooks('SpecialSearchResults', array($term, &$titleMatches, &$textMatches)); } else { wfRunHooks('SpecialSearchNoResults', array($term)); } if ($titleMatches) { if ($titleMatches->numRows()) { $wgOut->wrapWikiMsg("==\$1==\n", 'titlematches'); $wgOut->addHTML($this->showMatches($titleMatches)); } $titleMatches->free(); } if ($textMatches) { // output appropriate heading if ($textMatches->numRows()) { if ($titleMatches) { $wgOut->wrapWikiMsg("==\$1==\n", 'textmatches'); } else { // if no title matches the heading is redundant $wgOut->addHTML("<hr/>"); } } elseif ($num == 0) { # Don't show the 'no text matches' if we received title matches $wgOut->wrapWikiMsg("==\$1==\n", 'notextmatches'); } // show interwiki results if any if ($textMatches->hasInterwikiResults()) { $wgOut->addHTML($this->showInterwiki($textMatches->getInterwikiResults(), $term)); } // show results if ($textMatches->numRows()) { $wgOut->addHTML($this->showMatches($textMatches)); } $textMatches->free(); } if ($num == 0) { $wgOut->addWikiMsg('nonefound'); } if ($num || $this->offset) { $wgOut->addHTML("<p class='mw-search-pager-bottom'>{$prevnext}</p>\n"); } $wgOut->addHTML($this->powerSearchBox($term)); wfProfileOut(__METHOD__); }
/** * */ function wfSpecialMissingLanguageLinks() { global $wgUser, $wgOut, $wgContLang, $wgTitle, $wgRequest; $fname = 'wfSpecialMissingLanguageLinks'; $thelang = $wgRequest->getText('thelang'); if ($thelang == 'w') { $thelang = 'en'; } # Fix for international wikis list($limit, $offset) = wfCheckLimits(); $dbr =& wfGetDB(DB_SLAVE); $cur = $dbr->tableName('cur'); $sql = "SELECT cur_title FROM {$cur} " . "WHERE cur_namespace=" . NS_MAIN . " AND cur_is_redirect=0 " . "AND cur_title NOT LIKE '%/%' AND cur_text NOT LIKE '%[[" . wfStrencode($thelang) . ":%' " . "LIMIT {$offset}, {$limit}"; $res = $dbr->query($sql, $fname); $mll = wfMsg('missinglanguagelinkstext', $wgContLang->getLanguageName($thelang)); $top = getMaintenancePageBacklink('missinglanguagelinks'); $top .= "<p>{$mll}</p><br />"; $top .= wfShowingResults($offset, $limit); $wgOut->addHTML("<p>{$top}\n"); $sl = wfViewPrevNext($offset, $limit, 'REPLACETHIS'); $sl = str_replace('REPLACETHIS', sns() . ":Maintenance&subfunction=missinglanguagelinks&thelang=" . htmlspecialchars($thelang), $sl); $wgOut->addHTML("<br />{$sl}\n"); $sk = $wgUser->getSkin(); $s = '<ol start=' . ($offset + 1) . '>'; while ($obj = $dbr->fetchObject($res)) { $s .= "<li>" . $sk->makeKnownLink($obj->cur_title) . "</li>\n"; } $dbr->freeResult($res); $s .= '</ol>'; $wgOut->addHTML($s); $wgOut->addHTML("<p>{$sl}\n"); }
/** * This is the actual workhorse. It does everything needed to make a * real, honest-to-gosh query page. * Alas, we need to overwrite the whole beast since we do not assume * an SQL-based storage backend. * * @param $offset database query offset * @param $limit database query limit * @param $property database string query */ function doQuery($offset = false, $limit = false, $property = false) { $out = $this->getOutput(); $sk = $this->getSkin(); $options = new SMWRequestOptions(); $options->limit = $limit; $options->offset = $offset; $options->sort = true; if ($property) { $options->addStringCondition($property, SMWStringCondition::STRCOND_MID); } $res = $this->getResults($options); $num = count($res); // often disable 'next' link when we reach the end $atend = $num < $limit; $this->selectOptions = array('offset' => $offset, 'limit' => $limit, 'end' => $atend, 'count' => $num); $out->addHTML($this->getPageHeader()); // if list is empty, show it if ($num == 0) { $out->addHTML('<p>' . $this->msg('specialpage-empty')->escaped() . '</p>'); return; } // If unused properties and wanted properties are using the searchForm // then the useSerchForm if-inclusion can be scrapped if (!$this->useSerchForm) { $top = wfShowingResults($offset, $num); $sl = $this->getLanguage()->viewPrevNext($this->getTitleFor($this->getName()), $this->selectOptions['offset'], $this->selectOptions['limit'], $this->linkParameters(), $this->selectOptions['end']); $out->addHTML("<p>{$top}\n"); $out->addHTML("<br />{$sl}</p>\n"); } if ($num > 0) { $s = array(); if (!$this->listoutput) { $s[] = $this->openList($offset); } foreach ($res as $r) { $format = $this->formatResult($sk, $r); if ($format) { $s[] = $this->listoutput ? $format : "<li>{$format}</li>\n"; } } if (!$this->listoutput) { $s[] = $this->closeList(); } $str = $this->listoutput ? $this->getLanguage()->listToText($s) : implode('', $s); $out->addHTML($str); } if (!$this->useSerchForm) { $out->addHTML("<p>{$sl}</p>\n"); } return $num; }