Virtuemart 2: различные условия в шаблонах

Вывод модулей в Virtuemart 2 организован достаточно примитивно. Оно и понятно — надстройка над Joomla, которая сама по себе далеко не интернет-магазин многого не позволяет. Однако, имея под рукой мозги и напильник, почти всегда можно добиться желаемого. В конце концов разработчики оставили нам пространство для маневра.

Одной из таких вещей, из разряда «нельзя, но если очень хочется, то можно» и есть условия вывода (модулей и не только) в шаблонах. Допустим, нужно вывести модуль только в карточке товара. Или только в определённой категории. Стандартными средствами первое сделать уж точно не получится: нужно или ставить сторонние компоненты по управлению модулями, или лезть в код. И если задача стоит на уровне «присобачить штоп работало», захламлять движок компонентами вовсе необязательно.

Решение уже описано на форуме Joomla, однако, продублирую его сюда в более (как мне кажется) понятном виде и применительно только к Virtuemart 2.

Итак, допустим стоит задача вывести модуль только в карточке товара.

Первое, что нам нужно сделать, это набрать себе переменных, с которыми мы будем работать. Загляните в админку: если включен SEF, то без дополнительных движений сделать это не удастся. Тут два варианта: или выключаем SEF и смотрим в адресную строку браузера, или… Ищем шаблон, в котором описан вывод модулей магазина. Т.к. он нам в любом случае понадобится, то идём в templates/имя_шаблона/ и ищем там файл index.php (некоторые «клубные шаблоны» любят прятаться например layouts/template.php).

Чтобы узнать не SEF ссылку и те переменные, которые нам потом понадобятся, вставляем в произвольном месте код:

<?php echo $_SERVER["HTTP_HOST"].'/index.php?' . http_build_query($_REQUEST); ?>

Перезагружаем страницу и видим (напомню, что задача стоит вывести модуль только в карточке товара, потому тут ссылка на неё) что-то вроде www.sitename.com/index.php?b00b5f2ccd5666e8aa19c59bfd4cd42f=87e6e5778a0aa064137ca313f7d7bda0&__atuvc=35%7C13&f6540f995415bf8f41bcab8c450b0f82=522ac9b3534fce57979d8eef31b6cd80&jpanesliders_panel-sliders=0&jpanesliders_module-sliders=0&vmapply=0&Itemid=106&option=com_virtuemart&limitstart=0&limit=int&view=productdetails&virtuemart_product_id=33&virtuemart_category_id=33&filter_product=&keyword=

Теперь, у нас есть почти всё, что нужно. Смотрим в шаблон, и определяем место вывода модуля. У меня это

<?php if ($this['modules']->count('innertop')) : ?>
<section id="innertop" class="grid-block"><?php echo $this['modules']->render('innertop', array('layout'=>$this['config']->get('innertop'))); ?></section>
<?php endif; ?>

Позиция соответственно «innertop», если его оставить в таком же виде — он будет выводиться на всех страницах (ну или на тех, что указаны в его свойствах). Далее, воспользуемся функцией showpage, она нам нужна как раз для контроля вывода элементов на страницах Joomla, без использования API. Выглядит она так:

function showPage($x = array()){
    return array_intersect_assoc($x,  $_REQUEST) == $x;
}

Теперь, рассматривая внимательно не SEF ссылку, мы можем задавать условия вывода различных модулей. Пример с форума:

<?php if(showPage(array('option'=>'com_virtuemart', 'view'=>'category', 'virtuemart_category_id'=>'2'))):?>
Только на странице категории с номером 2
<?php endif;?>

А вот, что получилось под мою задачу:

<!-- выводим слайдер спецпредложений в карточке товара -->
<?php 			
function showPage($x = array()){
  return array_intersect_assoc($x,  $_REQUEST) == $x;}
if(showPage(array('option'=>'com_virtuemart', 'view'=>'productdetails'))):?>
<section id="innertop" class="grid-block"><?php echo $this['modules']->render('innertop', array('layout'=>$this['config']->get('innertop'))); ?></section>
<?php endif; ?>

Т.е. само условие читается как если видим модуль магазина и при этом видим карточку товара, то тогда выводим модуль в позицию innertop. Пример из форума можно прочитать как если видим модуль магазина и при этом видим категорию и номер у категории 2, то тогда выводим что-то.

Как видно из примеров, всё достаточно просто. Не забудьте убрать $_SERVER[«HTTP_HOST»].’/index.php?’ . http_build_query($_REQUEST); и/или включить SEF после экспериментов.

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