Сразу хочу обратить ваше внимание на то, что- данное решение работает только в VirtueMart 1.1.9 - в других версиях могут быть некоторые отличия в решениях. Подробнее про другие версии лучше спросить в других темах Доброго времени суток, уважаемые форумчане. Я не так давно начал работать с VirtueMart, но как то так получилось (спасибо привередливому заказчику) кое чему научился. Но поделиться хочу своим опытом в таком деле. Часто добавляемые в магазин VirtueMart 1.1.9 товары имеют некоторые свойства, самые распространенные из которых это размеры. Ну и соответственно каждый вариант товара (размер) имеет свою цену. И вот представьте себе такую ситуацию - вы с таким трудом разобрались, как же ставить выбор цены в зависимости от размеров, у вас в конце концов кнопка Купить обросла дополнениями в виде выпадающего меню с размерами и вариантами цены, но тут вдруг вы переходите в список товара в категории и застываете в столбняке - под товарами пропала кнопка "Купить"... И что бы вы не делали - ни в какую она там не появляется. Это не баг и не глюк VirtueMart 1.1.9 , это свойство самого компонента - ведь для того, чтобы выбрать размер товара, логично было бы войти в карточку товара, а там то кнопка как раз и работает со всеми дополнениями. А вот хочется, что бы и в категории работала так же. И вот я так же, как и вы, пытался найти решение этого вопроса и спустя какое то время я его нашел. Спешу с вами поделиться. Еще раз повторюсь - только для VirtueMart 1.1.9 1 шаг. Заходим через FTP в корень своего сайта и находим файл administrator/components/com_virtuemart/html/shop.browse.php, в нем находим условный оператор if else, в коде, который выглядит так (у меня это была строка 415): Код (html): // Add-to-Cart Button if (USE_AS_CATALOGUE != '1' && $product_price != "" && $tpl->get_cfg( 'showAddtocartButtonOnProductList' ) && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') ) && !ps_product::product_has_attributes( $db_browse->f('product_id'), true )) { $tpl->set( 'i', $i ); $tpl->set( 'product_id', $db_browse->f('product_id') ); $tpl->set( 'product_in_stock', $db_browse->f('product_in_stock') ); $tpl->set( 'ps_product_attribute', $ps_product_attribute ); $products[$i]['form_addtocart'] = $tpl->fetch( 'browse/includes/addtocart_form.tpl.php' ); $products[$i]['has_addtocart'] = true; } else { $products[$i]['form_addtocart'] = ''; $products[$i]['has_addtocart'] = false; } Так вот этот условный оператор (if else) следует закомментировать. То есть добавить в начале строки //. Но те, кто не силен в PHP не экспериментируйте а просто поменяйте указанный выше код на нижеследующий: Код (html): // Add-to-Cart Button //if (USE_AS_CATALOGUE != '1' && $product_price != "" //&& $tpl->get_cfg( 'showAddtocartButtonOnProductList' ) //&& !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') ) //&& !ps_product::product_has_attributes( $db_browse->f('product_id'), true )) { $tpl->set( 'i', $i ); $tpl->set( 'product_id', $db_browse->f('product_id') ); $tpl->set( 'product_in_stock', $db_browse->f('product_in_stock') ); $tpl->set( 'ps_product_attribute', $ps_product_attribute ); $products[$i]['form_addtocart'] = $tpl->fetch( 'browse/includes/addtocart_form.tpl.php' ); $products[$i]['has_addtocart'] = true; //} //else { //$products[$i]['form_addtocart'] = ''; //$products[$i]['has_addtocart'] = false; //} Кстати, совет такой - лучше все же закомментировать нужные строки, чем просто удалять. Мало ли что - так всегда можно убрать символы коммента и код будет как и прежде. Поменяли? Отлично, но только это еще не все. Шаг №2 Далее находим файл components/com_virtuemart/themes/default/templates/browse/includes/addtocart_form.tpl.php В данном случае все намного проще - просто удаляем из него весь код а вместо него вставляем код из этого файла: components/com_virtuemart/themes/default/templates/product_details/includes/addtocart_form.tpl.php, но не забудьте и тут закомментировать строки 27 и 58. А если у вас в связи с этим возникают некоторые проблемы, то просто вставьте вот такой код (тот, что нужен с уже вставленными комментами): Код (html): <?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?> <div class="vmCartContainer"> <?php mm_showMyFileName(__FILE__); // This function lists all product children ( = Items) // or, when not children are defined, the product_id // SO LEAVE THIS IN HERE! list($html,$children) = $ps_product_attribute->list_attribute( ( $product_parent_id > 0 ) ? $product_parent_id : $product_id ); if ($children != "multi") { if( CHECK_STOCK == '1' && !$product_in_stock ) { $notify = true; } else { $notify = false; } ?> <form action="index.php" method="post" name="addtocart" id="" class="addtocart_form" <?php if( $this->get_cfg( 'useAjaxCartActions', 1 ) && !$notify ) { echo 'onsubmit="handleAddToCart( this.id );return false;"'; } ?>> <?php } echo $html; //if (USE_AS_CATALOGUE != '1' && $product_price != "" && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )) { ?> <?php if ($children != "multi") { ?> <div style="float: right;vertical-align: middle;"> <?php if ($children == "drop") { echo $ps_product_attribute->show_quantity_box($product_id,$product_id); } if ($children == "radio") { echo $ps_product_attribute->show_radio_quantity_box(); } $button_lbl = $VM_LANG->_('PHPSHOP_CART_ADD_TO'); $button_cls = 'addtocart_button'; if( CHECK_STOCK == '1' && !$product_in_stock ) { $button_lbl = $VM_LANG->_('VM_CART_NOTIFY'); $button_cls = 'notify_button'; } ?> <input type="submit" class="" value="" title="" /> </div> <?php } ?> <input type="hidden" name="flypage" value="shop." /> <input type="hidden" name="page" value="shop.cart" /> <input type="hidden" name="manufacturer_id" value="" /> <input type="hidden" name="category_id" value="" /> <input type="hidden" name="func" value="cartAdd" /> <input type="hidden" name="option" value="" /> <input type="hidden" name="Itemid" value="" /> <input type="hidden" name="set_price[]" value="" /> <input type="hidden" name="adjust_price[]" value="" /> <input type="hidden" name="master_product[]" value="" /> <?php //} if ($children != "multi") { ?> </form> <?php } if($children == "radio") { ?> <script language="JavaScript" type="text/javascript">//<![CDATA[ function alterQuantity(myForm) { for (i=0;i<myForm.selItem.length;i++){ setQuantity = myForm.elements['quantity']; selected = myForm.elements['selItem']; j = selected[i].id.substr(7); k= document.getElementById('quantity' + j); if (selected[i].checked==true){ k.value = myForm.quantity_adjust.value; } else { k.value = 0; } } } //]]> </script> <?php } ?> </div> В принципе это и все, но есть одно НО. Если вы меняли изображение кнопки Купить на свое - то в категории после этого кнопка (сама картинка) может не отражаться. Тут не стоит пугаться, и если вы смогли до этого поменять стандартные кнопки на свои, то и тут быстро справитесь - система аналогичная. Ну вот я и написал маленький мануал - а вам всего самого хорошего и удачи! ЗЫ. Если вам понравилось - как то выделитесь - плюсуйте.)))
Решение неплохое. Сам долго мучался и решил похоже. Только возникает проблема с дочерними товарами. Если их количество 0 то кнопка купить всеравно отображается.