[SeoFilter] долгожданное обновление: меню, sitemap


[ купить дополнение ] [ демо ] [ документация ]

Выкладываю долгожданное обновление SeoFilter со сниппетами для формирования меню и карты сайта.



Кто ещё не знаком с SeoFilter, рассказываю его возможности.

Компонент позволяет создавать виртуальные страницы с красивым постоянным адресом по любым полям ресурса, товара, включая дополнительные поля(TV) и поля, значения которых хранятся в других таблицах. Также можно использовать одновременно несколько полей для формирования страниц.

Для виртуальных страниц предусмотрено динамическое формирование заголовков, контента с автоматической подстановкой значений полей с возможностью их склонения по падежам и с подсчётом количества ресурсов, удовлетворяющих условиям станицы.

Всё это может работать даже через AJAX совместно с mSearch2 или без него.
Подробнее про все возможности в первом анонсе и документации.

А в этом обновлении два новых сниппета и небольшие изменения в коде:

sfMenu — формирование меню

Первый и самый функциональный это sfMenu. Для формирования меню создал новый класс. Очень многое взято из pdoMenu, в том числе почти вся поддержка классов. Очередное спасибо Василию. Мой код, пока не такой изящный, но стараюсь делать всё красиво. Всю документацию напишу позже.

! Важно ! Отличается от pdoMenu тем, что за сформированную ссылку на страницу здесь отвечает параметр [[+url]], а за её название параметр [[+name]].
Вообще можете задавать пустые чанки и проверять что можно использовать :) Параметров, которыми можно управлять формированием меню много, что я наверно и не все проверил) Можно вообще не указывать параметры и получить все ссылки. Но вот основные:
  • rules — список правил, чьи ссылки нужно использовать в меню; (можно с минусом)
  • parents — список страниц, к которым привязаны правила; (можно с минусом)
  • urls — отдельно id виртуальных страниц из таблицы url; (можно с минусом)
  • countChildren — подсчёт ресурсов(товаров) которые будут на странице;
  • mincount — минимальное количество ресурсов для включения ссылки в меню;
  • sortcount: — сортировка по количеству ресурсов, приоритетнее той что в sortby;
  • relative — экспериментальная перестройка меню исходя из выбранной seo-страницы;
  • nesting — виртуальное вкладывание ссылок в ссылки, попробуйте :) ;
  • double — дублирование ссылок при вкладывании, так как могут относится к нескольким правилам, так сказать мультикатегории;
  • nesting — виртуальное вкладывание ссылок в ссылки, попробуйте :) ;
  • groupbyrule — группировка по правилам (отдельный чанк-обёртка tplGroup);
Для всех параметров есть описания, что не понятно — пишите сюда) Вообще, не хватает пользовательских примеров использования меню. Но несколько своих примеров напишу:

1. Пример с группировкой на отдельной странице с исключением «пустых» страниц.
Самый первый скриншот.
[[!sfMenu? 
    &countChildren=`1`
    &groupbyrule=`1`
    &sortby=`createdon`
    &sortdir=`ASC`
    &mincount=`1`
    &parents=`9`
    &tplGroup=`@INLINE <div class="col-sm-6"><h4>[[+name]] <small>[[+total]] ссылок</small></h4>[[+wrapper]]</div>`
    &tplOuter=`@INLINE <ul[[+classes]]>[[+wrapper]]</ul>`
    &tpl=`@INLINE <li[[+classes]]><a href="[[+url]]">[[+name]]</a> <nobr><span>([[+total]] [[+total:units=`товар|товара|товаров`]])</span><small> - [[+count]] [[+count:units=`просмотр|просмотра|просмотров`]]</small></nobr>[[+wrapper]]</li>`
]]

2. Пример с вложенностью ссылок от двух ресурсов

[[!sfMenu? 
    &countChildren=`1`
    &nesting=`1`
    &double=`0`
    &mincount=`2`
    &parents=`9`
]]

3. Меню только первого уровня с сортировкой по количеству

[[!sfMenu? 
    &countChildren=`1`
    &sortcount=`1`
    &sortby=`createdon`
    &sortdir=`DESC`
    &mincount=`1`
    &parents=`9`
    &level=`1`
]]

sfSitemap — карта сайта

Сниппет создан на основе класса меню, поэтому поддерживает почти все те параметры, за исключением вложенности и группировки. Также здесь взято почти всё из pdoSitemap и использовать их можно совместно. Здесь напишу только этот пример, в остальном разобраться не сложно.
В pdoSitemap для параметра tplWrapper на демке я использовал чанк. Его содержимое:
<?xml version="1.0" encoding="{'modx_charset' | option}"?>
<urlset xmlns="{$schema}">
{$output}
{$_modx->runSnippet('sfSitemap',['tplWrapper'=>'sitemap.output', 'countChildren'=>1, 'mincount'=>1, 'forceXML'=>''])}
</urlset>
Где в сниппете sfSitemap в параметр tplWrapper написал чанк sitemap.output с содержимым {$output}.

