[SeeToo] 1.1.0 - Класс для исключения ресурсов
В новой версии компонента были реализованы такие возможности как:
Итак, в первую очередь хочу поблагодарить сообщество и особенно Владимира Бурноса, которые постоянно мне напоминали, что компоненту есть куда развиваться и в нем есть заинтересованные пользователи. Давайте посмотрим более подробнее на изменения, которые планировались как небольшой патч и в итоге переросли в минорную версию.
Если useRandom имеет значение «Нет», то модель SeeTooResource подключается к modResource оператором INNER JOIN, что означает, что выведутся только те ресурсы, с которыми связан текущий ресурс, что в свою очередь исключает вывод случайных несвязанных ресурсов.
О том, какие системные ресурсы стоит еще исключить, пишите пожалуйста в комментариях.
Условия по которым он определяет разрешено ли ресурсам создать связь или запрещено, он берет из системной настройки seetoo_exclude_where, в которой условия написаны в формате JSON.
Пример, нам нужно исключить ресурсы-контейнеры или ресурсы у которых id шаблона равен 4, значение системной настройки будет иметь такой вид:
К сожалению SeeTooExcluder не умеет распознавать модификаторы условий, например ":!=", ":IN" и т. д. Но для изменения логики класса есть возможность его расширения. Тут ничего нового, всё как в mFilters2 при расширении обработчика фильтров, или в miniShop2 при расширении обработчиков корзины, заказа, доставки или оплаты. Создаем файл по пути «путь_к_компоненту/custom/excluder/название_класса.class.php», наследуем свой класс из базового класса SeeTooExcluder, пишем свою логику и вписываем название класса в системную настройку seetoo_excluder_class
Давайте рассмотрим несколько случаев расширения класса:
Когда мы не хотим отключать плагин, чтобы отключить автоматическое добавление связей, так как например при обновлении он снова станет активным.
Когда мы хотим, чтобы связь работала только для ресурсов в контексте «catalog».
Когда мы хотим, чтобы проверка выполнялась только для ресурса-цели, он должен иметь шаблон с полем id равному 4.
Когда мы хотим, чтобы связь создавалась только в случае, когда ресурс-источник имеет шаблон id=2, а шаблон-цель шаблон id=5.
Когда мы хотим, чтобы связь создавалась только в случае, когда ресурс-источник создан раньше ресурса-цели.
Когда мы хотим, чтобы связь создавалась только в случае, когда оба ресурса созданы одним автором (пригодится например при использовании компонента Tickets)
В общем тут всё ограничено вашей фантазией. Присылайте мне интересные реализации класса Excluder, я их включу в будущую документацию.
По поводу реализации ограничения создания связей ресурсов, я уже написал выше. Старался сделать максимально просто, наслаждайтесь :)
- булевый параметр «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`), не работает сниппет
- Когда будет реализована возможность ограничения создаваемых связей
[[!SeeTooResources?
&class=`msProduct`
&element=`msProducts`
&tpl=`item`
]]По поводу реализации ограничения создания связей ресурсов, я уже написал выше. Старался сделать максимально просто, наслаждайтесь :)
Ссылки
Комментарии: 18
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Да, монетизация, это уже отдельная тема, но если там доход мизерный, то все их иные плюшки сомнительный повод для выбора между SeeToo и Relap.io
Опять же, кастомизация оформления стороннего виджета- не факт что все будет так просто и как нужно. Ну и куча иных ограничений.
Если SeeToo выйграет Relap по скорости и настройка будет по-проще, второй отпадет автоматически.
К сожалению, некоторые сторонние сервисы очень замедляют загрузку, какими бы эффективными не были их инструменты.
Замер простой, в Google Chrome зайди в инструменты разработчика (для windows Ctrl + Shift + i ,для других ОС ) далее вкладка Network и обновляя страницу смотри внизу что показывает загрузка до DOM и полная загрузка страницы. Естественно, надо то включать то отключать коды сторонних сервисов для сравнения результатов теста.
С блоком Relap 2х2 — DOM:8.37s; Load:11.66s.
Без блока Relap — DOM:4.81s; Load:9.18s.
Соответственно, блок Relap — в топку. А вашим страницам нужна оптимизация, ну как бы до 1 секунды и не более надо DOM.
PS опять же аргументы в пользу выбора SeeToo, а не Relap, как бы они не рекламировали свои плюшки.
Мерил на сайтах без рекламы — там DOM как-раз чуть больше секунды.
Теперь жду чьи-либо замеры с SeeToo и без. Затем приму решение о покупке.
Замеры с блоком\без SeeToo могу сделать, много он не сожрет, тем более что вывожу феномом.
PS (чтобы до конца раскрыть тему): CTR блока рекомендаций Relap 8-10%, а заработок не 15 копеек, а 5 копеек/1000 хостов.
Например, с msProduct логично было бы его подружить.