Требования для работы
Описание
Для реализации этого механизма вам необходимо вести 2 списка: Список товаров и список подарков к этим товарам. Пример составлен для дополнения one page checkout.
Нам необходимо внести изменения в файле корзины one page checkout:
components/com_jshopping/templates/addons/onestepcheckout/default/checkuot.php
В начале файла добавить составление массива ID товаров и подарков (их отличие в нулевой стоимости):
$prodid=array();$prodprice=array();
foreach ($this->products as $key_id=>$prod)
{
$prodid[]=$prod['product_id'];//ID товаров
$prodprice[$prod['product_id']]=$prod['price'];//ID подарков
}
Убрать поле с вводом кол-ва у подарка:
<div class="quantity">
<span class="quantitymore" <?php if ($prod['price']*1<=0) echo 'style="display:none1;"'?> onclick="qty=jQuery('#quantity<?php echo $key_id ?>');qty.val(parseFloat(qty.val())+1);qty.change()"></span>
<input type="text" id="quantity<?php echo $key_id ?>" name="quantity[<?php echo $key_id ?>]" <?php if ($prod['price']*1<=0) echo 'disabled="disabled"'?> value="<?php echo $prod['quantity'] ?>" data-quantity="<?php echo $prod['quantity'] ?>" onkeyup="oneStepCheckout.refreshForm(this,800)" onchange="oneStepCheckout.refreshForm(this,0)" />
<span class="quantityless" <?php if ($prod['price']*1<=0) echo 'style="display:none1;"'?> onclick="qty=jQuery('#quantity<?php echo $key_id ?>');qty.val(parseFloat(qty.val())-1);qty.change()"></span>
</div>
Добавить код, для вставки формы добавления подарка:
<?php
//выбор подарка
//список товаров в $prodid
//список включенных подарков в $gifts
//товары в карточки $prodidstr
//подарки в карточке $cartgiftsstr
//смотрим в какие активные акции с типом подарок попадают товары
$prodidstr=implode(',',$prodid);
$cartgiftsstr=implode(',',$gifts); if (count($gifts)==0) $cartgiftsstr='0'; if (trim($cartgiftsstr)=='') $cartgiftsstr='0';
echo '<input type="hidden" id="prodstr" value="'.$prodidstr.'">';
if (trim($prodidstr)!='')
{Доступ к этому контенту разрешен только участникам проекта.
Вы можете получить доступ,купив эту доработку
?>
<script>
jQuery(document).ready(function() {
jQuery("body").on("click", ".setgift", function(e) {
var ids=this.id;
var myData = 'setgift='+ids;
jQuery.ajax({
type: "POST",
url: document.getElementById('siteurl').value+"index.php?<ссылка на файл, который обработает запрос>",
dataType:"text",
data:myData,
success:function(response){
location.reload();
},
error:function (xhr, ajaxOptions, thrownError){alert(thrownError);}
});
});
});
</script>
Необходимо внести изменения в модель корзины- чтобы подарки не меняли стоимость и кол-во, файл:
components/com_jshopping/models/cart.php
function updateCartProductPrice() {
$jshopConfig = JSFactory::getConfig();
foreach($this->products as $key=>$value) {
$product = JSFactory::getTable('product', 'jshop');
$product->load($this->products[$key]['product_id']);
$attr_id = unserialize($value['attributes']);
$freeattributes = unserialize($value['freeattributes']);
$product->setAttributeActive($attr_id);
$product->setFreeAttributeActive($freeattributes);
//корректировка подарка
if ($this->products[$key]['price']>0)
$this->products[$key]['price'] = $product->getPrice($this->products[$key]['quantity'], 1, 1, 1, $this->products[$key]);
if ($jshopConfig->cart_basic_price_show){$this->products[$key]['basicprice'] = $product->getBasicPrice();}
}
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onAfterUpdateCartProductPrice', array(&$this));
$this->loadPriceAndCountProducts();
$this->reloadRabatValue();
$this->saveToSession();
}
function refresh($quantity){
$jshopConfig = JSFactory::getConfig();
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onBeforeRefreshProductInCart', array(&$quantity, &$this));
if (is_array($quantity) && count($quantity)){
$lang = JSFactory::getLang();
$name = $lang->get('name');
foreach($quantity as $key=>$value){
if ($jshopConfig->use_decimal_qty){
$value = floatval(str_replace(",",".",$value));
$value = round($value, $jshopConfig->cart_decimal_qty_precision);
}else{
$value = intval($value);
}
if ($value < 0) $value = 0;
$product = JSFactory::getTable('product', 'jshop');
$product->load($this->products[$key]['product_id']);
$attr = unserialize($this->products[$key]['attributes']);
$free_attr = unserialize($this->products[$key]['freeattributes']);
$product->setAttributeActive($attr);
$product->setFreeAttributeActive($free_attr);
$qtyInStock = $product->getQtyInStock();
$checkqty = $value;
$dispatcher->trigger('onRefreshProductInCartForeach', array(&$this, &$quantity, &$key, &$product, &$attr, &$free_attr, &$qtyInStock, &$checkqty, &$value));
foreach($this->products as $key2 => $value2){
if ($key2!=$key && $value2['pid_check_qty_value']==$this->products[$key]['pid_check_qty_value']){
$checkqty += $value2["quantity"];
}
}
if ($jshopConfig->max_count_order_one_product && ($checkqty > $jshopConfig->max_count_order_one_product)){
JError::raiseNotice(111, sprintf(_JSHOP_ERROR_MAX_COUNT_ORDER_ONE_PRODUCT, $jshopConfig->max_count_order_one_product));
return 0;
}
if ($jshopConfig->min_count_order_one_product && ($checkqty < $jshopConfig->min_count_order_one_product)){
JError::raiseNotice(112, sprintf(_JSHOP_ERROR_MIN_COUNT_ORDER_ONE_PRODUCT, $jshopConfig->min_count_order_one_product));
return 0;
}
if (!$product->unlimited && $jshopConfig->controler_buy_qty && ($checkqty > $qtyInStock)){
JError::raiseWarning(113, sprintf(_JSHOP_ERROR_EXIST_QTY_PRODUCT_BASKET, $product->$name, $qtyInStock));
continue;
}
//корректировка подарка
if ($this->products[$key]['price']>0)
$this->products[$key]['price'] = $product->getPrice($value, 1, 1, 1, $this->products[$key]);
if ($jshopConfig->cart_basic_price_show){$this->products[$key]['basicprice'] = $product->getBasicPrice();}
//корректировка подарка
if ($this->products[$key]['price']>0)
$this->products[$key]['quantity'] = $value;Доступ к этому контенту разрешен только участникам проекта.
Вы можете получить доступ,купив эту доработку
unset($product);Доступ к этому контенту разрешен только участникам проекта.
Вы можете получить доступ,купив эту доработку
}
}
$this->loadPriceAndCountProducts();
$this->reloadRabatValue();
$this->saveToSession();
$dispatcher->trigger('onAfterRefreshProductInCart', array(&$quantity, &$this));
return 1;
}
Остается файл, который обработает запрос при добавлении подарка:
//установка подарка
if (isset($_POST['setgift']) and strlen($_POST['setgift']))
{
$ids=$_POST['setgift'];
require_once(JPATH_ROOT.DS.'components'.DS.'com_jshopping'.DS.'models'.DS.'cart.php');
require_once(JPATH_ROOT.DS.'components'.DS.'com_jshopping'.DS.'models'.DS.'tempcart.php');
$cart = new jshopCart();
$tempcart = new jshopTempCart();
$cart->load();
//добавляем подарокДоступ к этому контенту разрешен только участникам проекта.
Вы можете получить доступ,купив эту доработку
exit();
}