Рецепт очень простой, тем не менее, может пригодиться для решения специфических задач.
Возникла необходимость переключать описание в элементы цены JBZoo Price Plain (элемент ядра _description) для разных вариаций товара и языков. Проблема состояла в том, что сайт мультиязычный - 5 языков (английский, латышский, польский, русский, украинский), но имеется всего 2 элемента цены (2 склада - для ЕС и Украины с раздельным учетом остатков на складе). Первый элемент цены привязан к английскому, латышскому и польскому, второй - к русскому и украинскому. Ввиду того, что внутренние элементы цены не поддерживают мультиязычности, появилась идея определять язык стандартными средствами Joomla и выводить описание динамически. Для исполнения кода в элементе ядра _description требуется простейшая доработка:
В файле media/zoo/applications/jbuniversal/cart-elements/price/description/tmpl/description.php заменяем:
echo JText::_($this->getValue());
на
$command = $this->getValue(); eval ($command);
В результате этой замены исполняется PHP-код, помещенный в description, например для описанной выше ситуации:
$lang = JFactory::getLanguage(); $tag = $lang->getTag(); // Английский if ($tag == 'en-GB') { echo 'Описание на английском'; } // Латышский if ($tag == 'lv-LV') { echo 'Описание на латышском'; } // Польский if ($tag == 'pl-PL') { echo 'Описание на польском'; }
Основные недостатки рецепта:
1) функция eval() считается небезопасной, хотя в приведенном выше коде никаких внешних параметров не используется и безопасность сайта не страдает. Фанаты безопасности могут добавить экранирование изменив строку:
eval ($command);
на
eval (addslashes($command));
2) при заполнении сайта контент-менеджером возникают неудобства, связанные с заполнением. Хотя копипаста "по образу и подобию" или шаблону может разрешить и это неудобство.
Достоинства:
Мы получаем практически неограниченные возможности динамической генерации контента по условию в элементе цены.