Дочерние товары таблицей
получится должно так

Создаём настраиваемое поле -«Общий Дочерний вид» с названием «Другие цвета» и устанавливаем его к родительскому товару.
Массив с необходимыми данными формируется с помощью функции public function getUncategorizedChildren($selected) находящийся файле administrator\components\com_virtuemart\models\product.php функция с переделанным запросом на выборку данных о стоимости дочернего товара имеет вид, со строки 1601
public function getUncategorizedChildren($selected){
$q = 'SELECT * FROM `#__virtuemart_products` as p
LEFT JOIN `#__virtuemart_products_'.VMLANG.'` as pl
USING (`virtuemart_product_id`)
LEFT JOIN `#__virtuemart_product_medias`
USING (`virtuemart_product_id`)
LEFT JOIN `#__virtuemart_medias`
USING (`virtuemart_media_id`)
LEFT JOIN `#__virtuemart_product_prices`
USING (`virtuemart_product_id`)';
$q .= ' WHERE `ordering`="1" AND `product_parent_id` = "'.$this->_id.'"
OR `virtuemart_product_id` = "'.$this->_id.'" ';
Далее функция идет без изменений. Я не привожу исходный код функции т.к. sql запрос переписан полностью. Запрос с использованием оператора LEFT JOIN создает одну большую виртуальную таблицу - присоединяя к таблице с основными данными о товаре, данные о рисунках соответствующих товару , его цене . Этих данных получается много и здесь вспоминается недостаток VirtueMart 1.1.9 о не оптимальных запросах к БД потребляющих много ресурсов хостинга, соответственно денег владельца магазина. Возможно здесь кроется одна из причин создания простого выпадающего списка товаров, а не таблицы с изображением товаров их ценой и кнопки Добавить в Корзину.
Последней, в запрос на выборку данных, добавлена таблица virtuemart_product_prices. В ней хранится основная цена каждого товара. Но из таблицы стоимость товара получаем в виде строки, а в карточке товара стоимость выводится после расчета, в соответствии с выбранной посетителем валютой в интернет – магазине. Для этого стоимость каждого дочернего товара рассчитываем с помощью функции -
$currency->priceDisplay((float)$arr['tovarprice'])
Теперь нам нужно получение данных для отображения в следующей таблице:
Маленький рисунок товара.
Ссылка на карточку товара с его названием.
Артикул товара
Основная цена.
Конструкция кнопки – Добавить в корзину. (Здесь очень важно, чтобы нажатие на кнопку относилось именно к соответствующему товару в строке).
Общий вид функции дочернего поля - Общий дочерний вид следующий. Не знаю нужно, что либо подробно описывать это обычный код php, никах особых решений в нем нет просто получаем данные из базы данных и выводим их в нужном порядке таблицей в карточке товара. Наверное одно всё-таки нужно пояснить - в создаваемую таблицу не включается повторно, товар который уже стоит сверху в карточке товара с помощью условия:
if ( $arr['value'] === JRoute::_( 'index.php?option=com_virtuemart&view=productdetails& virtuemart_category_id= '.$virtuemart_category_id.'&virtuemart_product_id='.$selected))
В конце полученный массив с помощью функции implode() преобразуем в строку, которая возвращается как результат работы функции с помощью оператора return для отображения блока HTML кода в карточке товара. И так весь код функции со строки 763 в файле administrator\components\com_virtuemart\models\customfields.php
case 'A':
$options = array();
$session = JFactory::getSession();
$virtuemart_category_id =
$session->get('vmlastvisitedcategoryid', 0, 'vm');
$productModel = VmModel::getModel('product');
$selected = JRequest::getInt('virtuemart_product_id');
$uncatChildren = $productModel->getUncategorizedChildren($selected);
foreach($uncatChildren as $k =>$child ){
$options[] = array( 'value' => JRoute::_
('index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=
'.$virtuemart_category_id.'&virtuemart_product_id='.$child['virtuemart_product_id']),
'id'=>$child['virtuemart_product_id'],
'text' =>$child['product_name'],'articul' =>$child['product_sku'],
'tovarimage' =>$child['file_url_thumb'],
'tovarmodimage' =>$child['file_url'], 'tovarprice' =>$child['product_price'] );}
$res=array();
$table='<div class="tabletov"><table width="100%">
<tr><th>Изображение</th>
<th>Название</th><th>Артикул</th>
<th>Цена</th> <th>Купить</th></tr>';
foreach($options as $arr):
if ( $arr['value'] === JRoute::_
('index.php?option=com_virtuemart&view=productdetails
&virtuemart_category_id='.$virtuemart_category_id.
'&virtuemart_product_id='.$selected)) continue;
$res[]= '<tr><td><a class="modal" href='.JRoute::_
('').$arr['tovarmodimage'].'>
<img class="product-image" src='.$arr['tovarimage'].'></a></td>
<td><a href='.$arr['value'].'>'.$arr['text'].'</a></td><td>'.$arr['articul'].'</td>
<td>'.$currency->priceDisplay((float)$arr['tovarprice']).'</td>
<td><form method="post" class="product js-recalculate" action="index.php" >
<span class="quantity-box">
<input type="text" class="quantity-input js-recalculate" name="quantity[]" value="1" /></span>
<span class="quantity-controls js-recalculate">
<input type="button" class="quantity-controls quantity-plus" />
<input type="button" class="quantity-controls quantity-minus" /></span>
<span class="addtocart-button"><input type="submit" name="addtocart"
class="addtocart-button" value="Добавить в корзину" /></span>
<input class="pname" type="hidden" value='.$arr['text'].'>
<input type="hidden" value="com_virtuemart" name="option">
<input type="hidden" value="cart" name="view">
<noscript><input type="hidden" name="task" value="add" /></noscript>
<input type="hidden" value='.$arr['id'].' name="virtuemart_product_id[]">
<input type="hidden" value="0" name="virtuemart_category_id[]"></form></td></tr>';
endforeach;
$str = implode($res);
return '<br>'.$table.''.$str.'</table></div>';
break;
Сами CSS стили для таблицы, делаем так, чтобы строки выводилась с эффектом зебры, для лучшего восприятия и не пересекались с основными стилями шаблона. И карточка товара должна быть достаточно широкой, чтобы в строке разместились все данные.
.tabletov {text-align: center;}
.tabletov th { padding: 20px;
text-align: center; background: #3B5998;}
.tabletov tr {background: #fff;}
.tabletov tr:nth-child(odd) {background: #FFE4B5;}