sSearch = $sSearch; } function renderData($aDataRow) { $iDocumentId =& $aDataRow['document']->getId(); $aLocs = array(); $bFound = true; $iLastFound = 0; $iNumFound = 0; while ($bFound && $iNumFound < 5) { $sQuery = "SELECT LOCATE(?, document_text, ?) AS posi FROM document_searchable_text WHERE document_id = ?"; $aParams = array($this->sSearch, $iLastFound + 1, $iDocumentId); $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'posi'); if (PEAR::isError($res)) { var_dump($res); exit(0); } if (empty($res)) { break; } $iNumFound++; $iLastFound = $res; $bFound = $res; if ($iLastFound) { $aLocs[] = $iLastFound; } } $iBack = 20; $iForward = 50; $aTexts = array(); foreach ($aLocs as $iLoc) { $iThisForward = $iForward; $iThisBack = $iBack; if ($iLoc - $iBack < 0) { $iThisForward = $iForward + $iLoc; $iThisBack = 0; $iLoc = 1; } $sQuery = "SELECT SUBSTRING(document_text FROM ? FOR ?) AS text FROM document_searchable_text WHERE document_id = ?"; $aParams = array($iLoc - $iThisBack, $iThisForward + $iThisBack, $iDocumentId); $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'text'); if (PEAR::isError($res)) { var_dump($res); exit(0); } $res = htmlentities($res); $aSearch = array(sprintf('#(%s)#i', $this->sSearch)); $aReplace = array('  \1  '); $sText = preg_replace($aSearch, $aReplace, $res); $aFirstSpace = array(strpos($sText, " "), strpos($sText, "\n")); $iFirstSpace = false; foreach ($aFirstSpace as $iPos) { if ($iFirstSpace === false) { $iFirstSpace = $iPos; continue; } if ($iPos === false) { continue; } if ($iPos < $iFirstSpace) { $iFirstSpace = $iPos; } } if ($iFirstSpace === false) { $iFirstSpace = -1; } $iLastSpace = strrpos($sText, " "); $sText = substr($sText, $iFirstSpace + 1, $iLastSpace - $iFirstSpace - 1); $sText = str_replace("  ", "", $sText); $sText = str_replace("  ", "", $sText); $aTexts[] = $sText; } $sFullTexts = join(" … ", $aTexts); return sprintf('
%s
%s
', parent::renderData($aDataRow), $sFullTexts); } } class SimpleSearchDispatcher extends KTStandardDispatcher { var $sSection = "search"; var $browseType; function SimpleSearchDispatcher() { $this->aBreadcrumbs = array( array('action' => 'browse', 'name' => _kt('Browse')), array('name' => _kt('Simple Search')) ); return parent::KTStandardDispatcher(); } function do_main() { $aErrorOptions = array( "message" => _kt("Please provide a search term"), ); $searchable_text = sanitizeForSQL(KTUtil::arrayGet($_REQUEST, "fSearchableText")); $this->oValidator->notEmpty($searchable_text, $aErrorOptions); $collection = new AdvancedCollection; $oColumnRegistry = KTColumnRegistry::getSingleton(); $aColumns = $oColumnRegistry->getColumnsForView('ktcore.views.search'); $collection->addColumns($aColumns); // set a view option $aTitleOptions = array( 'documenturl' => $GLOBALS['KTRootUrl'] . '/view.php', 'direct_folder' => true, ); $collection->setColumnOptions('ktcore.columns.title', $aTitleOptions); // set the selection options $collection->setColumnOptions('ktcore.columns.selection', array( 'rangename' => 'selection', 'show_folders' => true, 'show_documents' => true, )); $aOptions = $collection->getEnvironOptions(); // extract data from the environment $aOptions['return_url'] = KTUtil::addQueryStringSelf("fSearchableText=" . urlencode($searchable_text)); $aOptions['empty_message'] = _kt("No documents or folders match this query."); $aOptions['is_browse'] = true; $collection->setOptions($aOptions); $collection->setQueryObject(new SimpleSearchQuery($searchable_text)); $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("kt3/browse"); $aTemplateData = array( "context" => $this, "collection" => $collection, 'isEditable' => true, 'bulkactions' => KTBulkActionUtil::getAllBulkActions(), 'browseutil' => new KTBrowseUtil(), 'returnaction' => 'simpleSearch', 'returndata' => $searchable_text, ); return $oTemplate->render($aTemplateData); } } $oDispatcher = new SimpleSearchDispatcher(); $oDispatcher->dispatch(); ?>