Вывод карточек товара магазина в статьях на сайте

Несколько недель назад от заказчика поступила такая хотелка — надо чтоб в статьи блога на сайте магазина можно было бы вставлять карточки товаров этого самого магазина. Обдумывал разные варианты, но в итоге, совместно с чатиком в телеграме пришел к такому решению:
  1. В статье в нужном месте менеджер делает конструкцию такого вида: %%34,45,54%%, где 34,45 и 54 — айди товаров в магазине, таких вхождений может быть хоть сколько в статье.
  2. На событие onWebPagePrerender вешается плагин, который с помощью регулярки выбирает все вхождения нашего паттерна, для каждого вхождения вызывает сниппет msProducts и последним шагом заменяет в контенте страницы паттерны соответствующими результатами сниппета.
Под катом код плагина:

//проверяем нужное событие
if ($modx->event->name != 'OnWebPagePrerender') return;
//7 - номер шаблона записи блога
if ($modx->resource->template != 7) return;

$input = &$modx->resource->_output;
// ищем вхождения паттерна
preg_match_all('/(?<=%%)[\d*,]*(?=%%)/m',$input,$out, PREG_PATTERN_ORDER);
if (count($out) && count($out[0])) {
    $items = [];
    foreach($out[0] as $p) {
        //тут надо подставить свои чанки
        $tmp = [
            'src'=>'%%'.$p.'%%',
            'replace'=>$modx->runSnippet('msProducts',['parents'=>13,'resources'=>$p,'tpl'=>'tpl.catаlog-item','tplWrapper'=>'@INLINE <div class="catalog-items items" id="mse2_results">[[+output]]</div>'])
        ];
        $items []= $tmp;
    }
    $output = $input;
    foreach($items as $i) {
        // подменяем
        $output = str_replace($i['src'],$i['replace'],$output);
    }
    $input = $output;
}
Если есть замечания — прошу в комменты.
Антон
19 августа 2019, 01:30
modx.pro
7
1 030
+7
Поблагодарить автора Отправить деньги

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

Наумов Алексей
19 августа 2019, 11:14
0
Вариант попроще, только менеджера нужно заставить выучить:)
Хотя можно эту конструкцию в шаблоны TinyMCE попробовать даже добавить.
{include 'products' id='34,35,36'}
В чанке products соответственно вызов msProducts с нужными resources.
    Антон
    19 августа 2019, 13:45
    0
    Я рассматривал такой вариант. Для юзера он не сильно проще, а в реализации дольше.
      Alexander V
      19 августа 2019, 17:11
      0
      Чем же дольше? В плагин добавить разметку, так себе решение.
        Антон
        19 августа 2019, 17:19
        0
        Ну если делать это на чистом сайте с самого начала, то норм, у меня же феном глобально не включен и надо весь сайт перелопачивать, чтоб не было ошибок парсинга.
        Плюс когда девочка менеджер видит непонятный ей код, она волнуется и может накосячить, а просто перечислить через запятую айди товаров это понятнее.
          Alexander V
          19 августа 2019, 17:24
          0
          Дело хозяйское. Мы менеджеров не допускаем, если нет базовых знаний html/css и синтаксиса шаблонизатора. Не так сложно это выучить. Иначе нечего им делать в админке.
            srs
            srs
            19 августа 2019, 18:27
            +2
            Не согласен. На мой взгляд контент менеджер не обязан знать html,css. Его задача грамотно наполнить необходимые позиции, все остальное должны предусмотреть мы с вами. Во первых это наиболее верный и «красивый» подход. Во вторых, если вдруг будет текучка менеджеров, то не нужно будет тратить время, на объяснения подобных «хаков». Для себя — пожалуйста. Использовать на работе, такая себе идея. Но да ладно, возможно тут
            Дело хозяйское
              Alexander V
              19 августа 2019, 18:32
              +2
              Обязан. Отдельных полей не напасешься и всего не предусмотришь. А еще они должны понимать, что творится в wysiwyg редакторе, если им пользуются.
                srs
                srs
                19 августа 2019, 21:24
                0
                Понимание wysiwyg это очевидно, но блин понимание знать html, css и базовое знания шаблонизаторов. Может это тогда не контент менеджер а начинающий фронтендер. Всегда думал, что контент менеджер это прежде всего маркетолог.
                Отдельных полей не напасешься
                А в чем сложность отдельных полей? Один раз сделал как надо и забыл. Я очень сомневаюсь, что вам надо на одном и том-же сайте в админке создавать дополнительные поля (это прям совсем абсурдный пример). Как правило вовремя тестового запуска такие проблемы выявляться и решаются.
                  Alexander V
                  19 августа 2019, 21:28
                  0
                  Один раз сделал как надо и забыл.
                  В суровой реальности так не работает.
                Сергей
                26 октября 2019, 09:42
                0
                Srs, Интересно если ваш контент менеджер все заголовки сделает h1… это будет хорошо для страницы? Полностью согласен с Alexander V без знания html/css это не контент менеджер ни разу на мой взгляд.
                  srs
                  srs
                  26 октября 2019, 17:59
                  0
                  Если требуется сделать все заголовки h1, то хорошо, если нет, то нет… Проблем не вижу. Мы с вами по разному понимаем обязанности контент менеджера. Я считаю что html/css и тем более знание шаблонизаторов, точно не является приоритетным и важным знанием. А отличить заголовок h1 от h2-h3 можно визуально. Просто говоришь, что самый большой заголовок должен быть только 1-2-3-n раз и все.
                  Контент менеджер должен хорошо писать тексты и наполнять карточки товара. Я намеренно не стал продолжать диалог, так как реплика «В суровой реальности так не работает.», является частично ложной. У кого-то в реальности так не работает, а у меня именно так и работает (работало… я сейчас занимаюсь немного другим).
                    Николай Савин
                    27 октября 2019, 09:16
                    0
                    Можно проверять html и устранять нежелательные тэги и атрибуты.
                    Например через модификацию HTML на лету или использовать что то вроде jevix
        Юрий
        15 декабря 2020, 01:31
        0
        Подскажите пожалуйста, вродибы все сделал как написано, но не выводится изображение товара, как правильно сделать вызов?
        у меня сейчас так
        {if $mediumprod?}
                              <img src="{$mediumprod}" alt="">
                        {/if}
        prnt.sc/w2rlqy
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          13