Обратились ко мне с просьбой помочь вот в таком вопросе.
Мне требуется доработать VirtueMart 3, на стандартном шаблоне.
Есть необходимость отобразить в категории товаров, в каждой карточке, количество этого товара, которое лежит в корзине.
Ну что же давайте.. ))
1. Открываем шаблон вывода категории.
/templates/ВАШ_ШАБЛОН/html/com_virtuemart/category/default.phpВ нем где то в начале документа после строки
defined ('_JEXEC') or die('Restricted access');пишем следующий код:
if(!class_exists('VirtueMartCart'))
require(VMPATH_SITE.DS.'helpers'.DS.'cart.php');
$cartData = VirtueMartCart::getCart()->cartProductsData;
$cartInfo = array ();
foreach ( $cartData as $prodInCar ){
$cartInfo[$prodInCar->virtuemart_product_id] = $prodInCar->quantity;
}//foreach
за тем в этом же файле опускаемся ниже и ищем вот такую строчку.
echo shopFunctionsF::renderVmSubLayout($this->productsLayout, array('products'=>$products,'currency'=>$this->currency,'products_per_row'=>$this->perRow,'showRating'=>$this->showRating ));Эта строка выводит под слой карточки товара который определен в переменной
$this->productsLayoutПо умолчанию VirtueMart имеет только два таких слоя которые могут использоваться.
Вот они.
- /templates/ВАШ_ШАБЛОН/html/com_virtuemart/sublayouts/products.php
- /templates/ВАШ_ШАБЛОН/html/com_virtuemart/sublayouts/products_horizon.php
Для того что бы понять какой файл Вам нужно править из перечисленных выше. Вы можете временно вставить перед конструкцией
echo shopFunctionsF::renderVmSubLayout( $this->productsLayout, array(...... Следующий код
echo '<pre>'; print_r ($this->productsLayout); echo '</pre>'.__FILE__.' in line: '.__LINE__ ;
die(__FILE__.'in line: '.__LINE__);
Что бы получилось как на скрине
Сохраняем этот файл.
Соответственно зайти на страницу категорий и обновить.
Не пугайтесь. но вид будет примерно следующим.
В красной рамке я выделил SUBLAYOUTS - тот который нам нужен. Значит это файл.
/templates/ВАШ_ШАБЛОН/html/com_virtuemart/sublayouts/products_horizon.phpПеред тем как перейти к выводу количества товаров находящихся в корзине. Нужно передать в файл
products_horizon.phpданные которые вытащили из данных корзины.
Делаем это так .
Заменяем строку.
echo shopFunctionsF::renderVmSubLayout($this->productsLayout,array('products'=>$products,'currency'=>$this->currency,'products_per_row'=>$this->perRow,'showRating'=>$this->showRating ));
на строку
echo shopFunctionsF::renderVmSubLayout($this->productsLayout,array( 'products'=>$products,'currency'=>$this->currency,'products_per_row'=>$this->perRow,'showRating'=>$this->showRating , 'cartInfo' => $cartInfo ));
т.е. просто добавили в массив эту пару - (ключ => значение)
'cartInfo' => $cartInfo Теперь давайте разберемся с самим выводом.
Открываем файл
/templates/ВАШ_ШАБЛОН/html/com_virtuemart/sublayouts/products_horizon.phpИ первым дел то что нам нужно это определить переменную с полученными данными.
Где то после строки
defined('_JEXEC') or die('Restricted access'); напишем такой код:
$cartInfo = $viewData['cartInfo'];
Теперь нам нужно только вывести.
Для этого определяем место где будем выводить (я предлагаю это количество вывести рядом с кнопкой
КУПИТЬ):
В моем случае кнопка
добавить в корзину выводиться через
SubLayout и код выглядит так:
...................
<td class="prodtab3">
<div class="vm3pr-<?php echo $rowsHeight[$row]['customfields'] ?>">
<?= shopFunctionsF::renderVmSubLayout('addtocart',array('product'=>$product,'rowHeights'=>$rowsHeight[$row])); ?>
</div>
</td>
................
Я не стал заморачиваться с таблицами. И вставил код после закрытия таблиц. т.е. после тэга
</table> Код следующий.
<?php
if( array_key_exists($product->virtuemart_product_id, $cartInfo) ){?>
<div class="csrtInfo" style="float:right; margin-right:10px; color:red;">
This product in cart :
<span style="color:red;"><?= $cartInfo[$product->virtuemart_product_id] ?></span>
<span style="color:red;"> pcs.</span>
</div>
<?php
} // end if ?>
На скрине это выглядит так.
Вот пока и все. В теле страницы это выглядит так.