[SeeToo] 1.1.0 - Класс для исключения ресурсов

В новой версии компонента были реализованы такие возможности как:
  • булевый параметр «useRandom» в сниппете «SeeTooResources», который обеспечивает включение и выключение присоединения случайных ресурсов в результатах вывода сниппета «SeeTooResources»
  • исключение из создаваемых связей ресурсов, которые прописаны в таких системных настройках как «error_page», «site_unavailable_page», «unauthorized_page»
  • класс под названием «SeeTooExcluder», с возможностью расширения, для исключения ресурсов из создаваемых автоматически связей
  • Добавлена системная настройка «seetoo_exclude_where», которую использует класс «SeeTooExcluder» для определения правил исключения ресурсов
Подробнее под катом


Итак, в первую очередь хочу поблагодарить сообщество и особенно Владимира Бурноса, которые постоянно мне напоминали, что компоненту есть куда развиваться и в нем есть заинтересованные пользователи. Давайте посмотрим более подробнее на изменения, которые планировались как небольшой патч и в итоге переросли в минорную версию.

Параметр useRandom для сниппета SeeTooResources

Это булевый параметр, который определяет, выводить ли случайные ресурсы, которые удовлетворяют условиям выборки pdoResources или другим используемым сниппетом, в том случае, если количество ресурсов в выборке, меньше установленного лимита. По умолчанию этот параметр имеет значение «Да».

Как это работает?

Если useRandom имеет значение «Да», то модель SeeTooResource подключается к modResource оператором LEFT JOIN, с условием, что количество просмотров больше минимального значения, составной сортировкой по количеству просмотров + RAND(), и функцией IFNULL(See.view, 0), которая возвращает цифру 0, если количество просмотров не определено (NULL). Когда количество выводимых ресурсов меньше установленного лимита в игру вступает RAND и IFNULL, которые позволяют вывести оставшиеся ресурсы в случайном порядке.

Если useRandom имеет значение «Нет», то модель SeeTooResource подключается к modResource оператором INNER JOIN, что означает, что выведутся только те ресурсы, с которыми связан текущий ресурс, что в свою очередь исключает вывод случайных несвязанных ресурсов.

Исключение системных ресурсов

Тут всё просто, если ресурс-источник или ресурс-цель указаны в «error_page», «site_unavailable_page» или «unauthorized_page», то они исключается.

О том, какие системные ресурсы стоит еще исключить, пишите пожалуйста в комментариях.

Класс, который отвечает за исключение ресурсов, с возможностью расширения

Итак, мы перешли к самому интересному, класс называется SeeTooExcluder. В нем реализован один метод check, который принимает два параметра, ресурс, с которого перешли и ресурс, на который перешли. Этот метод возвращает true, когда ресурсам разрешено создать связь, и false, когда им запрещено её создавать.

Условия по которым он определяет разрешено ли ресурсам создать связь или запрещено, он берет из системной настройки seetoo_exclude_where, в которой условия написаны в формате JSON.
Пример, нам нужно исключить ресурсы-контейнеры или ресурсы у которых id шаблона равен 4, значение системной настройки будет иметь такой вид:

{"is_folder":1, "template":4}

К сожалению SeeTooExcluder не умеет распознавать модификаторы условий, например ":!=", ":IN" и т. д. Но для изменения логики класса есть возможность его расширения. Тут ничего нового, всё как в mFilters2 при расширении обработчика фильтров, или в miniShop2 при расширении обработчиков корзины, заказа, доставки или оплаты. Создаем файл по пути «путь_к_компоненту/custom/excluder/название_класса.class.php», наследуем свой класс из базового класса SeeTooExcluder, пишем свою логику и вписываем название класса в системную настройку seetoo_excluder_class

Давайте рассмотрим несколько случаев расширения класса:

Когда мы не хотим отключать плагин, чтобы отключить автоматическое добавление связей, так как например при обновлении он снова станет активным.
class ExcludeAll extends SeeTooExcluder
{
    public function check($resource_from, $resource_to)
    {
        return false;	
    }
}

