Пару вопросов о 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>{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}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}<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 сниппет не начнет его поддерживать.            
                    не работает в чанке 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.
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    
             
             
                    
                    
                






