VM 2.x Кнопка купить на странице категории товара

Freeman Liberty

Постоялец
Регистрация
19 Май 2009
Сообщения
489
Реакции
173
Искал способ вставить кнопку "купить" и ввод кол-ва товара на страницу категории товара рядом с кнопкой "подробнее".
Не сильно силен в php, поэтому код, возможно, можно было бы и упростить (брал частями из default_addtocart.php и helper.php модуля вывода товаров).
У меня все работает, глюков не заметил.
Вообщем в файл default.php расположенный в ваш шаблон\html\com_virtuemart\category либо в аналогичном файле расположенном в components\com_virtuemart\views\category\tmpl\

вставляем следующий кусок кода


PHP:
<div class="addtocart-area">
 
        <form method="post" class="product" action="index.php">
                    <?php
                    // Product custom_fields
                    ?>
 
                    <div class="addtocart-bar">
 
            <?php // Display the quantity box
 
    $stockhandle = VmConfig::get('stockhandle', 'none');
    if (($stockhandle == 'disableit' or $stockhandle == 'disableadd') and ($this->product->product_in_stock - $this->product->product_ordered) < 1) {
?>
        <a href="<?php echo JRoute::_('index.php?option=com_virtuemart&view=productdetails&layout=notify&virtuemart_product_id='.$this->product->virtuemart_product_id); ?>" class="notify"><?php echo JText::_('COM_VIRTUEMART_CART_NOTIFY') ?></a>
 
<?php } else { ?>
                        <!-- <label for="quantity<?php echo $this->product->virtuemart_product_id; ?>" class="quantity_box"><?php echo JText::_('COM_VIRTUEMART_CART_QUANTITY'); ?>: </label> -->
        <span class="quantity-box">
        <input type="text" class="quantity-input js-recalculate" name="quantity[]" value="<?php if (isset($this->product->min_order_level) && (int) $this->product->min_order_level > 0) {
    echo $this->product->min_order_level;
} else {
    echo '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>
        <?php // Display the quantity box END ?>
 
 
            <?php
            }
            // Add the button
            $button_lbl = JText::_('COM_VIRTUEMART_CART_ADD_TO');
            $button_cls = '';
            // Display the add to cart button
            $stockhandle = VmConfig::get('stockhandle','none');
            if(($stockhandle=='disableit' or $stockhandle=='disableadd') and ($product->product_in_stock - $product->product_ordered)<1){
                $button_lbl = JText::_('COM_VIRTUEMART_CART_NOTIFY');
                $button_cls = 'notify-button';
                $button_name = 'notifycustomer';
            }
            ?>
            <?php // Display the add to cart button ?>
            <span class="addtocart-button">
                <input type="submit" name="addtocart"  class="addtocart-button" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
            </span>
 
                    <div class="clear"></div>
                    </div>
 
                    <input type="hidden" class="pname" value="<?php echo $product->product_name ?>"/>
                    <input type="hidden" name="option" value="com_virtuemart" />
                    <input type="hidden" name="view" value="cart" />
                    <noscript><input type="hidden" name="task" value="add" /></noscript>
                    <input type="hidden" name="virtuemart_product_id[]" value="<?php echo $product->virtuemart_product_id ?>" />
                    <input type="hidden" name="virtuemart_category_id[]" value="<?php echo $product->virtuemart_category_id ?>" />
                </form>
        <div class="clear"></div>
            </div>


После чего на странице категории появляется кнопка "Купить" с возможностью ввода кол-ва товара.
Если у кого будут предложения по улучшению - милости просим.
 