Когда мы хотим, чтобы связь работала только для ресурсов в контексте «catalog».
class ExcludeByContextKey extends SeeTooExcluder
{
    public function check($resource_from, $resource_to)
    {
        if ($resource_from->context_key == 'catalog' && $resource_to->context_key == 'catalog') {
            return true;
	}
	return false;
    }
}

Когда мы хотим, чтобы проверка выполнялась только для ресурса-цели, он должен иметь шаблон с полем id равному 4.
class ExcludeByResourceToTemplate extends SeeTooExcluder
{
    public function check($resource_from, $resource_to)
    {
	return $resource_to->template == 4 ? true : false;
    }
}

Когда мы хотим, чтобы связь создавалась только в случае, когда ресурс-источник имеет шаблон id=2, а шаблон-цель шаблон id=5.
class ExcludeByResourceToTemplate extends SeeTooExcluder
{
    public function check($resource_from, $resource_to)
    {
	return $resource_from->template == 2 && $resource_to->template == 5 ? true : false;
    }
}

Когда мы хотим, чтобы связь создавалась только в случае, когда ресурс-источник создан раньше ресурса-цели.
class ExcludeByEarly extends SeeTooExcluder
{
    public function check($resource_from, $resource_to)
    {
	return $resource_from->createdon < $resource_to->createdon ? true : false;
    }
}

Когда мы хотим, чтобы связь создавалась только в случае, когда оба ресурса созданы одним автором (пригодится например при использовании компонента Tickets)
class ExcludeByAuthor extends SeeTooExcluder
{
    public function check($resource_from, $resource_to)
    {
	return $resource_from->createdby == $resource_to->createdby ? true : false;
    }
}

В общем тут всё ограничено вашей фантазией. Присылайте мне интересные реализации класса Excluder, я их включу в будущую документацию.

Планы на будущее:

  • В первую очередь написать документацию :)
  • сделать msOrderHandler для «С этим товаром покупают» (кто разбирается, может сделать это в текущей версии компонента, главное использовать другой ключ для сохранение записей, по умолчанию ключ 'view')
  • сделать возможность включения/выключения обратной связи, то есть, ресурс-цель, так же является ресурсом-источником, а ресурс-источник, является ресурсом-целью

Часто задаваемые вопросы в тех. поддрежке

  • При использовании в выборке других сниппетов (Например &element=`msProducts`), не работает сниппет
  • Когда будет реализована возможность ограничения создаваемых связей
При использовании в выборке других сниппетов (Например &element=`msProducts`), которые используют расширенный класс modResource, его нужно указывать в параметре class, для msProducts это &class=`msProduct`, для getTickets это &class=`Ticket`. Я думаю над решением, чтобы пользователь не задумывался какой класс нужно вписывать и нужно ли его вписывать, Добавлю пример с использованием msProducts:
[[!SeeTooResources?
    &class=`msProduct`
    &element=`msProducts`
    &tpl=`item`
]]

По поводу реализации ограничения создания связей ресурсов, я уже написал выше. Старался сделать максимально просто, наслаждайтесь :)

Ссылки

Владимир Кисилица
26 января 2017, 06:25
modx.pro
4
2 897
+7

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

