Skip to content

Instantly share code, notes, and snippets.

@sergant210
Last active August 29, 2015 14:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sergant210/940510a96c460c2612c0 to your computer and use it in GitHub Desktop.
Save sergant210/940510a96c460c2612c0 to your computer and use it in GitHub Desktop.
Сниппет mSearch2Ext
<?php
/** @var array $scriptProperties */
/** @var pdoFetch $pdoFetch */
$fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
if (!$pdoClass = $modx->loadClass($fqn, '', false, true)) {return false;}
$pdoFetch = new $pdoClass($modx, $scriptProperties);
//$pdoFetch->addTime('pdoTools loaded.');
/** @var mSearch2ext $mSearch2 */
// Search in found
if (!$modx->loadClass('msearch2ext', MODX_CORE_PATH . 'components/msearch2/model/msearch2/', false, true)) {return false;}
$mSearch2 = new mSearch2ext($modx, $scriptProperties, $pdoFetch);
if (empty($queryVar)) {$queryVar = 'query';}
if (empty($parentsVar)) {$parentsVar = 'parents';}
if (empty($minQuery)) {$minQuery = $modx->getOption('index_min_words_length', null, 3, true);}
if (empty($htagOpen)) {$htagOpen = '<b>';}
if (empty($htagClose)) {$htagClose = '</b>';}
if (empty($outputSeparator)) {$outputSeparator = "\n";}
if (empty($plPrefix)) {$plPrefix = 'mse2_';}
$returnIds = !empty($returnIds);
$fastMode = !empty($fastMode);
$class = 'modResource';
$found = array();
$output = null;
$query = !empty($_REQUEST[$queryVar])
? htmlspecialchars(strip_tags(trim($_REQUEST[$queryVar])))
: '';
if (empty($resources)) {
if (empty($query) && isset($_REQUEST[$queryVar])) {
$output = $modx->lexicon('mse2_err_no_query');
}
elseif (empty($query) && !empty($forceSearch)) {
$output = $modx->lexicon('mse2_err_no_query_var');
}
elseif (!empty($query) && !preg_match('/^[0-9]{2,}$/', $query) && mb_strlen($query,'UTF-8') < $minQuery) {
$output = $modx->lexicon('mse2_err_min_query');
}
$modx->setPlaceholder($plPrefix.$queryVar, $query);
if (!empty($output)) {
return !$returnIds
? $output
: '';
}
elseif (!empty($query)) {
//***** Search in found ********/
$sinf = isset($_REQUEST['sinf']) ? true : false;
if ($sinf && isset($_SESSION['msearch2']['ids'])) {
if (isset($_SESSION['msearch2']['ids'])) $mSearch2->resources = $_SESSION['msearch2']['ids'];
}
$found = $mSearch2->Search($query);
$ids = array_keys($found);
$resources = implode(',', $ids);
$_SESSION['msearch2']['ids'] = $ids;
// ***************************** /
if (empty($found)) {
if ($returnIds) {
return '';
}
elseif (!empty($query)) {
$output = $modx->lexicon('mse2_err_no_results');
}
if (!empty($tplWrapper) && !empty($wrapIfEmpty)) {
$output = $pdoFetch->getChunk(
$tplWrapper,
array(
'output' => $output,
'total' => 0,
'query' => $query,
'parents' => $modx->getPlaceholder($plPrefix.$parentsVar),
),
$fastMode
);
}
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
$output .= '<pre class="mSearchLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
}
if (!empty($toPlaceholder)) {
$modx->setPlaceholder($toPlaceholder, $output);
return;
}
else {
return $output;
}
}
}
}
elseif (strpos($resources, '{') === 0) {
$found = $modx->fromJSON($resources);
$resources = implode(',', array_keys($found));
unset($scriptProperties['resources']);
}
/*----------------------------------------------------------------------------------*/
// Joining tables
$leftJoin = array(
'mseIntro' => array(
'class' => 'mseIntro',
'alias' => 'Intro',
'on' => '`modResource`.`id`=`Intro`.`resource`'
)
);
// Fields to select
$resourceColumns = !empty($includeContent)
? $modx->getSelectColumns($class, $class)
: $modx->getSelectColumns($class, $class, '', array('content'), true);
$select = array(
$class => $resourceColumns,
'Intro' => 'intro'
);
// Add custom parameters
foreach (array('leftJoin','select') as $v) {
if (!empty($scriptProperties[$v])) {
$tmp = $modx->fromJSON($scriptProperties[$v]);
if (is_array($tmp)) {
$$v = array_merge($$v, $tmp);
}
}
unset($scriptProperties[$v]);
}
// Default parameters
$default = array(
'class' => $class,
//,'where' => $modx->toJSON($where),
'leftJoin' => $modx->toJSON($leftJoin),
'select' => $modx->toJSON($select),
'groupby' => $class.'.id',
'fastMode' => $fastMode,
'return' => !empty($returnIds)
? 'ids'
: 'data',
'nestedChunkPrefix' => 'msearch2_',
);
if (!empty($resources)) {
$default['resources'] = is_array($resources)
? implode(',', $resources)
: $resources;
}
// Merge all properties and run!
$pdoFetch->setConfig(array_merge($default, $scriptProperties), false);
$pdoFetch->addTime('Query parameters are prepared.');
$rows = $pdoFetch->run();
// Processing results
if ($returnIds) {
return $rows;
}
elseif (!empty($rows) && is_array($rows)) {
$output = array();
foreach ($rows as $k => $row) {
// Processing main fields
$row['weight'] = isset($found[$row['id']]) ? $found[$row['id']] : '';
$row['intro'] = $mSearch2->Highlight($row['intro'], $query, $htagOpen, $htagClose);
$row['idx'] = $pdoFetch->idx++;
$tplRow = $pdoFetch->defineChunk($row);
$output[] .= empty($tplRow)
? $pdoFetch->getChunk('', $row)
: $pdoFetch->getChunk($tplRow, $row, $fastMode);
}
$pdoFetch->addTime('Returning processed chunks');
if (!empty($output)) {
$output = implode($outputSeparator, $output);
}
}
else {
$output = $modx->lexicon('mse2_err_no_results');
}
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
$output .= '<pre class="mSearchLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
}
// Return output
if (!empty($tplWrapper) && (!empty($wrapIfEmpty) || !empty($output))) {
$output = $pdoFetch->getChunk(
$tplWrapper,
array(
'output' => $output,
'total' => $modx->getPlaceholder($pdoFetch->config['totalVar']),
'query' => $modx->getPlaceholder($plPrefix.$queryVar),
'parents' => $modx->getPlaceholder($plPrefix.$parentsVar),
),
$fastMode
);
}
if (!empty($toPlaceholder)) {
$modx->setPlaceholder($toPlaceholder, $output);
}
else {
return $output;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment