Пару вопросов о Fenom

Добрый день. В ходе работы возникла пару проблем которые уже как несколько дней не удаётся побороть, скорей всего из за нехватки опыта. Буду благодарен за помощь, если кто то сталкивался с подобным.
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. менеджерам не удобно из корня двигаться к папкам.
Иванов Степан
21 июня 2017, 09:07
modx.pro
4
5 052
0

Комментарии: 17

Андрей
22 июня 2017, 08:32
+1
1. SimpleSearch не поддерживает Fenom, так что используйте обычный синтаксис

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="">
    unreal_serg
    15 июля 2021, 13:08
    0
    На всякий случай оставлю это здесь:

    SimpleSearch 2.1.0
    ========================================================================
    — Added pdoParser support
    — Fix XSS security issue
    Alexey Medvedev
    14 октября 2017, 15:17
    1
    +2
    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>
      Андрей
      25 января 2018, 08:36
      0
      Пробовал на последнем проекте, не работает в чанке fenom синтаксис.
        Alexey Medvedev
        25 января 2018, 10:06
        1
        0
        {'!SimpleSearchForm' | snippet : [
            'tpl' => 'search.form',
            'searchIndex' => 'test'
        ]}
        [[!SimpleSearch? &searchIndex=`test`]]
        Вот так всё прекрасно работает.

        {'!SimpleSearch' | snippet : ['searchIndex' => 'test']}
        Работает поиск, но не работает Fenom в чанке 'search.form'.
          Андрей
          25 января 2018, 10:15
          0
          Ну вопрос то был про поддержку синтаксиса сниппетом, от того что вызов написать в синтаксисе fenom сниппет не начнет его поддерживать.
            Alexey Medvedev
            25 января 2018, 10:52
            0
            не работает в чанке fenom синтаксис.
            Я ответил, как он работает. Частично поддерживает fenom при определенных условия. В чанке он работает при вызове SimpleSearch в синтаксисе smarty
              Alexey Medvedev
              25 января 2018, 11:20
              0
              На самом деле оригинальный компонент не обновлялся уже очень давно — 6 лет.

              Даже форк компонента последний раз обновлялся 2-3 года назад.
        Олег
        23 января 2018, 22:39
        0
        Может кто знает, какие правки нужно внести в код сниппетов SimpleSearch и SimpleSearchForm, чтобы они начали понимать Fenom? Весь сайт на Феноме написан, не хочется запускать стандартный парсер.
          Андрей
          24 января 2018, 12:15
          5
          0
          Если там ничего мудреного нету, то подключить в них pdoTools и заменить все вызовы чанков через него:

          //подключаем в начале сниппета
          $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' => ''
          ]}
            Александр
            24 января 2018, 19:52
            0
            А если pdoTools не установлен? Можно включить поддержку fenom, а если его нет, то использовать обычный синтаксис MODX?
              Андрей
              24 января 2018, 20:08
              0
              Ну если не установлен, то стандартный синтаксис и simpleSearch. Написали выше, что весь сайт на fenom.
                Александр
                24 января 2018, 21:28
                0
                Это если свой сниппет и знаешь установлен pdotools или нет, тогда сам и решаешь какой синтаксис использовать.
                А можно ли добавить в сниппет проверку: если установлен pdotools, то использовать синтаксис fenom, а если нет — то обычный?
                  Андрей
                  25 января 2018, 08:33
                  +1
                  Пишете функцию в которой проверяете наличие pdoTools, с помощью этой функции потом уже обрабатываете чанки.

                  Из formit пример
                  function getChunk($name,$properties = array()) {
                          if (class_exists('pdoTools') && $pdo = $this->modx->getService('pdoTools')) {
                              return $pdo->getChunk($name, $properties);
                          }
                  
                  	...
                  }
            Олег
            25 января 2018, 12:30
            0
            Спасибо! Я решил отказаться от компонента SimpleSearch (он, если честно, мне не сильно нравился) в пользу Вашего предложения с pdoPage — работает отлично. Единственное, не знаю как вывести «extract» (кусок текста до и после искомого слова), но это мелочи. К тому же, используя pdoResources можно в будущем расширить функционал поиска и подключить ТВ поля (SimpleSearch поиск по ТВ полям не поддерживает). Вообще, есть ещё много компонентов, которые пока ещё не поддерживают работу с Fenom. Возможно, есть какое-то универсальное решение для таких компонентов, вроде плагина, который бы проверял наличие pdoTools и подменял парсер?
              Андрей
              25 января 2018, 16:38
              1
              0
              Для extract можно взять функцию из simpleSearch и сделать сниппет

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