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();
?>