Клиент поставил задачу: для различных категорий товара в магазин VirtueMart менять задавать свой стиль всего сайта. Например, для магазина одежды менять стилистику сайта в зависимости от представленного в категории сезона (зима, лето и весна-осень).
Задача решалась в 3 этапа:

  • создать место хранения данных(поскольку завязывалось с категориями, то проще было хранить прямо в базе в таблице категорий)
  • внести корректировки в управления категориями — дать возможность выбора из установленных шаблонов
  • сделать функционал переключения в пользовательской части

Первый этап — выполнить запрос

ALTER TABLE `jos_vm_category` ADD `category_template` VARCHAR( 255 ) NULL DEFAULT NULL AFTER `category_flypage`;

Тут мы добавили поле category_template для записи информации о шаблоне в таблицу jos_vm_category. Префикс таблицы в данном случае по-умолчанию jos_. Если Вы меняли его при установке, то измените соответственно запрос.
Далее, вторым этапом, добавляем функционал в админку. Открываем файл /administrator/components/com_virtuemart/html/product.product_category_form.php, находим в нет следующий код (примерно 112 строка)

112
113
114
115
116
117
118
119
120
121
     <tr>
      <td ><div align="right">
        <?php echo $VM_LANG->_('PHPSHOP_CATEGORY_FORM_FLYPAGE') ?>:</div>
      </td>
      <td valign="top">
          <?php
          echo ps_html::list_template_files( "category_flypage", 'product_details', str_replace('shop.', '', $db->sf("category_flypage")) );
          ?>
      </td>
    </tr>

И добавляем код выбора шаблона. Вкратце, импортирум класс шаблонов Joomla, выбираем список шаблонов и преобразуем их в список.

122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
    <tr>
      <td colspan="2"><br /></td>
    </tr>
     <tr>
      <td ><div align="right">Шаблон категории:</div>
      </td>
      <td valign="top">
          <?php
            JLoader::import( 'components.com_templates.helpers.template', JPATH_ADMINISTRATOR );
            $_rows = array();
            $_rows = TemplatesHelper::parseXMLTemplateFiles( JPATH_ROOT.DS.'templates' );
 
            $templates = array();
            foreach($_rows AS $row) {
                $templates[$row->directory] = $row->name;
            }
 
            $_options = ps_html::dropdown_display("category_template", $db->sf("category_template"), $templates);
              //JPATH_ROOT.DS.'templates'
	      ?>
      </td>
    </tr>

Сохраняем. Визуальную форму сделали — осталось сохранить данные в базе. Для этого открываем файл /administrator/components/com_virtuemart/classes/ps_product_category.php и после ~260 строки

260
'category_flypage' => vmGet( $d, 'category_flypage' ),

добавляем

261
'category_template' => vmGet( $d, 'category_template' ),

И далее по тексту после ~323 строки

323
'category_flypage' => vmGet( $d, 'category_flypage' ),

добавляем

324
'category_template' => vmGet( $d, 'category_template' ),

Это мы добавили в массив сохраняемых данных в базе наши значения шаблонов.
И теперь непосредственно вывод — третий этап. Открываем файл /administrator/components/com_virtuemart/html/shop.browse.php, находим в нет следующий код (примерно 71 строка)

71
72
	// Set Dynamic Page Title
	$vm_mainframe->setPageTitle( $db->f("category_name") );

и добавляем код

73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
    $get = JRequest::getCmd('template', 0, 'get'); 
    $ctpl = $db->f("category_template");   
    if($get != $ctpl && !is_null($ctpl))  {
        $uri =& JURI::getInstance();
 
        $query = $uri->getQuery(true);
 
        foreach ($query as $name => $value) {
            if ($name != 'template') $new_query[$name] = $value;
        }
        $new_query['template'] = $ctpl;
 
        $new_query  = (isset($new_query))? '?'.$uri->buildQuery($new_query): null;
        $redirect_uri = $uri->current().$new_query;  
        $mainframe->redirect($redirect_uri);   
    }

Вкратце: получаем переменную названия шаблона для категории и если текущий шаблон не соответствует установленному производим переадресацию на страницу с установленным нашим шаблоном.
Вот и все — дерзайте.

Опубликовать в Яндекс
Опубликовать в Facebook
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в LiveJournal
Опубликовать в Google Plus
Опубликовать в Google Buzz