Как многие, наверное, уже заметили, если товару в Virtuemart 1.1.x добавить свойства (разные цвета, например), то в категории перестает отображаться форма добавления в корзину. Оно, по большому-то счету верно, ибо логика такова — если товар имеет свойства — о них лучше прочитать в полном описании в карточке товара и там все выбрать и нажать «Купить». Но нам-то надо сделать так, чтобы клиент не пугался, что нет кнопки «Купить» и не уходил от нас.
Исправляем недоразумение.
Как уже исторически сложилось, предлагаю несколько вариантов.
Вариант первый. Костяная нога.
Открываем файл administrator/components/com_virtuemart/html/shop.browse.php и ищем в районе 426 строки (ну да, где-то там, ибо у меня же вечно все переписано чуть менее, чем полностью) следующий код:
// Add-to-Cart Button if (USE_AS_CATALOGUE != '1' && $product_price != "" && $tpl->get_cfg( 'showAddtocartButtonOnProductList' ) && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') ) ) { $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; }
Собственно, тут и есть основное различие в вариантах решения задачи.
Итак, о первом варианте-костыле.
Можно убрать (закомментировать) проверку вместе с фигурными скобками, тем самым… В общем, об этом далее. Пока у нас должно получиться вот что:
// Add-to-Cart Button /* * 1. Начало - Костыль - Добавляем в browse кнопку Купить 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 )) { * 1. Начало - Костыль - Добавляем в browse кнопку Купить */ $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; /* * 2. Конец - Костыль - Добавляем в browse кнопку Купить } else { $products[$i]['form_addtocart'] = ''; $products[$i]['has_addtocart'] = false; } 2. Конец - Костыль - Добавляем в browse кнопку Купить * */
Затем у нас образуется, опять же, два варианта. Первый — косячный — оставить форму в категории как есть (без возможности выбора вариантов свойств). Кстати, это файл 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 и заменяем этим добром код в файле выше (components/com_virtuemart/themes/default/templates/browse/includes/addtocart_form.tpl.php). Обратите внимание на подчеркивание в пути к файлу — это разные файлы!
Теперь примерно в строке 27 видим это:
if (USE_AS_CATALOGUE != '1' && $product_price != "" && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )) {
и меняем на это:
if (USE_AS_CATALOGUE != '1') {
Почему не закомментировать всю строку? Давным-давно попросили меня убрать цены и сделать магазин каталогом… Именно это и проверяется в оставшемся условии — если константа из админки не равна ОДИН — это магазин и можно показывать кнопку «Купить». На самом деле, такие хотелки редкость, но они тоже бывают. Через полгода и не вспомнишь в каком магазине, что ты там делал и почему теперь галочка в админке не пашет.
Если комментировать все условия (весь IF) — придется еще закомментировать ему 61 строку — там закрывается блок.
Теперь объясню, почему вариант Первый Костыльный плох и что вместо него можно сделать.
Что мы видим в файле administrator/components/com_virtuemart/html/shop.browse.php
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 )) {
Ни много, ни мало — условия, при которых должна выводиться форма. А именно:
- USE_AS_CATALOGUE != ‘1’ — это мы уже знаем
- $product_price != «» — это если цена не пустая
- !stristr( $product_price, $VM_LANG->_(‘PHPSHOP_PRODUCT_CALL’) ) — если цена — это не «Позвоните, чтобы уточнить цену»
- !ps_product::product_has_attributes( $db_browse->f(‘product_id’), true ) — вот оно! Это как раз то, что нам и нужно!
И только если ВСЕ эти условия выполнятся — тогда и только тогда будет нам форма. Для того, чтобы не проверялось на наличие свойств у товара — убираем крайнее условие, оно где-то в строке 430. Т.е. Меняем это:
// 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 )) {
на это:
// 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 )) { ) {
Таким образом, что у нас теперь есть…
Исправили одну строку в файле administrator/components/com_virtuemart/html/shop.browse.php, скопировали код из шаблона формы в карточке в шаблон формы категории, исправив там одну строчку.
Ну, вроде все… Вопросы в комменты. Удачи!
З.Ы.
Как выяснилось, может возникнуть проблема. И, памятуя о мистере Мерфи, если проблема может случиться, она непременно случится.
Чтобы совсем допилить до вменяемого состояния это дело, дописываю. При добавлении товара, может появиться ошибка «Illegal variable _files or _env or _get or _post or _cookie or _server or _session or globals passed to script.«, соответственно, товар не добавляется. Ошибка происходит из-за того, что тип названия элемента формы (name) имеет не буквенное название, а числовое. Причем это может быть любой элемент любой формы на странице, не обязательно Virtuemart (спасибо nixsystem с JoomlaForum за подсказку).
Речь о том, что, напрмер, у нас где-то есть
<input type="text" value="" name="4">
Собственно, ошибка как раз в name, а именно — в том, что значение — число. Меняем, например, на name=»i4″ и проблема решена.
В принципе, можно вообще отучить Джумлу проверять это дело. Для этого открываем файл libraries/joomla/environment/request.php и комментируем строку 526 :
$failed |= is_numeric( $key );
Не стану утверждать, что способ правильный (хотя и радикальный), надо просто следить за именами элементов форм 😉
Ну, на этом, вроде бы, все…
Здравствуйте сделал по второму варианту
форма появилась все нормально красиво столкнулся с другой проблемой после этого
У меня на сайте учетная запись не создается и после 2 шага в корзине (Оформить заказ) перебрасываться на форму регистрации (ввода адреса, имени и тд) переход на страницу есть а форма эта не выводиться меняю шаблон без этого хака все работает проблема точно в нем. Помогите за вознаграждение