Добавляем выбор дочернего товара и его свойств в шаблон категории Virtuemart 1.1.4+

В прошлой статье на похожую тему я добавлял форму addToCart. Сейчас немного разжую как добавить ту же форму, только сбоку. Сразу картинка

Надеюсь, из нее понятно, что «Цвет Красный» у товара слева — это список дочерних товаров. Итак, поехали.Первое. Открываем файл /administrator/components/com_virtuemart/html/shop.browse.php

находим там строку 427:

&& !ps_product::product_has_attributes( $db_browse->f('product_id'), true )) {

и вместо нее вставляем это:

) {

Этим мы убираем проверку на наличие свойств у товара, чтобы вывести форму выбора дочерних товаров и свойств товара.

Теперь важное! Меняем шаблон формы. Открываем файл /components/com_virtuemart/themes/toys_store/templates/browse/includes/addtocart_form.tpl.php

и меняем его содержимое на это (не забываем сделать бэкап!):

<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>

<div class="vmCartContainer">

<?php
mm_showMyFileName(__FILE__);

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="<?php echo $mm_action_url ?>index.php" method="post" name="addtocart" id="<?php echo uniqid('addtocart_') ?>" 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') {
	?>
        <?php if ($children != "multi") { ?> 
    <div style="float: right;vertical-align: middle;"> <?php 

    echo '<input type="hidden" class="inputboxquantity" size="4" id="quantity'.$product_id.'" name="quantity[]" value="1" />';

    $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';
    }
    ?>
    <div class="clear"></div>
    <input type="submit" class="<?php echo $button_cls ?>" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
    </div>
    <?php  } ?>    
    <input type="hidden" name="flypage" value="shop.<?php echo $flypage ?>" />
	<input type="hidden" name="page" value="shop.cart" />
    <input type="hidden" name="manufacturer_id" value="<?php echo $manufacturer_id ?>" />
    <input type="hidden" name="category_id" value="<?php echo $category_id ?>" />
    <input type="hidden" name="func" value="cartAdd" />
    <input type="hidden" name="option" value="<?php echo $option ?>" />
    <input type="hidden" name="Itemid" value="<?php echo $Itemid ?>" />
    <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>

То есть, в отличие от стандартного шаблона добавления в корзину, который я взял из карточки, я убрал выбор количества товара (сделал его скрытым и по умолчанию 1) и сократил список условий в IF, чтобы вывести форму. Для тех, кому в лом — тупо копируйте код в файл.

Список отображается, но кривовастенько — хотелось бы убрать кривую строку из пунктов SELECT`a и вместо «Выберите» начинать с реально существующего товара, чтобы клиенту осталось только нажать «Купить» (провоцируем лень).

Для этого открываем файл /administrator/components/com_virtuemart/classes/ps_product_attribute.php

и ищем строку

$html .= "<option value=\"$product_id\">" . $VM_LANG->_( 'PHPSHOP_SELECT' ) . "</option>" ;

Ее комментируем в двух местах (две таких строки надо найти). Это примерно 290 и 403 строки. Этой строкой мы убираем пункт «Выберите», чтобы сразу был выбран первый товар из списка.

Теперь ищем строку:

$html .= $db->f( "product_name" ) ." - " ;

Это примерно 300 строка. Ее комментируем и ниже где-то строк на 20 (в цикле WHILE которая, перед if( ! $db_sku->is_last_record() ) ) видим строку

$html .= "(" . $db_item->f( "attribute_value" ) . ")" ;

Первая — это название дочернего товара в выпадающем списке, вторая — это свойства дочернего товара в скобках.

То есть, если закомментировать первую (то есть, ~300) строку и вторую (~320) поменять на:

$html .= $db_item->f( "attribute_value" ) ;

получим пункты вида «Красный — 1000 руб.»  вместо «Цвет ( красный ) — 1000 руб.»

Если надо убрать цену — надо закомментировать эту строку:

$html .= ' - ' . $CURRENCY_DISPLAY->getFullValue( $price["product_price"] ) ;

На этом, вроде бы, все… Если ничего не упустил 🙂

Вопросы — в комменты, спасибы — в комменты и в рыжую кнопку справа 🙂

 

0

Добавляем выбор дочернего товара и его свойств в шаблон категории Virtuemart 1.1.4+: 1 комментарий

  1. Ser

    День добрый. Спасибо за статью. Единственное возник вопрос. Как убрать кнопку купить у товаров в Browse_x у которых закончились дочерние или написать что нет в наличии? Возможно вы сможете помочь.

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