10Syaroslav@ivinco.com<?php 20Syaroslav@ivinco.com/** 312Syaroslav@ivinco.com * Script to search in dokuwiki documents 40Syaroslav@ivinco.com * 512Syaroslav@ivinco.com * @author Yaroslav Vorozhko <yaroslav@ivinco.com> 60Syaroslav@ivinco.com */ 70Syaroslav@ivinco.com 80Syaroslav@ivinco.comif(!defined('DOKU_INC')) die(); 90Syaroslav@ivinco.comif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 100Syaroslav@ivinco.com 116Syaroslav@ivinco.comrequire_once(DOKU_INC.'inc/parser/parser.php'); 126Syaroslav@ivinco.com 130Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'action.php'); 140Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/sphinxapi.php'); 150Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/PageMapper.php'); 160Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/SphinxSearch.php'); 176Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/functions.php'); 180Syaroslav@ivinco.com 190Syaroslav@ivinco.com 200Syaroslav@ivinco.comclass action_plugin_sphinxsearch extends DokuWiki_Action_Plugin { 2143Syaroslav@ivinco.com var $_search = null; 220Syaroslav@ivinco.com 23110Syaroslav var $_helpMessage = ''; 24110Syaroslav var $_versionNumber = '0.3.6'; 25110Syaroslav 26110Syaroslav /** 27110Syaroslav * return some info 28110Syaroslav */ 29110Syaroslav function getInfo() { 30110Syaroslav return confToHash(dirname(__FILE__).'/plugin.info.txt'); 31110Syaroslav } 32110Syaroslav 33110Syaroslav function getHelpInfo(){ 34110Syaroslav $this->_helpMessage = " 3582Syaroslav@ivinco.com===== DokuWiki Sphinx Search plugin features===== 3682Syaroslav@ivinco.com 3785Syaroslav@ivinco.comTo use the search you need to just enter your search keywords into the searchbox at the top right corner of the DokuWiki. When basic simple search is not enough you can try using the methods listed below: 3882Syaroslav@ivinco.com 3982Syaroslav@ivinco.com=== Phrase search (\"\") === 4082Syaroslav@ivinco.comPut double quotes around a set of words to enable phrase search mode. For example: 4182Syaroslav@ivinco.com<code>\"James Bond\"</code> 4282Syaroslav@ivinco.com 4382Syaroslav@ivinco.com=== Search within a namespace === 4482Syaroslav@ivinco.comYou can add \"@ns\" parameter to limit the search to some namespace. For exapmle: 4582Syaroslav@ivinco.com<code>hotel @ns personal:mike:travel</code> 4682Syaroslav@ivinco.comSuch query will return only results from \"personal:mike:travel\" namespace for keyword \"hotel\". 4782Syaroslav@ivinco.com 4882Syaroslav@ivinco.com=== Excluding keywords or namespaces from search === 4982Syaroslav@ivinco.comYou can add a minus sign to a keyword or a category name exclude it from search. For example: 5082Syaroslav@ivinco.com<code>hotel @ns -personal:mike</code> 5182Syaroslav@ivinco.comSuch query will look for \"hotel\" everywhere except the \"personal:mike\" namespace. 5282Syaroslav@ivinco.com<code>blog -post</code> 5382Syaroslav@ivinco.comSuch query will look for documents that have keyword \"blog\" but don't have keyword \"post\". 54115Syaroslav 55*116Syaroslav 56*116Syaroslav==== ==== 57*116Syaroslav---- 58115SyaroslavDokuWiki Sphinx Search plugin (version $this->_versionNumber) by [[http://www.ivinco.com/software/dokuwiki-sphinx-search-plugin/|Ivinco]]. 5982Syaroslav@ivinco.com"; 60111Syaroslav@ivinco.com return $this->_helpMessage; 61110Syaroslav } 620Syaroslav@ivinco.com 630Syaroslav@ivinco.com /** 640Syaroslav@ivinco.com * Register to the content display event to place the results under it. 650Syaroslav@ivinco.com */ 660Syaroslav@ivinco.com /** 670Syaroslav@ivinco.com * register the eventhandlers 680Syaroslav@ivinco.com */ 690Syaroslav@ivinco.com function register(&$controller){ 7087Syaroslav@ivinco.com $controller->register_hook('TPL_CONTENT_DISPLAY', 'BEFORE', $this, 'handle_act_unknown', array()); 710Syaroslav@ivinco.com } 720Syaroslav@ivinco.com 730Syaroslav@ivinco.com /** 7497Syaroslav@ivinco.com * If our own action was given we produce our content here 750Syaroslav@ivinco.com */ 760Syaroslav@ivinco.com function handle_act_unknown(&$event, $param){ 7727Syaroslav@ivinco.com global $ACT; 7827Syaroslav@ivinco.com global $QUERY; 7927Syaroslav@ivinco.com if($ACT != 'search') return; // nothing to do for us 800Syaroslav@ivinco.com 810Syaroslav@ivinco.com // we can handle it -> prevent others 820Syaroslav@ivinco.com $event->stopPropagation(); 830Syaroslav@ivinco.com $event->preventDefault(); 840Syaroslav@ivinco.com 8591Syaroslav@ivinco.com/* if (!extension_loaded('sqlite')) { 8687Syaroslav@ivinco.com echo "SQLite extension is not loaded!"; 8787Syaroslav@ivinco.com return; 8891Syaroslav@ivinco.com }*/ 8987Syaroslav@ivinco.com 9082Syaroslav@ivinco.com if(!empty($_REQUEST['ssplugininfo'])){ 9182Syaroslav@ivinco.com $info = array(); 92111Syaroslav@ivinco.com echo p_render('xhtml',p_get_instructions($this->getHelpInfo()), $info); 9382Syaroslav@ivinco.com return; 9482Syaroslav@ivinco.com } 9527Syaroslav@ivinco.com 9643Syaroslav@ivinco.com $this->_search($QUERY,$_REQUEST['start'],$_REQUEST['prev']); 970Syaroslav@ivinco.com } 980Syaroslav@ivinco.com 990Syaroslav@ivinco.com /** 1000Syaroslav@ivinco.com * do the search and displays the result 1010Syaroslav@ivinco.com */ 10243Syaroslav@ivinco.com function _search($query, $start, $prev) { 10326Syaroslav@ivinco.com global $conf; 1040Syaroslav@ivinco.com 1050Syaroslav@ivinco.com $start = (int) $start; 10644Syaroslav@ivinco.com if($start < 0){ 10744Syaroslav@ivinco.com $start = 0; 10844Syaroslav@ivinco.com } 10944Syaroslav@ivinco.com if(empty($prev)){ 11044Syaroslav@ivinco.com $prev = 0; 11144Syaroslav@ivinco.com } 1120Syaroslav@ivinco.com 11363Syaroslav@ivinco.com $categories = $this->_getCategories($query); 11467Syaroslav@ivinco.com $keywords = $this->_getKeywords($query); 1150Syaroslav@ivinco.com 1160Syaroslav@ivinco.com $search = new SphinxSearch($this->getConf('host'), $this->getConf('port'), $this->getConf('index')); 11716Syaroslav@ivinco.com $search->setSnippetSize($this->getConf('snippetsize')); 11831Syaroslav@ivinco.com $search->setArroundWordsCount($this->getConf('aroundwords')); 11919Syaroslav@ivinco.com $search->setTitlePriority($this->getConf('title_priority')); 12019Syaroslav@ivinco.com $search->setBodyPriority($this->getConf('body_priority')); 12180Syaroslav@ivinco.com $search->setNamespacePriority($this->getConf('namespace_priority')); 12280Syaroslav@ivinco.com $search->setPagenamePriority($this->getConf('pagename_priority')); 12369Syaroslav@ivinco.com 12469Syaroslav@ivinco.com if (!empty($keywords) && empty($categories)){ 12569Syaroslav@ivinco.com $search->setSearchAllQuery($keywords, $categories); 12679Syaroslav@ivinco.com } elseif (!empty($keywords)) { 12779Syaroslav@ivinco.com $search->setSearchAllQueryWithCategoryFilter($keywords, $categories); 12869Syaroslav@ivinco.com } else { 12982Syaroslav@ivinco.com echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br> 13082Syaroslav@ivinco.com <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>'; 13179Syaroslav@ivinco.com return; 13269Syaroslav@ivinco.com } 13369Syaroslav@ivinco.com $result = $search->search($start, $this->getConf('maxresults')); 13443Syaroslav@ivinco.com $this->_search = $search; 13528Syaroslav@ivinco.com 13688Syaroslav@ivinco.com if ($search->getError()){ 13789Syaroslav@ivinco.com echo "Could not connect to Sphinx search engine."; 13828Syaroslav@ivinco.com return; 13928Syaroslav@ivinco.com } 14069Syaroslav@ivinco.com 14193Syaroslav@ivinco.com if(!$result){ 14293Syaroslav@ivinco.com echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/> 14393Syaroslav@ivinco.com <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>'; 14493Syaroslav@ivinco.com return; 14593Syaroslav@ivinco.com } 14693Syaroslav@ivinco.com 14777Syaroslav@ivinco.com $pagesList = $search->getPages($keywords); 1484Syaroslav@ivinco.com 1490Syaroslav@ivinco.com $totalFound = $search->getTotalFound(); 15093Syaroslav@ivinco.com if(empty($pagesList) || 0 == $totalFound){ 15182Syaroslav@ivinco.com echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/> 15282Syaroslav@ivinco.com <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>'; 15327Syaroslav@ivinco.com return; 15427Syaroslav@ivinco.com } else { 15527Syaroslav@ivinco.com echo '<style type="text/css"> 15651Syaroslav@ivinco.com div.dokuwiki .search{ 15751Syaroslav@ivinco.com width:1024px; 15851Syaroslav@ivinco.com } 15927Syaroslav@ivinco.com div.dokuwiki .search_snippet{ 16027Syaroslav@ivinco.com color:#000000; 16127Syaroslav@ivinco.com margin-left:0px; 16239Syaroslav@ivinco.com font-size: 13px; 16339Syaroslav@ivinco.com } 16439Syaroslav@ivinco.com div.dokuwiki .search_result{ 16551Syaroslav@ivinco.com width:600px; 16639Syaroslav@ivinco.com float:left; 16739Syaroslav@ivinco.com } 16850Syaroslav@ivinco.com div.dokuwiki .search_result a.title{ 16950Syaroslav@ivinco.com font:16px Arial,Helvetica,sans-serif; 17050Syaroslav@ivinco.com } 17150Syaroslav@ivinco.com div.dokuwiki .search_result span{ 17251Syaroslav@ivinco.com font:12px Arial,Helvetica,sans-serif; 17350Syaroslav@ivinco.com } 17439Syaroslav@ivinco.com div.dokuwiki .search_sidebar{ 17550Syaroslav@ivinco.com width:300px; 17639Syaroslav@ivinco.com float:right; 17739Syaroslav@ivinco.com margin-right: 30px; 17839Syaroslav@ivinco.com } 17939Syaroslav@ivinco.com div.dokuwiki .search_result_row{ 18039Syaroslav@ivinco.com color:#000000; 18139Syaroslav@ivinco.com margin-left:0px; 18250Syaroslav@ivinco.com width:600px; 18350Syaroslav@ivinco.com text-align:left; 18439Syaroslav@ivinco.com } 18539Syaroslav@ivinco.com div.dokuwiki .search_result_row_child{ 18639Syaroslav@ivinco.com color:#000000; 18739Syaroslav@ivinco.com margin-left:30px; 18850Syaroslav@ivinco.com width:600px; 18950Syaroslav@ivinco.com text-align:left; 19050Syaroslav@ivinco.com } 19150Syaroslav@ivinco.com div.dokuwiki .hide{ 19250Syaroslav@ivinco.com display:none; 19327Syaroslav@ivinco.com } 19427Syaroslav@ivinco.com div.dokuwiki .search_cnt{ 19550Syaroslav@ivinco.com color:#909090; 19651Syaroslav@ivinco.com font:12px Arial,Helvetica,sans-serif; 19727Syaroslav@ivinco.com } 19827Syaroslav@ivinco.com div.dokuwiki .search_nmsp{ 19927Syaroslav@ivinco.com font-size: 10px; 20027Syaroslav@ivinco.com } 20139Syaroslav@ivinco.com div.dokuwiki .sphinxsearch_nav{ 20239Syaroslav@ivinco.com clear:both; 20339Syaroslav@ivinco.com } 20427Syaroslav@ivinco.com </style> 20550Syaroslav@ivinco.com <script type="text/javascript"> 20650Syaroslav@ivinco.comfunction sh(id) 20750Syaroslav@ivinco.com{ 20850Syaroslav@ivinco.com var e = document.getElementById(id); 20950Syaroslav@ivinco.com if(e.style.display == "block") 21050Syaroslav@ivinco.com e.style.display = "none"; 21150Syaroslav@ivinco.com else 21250Syaroslav@ivinco.com e.style.display = "block"; 21350Syaroslav@ivinco.com} 21451Syaroslav@ivinco.com</script> 21550Syaroslav@ivinco.com'; 21627Syaroslav@ivinco.com 21752Syaroslav@ivinco.com echo '<h2>Found '.$totalFound . ($totalFound == 1 ? ' match ' : ' matches ') . ' for query "' . hsc($query).'"</h2>'; 21851Syaroslav@ivinco.com echo '<div class="search">'; 21927Syaroslav@ivinco.com echo '<div class="search_result">'; 22027Syaroslav@ivinco.com // printout the results 22143Syaroslav@ivinco.com $pageListGroupByPage = array(); 22243Syaroslav@ivinco.com foreach ($pagesList as $row) { 22327Syaroslav@ivinco.com $page = $row['page']; 22443Syaroslav@ivinco.com if(!isset ($pageListGroupByPage[$page])){ 22543Syaroslav@ivinco.com $pageListGroupByPage[$page] = $row; 22627Syaroslav@ivinco.com } else { 22743Syaroslav@ivinco.com $pageListGroupByPage[$page]['subpages'][] = $row; 22827Syaroslav@ivinco.com } 22943Syaroslav@ivinco.com } 23043Syaroslav@ivinco.com foreach ($pageListGroupByPage as $row) { 23150Syaroslav@ivinco.com $this->_showResult($row, $keywords, false); 23243Syaroslav@ivinco.com if(!empty($row['subpages'])){ 23350Syaroslav@ivinco.com echo '<div id="more'.$row['page'].'" class="hide">'; 23443Syaroslav@ivinco.com foreach($row['subpages'] as $sub){ 23549Syaroslav@ivinco.com $this->_showResult($sub, $keywords, true); 23627Syaroslav@ivinco.com } 23750Syaroslav@ivinco.com echo '</div>'; 23827Syaroslav@ivinco.com } 23943Syaroslav@ivinco.com 2404Syaroslav@ivinco.com } 24127Syaroslav@ivinco.com echo '</div>'; 24253Syaroslav@ivinco.com echo '<div class="search_sidebar">'; 24375Syaroslav@ivinco.com printNamespacesNew($this->_getMatchingPagenames($keywords, $categories)); 24439Syaroslav@ivinco.com echo '</div>'; 24527Syaroslav@ivinco.com echo '<div class="sphinxsearch_nav">'; 24643Syaroslav@ivinco.com if ($start > 1){ 24743Syaroslav@ivinco.com if(false !== strpos($prev, ',')){ 24846Syaroslav@ivinco.com $prevArry = explode(",", $prev); 24946Syaroslav@ivinco.com $prevNum = $prevArry[count($prevArry)-1]; 25046Syaroslav@ivinco.com unset($prevArry[count($prevArry)-1]); 25146Syaroslav@ivinco.com $prevString = implode(",", $prevArry); 25243Syaroslav@ivinco.com } else { 25343Syaroslav@ivinco.com $prevNum = 0; 25443Syaroslav@ivinco.com } 2554Syaroslav@ivinco.com 25646Syaroslav@ivinco.com echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$prevNum, 'prev'=>$prevString),'false','&'), 25743Syaroslav@ivinco.com 'prev','wikilink1 gs_prev',$conf['target']['interwiki']); 25818Syaroslav@ivinco.com } 25927Syaroslav@ivinco.com echo ' '; 26043Syaroslav@ivinco.com 26139Syaroslav@ivinco.com //if($start + $this->getConf('maxresults') < $totalFound){ 26239Syaroslav@ivinco.com //$next = $start + $this->getConf('maxresults'); 26343Syaroslav@ivinco.com if($start + $search->getOffset()< $totalFound){ 26439Syaroslav@ivinco.com $next = $start + $search->getOffset(); 26545Syaroslav@ivinco.com if($start > 1){ 26646Syaroslav@ivinco.com $prevString = $prev.','.$start; 26745Syaroslav@ivinco.com } 26846Syaroslav@ivinco.com echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$next,'prev'=>$prevString),'false','&'), 26927Syaroslav@ivinco.com 'next','wikilink1 gs_next',$conf['target']['interwiki']); 27027Syaroslav@ivinco.com } 27127Syaroslav@ivinco.com echo '</div>'; 272111Syaroslav@ivinco.com echo '<a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>. '; 273111Syaroslav@ivinco.com echo 'DokuWiki Sphinx Search plugin (version '.$this->_versionNumber.') by <a href="http://www.ivinco.com/software/dokuwiki-sphinx-search-plugin/">Ivinco</a>.'; 27451Syaroslav@ivinco.com echo '</div>'; 2750Syaroslav@ivinco.com } 27651Syaroslav@ivinco.com 2770Syaroslav@ivinco.com 2780Syaroslav@ivinco.com } 2790Syaroslav@ivinco.com 28049Syaroslav@ivinco.com function _showResult($row, $keywords, $subpages = false) 28143Syaroslav@ivinco.com { 28243Syaroslav@ivinco.com $page = $row['page']; 28343Syaroslav@ivinco.com $bodyExcerpt = $row['bodyExcerpt']; 28443Syaroslav@ivinco.com $titleTextExcerpt = $row['titleTextExcerpt']; 28543Syaroslav@ivinco.com $hid = $row['hid']; 28643Syaroslav@ivinco.com 28743Syaroslav@ivinco.com $metaData = p_get_metadata($page); 28843Syaroslav@ivinco.com 28943Syaroslav@ivinco.com if (!empty($titleTextExcerpt)){ 29043Syaroslav@ivinco.com $titleText = $titleTextExcerpt; 29143Syaroslav@ivinco.com } elseif(!empty($row['title_text'])){ 29243Syaroslav@ivinco.com $titleText = $row['title_text']; 29343Syaroslav@ivinco.com } elseif(!empty($metaData['title'])){ 29443Syaroslav@ivinco.com $titleText = hsc($metaData['title']); 29543Syaroslav@ivinco.com } else { 29643Syaroslav@ivinco.com $titleText = hsc($page); 29743Syaroslav@ivinco.com } 29843Syaroslav@ivinco.com 29943Syaroslav@ivinco.com $namespaces = getNsLinks($page, $keywords, $this->_search); 30043Syaroslav@ivinco.com $href = !empty($hid) ? (wl($page).'#'.$hid) : wl($page); 30143Syaroslav@ivinco.com 30246Syaroslav@ivinco.com if($subpages){ 30346Syaroslav@ivinco.com echo '<div class="search_result_row_child">'; 30443Syaroslav@ivinco.com } else { 30546Syaroslav@ivinco.com echo '<div class="search_result_row">'; 30643Syaroslav@ivinco.com } 30743Syaroslav@ivinco.com 30850Syaroslav@ivinco.com echo '<a class="wikilink1 title" href="'.$href.'" title="" >'.$titleText.'</a><br/>'; 30943Syaroslav@ivinco.com echo '<div class="search_snippet">'; 31043Syaroslav@ivinco.com echo strip_tags($bodyExcerpt, '<b>,<strong>'); 31143Syaroslav@ivinco.com echo '</div>'; 31243Syaroslav@ivinco.com $sep=':'; 31343Syaroslav@ivinco.com $i = 0; 31443Syaroslav@ivinco.com echo '<span class="search_nmsp">'; 31543Syaroslav@ivinco.com foreach ($namespaces as $name){ 31643Syaroslav@ivinco.com $link = $name['link']; 31743Syaroslav@ivinco.com $pageTitle = $name['title']; 31851Syaroslav@ivinco.com tpl_link($link, $pageTitle); 31943Syaroslav@ivinco.com if ($i++ < count($namespaces)-1){ 32043Syaroslav@ivinco.com echo $sep; 32143Syaroslav@ivinco.com } 32243Syaroslav@ivinco.com } 32343Syaroslav@ivinco.com if (!empty($hid)){ 32443Syaroslav@ivinco.com echo '#'.$hid; 32543Syaroslav@ivinco.com } 32643Syaroslav@ivinco.com echo '</span>'; 32757Syaroslav@ivinco.com 32857Syaroslav@ivinco.com if (!empty($metaData['last_change']['date'])){ 32957Syaroslav@ivinco.com echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['last_change']['date']).'</span> '; 33057Syaroslav@ivinco.com } else if (!empty($metaData['date']['created'])){ 33157Syaroslav@ivinco.com echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['date']['created']).'</span> '; 33257Syaroslav@ivinco.com } 33357Syaroslav@ivinco.com 33457Syaroslav@ivinco.com if(!empty($metaData['last_change']['user'])){ 33557Syaroslav@ivinco.com echo '<span class="search_cnt">by '.$metaData['last_change']['user'].'</span> '; 33657Syaroslav@ivinco.com } else if(!empty($metaData['creator'])){ 33757Syaroslav@ivinco.com echo '<span class="search_cnt">by '.$metaData['creator'].'</span> '; 33857Syaroslav@ivinco.com } 33957Syaroslav@ivinco.com 34050Syaroslav@ivinco.com if (!empty($row['subpages'])){ 34150Syaroslav@ivinco.com echo '<br />'; 34251Syaroslav@ivinco.com echo '<div style="text-align:right;font:12px Arial,Helvetica,sans-serif;text-decoration:underline;"><a href="javascript:void(0)" onClick="sh('."'more".$page."'".');" >More matches in this document</a></div>'; 34350Syaroslav@ivinco.com }else { 34450Syaroslav@ivinco.com echo '<br />'; 34550Syaroslav@ivinco.com } 34643Syaroslav@ivinco.com echo '<br />'; 34743Syaroslav@ivinco.com echo '</div>'; 34843Syaroslav@ivinco.com } 34943Syaroslav@ivinco.com 35082Syaroslav@ivinco.com function searchform() 35182Syaroslav@ivinco.com { 3520Syaroslav@ivinco.com global $lang; 3530Syaroslav@ivinco.com global $ACT; 3540Syaroslav@ivinco.com global $QUERY; 3550Syaroslav@ivinco.com 3560Syaroslav@ivinco.com // don't print the search form if search action has been disabled 35727Syaroslav@ivinco.com if (!actionOk('search')) return false; 3580Syaroslav@ivinco.com 3590Syaroslav@ivinco.com print '<form action="'.wl().'" accept-charset="utf-8" class="search" id="dw__search"><div class="no">'; 36027Syaroslav@ivinco.com print '<input type="hidden" name="do" value="search" />'; 3610Syaroslav@ivinco.com print '<input type="text" '; 36227Syaroslav@ivinco.com if($ACT == 'search') print 'value="'.htmlspecialchars($QUERY).'" '; 3630Syaroslav@ivinco.com print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[ALT+F]" />'; 3640Syaroslav@ivinco.com print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />'; 3650Syaroslav@ivinco.com print '</div></form>'; 3660Syaroslav@ivinco.com return true; 3670Syaroslav@ivinco.com } 36815Syaroslav@ivinco.com 36915Syaroslav@ivinco.com function _getCategories($query) 37015Syaroslav@ivinco.com { 37115Syaroslav@ivinco.com $categories = ''; 37215Syaroslav@ivinco.com $query = urldecode($query); 37382Syaroslav@ivinco.com if (false !== ($pos = strpos($query, "@ns"))){; 37482Syaroslav@ivinco.com $categories = substr($query, $pos + strlen("@ns")); 37515Syaroslav@ivinco.com } 37615Syaroslav@ivinco.com return trim($categories); 37715Syaroslav@ivinco.com } 37815Syaroslav@ivinco.com 37915Syaroslav@ivinco.com function _getKeywords($query) 38015Syaroslav@ivinco.com { 38115Syaroslav@ivinco.com $keywords = $query; 38215Syaroslav@ivinco.com $query = urldecode($query); 38382Syaroslav@ivinco.com if (false !== ($pos = strpos($query, "-@ns"))){; 38415Syaroslav@ivinco.com $keywords = substr($keywords, 0, $pos); 38582Syaroslav@ivinco.com }else if (false !== ($pos = strpos($query, "@ns"))){; 38663Syaroslav@ivinco.com $keywords = substr($keywords, 0, $pos); 38763Syaroslav@ivinco.com } 38815Syaroslav@ivinco.com return trim($keywords); 38915Syaroslav@ivinco.com } 39069Syaroslav@ivinco.com 39170Syaroslav@ivinco.com function _getMatchingPagenames($keywords, $categories) 39269Syaroslav@ivinco.com { 39370Syaroslav@ivinco.com $this->_search->setSearchCategoryQuery($keywords, $categories); 39480Syaroslav@ivinco.com $this->_search->setNamespacePriority($this->getConf('mp_namespace_priority')); 39580Syaroslav@ivinco.com $this->_search->setPagenamePriority($this->getConf('mp_pagename_priority')); 39680Syaroslav@ivinco.com 39777Syaroslav@ivinco.com $res = $this->_search->search(0, 10); 39869Syaroslav@ivinco.com if (!$res){ 39969Syaroslav@ivinco.com return false; 40069Syaroslav@ivinco.com } 40169Syaroslav@ivinco.com $pageIds = $this->_search->getPagesIds(); 40269Syaroslav@ivinco.com 40369Syaroslav@ivinco.com $matchPages = array(); 40469Syaroslav@ivinco.com foreach($pageIds as $page){ 40577Syaroslav@ivinco.com $matchPages[$page['page']] = $page['hid']; 40669Syaroslav@ivinco.com } 40769Syaroslav@ivinco.com return array_unique($matchPages); 40869Syaroslav@ivinco.com } 4090Syaroslav@ivinco.com} 4100Syaroslav@ivinco.com 4110Syaroslav@ivinco.com?> 412