Автор Тема: Деинициализация переменной в Smarty  (Прочитано 1296 раз)

23 Март 2015, 17:30:20
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Уважаемые форумчане. Как известно  в Prestashop используется шаблонизатор  Smarty. А у меня возникла необходимость вывести ряд переменных. Вот так я переменную инициализирую:
{assign var=hard value=$product}
Потом я её вывожу, а потом мне надо её деинициализировать, то есть "уничтожить", чтобы она не выводилась повторно. И вот с этим неожиданно возникли проблемы! В документации мне всё-таки удалось найти функцию, которая деинициализирует переменную:
<?php
$smarty
->clear_assign('hard');
?>

Но функция clear_assign реализована там в php-тегах, а мне надо работать с переменной в tpl-файле, а не в php! И попытки избавится от тегов php и записать clear_assign, в том же виде как assign:
{clear_assign hard}
или вот так:
{php}
$smarty->clear_assign('hard');
{/php}

приводят только к неработоспособности сайта.
Подскажите, пожалуйста, кто знает, как деинициализировать переменную в tpl-файле smarty?
23 Март 2015, 17:52:18
Ответ #1
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вопрос - зачем очищать переменную? Учитесь или это реальная задача?
23 Март 2015, 18:02:38
Ответ #2
  • Новичок
  • *
  • Сообщений: 30
  • Репутация: +3/-0
  • Программист для PrestaShop
    • Просмотр профиля
    • Мои модули для PrestaShop
Цитировать
как деинициализировать переменную в tpl-файле smarty?
если нужно, и в шаблоне, то достаточно присвоить null. например, для smarty v3:
{$hard = null}
23 Март 2015, 18:26:27
Ответ #3
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
zapalm, спасибо, получилось!
DarinSr, это вполне реальная задача. Я вывожу значение свойства товара, а товаров много. У одних товаров это свойство есть, у других - нету. А если переменную перед новым проходом цикла не деинициализировать, то свойство выводится, как будто оно есть, да ему ещё (несуществующему свойству) и значение предыдущего товара присваивается!
23 Март 2015, 18:30:15
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
В таком случае помогает проверка
{if свойство} вывод.
23 Март 2015, 18:39:25
Ответ #5
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
DarinSr, это вполне реальная задача. Я вывожу значение свойства товара, а товаров много. У одних товаров это свойство есть, у других - нету. А если переменную перед новым проходом цикла не деинициализировать, то свойство выводится, как будто оно есть, да ему ещё (несуществующему свойству) и значение предыдущего товара присваивается!
Вам нужно проверять перед выводом значение переменной. Так вы сократите время работы скрипта и уменьшите потребление ресурсов. Такой подход эффективней, чем иницилизация/деинициализация.
23 Март 2015, 18:43:16
Ответ #6
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
coder, спасибо. Только ведь я именно такую проверку и делаю! Но если я свойство не "уничтожила" (не деинициализировала переменную), то программа считает, что оно есть! И выводит его (предыдущее). А вот если уничтожишь, а потом проверяешь, то программа уже ничего не выведет.
Тут есть определённая тонкость (не могу же я описать всю ситуацию, чтобы не захломлять суть вопроса деталями). Проверяю я реальные свойства-характеристики, а переменные на основе этих характеристик создаю свои. Слегка модифицируя то, что даёт мне престашоп. И работаю потом с этими СВОИМИ переменными. Если реального свойства у товара нет, то моя переменная, конечно, под этот товар не пересоздастся. Но старая-то никуда не денется! Как программе дать понять, что это уже "не та" переменная? Только уничтожить её.
DarinSr, и как в этом случае перед выводом проверять значение переменной (созданной мною же, фактически), я не знаю. Скорее всего при моём подходе это невозможно. Это надо писать иной скрипт с иной логикой...
23 Март 2015, 18:48:00
Ответ #7
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Понятно. У каждого своя логика.