frontend_nav и вывод названия плагина, даже если он ничего не возвращает.

2

Прошу обратить внимание разработчиков тем дизайна на баг в коде.

Практически стандартный код для всех тем дизайна берущих начало от Default3. Включая её саму.

{strip}
<!-- plugin hook: 'frontend_nav' -->
{* @event frontend_nav.%plugin_id% *}
{$_hook_frontend_sidebar_section = false}
{foreach $frontend_nav as $plugin => $output}
{if !empty($output)}
{$_hook_frontend_sidebar_section = true}
{/if}
{/foreach}

{if $_hook_frontend_sidebar_section}
    {foreach $frontend_nav as $_key => $_}
        <div class="sidebar-wrap sidebar-{$_key}">
            <div class="sidebar-wrap__head">
                {if substr($_key, -7) == '-plugin'}{$wa->pluginName(substr($_key, 0, -7))}{else}[`More`]{/if}
            </div>
            <div class="sidebar-wrap__body">
                {$_}
            </div>
        </div>
    {/foreach}
    {foreach $frontend_nav_aux as $_key => $_}
        <div class="sidebar-wrap sidebar-{$_key}">
            <div class="sidebar-wrap__head">
                {if substr($_key, -7) == '-plugin'}{$wa->pluginName(substr($_key, 0, -7))}{else}[`More`]{/if}
            </div>
            <div class="sidebar-wrap__body">
                {$_}
            </div>
        </div>
    {/foreach}
{/if}
{/strip}

Первый блок кода выставляет флаг $_hook_frontend_sidebar_section, в случае если хотя бы один из плагинов, использующих этот хук что-то выводит.
Во втором блоке таких проверок уже нет и даже если плагин возвращает в хуке false, всё равно выводится название плагина.
Обычно такое можно увидеть при использовании плагина "Бренды" и любого другого плагина, использующего этот хук.
Самое простое что можно сделать, добавить {if empty($_)}{continue}{/if} в начало циклов перебора foreach.
Касается популярных тем Mastershop и supreme - про них мне уже написали несколько раз.

А то что-то устал я бодаться. Мол, плагин "Youtube каналы и ролики" виноват, потому что в Default3 тоже самое - пишите разработчику.

3 комментария

  • +1
    Николай Иванов Николай Иванов 7 сентября 2020 22:11 #

    protected function runPlugins

    if ($plugin_result !== null) {....

    Почти всегда в хуках использовал return false там, где надо было известить о ложности/пустоте. И не парился(давно я к этому привык). Да и так как практически везде используется другая структура для вывода через хуки всё работало. В документации об этом как всегда ни слова, пришлось лезть в код фрэймворка.

    Сабжевый код, такое впечатление, был сделан только для того, чтобы вывести слово "Бренды" у соответствующего плагина -)

    Понятно, что сделаю "как надо" фрэймворку, но кажется мне что это всё таки не очень правильно.

  • +1
    Михаил Ушенин Михаил Ушенин Webasyst 8 сентября 2020 10:12 #

    При использовании какого плагина и какой темы дизайна это можно увидеть? Если речь о плагине «Бренды», то в каком месте кода он отдаёт false при обработке какого именно события?

    • +1
      Николай Иванов Николай Иванов 8 сентября 2020 10:44 #

      Темы Default3, Mastershop, Supreme.
      Речь о совокупности факторов. С плагином "Бренды" всё хорошо. Он возвращает свой контент, а если его нет, то null(то есть там просто return).
      Но если есть еще другой плагин(например, текущая версия "ytb" 1.0.5), который возвращает не null, а "пустую строку"(false/true) в хуке frontend_nav, когда соотв. настройка не включена в плагине, то получается то что описано выше.
      А пустая строка может возвращаться, например, если пустой шаблон(ну взял человек и удалил там всё) и в плагине нет проверки на эту "пустоту". Ну или просто не знание этой особенности фрэймворка, как в случае "ytb" и привычки так делать -)

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

      Добавить комментарий

      Чтобы добавить комментарий, зарегистрируйтесь или войдите