[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
Relap.io — бесплатно для статейников
Выглядит интересно, Вы использовали его в своих проектах?
Использую, но заработок от вставки их рекламы в блок рекомендаций копеечный: 15 копеек/1000 хостов — Прям реально копейки. А переходы на рекомендованный контент есть, но конверсию не мерил.
ИМХО, в каких то менее взрослых системах (джумла и т.п.) сторонние сервисы очень логичны, а MODX лучше использовать со встроенными скриптами. Потому я за развитие SeeToo и т.п., даже если есть уже что то готовое в виде виджетов.
Да, монетизация, это уже отдельная тема, но если там доход мизерный, то все их иные плюшки сомнительный повод для выбора между SeeToo и Relap.io
Опять же, кастомизация оформления стороннего виджета- не факт что все будет так просто и как нужно. Ну и куча иных ограничений.
Да, монетизация, это уже отдельная тема, но если там доход мизерный, то все их иные плюшки сомнительный повод для выбора между SeeToo и Relap.io
Опять же, кастомизация оформления стороннего виджета- не факт что все будет так просто и как нужно. Ну и куча иных ограничений.
Все верно + ставить чужие скрипты еще и опасно.
Если SeeToo выйграет Relap по скорости и настройка будет по-проще, второй отпадет автоматически.
Если SeeToo выйграет Relap по скорости и настройка будет по-проще, второй отпадет автоматически.
Страницу сильно тормозит сторонний виджет?
К сожалению, некоторые сторонние сервисы очень замедляют загрузку, какими бы эффективными не были их инструменты.
К сожалению, некоторые сторонние сервисы очень замедляют загрузку, какими бы эффективными не были их инструменты.
Думал об этом, но не делал — тупо не знаю как. Если подскажешь, сегодня же дам результат.
Я когда отключаю коды sendpulse.com/ru и bannerboo.com/ru/ ( это PUSH-уведомления и анимированный HTML5-баннер, который как бы в облаке) то более 1 секунды выигрываю, что весьма грустно, т.к. баннер то можно к себе перенести, а вот на PUSH я уже набрал тысячи подписчиков, т.е. теперь я «раб» сервиса sendpulse.
Замер простой, в Google Chrome зайди в инструменты разработчика (для windows Ctrl + Shift + i ,для других ОС ) далее вкладка Network и обновляя страницу смотри внизу что показывает загрузка до DOM и полная загрузка страницы. Естественно, надо то включать то отключать коды сторонних сервисов для сравнения результатов теста.
Замер простой, в 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 2х2 — DOM:8.37s; Load:11.66s.
Без блока Relap — DOM:4.81s; Load:9.18s.
Ужас. Нет слов.
Соответственно, блок Relap — в топку. А вашим страницам нужна оптимизация, ну как бы до 1 секунды и не более надо DOM.
PS опять же аргументы в пользу выбора SeeToo, а не Relap, как бы они не рекламировали свои плюшки.
Соответственно, блок Relap — в топку. А вашим страницам нужна оптимизация, ну как бы до 1 секунды и не более надо DOM.
PS опять же аргументы в пользу выбора SeeToo, а не Relap, как бы они не рекламировали свои плюшки.
А если это лонгрид с 9-ю блоками адсенс + 2 блока тизеров, тоже все плохо?
Мерил на сайтах без рекламы — там DOM как-раз чуть больше секунды.
Теперь жду чьи-либо замеры с SeeToo и без. Затем приму решение о покупке.
Мерил на сайтах без рекламы — там DOM как-раз чуть больше секунды.
Теперь жду чьи-либо замеры с SeeToo и без. Затем приму решение о покупке.
А если это лонгридДавайте все что за рамками темы SeeToo в личку. Не будем забивать ветку обсуждения, автор же ждет комментарии именно касающихся SeeToo.
Замеры с блоком\без SeeToo могу сделать, много он не сожрет, тем более что вывожу феномом.
Хорошо. Ожидаю тест + вывод через Fenom.
PS (чтобы до конца раскрыть тему): CTR блока рекомендаций Relap 8-10%, а заработок не 15 копеек, а 5 копеек/1000 хостов.
PS (чтобы до конца раскрыть тему): CTR блока рекомендаций Relap 8-10%, а заработок не 15 копеек, а 5 копеек/1000 хостов.
Компонент имеет возможность кеширования. Так, что с нагрузкой у компонента нет никаких проблем ( еще никто не жаловался :) ).
Спасибо!
Владимир, подскажите, сброс всех связей в ресурсах (что бы начать с чистого листа и применить все новые установки в настройках) сейчас проще в базе данных выполнить?
Можно через консоль их удалить
Будет ли далее обновляться или поддерживаться этот компонент?
Например, с msProduct логично было бы его подружить.
Например, с msProduct логично было бы его подружить.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.