brioni
26 января 2017, 09:49
0
Relap.io — бесплатно для статейников
    Владимир Кисилица
    26 января 2017, 10:00
    0
    Выглядит интересно, Вы использовали его в своих проектах?
      brioni
      26 января 2017, 10:12
      0
      Использую, но заработок от вставки их рекламы в блок рекомендаций копеечный: 15 копеек/1000 хостов — Прям реально копейки. А переходы на рекомендованный контент есть, но конверсию не мерил.
        Владимир
        26 января 2017, 10:54
        0
        ИМХО, в каких то менее взрослых системах (джумла и т.п.) сторонние сервисы очень логичны, а MODX лучше использовать со встроенными скриптами. Потому я за развитие SeeToo и т.п., даже если есть уже что то готовое в виде виджетов.
        Да, монетизация, это уже отдельная тема, но если там доход мизерный, то все их иные плюшки сомнительный повод для выбора между SeeToo и Relap.io
        Опять же, кастомизация оформления стороннего виджета- не факт что все будет так просто и как нужно. Ну и куча иных ограничений.
          brioni
          26 января 2017, 13:47
          0
          Все верно + ставить чужие скрипты еще и опасно.
          Если SeeToo выйграет Relap по скорости и настройка будет по-проще, второй отпадет автоматически.
      Владимир
      26 января 2017, 10:22
      0
      Страницу сильно тормозит сторонний виджет?
      К сожалению, некоторые сторонние сервисы очень замедляют загрузку, какими бы эффективными не были их инструменты.
        brioni
        26 января 2017, 10:28
        0
        Думал об этом, но не делал — тупо не знаю как. Если подскажешь, сегодня же дам результат.
          Владимир
          26 января 2017, 10:37
          +1
          Я когда отключаю коды sendpulse.com/ru и bannerboo.com/ru/ ( это PUSH-уведомления и анимированный HTML5-баннер, который как бы в облаке) то более 1 секунды выигрываю, что весьма грустно, т.к. баннер то можно к себе перенести, а вот на PUSH я уже набрал тысячи подписчиков, т.е. теперь я «раб» сервиса sendpulse.
          Замер простой, в Google Chrome зайди в инструменты разработчика (для windows Ctrl + Shift + i ,для других ОС ) далее вкладка Network и обновляя страницу смотри внизу что показывает загрузка до DOM и полная загрузка страницы. Естественно, надо то включать то отключать коды сторонних сервисов для сравнения результатов теста.
            brioni
            27 января 2017, 00:34
            0
            Результаты после очистки кэша через админку перед каждым замером на одной и той же странице:
            С блоком Relap 2х2 — DOM:8.37s; Load:11.66s.
            Без блока Relap — DOM:4.81s; Load:9.18s.
              Владимир
              27 января 2017, 08:45
              0
              Ужас. Нет слов.
              Соответственно, блок Relap — в топку. А вашим страницам нужна оптимизация, ну как бы до 1 секунды и не более надо DOM.
              PS опять же аргументы в пользу выбора SeeToo, а не Relap, как бы они не рекламировали свои плюшки.
                brioni
                27 января 2017, 11:06
                1
                0
                А если это лонгрид с 9-ю блоками адсенс + 2 блока тизеров, тоже все плохо?
                Мерил на сайтах без рекламы — там DOM как-раз чуть больше секунды.

                Теперь жду чьи-либо замеры с SeeToo и без. Затем приму решение о покупке.
                  Владимир
                  27 января 2017, 11:10
                  0
                  А если это лонгрид
                  Давайте все что за рамками темы SeeToo в личку. Не будем забивать ветку обсуждения, автор же ждет комментарии именно касающихся SeeToo.

                  Замеры с блоком\без SeeToo могу сделать, много он не сожрет, тем более что вывожу феномом.
                    brioni
                    27 января 2017, 11:14
                    +1
                    Хорошо. Ожидаю тест + вывод через Fenom.

                    PS (чтобы до конца раскрыть тему): CTR блока рекомендаций Relap 8-10%, а заработок не 15 копеек, а 5 копеек/1000 хостов.
                    Владимир Кисилица
                    27 января 2017, 12:01
                    +1
                    Компонент имеет возможность кеширования. Так, что с нагрузкой у компонента нет никаких проблем ( еще никто не жаловался :) ).
        Владимир
        26 января 2017, 09:55
        0
        Спасибо!
          Владимир
          27 января 2017, 19:57
          0
          Владимир, подскажите, сброс всех связей в ресурсах (что бы начать с чистого листа и применить все новые установки в настройках) сейчас проще в базе данных выполнить?
          Владимир
          14 апреля 2019, 23:38
          0
          Будет ли далее обновляться или поддерживаться этот компонент?
          Например, с msProduct логично было бы его подружить.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            18