«Времена года», или смена шаблонов Joomla из VirtueMart
Дата: 12 Июл ' 11 Автор: mart Рубрики: Программирование
Клиент поставил задачу: для различных категорий товара в магазин 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); } |
Вкратце: получаем переменную названия шаблона для категории и если текущий шаблон не соответствует установленному производим переадресацию на страницу с установленным нашим шаблоном.
Вот и все — дерзайте.