Переопределение smarty переменных приложения в плагинах

info@ravencode.ru

Столкнулся с такой проблемой: в теме дизайна supreme использовалась переменная $product, эта переменная создается на страницах продукта магазина и используется в шаблоне product.html, но она доступна и в шаблоне index.html (выводится через {if (isset($product))}). В одном из плагинов также использовалась переменная $product, что приводило к тому что значения в index.html и product.html различались. Это возникает из-за того что фабрика wa()->getView() вызывает уже ранее созданный waView и с уже переданными в него переменными.

Я обрисовал эту тему разработчику плагина, на что он мне сказал что его плагин зашибись, а вот разработчик темы козел) и кстати мои попытки объяснить ситуацию с waView не принесли плодов. Поэтому просьба к разработчикам WA указать на странице https://developers.webasyst.ru/cookbook/plugins/ то, что переменные плагинов должны содержать префикс (аля $shop_my_plugin_product) чтобы не перекликаться с системными переменными. В идеале же нужно экранировать переменные приложений от переменных плагинов, самый простой способ это в плагинах использовать clone waView.

30 ноября 2017
  • Гена Рыжов 30 ноября 2017 04:56

    надо вместо $view = wa()->getView();

    использовать

    $view = new waSmarty3View(wa());


  • info@ravencode.ru 30 ноября 2017 05:24

    В этом случае плагин не увидит переменные приложения, только минимальный набор заданных в waSmarty3View. Хотя это может быть и правильно - не будет пересечений с переменными плагина.

    Ладно бы еще был только вызов через wa()->getView(), но есть еще

    $this->view->assign('myvar', $value) //экземпляр класса шаблонизатора доступен в поле 'view' экземпляров классов waViewAction и waViewActions.



  • Евгений Леман 30 ноября 2017 06:32

    Есть ощущение, что этот наглый разработчик плагина есть я. По крайней мере у меня на днях была похожая проблема. Именно с темой supreme и именно с $product. В совпадения не верю, поэтому поясню суть проблемы. Мой плагин(если речь таки о нем) ничего не затирает. Фрагмент кода:

    public static function getListFormHtml($product) { ... $view->assign('product', $product); ... }

    То есть каким приходит, таким и уходит. А вот в теме supreme есть косяк. В файле product-list.html есть строки:

    {$p.skus = $skus[$p.id]}

    {$p} после этого передается в плагин, который не может найти нужную информацию об артикуле, которая там должна быть по умолчанию.

    Если речь и не о моем плагине, то возможно проблема та же.

  • info@ravencode.ru 30 ноября 2017 07:03

    Ты про ссылку на присваиваемый объект видимо не слышал т.ч. просвещаю

    class View {
        public $prop = 1;
    }
    class App {
        public $view;
        public function __construct() {
            $this->view = new View;
        }
    }
    class Plugin {
        public $view;
       public function __construct(View $view) {
            $this->view = $view;
        }
    }
    $app = new App;
    $plugin = new Plugin($app->view);
    $plugin->view->prop = 2;
    echo $app->view->prop;

    Результат как ты мог догадаться 2.

  • info@ravencode.ru 30 ноября 2017 07:44

    И проблема в том, что код темы то я могу скорректировать, а твой нет. При этом название темы я указал открыто т.к. его косяк налицо, а название твоего плагина нигде не фигурировало, но ты сам себя спалил)

  • Евгений Леман 30 ноября 2017 07:46
    $plugin->view->prop = 2;

    https://otvet.mail.ru/question/170950847

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

    PS Вот так надо было делать:

    $plugin->view->prop = $app->view->prop;
    echo $plugin->view->prop;

    Каким будет результат?

  • info@ravencode.ru 30 ноября 2017 09:32

    Проблема там вообще вылезала в хлебных крошках в которых {$product.name} фигурировал, а твой плагин перезаписывал получаемое из приложения значение.

    Баг в теме я давно заткнул заглушками т.к. автор темы тоже не идет на диалог.

    {shopArrivedPlugin::getListFormHtml($wa->shop->product($p.id))}

    т.к. в общении ты повел себя как полный м..к и начал откровенно хамить не разобравшись в вопросе. Я не мог видеть код твоего плагина и поэтому сделал только предположение, кстати было бы интересно взглянуть каким образом происходит присвоение значения $view, что-то мне подсказывает что не $view = new waSmarty3View(wa()).

    К тебе я лично этот пост не адресовал т.ч. о каких холиварах речь?

    Тема на самом деле важная и не исчерпывается этим плагином и этой темой. Проблемы могут всплыть в других местах. Я лично сам использовал имена переменных не особо задумываясь к чему это может привести.

  • Евгений Леман 30 ноября 2017 10:46
    в хлебных крошках в которых {$product.name} фигурировал, а твой плагин перезаписывал получаемое из приложения значение.

    https://pastebin.com/Ji5QUiFt - можно ткнуть пальцем в место перезаписи? Но да, не new waSmarty3View(wa()). Во-первых, сия особенность для меня стала откровением. Во-вторых, проблем тут всё равно быть не должно. Разве что где-то кто-то вдруг в шаблоне вызывает метод, формирующий $settings, потом вызов плагина, а потом использует $settings... Ситуация крайне маловероятная. То есть по факту проблема надуманная. Тем не менее, префиксы теперь добавлены(а ошибка осталась. Забавно, да?). "Спасибо за замечание" - стандартная фраза, которую я пишу в ответ на любой репорт бага/недочета. Если в письме я случайно забыл написать, то... Спасибо за замечание. Это к слову о мудачестве. "Как мудак" я веду себя сейчас тут и с вами, а не с клиентом(даю разрешение на публикацию переписки). И, если любопытно, вполне осознанно. У нас нынче модно зеркально отвечать.

    Меня разбудили в 2 часа ночи с этой проблемой. Не вопрос, я покопался. Протестировал у себя - проблем не обнаружил. О чем и написал клиенту. Далее он просто процитировал некого программиста, который, не вникая в детали, завуалированно назвал меня идиотом и заставил ковырять чужой шаблон, чтобы найти ошибку в нём.

  • info@ravencode.ru 30 ноября 2017 12:42


    Тем не менее, префиксы теперь добавлены(а ошибка осталась. Забавно, да?).

    Ошибка как вызываемая темой, так и твоим плагином были устранены еще до выхода обновления. Изначально была проблема с $product в крошках, потом я увидел в логах упоминание плагина отключение которого исправляло как крошки, так и ошибки в логах. Тебе написали только потому что я не люблю оставлять костыли в коде и был бы сайт не в облаке WA я бы сам все поправил.

    И да, касаемо фразы "её код не может быть оригинальным если такая же переменная используется в коде wa". Дайте ему задачку: function do($var) { $var=$var;return $var; } // изменится ли значение $var или останется оригинальным?

    Срочно от тебя никто ничего не требовал. Вот это вот дешевые понты которых клиенту не надо вешать, тебе писали по существу.

    https://pastebin.com/Ji5QUiFt - можно ткнуть пальцем в место перезаписи?

    $view = wa()->getView();
    $view->assign('product', $product);
  • Евгений Леман 30 ноября 2017 12:50
    Ошибка как вызываемая темой, так и твоим плагином
    так и твоим плагином

    Задачку всё же решить не удалось, как я понял.

  • info@ravencode.ru 30 ноября 2017 13:06

    Честно говоря не могу понять как ты с 3его раза ничего не поймешь, давай еще раз..

    $view = wa()->getView();
    $view->assign('product', $product);

    Суть в том что на странице товара твой плагин используется не
    только для самого товара, но и для списка "с этим товаром покупают" которые идут в конце страницы. Твой плагин заносит в $product данные последнего товара из списка "с этим товаром покупают", а дальше это значение попадает в основной шаблон. Грубо говоря: WA вначале компилит основной контент $content, а потом уже компилит index.html с его участием, поэтому в хлебные крошки размещенные в index'e попадало неверное значение.

  • Евгений Леман 30 ноября 2017 13:32

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

    ПС и всё же это чистой воды холивар. Переопределение стандартных переменных не баг, а фича. Править не нужно. А данный инцидент является косяком 1 плагина, который следует обсуждать напрямую с разработчиком. Только информацию ему предоставить в более подробном виде. Особенно если уже известна точная проблема.

  • info@ravencode.ru 30 ноября 2017 17:05

    Мне попросить у клиента переписку и опубликовать? Чтобы ты не врал насчет

    Но в ответ получал лишь "У тебя косяк".

    Тебе четко сказали про имя переменной и префикс.

    Почему я должен разжевывать эксперту и разработчику основы работы с фреймворком?

  • Евгений Леман 30 ноября 2017 21:26
    Чтобы ты не врал

    Правильная часть меня говорит, чтобы я положил на тебя орган и пошел отдыхать. Другая часть говорит, что за подобное оскорбление надо унизить. Хм... Остановлюсь на нейтральном варианте. Я своё согласие на публикацию переписки дал еще давно. Мог просто выложить, а не рисоваться. Только зачем? Доказать что? Своё же плоскомыслие? Зачем публично унижаться то? Мог напрямую мне написать/позвонить.

    А опубликовать ты хочешь фразу из 4 по счету письма:

    переменная $product затирает значение задаваемое wa для страницы товара и поэтому мы не можем например использовать это значение в хлебных крошках. Могли бы вы изменить название переменной?

    Ок, проверяем, как и сказано, на странице товара. С самим товаром. Проблем нет и быть не может. И хлебные крошки работают прекрасно. И содержимое $product полностью оригинальное. Уточняю. Прошу больше исходных данных у клиента, который говорит, что проблема с темой Supreme и мой плагин генерит РНР ошибки. В этом направлении и копаю. Где и нахожу ошибку в теме, которая и приводила к нотисам. А где тут про использование плагина в не совсем предназначенном для него месте? Или я должен мысли по email читать? Не имея даже адреса сайта, на котором, возможно, мог бы хотя бы увидеть подобное. Или кто-то не в состоянии прочитать описание на странице плагина, в котором, напомню, написан код для использования "в каталоге".

    У меня всё, Ваша Честь. Засим откланиваюсь и предлагаю вам в мою дверь более не звонить, и звуков в мою сторону не издавать. Спасибо!



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