! Важно ! При совместном использовании на одной странице нужно задавать пустой параметр forceXML, чтобы не было конфликтов заголовков header.

sfLink — обновление логики работы

Его смысл остался таким же, выводить ссылку при вводе id правила(или нескольких). Но код и формат использования стали лучше. Простой пример для того, чтобы вывести ссылку на сложную страницу. (у меня включён Fenom в шаблонах)
Ссылка на категорию:
{foreach $_modx->resource.color as $cvet}
	{'!sfLink'|snippet:[ 
	     'rules'=>'22,17',
	     'category'=>$_modx->resource.parent,
	     'cvet'=>$cvet
	]}
{/foreach}
Где-то выведет одну ссылку, где-то несколько:

Теперь не нужно вызывать дополнительные сниппеты для названия ссылки, так как в одном из предыдущих обновлений для всех ссылок правила (виртуальных страниц) можно задавать шаблон для формирования названия.

Если же какой-то цвет исключается правилом 22 (цвет + категория) или ссылка отключена, то будет поиск по правилу 17 (категория). Оно здесь специально стоит последним.

Меню и карта сайта кэшируются по-умолчанию на час. Подсчёт ресурсов дорогая операция на запросы, так как для каждой ссылки прогоняется. Но по времени у меня даже первый запуск не особо долгий, но всё сильно зависит от количества ссылок.

Описал, что вспомнил. Документация будет позже, а пока задавайте вопросы, если есть :)
28 сентября 2017, 23:21    Евгений Шеронов   
3    423 +15

