Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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;
 }
Example #3
0
 /**
  * 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;
 }
Example #4
0
 /**
  * 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;
 }
Example #7
0
 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;
 }
Example #8
0
 /**
  * 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);
 }
Example #10
0
 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;
 }
Example #11
0
 /**
  * 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);
 }
Example #13
0
 /**
  * @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;
 }