Мультинастраиваемость плагинов chikurov-seo

К сожалению, Webasyst Shop Script не имеет коробочного решения для динамического изменения настроек плагинов. Но т.к. у многих владельцев интернет-проектов на одной установке имеется несколько проектов, зачастую требующих разных настроек, разработчикам готовых решений приходится выкручиваться. Большинство ограничивается тем, что добавляют в настройках своего продукта select, в котором можно выбрать из списка витрину и вручную задать для нее отдельные настройки, называя это мультивитринностью. Но мы пошли дальше и внедрили во все наши продукты полноценную мультинастраиваемость.

Чикуров Анатолий

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

У каждого плагина имеются свои настройки, выбранные значения которых влияют на функционал плагинов. Самая простая настройка: $settings.enabled — «Статус плагина». Он может быть либо ВКЛ, либо ОТКЛ (либо "1", либо "0"). Допустим, условный плагин с идентификатором «showsomething» что-то внедряет на странице товара на пользовательской части сайта. Как только вызывается его функция (через хелпер или через хук), он первым делом проверяет значение настройки $settings.enabled и если "видит" значение == "1", то продолжает выполнять свой код, а если "видит" значение == "0", то останавливается и ничего не внедряет на страницу товара.

Но перед вами стоит задача доработать данную логику. Допустим, у вас на одной установке имеется две витрины, у первой витрины url: mysite.ru, у второй: mysite.com. Что делать, если вы хотите чтобы плагин «showsomething» на витрине mysite.ru внедрял свой код, а на витрине mysite.com - не внедрял?

Ответ: вам надо установить значение настройки «Статус плагина» --> "ВКЛ" на странице настроек плагина, но для витрины сайта mysite.com переопределить данную настройку, чтобы она работала так, будто бы на странице настроек плагина опция «Статус плагина» была равна "ОТКЛ". Т.е. вам надо сделать так, чтобы плагин при обращении к нему на странице товара получал $settings.enabled = 1 на странице товара на витрине mysite.ru, но при этом получал $settings.enabled = 0 на странице товара на витрине mysite.com.

В плагинах нашей разработки такое динамическое переопределение настроек плагинов реализуются через блоки сайта.

Как динамически переопределить настройку $settings.enabled?

Порядок действий такой:

  1. Зайти в раздел "Сайт" -- "Блоки" в административной панели сайта.
  2. Создать новый блок с ID вида pluginid.settings, где pluginid - это ID плагина. В случае с плагином «showsomething», ID блока должен быть: showsomething.settings.
  3. Описание блока можно оставить пустым, оно ни на что не влияет.
  4. В самом блоке используя Smarty нужно изменить массив $plugin_settings (именно в него передаются настройки плагина — $settings). Соответственно, если стоит задача динамически переопределить опцию $settings.enabled с нуля на единицу для витрины сайта mysite.com, то нужно прописать в блоке такой код:
    {if $wa->domainUrl() == 'https://mysite.com'}
      {$plugin_settings.enabled = "0"}
    {/if}
  5. В конце блока добавить такую строчку кода («showsomething» - это снова ID плагина):
    {$wa->globals('showsomething.settings', $plugin_settings)}
  6. В итоге должно получиться:
  7. {if $wa->domainUrl() == 'https://mysite.com'}
      {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}
  8. Сохранить блок

Готово! При каждом обращении к функциям плагина «showsomething» плагин не сразу получает стандартный массив с настройками $settings и выполняет свой код, а сначала проверяет на сайте наличие блока showsomething.settings, при его обнаружении берет настройки из глобальной переменной "showsomething.settings", куда вы настроили передачу измененного массива $settings. Для страниц витрины mysite.ru настройки согласно коду блока "showsomething.settings" не изменились, а для страниц витрины mysite.com - изменились. Вы только что динамически переопределили значение настройки $settings.enabled.

Еще несколько примеров динамического переопределения настройки $settings.enabled для условного плагина «showsomething»:

  • Изменение настройки "Статус плагина" для администраторов сайта:
    {if $wa->user()->isAdmin($wa->app())}
      {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}
  • Изменение настройки "Статус плагина" для мобильной версии сайта:
    {if $wa->isMobile()}
      {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}
  • Изменение настройки "Статус плагина" для страниц, содержаших в URL фрагмент "/category/":
    {if strpos($wa->currentUrl(false), '/category/') !== false}
      {$plugin_settings.enabled = "0"}
    {/if}
    {$wa->globals('showsomething.settings', $plugin_settings)}

Как узнать ID нужных настроек в массиве $settings и переопределить их?