Комментарии (22)

  1. Алексей 29 сентября 2017, 07:31 # 0
    У меня такой вопрос: а ресурсы кроме виртуальных ссылок так же остаются доступны по оригинальному пути или нет? Т.е. как обстоят дела с дублями страниц?
    1. Евгений Шеронов 29 сентября 2017, 08:55 # 0
      Вопрос не совсем понял, но компонент никак не затрагивает роботу обычных ресурсов. Все виртуальные станицы привязаны к физической странице и их адрес всегда будет зависеть от этой страницы. Метод формирования адреса можно задавать в параметре scheme (abs, full и т.д).

      Дублями вы называете то, когда одна страница доступна по нескольким адресам?
      Если так, то в системных настройках SeoFilter можно включить переадресацию на страницу с нужным окончанием (слэш, .html и т.д).
    2. Антон 29 сентября 2017, 12:36 # +1
      Добрый день, Евгений, спасибо за обновление. Есть одна проблема со сниппетом sfmenu. Если страницы на сайте не имеют окончания, то есть вида site.ru/category, то ссылки в меню выводятся неправильно, site.ru/categorystranica1, при этом при работе через фильтрацию mfilter2, все работает правильно site.ru/category/stranica1. Это можно как-то исправить или подождать следующего обновления?
      1. Евгений Шеронов 29 сентября 2017, 12:48 # +3
        Можете сами поправить, но в следующем обновлении учту, как наберутся ещё несколько замечаний.
        В чанке ссылки (параметр tpl) вместо плейсхолдера [[+url]] можете прописать так:
        [[~[[+page_id]]]]/[[+new_url:default=`[[+old_url]]`]]
        При этом чанк ссылки в таком варианте лучше не в inline формате использовать.

        Или же в синтаксисе Fenom: (что приятнее выглядит)
        {$page_id|url}/{$new_url ?: $old_url} 
        
        P.S. Эта инструкция для тех, у кого в качестве суффикса контейнера пустое значение.
      2. Александр 12 октября 2017, 11:30 # 0
        Евгений, а доступ тестовый в админ можно получить? Как Василий в минишоп с фильтрами открыл, чтобы посмотреть как под капотом все устроено, чтобы понять можно будет как то совместить ваше решение со своим сайтом?
        спасибо.
        1. Евгений Шеронов 12 октября 2017, 12:14 # +1
          Можно) Даже на целый день — modhost.pro

          Заодно поставьте mSearch2, miniShop2 и пройдите Быстрый старт SeoFilter

          Проблем с совместимостью пока ещё не бывало.
          Раз задались таким вопросам — то на 99% дополнение Вам подойдёт)

          1. Александр 12 октября 2017, 12:26 # 0
            s11324.h9.modhost.pro/manager/
            s11324
            EeYrtfL6AqMZ
        2. Михаил 12 октября 2017, 19:42 # 0
          А в самом ресурсе можно получить обратные ссылки на эти созданные страницы?
          1. Евгений Шеронов 12 октября 2017, 21:15 # 0
            Да, даже на те, что состоят из двух или более полей.

            Для этого предусмотрен сниппет sfLink.
          2. Артем 13 октября 2017, 20:30 # 0
            Подскажите, как в сниппете получить параметры страницы, например поле, где хранится Заголовок страницы
            seofilter_title
            1. Евгений Шеронов 13 октября 2017, 21:01 # 0
              Здравствуйте!
              А в каком именно сниппете?

              Если в SEO шаблонах правила, то вот так:
              {$id | resource:'pagetitle'}
              Здесь $id — это id страницы, куда относится правило.

              А сама настройка seofilter_title отвечает за то, чтобы подставлять оригинальный заголовок страницы, когда, например, будет выбрано много значений одного поля.
              1. Артем 13 октября 2017, 22:40 # 0
                Я имею ввиду в собственном сниппете подключенном в шаблоне. Нужно в нем получить +sf.title и другие
                1. Евгений Шеронов 13 октября 2017, 23:43 # 0
                  В своих сниппетах вот так:
                  $modx->getPlaceholder('sf.title'); //sf.description и т.д.
                  

                  Либо же можете передавать как параметры:
                  [[!mySnippet? &title=`[[!+sf.title]]` &introtext=`[[!+sf.introtext]]`]]
                  
                  1. Артем 14 октября 2017, 10:33 # 0
                    Спасибо
                    1. Артем 14 октября 2017, 10:59 # 0
                      А такой ещё вопрос, есть ли возможность генерации seo полей для всех категорий по единому шаблону и возврату к нему?
                      Например, для всех категорий каталога одежды сформирован один стиль генерации description (default), но при указании индивидуального описания и в фильтре при возврате к товару без фильтра, description остаётся как при индивидуальном, но уже не default т.к. он генерировался в другом месте и брался не из поля.
                      Вот есть ли возможность вернуть значение к default?
                      1. Евгений Шеронов 14 октября 2017, 11:30 # 0
                        Покажите пример, как у Вас изначально формируется description.

                        Как вариант, можете сделать ТВ поле, куда можете записать свой вызов сниппета для формирования description и в системных настройках для поля description задать это ТВ поле, для подстановки по умолчанию.
                        1. Артем 14 октября 2017, 12:06 # 0
                          Да, как вариант, но для вновь созданных категорий надо не забывать добавлять этот сниппет в ТВ. А через системные настройки/ClientConfig нельзя ли тоже самое сделать?
                          Я думаю было бы не плохо в системных настройках сделать возможность указания сниппета по обработке seo данных при возврате значений на default или что-то подобное.
                          1. Евгений Шеронов 14 октября 2017, 14:18 # +1
                            Как значение по-умолчанию поставьте в ТВ и всё :)

                            Думал когда-то над тем, чтобы сделать там возможность писать @INLINE чанки, где можно будет и сниппеты на Fenom запускать, но что-то взвесил все за и против, решил остаться на одном варианте.

                            Но так как много категорий может быть разных — это не самый удобный вариант.

                            Я просто всё равно не понимаю, что у Вас там по умолчанию делает сниппет?)
                            Берёт значение из description и изменяет его?

                            Или в самом description какие нибудь параметры-плейсхолдеры, выставляемые другими сниппетами? Если так, то все возвращаемые текстовые шаблоны (даже для страниц по умолчанию) через AJAX могут обрабатываться сниппетом из настройки prepareSnippet.

                            Вот пример сниппета обработчика:
                            <?php
                            $row = unserialize($row);  
                            if($rule_id) {
                            	// здесь же можете добавлять, изменять и обрабатывать значения
                            } else {
                            	// здесь делаете любые запросы, на подчсёты свои и т.д
                            	// и выставляете так: $row['myparam'] = 'Мой параметр';
                            }
                            return serialize($row);
                            
                            1. Артем 14 октября 2017, 23:40 # 0
                              description формируется в зависимости от категории/родителя/названия страницы и пр.
                              И мне нужно вернуть именно такой дефолт.

                              И ещё одно, например, у страницы фильтра есть контент а у дефолтной нет, но чтобы текст при переходе на дефолт пропадал приходится в каждой категории вставлять пустые символы.
                              1. Евгений Шеронов 15 октября 2017, 09:32 # 0
                                Первое — пока только свой вызов сниппета в возвращаемом ТВ поле для страниц по умолчанию.

                                А если кому-то наоборот, не надо, чтобы контент пропадал?)

                                Какое решение Вы можете предложить, чтобы всех устроило?
                                1. Артем 15 октября 2017, 10:55 # 0
                                  В поля для подстановки по умолчанию добавить возможность указания ещё и сниппета, тогда всё будет в одном месте и не надо создавать тв чтобы для него указывать сниппет по умолчанию.
                2. Ольга 35 минут назад # 0
                  Мне необходимо на страницу производителя вывести все подразделы, в которых он встречается. Например, есть категория детские коляски. В ней разделы — прогулочные коляска, модульные коляски и тд. В каждой есть производитель Riko. На странице производителя нужно чтобы было прогулочные коляски Riko, модульные коляски Riko и тд. И изображение, которое вытягивается из TV раздела. Получится такое сделать с вашим дополнением?
                  Вы должны авторизоваться, чтобы оставлять комментарии.