Вот обнаружил чуть более короткий вариант - 40 строк против 62
PHP:
<form method="post" class="product" action="index.php" id="addtocartproduct<?php echo $product->virtuemart_product_id ?>">
    <div class="addtocart-bar">
 
            <?php // Display the quantity box ?>
            <!-- <label for="quantity<?php echo $product->virtuemart_product_id;?>" class="quantity_box"><?php echo JText::_('COM_VIRTUEMART_CART_QUANTITY'); ?>: </label> -->
            <span class="quantity-box">
                <input  type="text" class="quantity-input" name="quantity[]" value="1" />
            </span>
            <span class="quantity-controls">
                <input type="button" class="quantity-controls quantity-plus" />
                <input type="button" class="quantity-controls quantity-minus" />
            </span>
            <?php // Display the quantity box END ?>
 
            <?php // Add the button
            $button_lbl = JText::_('COM_VIRTUEMART_CART_ADD_TO');
            $button_cls = ''; //$button_cls = 'addtocart_button';
            if (VmConfig::get('check_stock') == '1' && !$product->product_in_stock) {
                $button_lbl = JText::_('COM_VIRTUEMART_CART_NOTIFY');
                $button_cls = 'notify-button';
            } ?>
 
            <?php // Display the add to cart button ?>
            <span class="addtocart-button">
                <input type="submit" name="addtocart"  class="addtocart-button" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
            </span>
 
        <div class="clear"></div>
        </div>
 
        <?php // Display the add to cart button END ?>
        <input type="hidden" class="pname" value="<?php echo $product->product_name ?>">
        <input type="hidden" name="option" value="com_virtuemart" />
        <input type="hidden" name="view" value="cart" />
        <noscript><input type="hidden" name="task" value="add" /></noscript>
        <input type="hidden" name="virtuemart_product_id[]" value="<?php echo $product->virtuemart_product_id ?>" />
        <?php /** @todo Handle the manufacturer view */ ?>
        <input type="hidden" name="virtuemart_manufacturer_id" value="<?php echo $product->virtuemart_manufacturer_id ?>" />
        <input type="hidden" name="virtuemart_category_id[]" value="<?php echo $product->virtuemart_category_id ?>" />
</form>
Может кому пригодится.
 
