Вставка кнопки "Купить" в списке товара категории при использовании свойств товара

Тема в разделе "Хаки и модификации", создана пользователем forzi, 10.04.2013.

  1. Offline

    forzi Недавно здесь

    Регистрация:
    09.04.2013
    Сообщения:
    21
    Симпатии:
    1
    Пол:
    Мужской
    Сразу хочу обратить ваше внимание на то, что- данное решение работает только в 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):
    1. // Add-to-Cart Button
    2. if (USE_AS_CATALOGUE != '1' && $product_price != ""
    3. && $tpl->get_cfg( 'showAddtocartButtonOnProductList' )
    4. && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )
    5. && !ps_product::product_has_attributes( $db_browse->f('product_id'), true )) {
    6.  $tpl->set( 'i', $i );
    7.   $tpl->set( 'product_id', $db_browse->f('product_id') );
    8.   $tpl->set( 'product_in_stock', $db_browse->f('product_in_stock') );
    9.   $tpl->set( 'ps_product_attribute', $ps_product_attribute );
    10.   $products[$i]['form_addtocart'] = $tpl->fetch( 'browse/includes/addtocart_form.tpl.php' );
    11.   $products[$i]['has_addtocart'] = true;
    12.   }
    13.   else {
    14.   $products[$i]['form_addtocart'] = '';
    15.   $products[$i]['has_addtocart'] = false;
    16.   }

    Так вот этот условный оператор (if else) следует закомментировать. То есть добавить в начале строки //. Но те, кто не силен в PHP не экспериментируйте а просто поменяйте указанный выше код на нижеследующий:
    Код (html):
    1. // Add-to-Cart Button
    2. //if (USE_AS_CATALOGUE != '1' && $product_price != ""
    3. //&& $tpl->get_cfg( 'showAddtocartButtonOnProductList' )
    4. //&& !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )
    5. //&& !ps_product::product_has_attributes( $db_browse->f('product_id'), true )) {
    6.  $tpl->set( 'i', $i );
    7.   $tpl->set( 'product_id', $db_browse->f('product_id') );
    8.   $tpl->set( 'product_in_stock', $db_browse->f('product_in_stock') );
    9.   $tpl->set( 'ps_product_attribute', $ps_product_attribute );
    10.   $products[$i]['form_addtocart'] = $tpl->fetch( 'browse/includes/addtocart_form.tpl.php' );
    11.   $products[$i]['has_addtocart'] = true;
    12.   //}
    13.   //else {
    14.   //$products[$i]['form_addtocart'] = '';
    15.   //$products[$i]['has_addtocart'] = false;
    16.   //}

    Кстати, совет такой - лучше все же закомментировать нужные строки, чем просто удалять. Мало ли что - так всегда можно убрать символы коммента и код будет как и прежде.
    Поменяли? Отлично, но только это еще не все.
    Шаг №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):
    1. <?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
    2. <div class="vmCartContainer">
    3.  
    4.   <?php
    5.  mm_showMyFileName(__FILE__);
    6.  // This function lists all product children ( = Items)
    7.  // or, when not children are defined, the product_id
    8.  // SO LEAVE THIS IN HERE!
    9.  list($html,$children) = $ps_product_attribute->list_attribute( ( $product_parent_id > 0 )  ? $product_parent_id : $product_id );
    10.  if ($children != "multi") {
    11.    if( CHECK_STOCK == '1' && !$product_in_stock ) {
    12.    $notify = true;
    13.    } else {
    14.    $notify = false;
    15.  }
    16. ?>
    17.   <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;"'; } ?>>
    18. <?php
    19.  }
    20.  echo $html;
    21. //if (USE_AS_CATALOGUE != '1' && $product_price != "" && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )) {
    22.  ?>
    23.   <?php if ($children != "multi") { ?>  
    24.   <div style="float: right;vertical-align: middle;"> <?php  
    25.  if ($children == "drop") {  
    26.  echo $ps_product_attribute->show_quantity_box($product_id,$product_id);
    27.  }  
    28.  if ($children == "radio") {
    29.  echo $ps_product_attribute->show_radio_quantity_box();
    30.  }
    31.  $button_lbl = $VM_LANG->_('PHPSHOP_CART_ADD_TO');
    32.  $button_cls = 'addtocart_button';
    33.  if( CHECK_STOCK == '1' && !$product_in_stock ) {
    34.  $button_lbl = $VM_LANG->_('VM_CART_NOTIFY');
    35.  $button_cls = 'notify_button';
    36.  }
    37.  ?>  
    38.   <input type="submit" class="" value="" title="" />
    39.   </div>
    40.   <?php  } ?>  
    41.   <input type="hidden" name="flypage" value="shop." />
    42.   <input type="hidden" name="page" value="shop.cart" />
    43.   <input type="hidden" name="manufacturer_id" value="" />
    44.   <input type="hidden" name="category_id" value="" />
    45.   <input type="hidden" name="func" value="cartAdd" />
    46.   <input type="hidden" name="option" value="" />
    47.   <input type="hidden" name="Itemid" value="" />
    48.   <input type="hidden" name="set_price[]" value="" />
    49.   <input type="hidden" name="adjust_price[]" value="" />
    50.   <input type="hidden" name="master_product[]" value="" />
    51.   <?php
    52.  //}
    53.  if ($children != "multi") { ?>
    54.   </form>
    55.   <?php  
    56.  }  
    57.  if($children == "radio") { ?>
    58.  
    59.   <script language="JavaScript" type="text/javascript">//<![CDATA[
    60.  function alterQuantity(myForm) {
    61.  for (i=0;i<myForm.selItem.length;i++){
    62.  setQuantity = myForm.elements['quantity'];
    63.  selected = myForm.elements['selItem'];
    64.  j = selected[i].id.substr(7);
    65.  k= document.getElementById('quantity' + j);
    66.  if (selected[i].checked==true){
    67.  k.value = myForm.quantity_adjust.value; }
    68.  else {
    69.  k.value  = 0;
    70.  }
    71.  }
    72.  }
    73.  //]]>  
    74.   </script>
    75.   <?php } ?>
    76.   </div>

    В принципе это и все, но есть одно НО. Если вы меняли изображение кнопки Купить на свое - то в категории после этого кнопка (сама картинка) может не отражаться. Тут не стоит пугаться, и если вы смогли до этого поменять стандартные кнопки на свои, то и тут быстро справитесь - система аналогичная.
    Ну вот я и написал маленький мануал - а вам всего самого хорошего и удачи!
    ЗЫ. Если вам понравилось - как то выделитесь - плюсуйте.)))
     
    OlegM нравится это.
  2.  
  3. Offline

    user_name Недавно здесь

    Регистрация:
    10.07.2013
    Сообщения:
    1
    Симпатии:
    0
    Пол:
    Мужской
    Решение неплохое. Сам долго мучался и решил похоже. Только возникает проблема с дочерними товарами. Если их количество 0 то кнопка купить всеравно отображается.
     

Поделиться этой страницей

Загрузка...