Файл: concrete5.7.5.6/concrete/blocks/search/controller.php
Строк: 157
<?php
namespace ConcreteBlockSearch;
use Database;
use CollectionAttributeKey;
use ConcreteCorePagePageList;
use ConcreteCoreBlockBlockController;
use Page;
use Core;
class Controller extends BlockController
{
protected $btTable = 'btSearch';
protected $btInterfaceWidth = "400";
protected $btInterfaceHeight = "420";
protected $btWrapperClass = 'ccm-ui';
protected $btExportPageColumns = array('postTo_cID');
protected $btCacheBlockRecord = true;
protected $btCacheBlockOutput = null;
public $title = "";
public $buttonText = ">";
public $baseSearchPath = "";
public $resultsURL = "";
public $postTo_cID = "";
protected $hColor = '#EFE795';
public function highlightedMarkup($fulltext, $highlight)
{
if (!$highlight) {
return $fulltext;
}
$this->hText = $fulltext;
$this->hHighlight = $highlight;
$this->hText = @preg_replace('#' . preg_quote($this->hHighlight, '#') . '#ui', '<span style="background-color:'. $this->hColor .';">$0</span>', $this->hText);
return $this->hText;
}
public function highlightedExtendedMarkup($fulltext, $highlight)
{
$text = @preg_replace("#n|r#", ' ', $fulltext);
$matches = array();
$highlight = str_replace(array('"', "'", """), '', $highlight); // strip the quotes as they mess the regex
if (!$highlight) {
$text = Core::make('helper/text')->shorten($fulltext, 180);
if (strlen($fulltext) > 180) {
$text .= '…<wbr>';
}
return $text;
}
$regex = '([[:alnum:]|'|.|_|s]{0,45})'. preg_quote($highlight, '#') .'([[:alnum:]|.|_|s]{0,45})';
preg_match_all("#$regex#ui", $text, $matches);
if (!empty($matches[0])) {
$body_length = 0;
$body_string = array();
foreach ($matches[0] as $line) {
$body_length += strlen($line);
$r = $this->highlightedMarkup($line, $highlight);
if ($r) {
$body_string[] = $r;
}
if ($body_length > 150) {
break;
}
}
if (!empty($body_string)) {
return @implode("…<wbr>", $body_string);
}
}
}
public function setHighlightColor($color)
{
$this->hColor = $color;
}
/**
* Used for localization. If we want to localize the name/description we have to include this.
*/
public function getBlockTypeDescription()
{
return t("Add a search box to your site.");
}
public function getBlockTypeName()
{
return t("Search");
}
public function __construct($obj = null)
{
parent::__construct($obj);
}
public function indexExists()
{
$db = Database::connection();
$numRows = $db->GetOne('select count(cID) from PageSearchIndex');
return ($numRows > 0);
}
public function cacheBlockOutput()
{
if ($this->btCacheBlockOutput === null) {
$this->btCacheBlockOutput = (($this->postTo_cID !== '' || $this->resultsURL !== '') && empty($_REQUEST['query']));
}
return $this->btCacheBlockOutput;
}
public function view()
{
$c = Page::getCurrentPage();
$this->set('title', $this->title);
$this->set('buttonText', $this->buttonText);
$this->set('baseSearchPath', $this->baseSearchPath);
$this->set('postTo_cID', $this->postTo_cID);
$resultsURL = $c->getCollectionPath();
if ($this->resultsURL != '') {
$resultsURL = $this->resultsURL;
} elseif ($this->postTo_cID != '') {
$resultsPage = Page::getById($this->postTo_cID);
$resultsURL = $resultsPage->cPath;
}
$resultsURL = Core::make('helper/text')->encodePath($resultsURL);
$this->set('resultTargetURL', $resultsURL);
//run query if display results elsewhere not set, or the cID of this page is set
if ($this->postTo_cID == '' && $this->resultsURL == '') {
if (!empty($_REQUEST['query']) || isset($_REQUEST['akID']) || isset($_REQUEST['month'])) {
$this->do_search();
}
}
}
public function save($data)
{
$data += array(
'title' => '',
'buttonText' => '',
'baseSearchPath' => '',
'searchUnderCID' => 0,
'postTo_cID' => 0,
'externalTarget' => 0,
'resultsURL' => '',
);
$args = array();
$args['title'] = $data['title'];
$args['buttonText'] = $data['buttonText'];
$args['baseSearchPath'] = $data['baseSearchPath'];
if ($args['baseSearchPath'] == 'OTHER' && intval($data['searchUnderCID']) > 0) {
$customPathC = Page::getByID(intval($data['searchUnderCID']));
if (!$customPathC) {
$args['baseSearchPath'] = '';
} else {
$args['baseSearchPath'] = $customPathC->getCollectionPath();
}
}
if (trim($args['baseSearchPath']) == '/' || strlen(trim($args['baseSearchPath'])) == 0) {
$args['baseSearchPath'] = '';
}
if (intval($data['postTo_cID']) > 0) {
$args['postTo_cID'] = intval($data['postTo_cID']);
} else {
$args['postTo_cID'] = '';
}
$args['resultsURL'] = ($data['externalTarget'] == 1 && strlen($data['resultsURL']) > 0) ? trim($data['resultsURL']) : '';
parent::save($args);
}
public $reservedParams = array('page=','query=','search_paths[]=','submit=','search_paths%5B%5D=');
public function do_search()
{
$q = $_REQUEST['query'];
// i have NO idea why we added this in rev 2000. I think I was being stupid. - andrew
// $_q = trim(preg_replace('/[^A-Za-z0-9s']/i', ' ', $_REQUEST['query']));
$_q = $q;
$ipl = new PageList();
$aksearch = false;
if (is_array($_REQUEST['akID'])) {
foreach ($_REQUEST['akID'] as $akID => $req) {
$fak = CollectionAttributeKey::getByID($akID);
if (is_object($fak)) {
$type = $fak->getAttributeType();
$cnt = $type->getController();
$cnt->setAttributeKey($fak);
$cnt->searchForm($ipl);
$aksearch = true;
}
}
}
if (isset($_REQUEST['month']) && isset($_REQUEST['year'])) {
$year = @intval($_REQUEST['year']);
$month = abs(@intval($_REQUEST['month']));
if (strlen(abs($year)) < 4) {
$year = (($year < 0) ? '-' : '') . str_pad($year, 4, '0', STR_PAD_LEFT);
}
if ($month < 12) {
$month = str_pad($month, 2, '0', STR_PAD_LEFT);
}
$daysInMonth = date('t', strtotime("$year-$month-01"));
$dh = Core::make('helper/date');
/* @var $dh ConcreteCoreLocalizationServiceDate */
$start = $dh->toDB("$year-$month-01 00:00:00", 'user');
$end = $dh->toDB("$year-$month-$daysInMonth 23:59:59", 'user');
$ipl->filterByPublicDate($start, '>=');
$ipl->filterByPublicDate($end, '<=');
$aksearch = true;
}
if (empty($_REQUEST['query']) && $aksearch == false) {
return false;
}
if (isset($_REQUEST['query'])) {
$ipl->filterByKeywords($_q);
}
if (is_array($_REQUEST['search_paths'])) {
foreach ($_REQUEST['search_paths'] as $path) {
if (!strlen($path)) {
continue;
}
$ipl->filterByPath($path);
}
} elseif ($this->baseSearchPath != '') {
$ipl->filterByPath($this->baseSearchPath);
}
// TODO fix this
//$ipl->filter(false, '(ak_exclude_search_index = 0 or ak_exclude_search_index is null)');
$pagination = $ipl->getPagination();
$results = $pagination->getCurrentPageResults();
$this->set('query', $q);
$this->set('results', $results);
$this->set('do_search', true);
$this->set('searchList', $ipl);
$this->set('pagination', $pagination);
}
}