у меня что первый что второй вариант кода даёт такой результат((( кнопка только под одним товаром
вирт2.0.6 у меня
164f425629eb.jpg

обновился до 2.0.14 тот же эффект(((
 
У меня вот этот :rules: код работает исправно:
PHP:
<!--Add to cart button BEGIN-->
<form method="post" class="product" action="index.php" id="addtocartproduct<?php echo $product->virtuemart_product_id ?>">
  <div class="addtocart-bar">
    <?php // Display the quantity box BEGIN ?>
      <div class="product-price floatleft">
                    <?php
                    if ($this->show_prices == '1') {
                        if(empty($product->prices) and VmConfig::get('askprice',1) and empty($product->images[0]->file_is_downloadable) ){echo JText::_('COM_VIRTUEMART_PRODUCT_ASKPRICE');}
                        //todo add config settings
                        if( $this->showBasePrice){
                            echo $this->currency->createPriceDiv('basePrice','COM_VIRTUEMART_PRODUCT_BASEPRICE',$product->prices);
                            echo $this->currency->createPriceDiv('basePriceVariant','COM_VIRTUEMART_PRODUCT_BASEPRICE_VARIANT',$product->prices);}
                        echo $this->currency->createPriceDiv('variantModification','COM_VIRTUEMART_PRODUCT_VARIANT_MOD',$product->prices);
                        echo $this->currency->createPriceDiv('basePriceWithTax','COM_VIRTUEMART_PRODUCT_BASEPRICE_WITHTAX',$product->prices);
                        echo $this->currency->createPriceDiv('discountedPriceWithoutTax','COM_VIRTUEMART_PRODUCT_DISCOUNTED_PRICE',$product->prices);
                        echo $this->currency->createPriceDiv('salesPriceWithDiscount','COM_VIRTUEMART_PRODUCT_SALESPRICE_WITH_DISCOUNT',$product->prices);
                        echo $this->currency->createPriceDiv('salesPrice','COM_VIRTUEMART_PRODUCT_SALESPRICE',$product->prices);
                        echo $this->currency->createPriceDiv('priceWithoutTax','COM_VIRTUEMART_PRODUCT_SALESPRICE_WITHOUT_TAX',$product->prices);
                        echo $this->currency->createPriceDiv('discountAmount','COM_VIRTUEMART_PRODUCT_DISCOUNT_AMOUNT',$product->prices);
                        echo $this->currency->createPriceDiv('taxAmount','COM_VIRTUEMART_PRODUCT_TAX_AMOUNT',$product->prices);
                    } ?>
        </div>
        <span class="quantity-box floatleft">
            <input type="text" class="quantity-input js-recalculate" name="quantity[]" value="<?php if (isset($this->product->min_order_level) && (int) $this->product->min_order_level > 0) {
                echo $this->product->min_order_level;
            } else {
                echo '1';
            } ?>" />
        </span>
        <span class="quantity-controls js-recalculate floatleft">
        <input type="button" class="quantity-controls quantity-plus" />
        <input type="button" class="quantity-controls quantity-minus" />
        </span>                       
      <?php // Display the quantity box END ?>
      <?php // Add the button
        $button_lbl = JText::_('COM_VIRTUEMART_CART_ADD_TO');
        $button_cls = ''; //$button_cls = 'addtocart_button';
        if (VmConfig::get('check_stock') == '1' && !$this->product->product_in_stock) {
            $button_lbl = JText::_('COM_VIRTUEMART_CART_NOTIFY');
            $button_cls = 'notify-button';
      } ?>
    <!-- </div> -->
      <?php // Display the add to cart button ?>
      <span class="addtocart-button">
        <input type="submit" name="addtocart"  class="addtocart-button" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
      </span>
      <div class="clear"></div>
  </div>
  <?php // Display the add to cart button END ?>
  <input type="hidden" class="pname" value="<?php echo $product->product_name ?>">
  <input type="hidden" name="option" value="com_virtuemart" />
  <input type="hidden" name="view" value="cart" />
  <noscript><input type="hidden" name="task" value="add" /></noscript>
  <input type="hidden" name="virtuemart_product_id[]" value="<?php echo $product->virtuemart_product_id ?>" />
  <?php /** @todo Handle the manufacturer view */ ?>
  <input type="hidden" name="virtuemart_manufacturer_id" value="<?php echo $product->virtuemart_manufacturer_id ?>" />
  <input type="hidden" name="virtuemart_category_id[]" value="<?php echo $product->virtuemart_category_id ?>" />
</form><!--Add to cart button END-->

добавлял в раздел productdetails в файле "путь-до-шаблона/html/com_virtuemart/category/default.php"
 
У меня вот этот :rules: код работает исправно:

добавлял в раздел productdetails в файле "путь-до-шаблона/html/com_virtuemart/category/default.php"

Это для какой версии VM? Что-то я не могу у себя найти в какое место (номер строки) данный код вставлять?
 
  • Заблокирован
  • #6
У меня вот этот :rules: код работает исправно:
PHP:
<!--Add to cart button BEGIN-->
<form method="post" class="product" action="index.php" id="addtocartproduct<?php echo $product->virtuemart_product_id ?>">
  <div class="addtocart-bar">
    <?php // Display the quantity box BEGIN ?>
      <div class="product-price floatleft">
                    <?php
                    if ($this->show_prices == '1') {
                        if(empty($product->prices) and VmConfig::get('askprice',1) and empty($product->images[0]->file_is_downloadable) ){echo JText::_('COM_VIRTUEMART_PRODUCT_ASKPRICE');}
                        //todo add config settings
                        if( $this->showBasePrice){
                            echo $this->currency->createPriceDiv('basePrice','COM_VIRTUEMART_PRODUCT_BASEPRICE',$product->prices);
                            echo $this->currency->createPriceDiv('basePriceVariant','COM_VIRTUEMART_PRODUCT_BASEPRICE_VARIANT',$product->prices);}
                        echo $this->currency->createPriceDiv('variantModification','COM_VIRTUEMART_PRODUCT_VARIANT_MOD',$product->prices);
                        echo $this->currency->createPriceDiv('basePriceWithTax','COM_VIRTUEMART_PRODUCT_BASEPRICE_WITHTAX',$product->prices);
                        echo $this->currency->createPriceDiv('discountedPriceWithoutTax','COM_VIRTUEMART_PRODUCT_DISCOUNTED_PRICE',$product->prices);
                        echo $this->currency->createPriceDiv('salesPriceWithDiscount','COM_VIRTUEMART_PRODUCT_SALESPRICE_WITH_DISCOUNT',$product->prices);
                        echo $this->currency->createPriceDiv('salesPrice','COM_VIRTUEMART_PRODUCT_SALESPRICE',$product->prices);
                        echo $this->currency->createPriceDiv('priceWithoutTax','COM_VIRTUEMART_PRODUCT_SALESPRICE_WITHOUT_TAX',$product->prices);
                        echo $this->currency->createPriceDiv('discountAmount','COM_VIRTUEMART_PRODUCT_DISCOUNT_AMOUNT',$product->prices);
                        echo $this->currency->createPriceDiv('taxAmount','COM_VIRTUEMART_PRODUCT_TAX_AMOUNT',$product->prices);
                    } ?>
        </div>
        <span class="quantity-box floatleft">
            <input type="text" class="quantity-input js-recalculate" name="quantity[]" value="<?php if (isset($this->product->min_order_level) && (int) $this->product->min_order_level > 0) {
                echo $this->product->min_order_level;
            } else {
                echo '1';
            } ?>" />
        </span>
        <span class="quantity-controls js-recalculate floatleft">
        <input type="button" class="quantity-controls quantity-plus" />
        <input type="button" class="quantity-controls quantity-minus" />
        </span>                     
      <?php // Display the quantity box END ?>
      <?php // Add the button
        $button_lbl = JText::_('COM_VIRTUEMART_CART_ADD_TO');
        $button_cls = ''; //$button_cls = 'addtocart_button';
        if (VmConfig::get('check_stock') == '1' && !$this->product->product_in_stock) {
            $button_lbl = JText::_('COM_VIRTUEMART_CART_NOTIFY');
            $button_cls = 'notify-button';
      } ?>
    <!-- </div> -->
      <?php // Display the add to cart button ?>
      <span class="addtocart-button">
        <input type="submit" name="addtocart"  class="addtocart-button" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
      </span>
      <div class="clear"></div>
  </div>
  <?php // Display the add to cart button END ?>
  <input type="hidden" class="pname" value="<?php echo $product->product_name ?>">
  <input type="hidden" name="option" value="com_virtuemart" />
  <input type="hidden" name="view" value="cart" />
  <noscript><input type="hidden" name="task" value="add" /></noscript>
  <input type="hidden" name="virtuemart_product_id[]" value="<?php echo $product->virtuemart_product_id ?>" />
  <?php /** @todo Handle the manufacturer view */ ?>
  <input type="hidden" name="virtuemart_manufacturer_id" value="<?php echo $product->virtuemart_manufacturer_id ?>" />
  <input type="hidden" name="virtuemart_category_id[]" value="<?php echo $product->virtuemart_category_id ?>" />
</form><!--Add to cart button END-->

добавлял в раздел productdetails в файле "путь-до-шаблона/html/com_virtuemart/category/default.php"


Вставлять нужно в www/components/com_virtuemart/views/category/tmpl/default.php
Virtuemart 2.0.14
85b9e35db95a4a8232eb48537fc62ba9.png
 
А как вывести еще и выпадающий список custom fields туда же ? Очень надо, но шаманство пока не дало успеха...

Сам спросил, сам отвечаю - оказалось достаточно взять код из helper.php модуля Вирта :
Код:
<form method="post" class="product" action="index.php">
                                        <?php
                                        // Product custom_fields
                                        if (!empty($product->customfieldsCart)) {
                                                ?>
                                                <div class="product-fields">
                                                        <?php foreach ($product->customfieldsCart as $field) { ?>
 
                                                        <div style="display:inline-block;" class="product-field product-field-type-<?php echo $field->field_type ?>">
                                                                <span class="product-fields-title"><b><?php echo $field->custom_title ?></b></span>
                                                                <?php echo JHTML::tooltip ($field->custom_tip, $field->custom_title, 'tooltip.png'); ?>
                                                                <span class="product-field-display"><?php echo $field->display ?></span>
                                                                <span class="product-field-desc"><?php echo $field->custom_field_desc ?></span>
                                                        </div>
 
                                                        <?php } ?>
                                                </div>
                                                <?php } ?>
 
                                        <div class="addtocart-bar">
 
                                                <?php
                                                // Display the quantity box
                                                ?>
                                                <!-- <label for="quantity<?php echo $product->virtuemart_product_id;?>" class="quantity_box"><?php echo JText::_ ('COM_VIRTUEMART_CART_QUANTITY'); ?>: </label> -->
                        <span class="quantity-box">
                        <input type="text" class="quantity-input" name="quantity[]" value="1"/>
                        </span>
                        <span class="quantity-controls">
                        <input type="button" class="quantity-controls quantity-plus"/>
                        <input type="button" class="quantity-controls quantity-minus"/>
                        </span>
 
 
                                                <?php
                                                // Add the button
                                                $button_lbl = JText::_ ('COM_VIRTUEMART_CART_ADD_TO');
                                                $button_cls = ''; //$button_cls = 'addtocart_button';
 
 
                                                ?>
                                                <?php // Display the add to cart button ?>
                                                <span class="addtocart-button">
                                                        <?php echo shopFunctionsF::getAddToCartButton($product->orderable); ?>
                        </span>
 
                                                <div class="clear"></div>
                                        </div>
 
                                        <input type="hidden" class="pname" value="<?php echo $product->product_name ?>"/>
                                        <input type="hidden" name="option" value="com_virtuemart"/>
                                        <input type="hidden" name="view" value="cart"/>
                                        <noscript><input type="hidden" name="task" value="add"/></noscript>
                                        <input type="hidden" name="virtuemart_product_id[]" value="<?php echo $product->virtuemart_product_id ?>"/>
                                        <input type="hidden" name="virtuemart_category_id[]" value="<?php echo $product->virtuemart_category_id ?>"/>
                                </form>

Почему-то предложенные варианты ТС и около 6 вариаций с Для просмотра ссылки Войди или Зарегистрируйся от забугорных друзей не работали, причем именно CustomFields не выводились. быть может из-за того, что на данном проекте у меня они не совсем стандартно создаются - их не видно в самой админке Вирта, все админится через модуль синхронизации с 1С. Собственно в ней товар добавляется, продается, заказы загружаются и все автоматически по заданному временному интервалу... разошелся, сори за оффтоп.
 
А у меня вопрос. Вот смотрите данный хак у меня работает нормально, НО при изменении в настройках магаза во вкладке "Внешний вид" - "Действие при поступлении на склад" - "Показывать 'Известить меня' вместо кнопки 'Добавить в корзину" кнопка "Добавить в корзину" не пропадает. По логике она должна поменяться на 'Известить меня'. Может кто подсказать как подправить?
 
Второй вариант кода, который из 40 строк в IE 9 работает не правильно. В IE 8 проблем не наблюдал. При нажатии кнопки "В корзину" товар в корзину не помещается, а открывается корзина без товара. В связи с чем заменил код на тот, что в первом посту. На него жалоб не поступало.
 
А у меня вопрос. Вот смотрите данный хак у меня работает нормально, НО при изменении в настройках магаза во вкладке "Внешний вид" - "Действие при поступлении на склад" - "Показывать 'Известить меня' вместо кнопки 'Добавить в корзину" кнопка "Добавить в корзину" не пропадает. По логике она должна поменяться на 'Известить меня'. Может кто подсказать как подправить?

Аналогичная ситуация - не работает "Уведомить меня" с этими вариантами - немного порылся и нашел такой вариант:

1) В папку ваш сайт/templates/ваш шаблон/html/com_virtuemart/category
скопировать файл default_addtocart.php из папки
ваш сайт/components/com_virtuemart/views/productdetails/tmpl
2) Открыть файл default.php из папки
ваш сайт/templates/ваш шаблон/html/com_virtuemart/category
и добавить пару строк в удобное место (где предполагаете вывести кнопку) :
PHP:
<?php
    $this->product = $product;
    echo $this->loadTemplate('addtocart');
?>

Все...))) Пробуйте, тестируйте...
Главное, что появляется "Уведомить меня" при отсутствии товара, если в админке установлена соответствующая "галка"

P.S. если понравилось, то "+ " не забывайте ставить)))
 
Назад
Сверху