Вывод настраиваемых полей на странице категории virtuemart 2
Настраиваемые поля значительно расширили функционал virtuemart. Вывести их на странице товара в нужном месте не представляет проблем. Для этого достаточно указать в поле Позиция макета свою уникальную позицию, например, my_position, и в нужном месте шаблона карточки товара вставить:
<?php if (!empty($this->product->customfieldsSorted['my-position'])) { $this->position='my-position'; echo $this->loadTemplate('customfields'); } ?>
Вывод настраиваемых полей на странице категорий несколько сложнее. В интернете встречается масса решений проблемы и в статье я опишу способы, которые заработали у меня.
Создание настраиваемых полей
Для начала создадим несколько типов настраиваемых полей: Строка, Изображение и Атрибут корзины. Для этого заходим в Virtuemart -> Настраиваемые поля и нажимаем в правом верхнем углу кнопку Создать.
Тип поля: Строка
С помощью этого поля укажем есть ли товар в наличии. Все настройки приведены на скриншоте.
Тип поля: Изображение
Это поле будет, например, выводить картинку Новинка (хотя гораздо проще это реализовать с помощью этого плагина). Настройки приведены на скриншоте.
В папку /images/stories/virtuemart/product загрузим необходимые картинки. Далее зайдем в Медиа файлы и синхронизируем картинки.
Чтобы уменьшить размер миниатюры, нужно зайти в нужную картинку, выбрать Заменить миниатюру изображения и повторно загрузить нужную картинку.
Тип поля: Атрибут корзины
Пусть в этом поле в выпадающем списке будут выводиться цвета товара, причем в зависимости от цвета будет меняться цена товара. Настройки на скриншоте.
Настраиваемые поля созданы, теперь добавим их в нашему товару. Заходим в товар, переходим во вкладку Настраиваемые поля и добавляем все поля.
Вывод настраиваемых полей на странице категории
Начнем с вывода настраиваемого поля Атрибут корзины. Самый простой, на мой взгляд, способ — это вывести на странице категории кнопку Купить. После этого все поля Атрибут корзины появятся автоматически и при выборе разных вариантов цена будет меняться динамически, как на странице товара. Есть и другие способы, но с их помощью мне так и не удалось настроить динамическое изменение цены.
Итак, добавим кнопку Купить на страницу категорий.
1. Скопируем файл components/com_virtuemart/views/productdetails/tmpl/default_addtocart.php в папку components/com_virtuemart/views/category/tmpl.
2. В файле components/com_virtuemart/views/category/tmpl/default.php сразу после
// Start the Output foreach ($this->products as $product) {
Вставляем
$this->product = $product;
Получается
// Start the Output foreach ($this->products as $product) { $this->product = $product;
3. Для вывода кнопки вставляем в понравившееся место в файле components/com_virtuemart/views/category/tmpl/default.php код
<?php echo $this->loadTemplate('addtocart'); ?>
Я, например, вставил его сразу после кода, который выводит кнопку «описание товара»
<p> <?php // Product Details Button echo JHTML::link ($product->link, JText::_ ('COM_VIRTUEMART_PRODUCT_DETAILS'), array('title' => $product->product_name, 'class' => 'product-details')); ?> </p>
Если кнопка купить не нужна на странице категорий, то скрыть ее можно, например, с помощью стилей. В файл /components/com_virtuemart/assets/css/vmsite-ltr.css нужно добавить
.spacer .addtocart-bar{ display:none; }
Теперь выведем оставшиеся поля — изображение и строка. Если нужно вывести все настраиваемые поля, которые есть у товаров, то можно просто добавить в файл /components/com_virtuemart/views/category/tmpl/default.php следующий код:
<?php $custom_title = null; if (!empty($product->customfields)) { foreach ($product->customfields as $field) { if ($field->is_hidden ) continue; if ($field->display) { ?> <span class="product-field-title"><?php echo $field->custom_title ?></span> <span class="product-field-display"><?php echo $field->display ?></span> <?php } ?> <?php } ?> <?php } ?>
Данный код я добавил перед
</div> <div class="clear"></div> </div> <!-- end of spacer -->
Стиль отображения можно легко изменить с помощью css. Например, чтобы убрать название картинки нужно добавить в /components/com_virtuemart/assets/css/vmsite-ltr.css
.spacer .vm-img-desc{ display:none; }
Но если нужно вывести не все поля, а только некоторые, то можно воспользоваться способом, предложенным на форуме nulled.cc (кстати, там есть и другие варианты вывода настраиваемых полей).
Для начала распечатаем массив данных, чтобы посмотреть какие настраиваемые поля существуют у товара. Для этого перед
<!-- end of spacer --> </div> <!-- end of product -->
Вставим
<?php echo '<pre>'; print_r($product->customfields); echo '</pre>'; ?>
В результате получится что-то вроде этого
Чтобы убрать информацию о настраиваемых полях из категории можно просто закомментировать строчку
<?php echo '<pre>'; //print_r($product->customfields); echo '</pre>'; ?>
Имея эти данные можно вывести только поля с наличием, не затрагивая поле с изображением. Для этого нужно добавить
<?php if($product->customfields[0]->virtuemart_custom_id == 7){ echo '<span class="product-field-title">'; echo $product->customfields[0]->custom_title; echo '</span>'; echo '<span class="product-field-display">'; echo $product->customfields[0]->display; echo '</span>'; } ?>
Если заголовок выводить не нужно, то просто убираем из кода
echo '<span class="product-field-title">'; echo $product->customfields[0]->custom_title; echo '</span>';
P.S.
Описанные способы не претендуют на 100% универсальность. Если у вас есть свои способы вывода настраиваемых полей на странице категорий, то буду рад если вы поделитесь ими в комментариях.