Добавляем форму «Добавить в корзину» в шаблон категории товаров в Virtuemart 1.1.x, если у товара есть свойства

Как многие, наверное, уже заметили, если товару в 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 );

Не стану утверждать, что способ правильный (хотя и радикальный), надо просто следить за именами элементов форм 😉

Ну, на этом, вроде бы, все…

 

0

Добавляем форму «Добавить в корзину» в шаблон категории товаров в Virtuemart 1.1.x, если у товара есть свойства: 1 комментарий

  1. Александр

    Здравствуйте сделал по второму варианту
    форма появилась все нормально красиво столкнулся с другой проблемой после этого
    У меня на сайте учетная запись не создается и после 2 шага в корзине (Оформить заказ) перебрасываться на форму регистрации (ввода адреса, имени и тд) переход на страницу есть а форма эта не выводиться меняю шаблон без этого хака все работает проблема точно в нем. Помогите за вознаграждение

Добавить комментарий