Пару вопросов о Fenom
Добрый день. В ходе работы возникла пару проблем которые уже как несколько дней не удаётся побороть, скорей всего из за нехватки опыта. Буду благодарен за помощь, если кто то сталкивался с подобным.
1. Модуль SimpleSearch, не могу разобраться как правильно привести чанк к Fenom'у
p.s. менеджерам не удобно из корня двигаться к папкам.
1. Модуль SimpleSearch, не могу разобраться как правильно привести чанк к Fenom'у
<form action="[[~[[+landing:default=`[[*id]]`]]]]" method="[[+method:default=`get`]]" role="form">
<input type="hidden" name="id" value="[[+landing:default=[[*id]]]]" />
<input type="text" class="form-control" name="[[+searchIndex]]" id="[[+searchIndex]]" value="[[+searchValue]]" placeholder="Поиск...">
</form>
2. Для вывода информации из MIGX использовал следующую конструкцию{foreach $_modx->resource['gallery.Projects'] | fromJSON as $item}
<div class="gallery-item photography">
<div class="thumb">
<a href="{$item['image']}">
<img class="img-fullwidth lazy" src="{$item['image']|phpthumbon:'w=470&h=320&zc=1'}" alt="">
</a>
</div>
</div>
{/foreach}
Вроде бы всё хорошо, но вывод не учитывает источник файлов, для {$item['image']} в целом можно подставить просто перед выводом кусок адреса, на уровне assets/userfiles/{$item['image']}, а вот с {$item['image']|phpthumbon:'w=470&h=320&zc=1'} это не работает. Есть ли способ сделать вывод с учётом источника файлов? p.s. менеджерам не удобно из корня двигаться к папкам.
Комментарии: 17
1. SimpleSearch не поддерживает Fenom, так что используйте обычный синтаксис
2. С картинками можно делать так
2. С картинками можно делать так
{set $image = 'phpthumbon' | snippet : [
'input' => '/assets/userfiles/'~$item['image'],
'options' => 'w=470&h=320&zc=1'
]}
<img class="img-fullwidth lazy" src="{$image}" alt="">
На всякий случай оставлю это здесь:
SimpleSearch 2.1.0
========================================================================
— Added pdoParser support
— Fix XSS security issue
SimpleSearch 2.1.0
========================================================================
— Added pdoParser support
— Fix XSS security issue
1. SimpleSearch не поддерживает Fenom, так что используйте обычный синтаксисПочему не поддерживает??? Всё прекрасно работает.
{'!SimpleSearchForm' | snippet : [
'tpl' => 'search.form'
]}
{'!SimpleSearch' | snippet}
search.form<form action="{($landing ?: $_modx->resource.id) | url}" method="{$method ?: 'get'}" role="form">
<input type="hidden" name="id" value="{($landing ?: $_modx->resource.id) | url}" />
<input type="text" class="form-control" name="{$searchIndex}" id="{$searchIndex}" value="{$searchValue}" placeholder="Поиск...">
</form>
Пробовал на последнем проекте, не работает в чанке fenom синтаксис.
{'!SimpleSearchForm' | snippet : [
'tpl' => 'search.form',
'searchIndex' => 'test'
]}
[[!SimpleSearch? &searchIndex=`test`]]
Вот так всё прекрасно работает. {'!SimpleSearch' | snippet : ['searchIndex' => 'test']}
Работает поиск, но не работает Fenom в чанке 'search.form'.
Ну вопрос то был про поддержку синтаксиса сниппетом, от того что вызов написать в синтаксисе fenom сниппет не начнет его поддерживать.
не работает в чанке fenom синтаксис.Я ответил, как он работает. Частично поддерживает fenom при определенных условия. В чанке он работает при вызове SimpleSearch в синтаксисе smarty
На самом деле оригинальный компонент не обновлялся уже очень давно — 6 лет.
Даже форк компонента последний раз обновлялся 2-3 года назад.
Даже форк компонента последний раз обновлялся 2-3 года назад.
Может кто знает, какие правки нужно внести в код сниппетов SimpleSearch и SimpleSearchForm, чтобы они начали понимать Fenom? Весь сайт на Феноме написан, не хочется запускать стандартный парсер.
Если там ничего мудреного нету, то подключить в них pdoTools и заменить все вызовы чанков через него:
Так же можно сделать простейший поиск через pdoPage
//подключаем в начале сниппета
$pdo = $modx->getSetvice('pdoFetch');
//далее везде в сниппете заменить
$modx->getChunk
// на обработку через pdoTools
$pdo->getChunk
Так же можно сделать простейший поиск через pdoPage
{'!pdoPage' | snippet : [
'parents' => 0,
'includeContent' => 1,
'context' => $_modx->context.key,
'where' => [
[
'context_key' => $_modx->context.key
],
[
'AND:pagetitle:LIKE' => '%'~ $.get.search | escape ~'%',
'OR:introtext:LIKE' => '%'~ $.get.search | escape ~'%',
'OR:content:LIKE' => '%'~ $.get.search | escape ~'%'
]
] | toJSON,
'tpl' => ''
]}
А если pdoTools не установлен? Можно включить поддержку fenom, а если его нет, то использовать обычный синтаксис MODX?
Ну если не установлен, то стандартный синтаксис и simpleSearch. Написали выше, что весь сайт на fenom.
Это если свой сниппет и знаешь установлен pdotools или нет, тогда сам и решаешь какой синтаксис использовать.
А можно ли добавить в сниппет проверку: если установлен pdotools, то использовать синтаксис fenom, а если нет — то обычный?
А можно ли добавить в сниппет проверку: если установлен pdotools, то использовать синтаксис fenom, а если нет — то обычный?
Пишете функцию в которой проверяете наличие pdoTools, с помощью этой функции потом уже обрабатываете чанки.
Из formit пример
Из formit пример
function getChunk($name,$properties = array()) {
if (class_exists('pdoTools') && $pdo = $this->modx->getService('pdoTools')) {
return $pdo->getChunk($name, $properties);
}
...
}
Понял. Спасибо!
Спасибо! Я решил отказаться от компонента SimpleSearch (он, если честно, мне не сильно нравился) в пользу Вашего предложения с pdoPage — работает отлично. Единственное, не знаю как вывести «extract» (кусок текста до и после искомого слова), но это мелочи. К тому же, используя pdoResources можно в будущем расширить функционал поиска и подключить ТВ поля (SimpleSearch поиск по ТВ полям не поддерживает). Вообще, есть ещё много компонентов, которые пока ещё не поддерживают работу с Fenom. Возможно, есть какое-то универсальное решение для таких компонентов, вроде плагина, который бы проверял наличие pdoTools и подменял парсер?
Для extract можно взять функцию из simpleSearch и сделать сниппет
Использовать можно как сниппет или модификатор
По-умолчанию ищет параметр $_GET['search'], если нет параметра, то ищет опцию search, иначе возвращает текст.
Найденное выражение оборачивает в span с классом extract.
<?php
$search = $modx->getOption('search', $scriptProperties, $_GET['search']);
$text = (isset($input)) ? $input : $modx->getOption('text', $scriptProperties, '');
$length = (isset($options)) ? $options : $modx->getOption('length', $scriptProperties, 200);
$ellipsis = $modx->getOption('ellipsis', $scriptProperties, '...');
if (empty($search) || empty($text)) {
return $text;
}
if (!function_exists('createExtract')) {
function createExtract($text, $length = 200, $search = '', $ellipsis = '...') {
global $modx;
$text = strip_tags($text);
$text = preg_replace('/(\[\[\+.*?\]\])/i', '', $text);
$text = $modx->stripTags($text);
$text = trim(preg_replace('/\s+/u', ' ', $text));
if (empty($text)) return '';
$useMb = $modx->getOption('use_multibyte',null,false) && function_exists('mb_strlen');
$encoding = $modx->getOption('modx_charset',null,'UTF-8');
$trimChars = "\t\r\n -_()!~?=+/*\\,.:;\"'[]{}`&";
if ($useMb) {
$wordPos = mb_strpos(mb_strtolower($text,$encoding), mb_strtolower($search,$encoding),null,$encoding);
$halfSide = intval($wordPos - $length / 2 + mb_strlen($search, $encoding) / 2);
if ($halfSide > 0) {
$halfText = mb_substr($text, 0, $halfSide, $encoding);
$pos_start = max(mb_strrpos($halfText, ' ', 0, $encoding), mb_strrpos($halfText, '.', 0, $encoding));
if (!$pos_start) {
$pos_start = 0;
}
} else {
$pos_start = 0;
}
if ($wordPos && $halfSide > 0) {
$l = $pos_start + $length - 1;
$realLength = mb_strlen($text,$encoding);
if ($l > $realLength) { $l = $realLength; }
$pos_end = min(mb_strpos($text, ' ',$l, $encoding), mb_strpos($text, '.', $l, $encoding)) - $pos_start;
if (!$pos_end || $pos_end <= 0) {
$extract = $ellipsis . ltrim(mb_substr($text, $pos_start, mb_strlen($text, $encoding), $encoding), $trimChars);
} else {
$extract = $ellipsis . trim(mb_substr($text, $pos_start, $pos_end, $encoding), $trimChars) . $ellipsis;
}
} else {
$l = $length - 1;
$trueLength = mb_strlen($text,$encoding);
if ($l > $trueLength) $l = $trueLength;
$pos_end = min(mb_strpos($text, ' ',$l, $encoding), mb_strpos($text, '.', $l, $encoding));
if ($pos_end) {
$extract = rtrim(mb_substr($text, 0, $pos_end, $encoding), $trimChars) . $ellipsis;
} else {
$extract = $text;
}
}
} else {
$wordPos = strpos(strtolower($text), strtolower($search));
$halfSide = intval($wordPos - $length / 2 + strlen($search) / 2);
if ($halfSide > 0) {
$halfText = substr($text, 0, $halfSide);
$pos_start = max(strrpos($halfText, ' '), strrpos($halfText, '.'));
if (!$pos_start) {
$pos_start = 0;
}
} else {
$pos_start = 0;
}
if ($wordPos && $halfSide > 0) {
$l = $pos_start + $length - 1;
$realLength = strlen($text);
if ($l > $realLength) { $l = $realLength; }
$pos_end = min(strpos($text, ' ', $l), strpos($text, '.', $l)) - $pos_start;
if (!$pos_end || $pos_end <= 0) {
$extract = $ellipsis . ltrim(substr($text, $pos_start), $trimChars);
} else {
$extract = $ellipsis . trim(substr($text, $pos_start, $pos_end), $trimChars) . $ellipsis;
}
} else {
$pos_end = min(strpos($text, ' ', $length - 1), strpos($text, '.', $length - 1));
if ($pos_end) {
$extract = rtrim(substr($text, 0, $pos_end), $trimChars) . $ellipsis;
} else {
$extract = $text;
}
}
}
return $extract;
}
}
$extract = createExtract($text, $length, $search, $ellipsis);
$extract = strip_tags(preg_replace("#\<!--(.*?)--\>#siu",'',$extract));
$extract = preg_replace("#\[\[(.*?)\]\]#siu",'',$extract);
$extract = str_replace(array('[[',']]'),'',$extract);
$output = preg_replace("/$search/iu", "<span class=\"extract\">$0</span>", $extract);
return $output;
Использовать можно как сниппет или модификатор
// модификатор если есть $_GET['search']
{$content | extract : 100}
// сниппет
{'extract' | snippet : [
'text' => $content,
'search' => $.get.search,
'length' => 200,
'ellipsis' => '...'
]}
//минимальный вызов если есть $_GET['search']
{'extract' | snippet : [
'text' => $content
]}
По-умолчанию ищет параметр $_GET['search'], если нет параметра, то ищет опцию search, иначе возвращает текст.
Найденное выражение оборачивает в span с классом extract.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.