Если нужно переопределить любые другие настройки плагина, то просто сделайте "дамп" массива $plugin_settings в начале блока и посмотрите информацию его содержимое на любой странице сайта, где вызывается метод интересуемого плагина.

На примере реального плагина. Допустим, вы настроили плагин "Доработки оформления заказа в корзине". У вас есть 2 витрины сайта с разными url-адресами информационных страниц сайта, и вы хотите динамически изменять значение настройки HTML-код ссылки: на отдельно взятой витрине сайта скорректировать адрес ссылки в тексте «Оформляя заказ, вы соглашаетесь на обработку персональных данных в соответствии с <a href="/politica/" target="_blank">условиями».

Порядок действий:

  1. Зайти в раздел "Сайт" -- "Блоки" в административной панели сайта.
  2. Создать новый блок с ID вида fixorder.settings
  3. В начале блока пишем код, который на тестовой странице сайта выведет дамп настроек:
    {if $wa->get('test') == 1}
      {$plugin_settings|wa_dump}
    {/if}
  4. Сохранить блок, открыть корзину на сайте, добавить в конец URL-страницы фрагмент ?test=1, обновить страницу (т.е. надо открыть на сайте страницу вида site.ru/order/?test=1).
  5. Изучить дамп настроек и понять какая настройка отвественна за вывод интересуемого текста: по дампу видно, что это privacy_policy_text. Скопировать этот фрагмент.
  6. Вернуться в редактирование блока сайта, удалить или закомментировать код для вывода дампа настроек плагина, и по аналогии с примером выше настроить изменение $settings.privacy_policy_text для витрины mysite.com, указав нужное значение, а в конце настроить передачу массива в глобальную переменную:
    {* {if $wa->get('test') == 1}
      {$plugin_settings|wa_dump}
    {/if} *}
    {if $wa->domainUrl() == 'https://mysite.com'}
      {$plugin_settings.privacy_policy_text = "Оформляя заказ, вы соглашаетесь на обработку персональных данных в соответствии с <a href="/page/terms/" target="_blank">условиями"}
    {/if}
    {$wa->globals('fixorder.settings', $plugin_settings)}
  7. Готово! Теперь на витрине mysite.com будет выводиться ссылка на страницу /page/terms/, как задано в блоке fixorder.settings; а на всех остальных витринах — на страницу /politica/, как задано в настройках плагина.

Примеры некоторых готовых решений для динамического переопределения настроек

Плагин SEO Яндекс.Метрика (seoyandexmetrika)
Задача 1: изменить ID счетчика Яндекс.Метрики при условии, что в URL страницы имеется фрагмент "/city/spb/" или "spb."

Решение: разместить код в блоке сайта: seoyandexmetrika.settings:

{$page_full_url = $wa->currentUrl(true)}
{if strpos($page_full_url, '/city/spb/') !== false || strpos($page_full_url, 'spb.') !== false}
  {$plugin_settings.metrika_id = "00000000"}
{/if}
{$wa->globals('seoyandexmetrika.settings', $plugin_settings)}
Задача 2: включить вебвизор при условии, что в URL страницы имеется фрагмент "/kontakty/."

Решение: разместить код в блоке сайта: seoyandexmetrika.settings:

{$page_full_url = $wa->currentUrl(true)}
{if strpos($page_full_url, '/kontakty/') !== false}
  {$plugin_settings.webvisor = "1"}
{/if}
{$wa->globals('seoyandexmetrika.settings', $plugin_settings)}
Задача 3: выполнить одновременно и задачу 1 и задачу 2

Решение: разместить код в блоке сайта: seoyandexmetrika.settings:

{$page_full_url = $wa->currentUrl(true)}
{if strpos($page_full_url, '/city/spb/') !== false || strpos($page_full_url, 'spb.') !== false}
  {$plugin_settings.metrika_id = "00000000"}
{/if}
{if strpos($page_full_url, '/kontakty/') !== false}
  {$plugin_settings.webvisor = "1"}
{/if}
{$wa->globals('seoyandexmetrika.settings', $plugin_settings)}
У вас другая задача?

Попробуйте прописать нужное условие самостоятельно, используя "Шпаргалки" со страницы редактирования шаблонов темы дизайна, либо воспользоваться поиском нужного фрагмента кода на форуме Webasyst. Также вы можете оставить заявку в нашу ТП с подробным описанием вашей задачи — оценим техническую возможность и стоимость реализации (приблизительная стоимость разработки кода для динамического изменения настроек плагинов: 1500-4500 руб).

Типовые готовые решения по мультинастраиваемости всех плагинов будут регулярно здесь добавляться с течением времени.

Написать комментарий