1 Отредактировано Илья (09.02.2017 12:14:43)

Тема: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Добрый день. Подскажите пожалуйста как образом мне доработать, что бы Если товар на сайте выключили, то он удалялся из корзины пользователя. Спасибо

1. Удаление товара из корзины если он выключен

delproduct/config/handlers.inc.php

<?php
namespace Delproduct\Config;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
         $this->bind('cart.getcartdata');
    }

     public static function CartGetcartdata ($info) {
        
         $cart = $info['cart'];
         $cart_products = $cart->getProductItems();
         foreach($cart_products as $key => $cartdata) { 
             if ($cartdata['product']['public'] == 0){
                
                 $cart->removeItem($key);
                
            
             }            
         }
     }
}

delproduct/config/file.inc.php

<?php
namespace Delproduct\Config;
use \RS\Orm\Type;


class File extends \RS\Orm\ConfigObject
{
   
    
}

delproduct/config/module.xml

<?xml version="1.0" encoding="utf-8"?>
<config>
    <defaultValues>    
        <name multilanguage="true">Удаление товара из корзины</name>
        <description multilanguage="true">Удаляет товар из корзины, если у этого товара выключена публичность</description>        
        <version>1.0.0.0</version>
        <author>My mod</author>      
    </defaultValues>
</config>

Перегрузить шаблон сartpage.tpl

{$shop_config=ConfigLoader::byModule('shop')}
{assign var=catalog_config value=ConfigLoader::byModule('catalog')}
{assign var=product_items value=$cart->getProductItems()}
<div class="cart" id="cartItems">
    <div class="top">
        <div class="cartIcon">Корзина</div>
        {if !empty($cart_data.items)}
        <a class="clearCart" href="{$router->getUrl('shop-front-cartpage', ["Act" => "cleanCart"])}"><span>очистить корзину</span></a>
        {/if}
    </div>
    <div class="padd">
        {if !empty($cart_data.items)}
        <div class="head">
            <div class="price">Цена</div>    
            <div class="amount">Количество</div>
        </div>
        <form method="POST" action="{$router->getUrl('shop-front-cartpage', ["Act" => "update"])}" id="cartForm">
            <input type="submit" class="hidden">
            {hook name="shop-cartpage:products" title="{t}Корзина:товары{/t}"}
            <div class="viewport">
                <table class="cartProducts">
                    {foreach from=$cart_data.items key=index item=item name="items"}
                        {assign var=product value=$product_items[$index].product}
                        {if $product}
                        {assign var=cartitem value=$product_items[$index].cartitem}
                        {if !empty($cartitem.multioffers)}
                           {assign var=multioffers value=unserialize($cartitem.multioffers)} 
                        {/if}
                        <tr data-id="{$index}" data-product-id="{$cartitem.entity_id}" class="cartitem{if $smarty.foreach.items.first} first{/if}">
                            <td class="colPreview">
                                <a class="preview" href="{$product->getUrl()}"><img src="{$product->getMainImage(64,64)}" alt="{$product.title}"/></a>
                            </td>
                            <td class="colTitle">
                                <a class="title" href="{$product->getUrl()}">{$product.title}</a><br>
                                {if $product->isMultiOffersUse()}
                                    <div class="multiOffers">
                                        {foreach $product.multioffers.levels as $level}
                                            {if !empty($level.values)}
                                                <div class="title">{if $level.title}{$level.title}{else}{$level.prop_title}{/if}</div>
                                                <select name="products[{$index}][multioffers][{$level.prop_id}]" data-prop-title="{if $level.title}{$level.title}{else}{$level.prop_title}{/if}">
                                                    {foreach $level.values as $value}
                                                        <option {if $multioffers[$level.prop_id].value == $value.val_str}selected="selected"{/if} value="{$value.val_str}">{$value.val_str}</option>   
                                                    {/foreach}
                                                </select>
                                            {/if}
                                        {/foreach}
                                        {if $product->isOffersUse()}
                                            {foreach from=$product.offers.items key=key item=offer name=offers}
                                                <input id="offer_{$key}" type="hidden" name="hidden_offers" class="hidden_offers" value="{$key}" data-info='{$offer->getPropertiesJson()}' data-num="{$offer.num}"/>
                                                {if $cartitem.offer==$key}
                                                    <input type="hidden" name="products[{$index}][offer]" value="{$key}"/>
                                                {/if}
                                            {/foreach}
                                        {/if}
                                    </div>
                                {elseif $product->isOffersUse()}
                                    <select name="products[{$index}][offer]" class="offer">
                                        {foreach from=$product.offers.items key=key item=offer name=offers}
                                            <option value="{$key}" {if $cartitem.offer==$key}selected{/if}>{$offer.title}</option>
                                        {/foreach}
                                    </select>
                                {/if}
                            </td>
                            <td class="colAmount">      
                                <div class="amoutPicker">                    
                                    <div class="qpicker">
                                        <a class="inc"></a>
                                        <a class="dec"></a>
                                    </div>                    
                                    <input type="text" maxlength="4" class="fieldAmount" value="{$cartitem.amount}" name="products[{$index}][amount]"> 
                                    <span class="unit">
                                        {if $catalog_config.use_offer_unit}
                                            {$product.offers.items[$cartitem.offer]->getUnit()->stitle}
                                        {else}
                                            {$product->getUnit()->stitle}
                                        {/if}
                                    </span>
                                    <div class="error">{$item.amount_error}</div>
                                </div>
                            </td>
                            <td class="colPrice">
                                <div class="floatbox">
                                    <span class="priceBlock">
                                        <span class="priceValue">{$item.cost}</span>
                                    </span>
                                </div>
                                <div class="discount">
                                    {if $item.discount>0}
                                    скидка {$item.discount}
                                    {/if}
                                </div>
                            </td>
                            <td class="colRemove">
                                <a title="Удалить товар из корзины" class="remove" href="{$router->getUrl('shop-front-cartpage', ["Act" => "removeItem", "id" => $index])}"></a>
                            </td>
                        </tr>
                        {assign var=concomitant value=$product->getConcomitant()}
                        
                        {foreach from=$item.sub_products key=id item=sub_product_data}
                            {assign var=sub_product value=$concomitant[$id]}
                            <tr>

                                <td colspan="2" class="colTitle">
                                    <label>
                                        <input 
                                            class="fieldConcomitant" 
                                            type="checkbox" 
                                            name="products[{$index}][concomitant][]" 
                                            value="{$sub_product->id}"
                                            {if $sub_product_data.checked}
                                                checked="checked"
                                            {/if}
                                            >
                                        {$sub_product->title}
                                    </label>
                                </td>
                                <td class="colAmount">
                                    {if $shop_config.allow_concomitant_count_edit}
                                        <div class="amoutPicker">                    
                                            <div class="qpicker">
                                                <a class="inc"></a>
                                                <a class="dec"></a>
                                            </div>                            
                                            <input type="text" maxlength="4" class="fieldAmount concomitant" data-id="{$sub_product->id}" value="{$sub_product_data.amount}" name="products[{$index}][concomitant_amount][{$sub_product->id}]"> 
                                            <span class="unit">{$product->getUnit()->stitle}</span>
                                        </div>
                                    {else}
                                        {$sub_product_data.amount} {$sub_product->getUnit()->stitle}
                                    {/if}
                                    <div class="error">{$sub_product_data.amount_error}</div>
                                </td>
                                <td class="colPrice">
                                    <span class="priceBlock">
                                        <span class="priceValue">{$sub_product_data.cost}</span>
                                    </span>
                                    <div class="discount">
                                        {if $sub_product_data.discount>0}
                                        скидка {$sub_product_data.discount}
                                        {/if}
                                    </div>
                                </td>
                                <td></td>
                            </tr>
                        {/foreach}
                        {/if}
                    {/foreach}
                </table>
            </div>
            {/hook}
            {hook name="shop-cartpage:summary" title="{t}Корзина:итог{/t}"}
                <div class="cartFooter">
                    <div class="linesContainer">
                        {foreach from=$cart->getCouponItems() key=id item=item}
                            <div class="line">
                                <a href="{$router->getUrl('shop-front-cartpage', ["Act" => "removeItem", "id" => $id])}" class="remove" title="{t}удалить скидочный купон{/t}"></a>
                                <div class="text">{t}Купон на скидку{/t} {$item.coupon.code}</div>
                                <div class="digits"></div>
                            </div>
                        {/foreach}
                        {if $cart_data.total_discount>0}
                            <div class="line">
                                <div class="text">Скидка на заказ</div>
                                <div class="digits">{$cart_data.total_discount}</div>
                            </div>                        
                        {/if}
                    </div>
                    <div class="discountText">
                        <span class="info">Купон на скидку (если есть): </span><input type="text" class="couponCode{if $cart->getUserError('coupon')!==false} hasError{/if}" size="12" name="coupon" value="{$coupon_code}">&nbsp;
                        <a class="applyCoupon">применить</a>
                    </div>
                    <div class="total"><span class="text">Итого:</span> <span class="total-value">{$cart_data.total}</span></div>
                    <div class="loader"></div>                                
                </div>
            {/hook}
            {hook name="shop-cartpage:bottom" title="{t}Корзина:подвал{/t}"}
                <div class="bottom">
                    <noscript><input type="submit" class="onemoreEmpty recalc" value="{t}Пересчитать{/t}"></noscript>
                    <a href="{$router->getUrl('shop-front-checkout')}" class="submit{if $cart_data.has_error} disabled{/if}">{t}Оформить заказ{/t}</a>
                    
                    <a href="JavaScript:;" class="continue">Продолжить покупки</a>
                    
                    {if $THEME_SETTINGS.enable_one_click_cart}
                    <a href="JavaScript:;" class="toggleOneClickCart"><span class="tabletHidden">Заказать по телефону</span></a>
                    {/if}
                    
                    <div class="error" {if !empty($cart_data.errors)}style="display: block;"{/if}>
                        {foreach from=$cart_data.errors item=error}
                            {$error}<br>
                        {/foreach}
                    </div>
                </div>
            {/hook}
        </form>
        {* Покупка в один клик в корзине *}
        {if $THEME_SETTINGS.enable_one_click_cart}
            {moduleinsert name="\Shop\Controller\Block\OneClickCart"}
        {/if}
        {else}
            <div class="empty">В корзине нет товаров</div>
        {/if}
    </div>
</div>

2. Запрет оформления товара если он выключен

Перегрузить шаблон cartpage.tpl
После:

<a class="title" href="{$product->getUrl()}">{$product.title}</a><br>

Вставить:

{if $product.public==0}<span style="color:red;">Товара нет в наличии</span>{/if}<br>

Это заменить:

                    <noscript><input type="submit" class="onemoreEmpty recalc" value="{t}Пересчитать{/t}"></noscript>
                    <a href="{$router->getUrl('shop-front-checkout')}" class="submit{if $cart_data.has_error} disabled{/if}">{t}Оформить заказ{/t}</a>
                    
                    <a href="JavaScript:;" class="continue">Продолжить покупки</a>

На это:

                {$s = 1}
                {foreach $product_items as $publics}
                    {if $publics.product.public  eq 0}
                    {$s = 0}
                    {break}
                    {/if}
                {/foreach}
                <!-- {var_dump($s)} -->
                {if $s eq 0}
                    <a href="{$router->getUrl('shop-front-checkout')}" class="submit disabled">{t}Оформить заказ{/t}</a>
                {else}
                    <a href="{$router->getUrl('shop-front-checkout')}" class="submit{if $cart_data.has_error} disabled{/if}">{t}Оформить заказ{/t}</a>                 
                {/if}           
                    <noscript><input type="submit" class="onemoreEmpty recalc" value="{t}Пересчитать{/t}"></noscript>
                    <!-- <a href="{$router->getUrl('shop-front-checkout')}" class="submit{if $cart_data.has_error} disabled{/if}">{t}Оформить заказ{/t}</a> -->
                    <a href="JavaScript:;" class="continue">Продолжить покупки</a>

http://s020.radikal.ru/i716/1702/10/13c4ee5b2f75.png

Повысить оценку Понизить оценку

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Вы можете повеситься на хук cart.getcartdata. Там перебрать товары и проверить видимость.

3

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Вот чт оу меня получилось. А как мне перейти к публичности объекта?

public static function CartGetcartdata ($product) {
        
        foreach ($product as $prod) {
            var_dump($prod);
            
        }
    }

var_dump($prod);

object(Shop\Model\Cart)#184 (11) {
  ["mode":protected]=>
  string(7) "session"
  ["order":protected]=>
  NULL
  ["cartitem":protected]=>
  object(Shop\Model\Orm\CartItem)#185 (5) {
    ["_values":protected]=>
    array(0) {
    }
    ["_self_class":protected]=>
    string(23) "Shop\Model\Orm\CartItem"
    ["_local_id":protected]=>
    int(64)
    ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
    array(0) {
    }
    ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
    array(0) {
    }
  }
  ["user_errors":protected]=>
  array(0) {
  }
  ["select_expression":protected]=>
  array(2) {
    ["site_id"]=>
    string(1) "1"
    ["session_id"]=>
    string(26) "qk3rn88eg9h99vuunf04fg21g7"
  }
  ["order_expression":protected]=>
  string(6) "dateof"
  ["session_id":protected]=>
  string(26) "qk3rn88eg9h99vuunf04fg21g7"
  ["cache_coupons":protected]=>
  array(0) {
  }
  ["cache_products":protected]=>
  array(1) {
    ["a3nznrjd4t"]=>
    array(2) {
      ["product"]=>
      object(Catalog\Model\Orm\Product)#288 (20) {
        ["fast_mark_offers_use":protected]=>
        NULL
        ["fast_mark_multioffers_use":protected]=>
        NULL
        ["fast_mark_virtual_multioffers_use":protected]=>
        NULL
        ["keep_update_prod_cat":protected]=>
        bool(true)
        ["keep_spec_dirs":protected]=>
        bool(false)
        ["cache_visible_property":protected]=>
        NULL
        ["user_cost":protected]=>
        NULL
        ["stock":protected]=>
        NULL
        ["full_stock":protected]=>
        NULL
        ["offer_xcost":protected]=>
        array(0) {
        }
        ["dir_alias_cache":protected]=>
        array(0) {
        }
        ["files":protected]=>
        NULL
        ["update_search_index"]=>
        bool(true)
        ["use_property_in_search_index"]=>
        bool(true)
        ["update_dir_counter"]=>
        bool(true)
        ["_values":protected]=>
        array(41) {
          ["id"]=>
          string(3) "114"
          ["site_id"]=>
          string(1) "1"
          ["title"]=>
          string(18) "Samsung S5233t Red"
          ["alias"]=>
          string(18) "samsung-s5233t-red"
          ["short_description"]=>
          string(0) ""
          ["description"]=>
          string(3335) "<p>Сотовый телефон &mdash; мобильный телефон, предназначенный для работы в с
етях сотовой связи; использует радиоприёмопередатчик и традиционную телефонную коммутацию для осущес
твления телефонной связи на территории зоны покрытия сотовой сети.<br /><br />В настоящее время сото
вая связь &mdash; самая распространённая из всех видов мобильной связи, поэтому обычно мобильным тел
ефоном называют именно сотовый телефон, хотя мобильными телефонами помимо сотовых являются также спу
тниковые телефоны, радиотелефоны и аппараты магистральной связи.<br /><br /><strong>Сотовый телефон<
/strong> &mdash; сложное высокотехнологичное электронное устройство, включающее в себя: приёмопереда
тчик на 2-4 СВЧ-диапазона, специализированный контроллер управления, цветной/монохромный дисплей, ин
терфейсные устройства, аккумулятор. Большинство трубок имеет свой уникальный номер, т. н. IMEI &mdash
; международный идентификатор мобильного устройства). IMEI присваивается при производстве сотового т
елефона и состоит из 15 цифр, записывается в немодифицируемую часть прошивки телефона. Сам этот номе
р отпечатан на этикетке телефона под аккумулятором, также на коробке (упаковке) от телефона (под штр
их-кодом). В большинстве телефонов его также можно узнать, набрав на клавиатуре код *#06#<br /><br /
>Большинство стандартов мобильной связи используют для идентификации абонента SIM-карту. Она предста
вляет собой смарт-карту (пластиковую карточку с впаянной в неё микросхемой микроконтроллера и памяти
) с программным управлением, и также имеет свой уникальный идентификационный номер IMSI (en:International
 Mobile Subscriber Identity &mdash; международный идентификационный номер подвижного абонента) и инд
ивидуальный цифровой пароль. Напряжение питания SIM-карты 3,3 В.<br /><br />В просторечии мобильный 
телефон именуется как &laquo;мобильник&raquo;, &laquo;труба&raquo;, &laquo;мобила&raquo;, &laquo;сот
ка&raquo;, &laquo;сотик&raquo;.</p>"
          ["barcode"]=>
          string(13) "64155-5RXQOAO"
          ["weight"]=>
          string(1) "0"
          ["dateof"]=>
          string(19) "2013-08-07 09:51:28"
          ["num"]=>
          string(1) "2"
          ["unit"]=>
          string(1) "0"
          ["min_order"]=>
          NULL
          ["public"]=>
          string(1) "1"
          ["maindir"]=>
          string(2) "38"
          ["reservation"]=>
          string(7) "default"
          ["brand_id"]=>
          string(1) "0"
          ["format"]=>
          string(0) ""
          ["rating"]=>
          string(3) "5.0"
          ["comments"]=>
          string(1) "1"
          ["last_id"]=>
          string(0) ""
          ["processed"]=>
          NULL
          ["is_new"]=>
          string(1) "0"
          ["group_id"]=>
          NULL
          ["xml_id"]=>
          NULL
          ["recommended"]=>
          string(6) "a:0:{}"
          ["concomitant"]=>
          string(6) "a:0:{}"
          ["offer_caption"]=>
          string(0) ""
          ["meta_title"]=>
          string(0) ""
          ["meta_keywords"]=>
          string(0) ""
          ["meta_description"]=>
          string(0) ""
          ["tax_ids"]=>
          string(8) "category"
          ["recommended_arr"]=>
          array(0) {
          }
          ["concomitant_arr"]=>
          array(0) {
          }
          ["_alias"]=>
          string(18) "samsung-s5233t-red"
          ["xcost"]=>
          array(2) {
            [1]=>
            string(7) "5190.00"
            [2]=>
            string(4) "0.00"
          }
          ["_currency"]=>
          object(Catalog\Model\Orm\Currency)#187 (5) {
            ["_values":protected]=>
            array(9) {
              ["id"]=>
              string(1) "1"
              ["site_id"]=>
              string(1) "1"
              ["title"]=>
              string(3) "RUB"
              ["stitle"]=>
              string(3) "р."
              ["is_base"]=>
              string(1) "1"
              ["ratio"]=>
              string(1) "1"
              ["public"]=>
              string(1) "1"
              ["default"]=>
              string(1) "1"
              ["percent"]=>
              string(1) "0"
            }
            ["_self_class":protected]=>
            string(26) "Catalog\Model\Orm\Currency"
            ["_local_id":protected]=>
            int(69)
            ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
            array(0) {
            }
            ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
            array(0) {
            }
          }
          ["_current_cost_id"]=>
          int(1)
          ["offers"]=>
          array(2) {
            ["use"]=>
            int(1)
            ["items"]=>
            array(1) {
              [0]=>
              object(Catalog\Model\Orm\Offer)#196 (6) {
                ["first_sortn"]=>
                int(0)
                ["_values":protected]=>
                array(15) {
                  ["id"]=>
                  string(3) "114"
                  ["site_id"]=>
                  string(1) "1"
                  ["product_id"]=>
                  string(3) "114"
                  ["title"]=>
                  NULL
                  ["barcode"]=>
                  NULL
                  ["pricedata"]=>
                  string(6) "a:0:{}"
                  ["propsdata"]=>
                  NULL
                  ["num"]=>
                  string(1) "2"
                  ["photos"]=>
                  string(6) "a:0:{}"
                  ["sortn"]=>
                  string(1) "0"
                  ["unit"]=>
                  string(1) "0"
                  ["processed"]=>
                  NULL
                  ["xml_id"]=>
                  NULL
                  ["photos_arr"]=>
                  array(0) {
                  }
                  ["pricedata_arr"]=>
                  array(0) {
                  }
                }
                ["_self_class":protected]=>
                string(23) "Catalog\Model\Orm\Offer"
                ["_local_id":protected]=>
                int(77)
                ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
                array(0) {
                }
                ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
                array(0) {
                }
              }
            }
          }
          ["multioffers"]=>
          array(1) {
            ["use"]=>
            bool(false)
          }
          ["xdir"]=>
          array(2) {
            [0]=>
            string(1) "1"
            [1]=>
            string(2) "38"
          }
          ["xspec"]=>
          array(1) {
            [0]=>
            string(1) "1"
          }
        }
        ["_self_class":protected]=>
        string(25) "Catalog\Model\Orm\Product"
        ["_local_id":protected]=>
        int(146)
        ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
        array(0) {
        }
        ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
        array(0) {
        }
      }
      ["cartitem"]=>
      object(Shop\Model\Orm\CartItem)#189 (5) {
        ["_values":protected]=>
        array(12) {
          ["site_id"]=>
          string(1) "1"
          ["session_id"]=>
          string(26) "qk3rn88eg9h99vuunf04fg21g7"
          ["uniq"]=>
          string(10) "a3nznrjd4t"
          ["dateof"]=>
          string(19) "2016-10-28 15:35:24"
          ["user_id"]=>
          string(1) "1"
          ["type"]=>
          string(7) "product"
          ["entity_id"]=>
          string(3) "114"
          ["offer"]=>
          string(1) "0"
          ["multioffers"]=>
          string(6) "a:0:{}"
          ["amount"]=>
          string(1) "2"
          ["title"]=>
          string(18) "Samsung S5233t Red"
          ["extra"]=>
          NULL
        }
        ["_self_class":protected]=>
        string(23) "Shop\Model\Orm\CartItem"
        ["_local_id":protected]=>
        int(65)
        ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
        array(0) {
        }
        ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
        array(0) {
        }
      }
    }
  }
  ["items":protected]=>
  array(1) {
    ["a3nznrjd4t"]=>
    object(Shop\Model\Orm\CartItem)#189 (5) {
      ["_values":protected]=>
      array(12) {
        ["site_id"]=>
        string(1) "1"
        ["session_id"]=>
        string(26) "qk3rn88eg9h99vuunf04fg21g7"
        ["uniq"]=>
        string(10) "a3nznrjd4t"
        ["dateof"]=>
        string(19) "2016-10-28 15:35:24"
        ["user_id"]=>
        string(1) "1"
        ["type"]=>
        string(7) "product"
        ["entity_id"]=>
        string(3) "114"
        ["offer"]=>
        string(1) "0"
        ["multioffers"]=>
        string(6) "a:0:{}"
        ["amount"]=>
        string(1) "2"
        ["title"]=>
        string(18) "Samsung S5233t Red"
        ["extra"]=>
        NULL
      }
      ["_self_class":protected]=>
      string(23) "Shop\Model\Orm\CartItem"
      ["_local_id":protected]=>
      int(65)
      ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
      ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
    }
  }
  ["order_items":protected]=>
  array(0) {
  }
}
array(14) {
  ["total"]=>
  string(10) "10 380 р."
  ["total_base"]=>
  string(10) "10 380 р."
  ["total_discount"]=>
  string(5) "0 р."
  ["items"]=>
  array(1) {
    ["a3nznrjd4t"]=>
    &array(7) {
      ["id"]=>
      string(10) "a3nznrjd4t"
      ["cost"]=>
      string(10) "10 380 р."
      ["base_cost"]=>
      string(10) "10 380 р."
      ["single_cost"]=>
      string(9) "5 190 р."
      ["single_weight"]=>
      string(1) "0"
      ["discount"]=>
      string(5) "0 р."
      ["sub_products"]=>
      array(0) {
      }
    }
  }
  ["items_count"]=>
  int(2)
  ["total_weight"]=>
  int(0)
  ["checkcount"]=>
  int(1)
  ["currency"]=>
  string(3) "р."
  ["errors"]=>
  array(0) {
  }
  ["has_error"]=>
  bool(false)
  ["taxes"]=>
  array(0) {
  }
  ["total_without_delivery"]=>
  string(10) "10 380 р."
  ["total_without_delivery_unformatted"]=>
  float(10380)
  ["total_unformatted"]=>
  float(10380)
}

Повысить оценку Понизить оценку

4 Отредактировано Закусило Александр (28.10.2016 16:49:11)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Во первых. Смотрите описание к хуку по входящим данным:
https://readyscript.ru/dev-manual/dev_h … hooks_list

array. Элементы:

    cart - объект Shop::Model::Cart
    cart_result - массив со всеми сведениями о корзине
    format - true, если необходимо вернуть отформатированные числа
    use_currency - true, если необходимо вернуть числа в текущей валюте

Т.е. туда поступает массив с ключами содержащими данные.

Во вторых Вы можете открыть класс корзины и посмотреть доступные методы. Я думаю Вам понадобится метод  getProductItems

5 Отредактировано Илья (28.10.2016 17:12:31)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Я вас правильно понял?Если так, то как быть дальше?

public static function CartGetcartdata ($info) {
        
        $cart=$info['cart'];
        $cart_products=$cart->getProductItems();
        foreach($cart_products as $cartdata) {  
             
            var_dump($cartdata['product']['public']);
        }
    }

Повысить оценку Понизить оценку

6 Отредактировано Закусило Александр (28.10.2016 17:14:27)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Я вас правильно понял?Если так, то как быть дальше?

Да правильно.
Далее Вам надо посмотреть внутрь товара посмотрев свойство public у него. И еслион 0 - выключен, то воспользоваться методом removeItem у объекта корзины.

7 Отредактировано Илья (28.10.2016 17:37:44)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Подскажите что не так?
При попытке открыть карзину, просто идет загрузка диалогового окна P.S. отображение ошибок включено.
Вот что в консоле "NetworkError: 500 Internal Server Error - http://test.local/cart/?dialogWrap=1"
Я так понимаю дело в $cartdata, но я все перепробовал и ничего не работает.

public static function CartGetcartdata ($info) {
        
        $cart=$info['cart'];
        $cart_products=$cart->getProductItems();
        foreach($cart_products as $key => $cartdata) { 
            if ($cartdata['product']['public'] == 0){
             
                $cartdata->removeItem($key);
            
            }
        }
    }

Повысить оценку Понизить оценку

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

removeItem Вам надо вызвать у объекта корзины ($cart) в Вашем случае. А вы пытаетесь у массива данных ($cartdata) вызвать функцию, что и приводит к ошибке. Пользуйтесь var_dump, чтобы понять что за тип данных в переменной.
Что касается 500 ошибки - внутренняя ошибка сервера. Означает, что отображение ошибок у Вас всё таки не включено. Проверьте файл .htaccess.

9 Отредактировано Илья (31.10.2016 13:10:31)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Если я привожу к такому виду код то получаю ошибку вида
Illegal offset type in isset or empty in Z:\home\test.local\www\modules\shop\model
\cart.inc.php</b> on line <b>783

foreach($cart_products as $cartdata) { 
            if ($cartdata['product']['public'] == 0){
             
                $cart->removeItem($cartdata);
            
            }
        }

Пытаюсь выводим вот таким способом, ошибка пропадает но ничего не очищает

$cart->removeItem($cartdata['product']['public']);

Повысить оценку Понизить оценку

10

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Вместо  $cartdata->removeItem($key) -->  $cart->removeItem($key);

foreach($cart_products as $key => $cartdata) { 
            if ($cartdata['product']['public'] == 0){
             
                $cart->removeItem($key);
            
            }

11

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Ярослав, я так пробовал, работает следующим образом. Первый раз открываю карзину просто грузится диалоговое окно. Закрываю. Открываю второй раз окно открывается, товар удаляется.
Вообщем работает только со второго раза, почему?

Повысить оценку Понизить оценку

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Не бывает такого.
Откройте /cart/ на сайте и попробуйте пообновлять окно.

13 Отредактировано Закусило Александр (31.10.2016 18:33:37)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Откройте файл /modules/shop/model/cart.inc.php и посмотрите описания к функциям, а также тип входящих данных.

14 Отредактировано Ярослав (31.10.2016 23:31:51)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Скорее всего просто для отображения в первый раз используются старые данные.
Припоминаю было что то подобное, возможно после надо сделать  $cart->cleanInfoCache();

foreach($cart_products as $key => $cartdata) { 
            if ($cartdata['product']['public'] == 0){
             
                $cart->removeItem($key);
            
            }
$cart->cleanInfoCache();

15 Отредактировано Илья (01.11.2016 09:41:50)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Ярослав, все равно открывается со второго раза

Закусило Александр пишет:

Не бывает такого.
Откройте /cart/ на сайте и попробуйте пообновлять окно.

Так работает, а вот если открывать корзину во всплывающем окне, то со второго раза

Повысить оценку Понизить оценку

16

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Закусило Александр, Ярослав Простите не увидел сразу. Вот такую ошибку выдает в консоли firebag. А если открываю второй раз, то ошибки нет
Я пробовал сделать как советовал Ярослав, но не помогает

<div class="cart" id="cartItems">
    <div class="top">
        <div class="cartIcon">Корзина</div>
                <a class="clearCart" href="/cart/?Act=cleanCart"><span>очистить корзину</span></a>
            </div>
    <div class="padd">
                <div class="head">
            <div class="price">Цена</div>    
            <div class="amount">Количество</div>
        </div>
        <form method="POST" action="/cart/?Act=update" id="cartForm">
            <input type="submit" class="hidden">
            
            <div class="viewport">
                <table class="cartProducts">
                                                                                                    
                <tr data-id="l18a0x2trq" data-product-id="" class="cartitem first">
                            <td class="colPreview">
                                <a class="preview" href="<!--error--><br />
<b>Fatal error</b>:  Call to a member function getUrl() on a non-object in <b>Z:\home\test.local\www
\cache\smarty\compile\modules_shop_view_cartpage_tpl.rs.tpl.php</b> on line <b>96</b><br />
<script language=JavaScript src='/denwer/errors/phperror_js.php'></script>

Повысить оценку Понизить оценку

17 Отредактировано Закусило Александр (01.11.2016 11:41:33)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Ну судя по ошибке он у Вас жалуется на то, что товар который вы положили в корзину либо не существует либо отсутствует. Закомментируйте Ваш код с удаление и проверьте он генерирует ошибку или нет.

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

И ещё приведите код корзины шаблона.

19 Отредактировано Илья (01.11.2016 12:20:32)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Закусило Александр пишет:

Ну судя по ошибке он у Вас жалуется на то, что товар который вы положили в корзину либо не существует либо отсутствует.

По логике то все верно же, потому что я его выключил и затем открываю корзину. В ошибке указаны пути к папке с кешем, соответственно нужно сбрасывать кеш получается. Но как советовал Ярослав, так не срабатывает, может чего то не хватает?


Закусило Александр пишет:

Закомментируйте Ваш код с удаление и проверьте он генерирует ошибку или нет.

Закомментировал, ошибка пропала, корзина открывается но товар не удаляется.

if ($cartdata['product']['public'] == 0){
             
                //$cart->removeItem($key);
            
            }

Повысить оценку Понизить оценку

20 Отредактировано Илья (01.11.2016 12:18:42)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Закусило Александр пишет:

И ещё приведите код корзины шаблона.

cart.tpl

<a class="basket showCart" id="cart" href="{$router->getUrl('shop-front-cartpage')}">
    <div class="cart"><span class="lineHolder"></span><span class="title">МОЯ КОРЗИНА</span></div>
    <p class="products">товаров: <span class="value">{$cart_info.items_count}</span></p>
    <p class="cost">сумма: <span class="value">{$cart_info.total}</span></p>
</a>

P.S. если что тема default

Повысить оценку Понизить оценку

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

За корзину в окне и на отдельной странице отвечает cartpage.tpl

22

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Закусило Александр

{$shop_config=ConfigLoader::byModule('shop')}
{assign var=catalog_config value=ConfigLoader::byModule('catalog')}
{assign var=product_items value=$cart->getProductItems()}
<div class="cart" id="cartItems">
    <div class="top">
        <div class="cartIcon">Корзина</div>
        {if !empty($cart_data.items)}
        <a class="clearCart" href="{$router->getUrl('shop-front-cartpage', ["Act" => "cleanCart"])}"><span>очистить корзину</span></a>
        {/if}
    </div>
    <div class="padd">
        {if !empty($cart_data.items)}
        <div class="head">
            <div class="price">Цена</div>    
            <div class="amount">Количество</div>
        </div>
        <form method="POST" action="{$router->getUrl('shop-front-cartpage', ["Act" => "update"])}" id="cartForm">
            <input type="submit" class="hidden">
            {hook name="shop-cartpage:products" title="{t}Корзина:товары{/t}"}
            <div class="viewport">
                <table class="cartProducts">
                    {foreach from=$cart_data.items key=index item=item name="items"}
                        {assign var=product value=$product_items[$index].product}
                        {assign var=cartitem value=$product_items[$index].cartitem}
                        {if !empty($cartitem.multioffers)}
                           {assign var=multioffers value=unserialize($cartitem.multioffers)} 
                        {/if}
                        <tr data-id="{$index}" data-product-id="{$cartitem.entity_id}" class="cartitem{if $smarty.foreach.items.first} first{/if}">
                            <td class="colPreview">
                                <a class="preview" href="{$product->getUrl()}"><img src="{$product->getMainImage(64,64)}" alt="{$product.title}"/></a>
                            </td>
                            <td class="colTitle">
                                <a class="title" href="{$product->getUrl()}">{$product.title}</a><br>
                                {if $product->isMultiOffersUse()}
                                    <div class="multiOffers">
                                        {foreach $product.multioffers.levels as $level}
                                            {if !empty($level.values)}
                                                <div class="title">{if $level.title}{$level.title}{else}{$level.prop_title}{/if}</div>
                                                <select name="products[{$index}][multioffers][{$level.prop_id}]" data-prop-title="{if $level.title}{$level.title}{else}{$level.prop_title}{/if}">
                                                    {foreach $level.values as $value}
                                                        <option {if $multioffers[$level.prop_id].value == $value.val_str}selected="selected"{/if} value="{$value.val_str}">{$value.val_str}</option>   
                                                    {/foreach}
                                                </select>
                                            {/if}
                                        {/foreach}
                                        {if $product->isOffersUse()}
                                            {foreach from=$product.offers.items key=key item=offer name=offers}
                                                <input id="offer_{$key}" type="hidden" name="hidden_offers" class="hidden_offers" value="{$key}" data-info='{$offer->getPropertiesJson()}' data-num="{$offer.num}"/>
                                                {if $cartitem.offer==$key}
                                                    <input type="hidden" name="products[{$index}][offer]" value="{$key}"/>
                                                {/if}
                                            {/foreach}
                                        {/if}
                                    </div>
                                {elseif $product->isOffersUse()}
                                    <select name="products[{$index}][offer]" class="offer">
                                        {foreach from=$product.offers.items key=key item=offer name=offers}
                                            <option value="{$key}" {if $cartitem.offer==$key}selected{/if}>{$offer.title}</option>
                                        {/foreach}
                                    </select>
                                {/if}
                            </td>
                            <td class="colAmount">      
                                <div class="amoutPicker">                    
                                    <div class="qpicker">
                                        <a class="inc"></a>
                                        <a class="dec"></a>
                                    </div>                    
                                    <input type="text" maxlength="4" class="fieldAmount" value="{$cartitem.amount}" name="products[{$index}][amount]"> 
                                    <span class="unit">
                                        {if $catalog_config.use_offer_unit}
                                            {$product.offers.items[$cartitem.offer]->getUnit()->stitle}
                                        {else}
                                            {$product->getUnit()->stitle}
                                        {/if}
                                    </span>
                                    <div class="error">{$item.amount_error}</div>
                                </div>
                            </td>
                            <td class="colPrice">
                                <div class="floatbox">
                                    <span class="priceBlock">
                                        <span class="priceValue">{$item.cost}</span>
                                    </span>
                                </div>
                                <div class="discount">
                                    {if $item.discount>0}
                                    скидка {$item.discount}
                                    {/if}
                                </div>
                            </td>
                            <td class="colRemove">
                                <a title="Удалить товар из корзины" class="remove" href="{$router->getUrl('shop-front-cartpage', ["Act" => "removeItem", "id" => $index])}"></a>
                            </td>
                        </tr>
                        {assign var=concomitant value=$product->getConcomitant()}
                        
                        {foreach from=$item.sub_products key=id item=sub_product_data}
                            {assign var=sub_product value=$concomitant[$id]}
                            <tr>

                                <td colspan="2" class="colTitle">
                                    <label>
                                        <input 
                                            class="fieldConcomitant" 
                                            type="checkbox" 
                                            name="products[{$index}][concomitant][]" 
                                            value="{$sub_product->id}"
                                            {if $sub_product_data.checked}
                                                checked="checked"
                                            {/if}
                                            >
                                        {$sub_product->title}
                                    </label>
                                </td>
                                <td class="colAmount">
                                    {if $shop_config.allow_concomitant_count_edit}
                                        <div class="amoutPicker">                    
                                            <div class="qpicker">
                                                <a class="inc"></a>
                                                <a class="dec"></a>
                                            </div>                            
                                            <input type="text" maxlength="4" class="fieldAmount concomitant" data-id="{$sub_product->id}" value="{$sub_product_data.amount}" name="products[{$index}][concomitant_amount][{$sub_product->id}]"> 
                                            <span class="unit">{$product->getUnit()->stitle}</span>
                                        </div>
                                    {else}
                                        {$sub_product_data.amount} {$sub_product->getUnit()->stitle}
                                    {/if}
                                    <div class="error">{$sub_product_data.amount_error}</div>
                                </td>
                                <td class="colPrice">
                                    <span class="priceBlock">
                                        <span class="priceValue">{$sub_product_data.cost}</span>
                                    </span>
                                    <div class="discount">
                                        {if $sub_product_data.discount>0}
                                        скидка {$sub_product_data.discount}
                                        {/if}
                                    </div>
                                </td>
                                <td></td>
                            </tr>
                        {/foreach}
                    {/foreach}
                </table>
            </div>
            {/hook}
            {hook name="shop-cartpage:summary" title="{t}Корзина:итог{/t}"}
                <div class="cartFooter">
                    <div class="linesContainer">
                        {foreach from=$cart->getCouponItems() key=id item=item}
                            <div class="line">
                                <a href="{$router->getUrl('shop-front-cartpage', ["Act" => "removeItem", "id" => $id])}" class="remove" title="{t}удалить скидочный купон{/t}"></a>
                                <div class="text">{t}Купон на скидку{/t} {$item.coupon.code}</div>
                                <div class="digits"></div>
                            </div>
                        {/foreach}
                        {if $cart_data.total_discount>0}
                            <div class="line">
                                <div class="text">Скидка на заказ</div>
                                <div class="digits">{$cart_data.total_discount}</div>
                            </div>                        
                        {/if}
                    </div>
                    <div class="discountText">
                        <span class="info">Купон на скидку (если есть): </span><input type="text" class="couponCode{if $cart->getUserError('coupon')!==false} hasError{/if}" size="12" name="coupon" value="{$coupon_code}">&nbsp;
                        <a class="applyCoupon">применить</a>
                    </div>
                    <div class="total"><span class="text">Итого:</span> <span class="total-value">{$cart_data.total}</span></div>
                    <div class="loader"></div>                                
                </div>
            {/hook}
            {hook name="shop-cartpage:bottom" title="{t}Корзина:подвал{/t}"}
                <div class="bottom">
                    <noscript><input type="submit" class="onemoreEmpty recalc" value="{t}Пересчитать{/t}"></noscript>
                    <a href="{$router->getUrl('shop-front-checkout')}" class="submit{if $cart_data.has_error} disabled{/if}">{t}Оформить заказ{/t}</a>
                    
                    <a href="JavaScript:;" class="continue">Продолжить покупки</a>
                    
                    {if $THEME_SETTINGS.enable_one_click_cart}
                    <a href="JavaScript:;" class="toggleOneClickCart"><span class="tabletHidden">Заказать по телефону</span></a>
                    {/if}
                    
                    <div class="error" {if !empty($cart_data.errors)}style="display: block;"{/if}>
                        {foreach from=$cart_data.errors item=error}
                            {$error}<br>
                        {/foreach}
                    </div>
                </div>
            {/hook}
        </form>
        {* Покупка в один клик в корзине *}
        {if $THEME_SETTINGS.enable_one_click_cart}
            {moduleinsert name="\Shop\Controller\Block\OneClickCart"}
        {/if}
        {else}
            <div class="empty">В корзине нет товаров</div>
        {/if}
    </div>
</div>

Повысить оценку Понизить оценку

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

{foreach from=$cart_data.items key=index item=item name="items"}

Замените на и покажите, что у Вас получилось.

<pre>
{var_dump($cart_data.items)}
</pre>
{foreach from=$cart_data.items key=index item=item name="items"}

24 Отредактировано Илья (01.11.2016 16:46:45)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Закусило Александр о public упоминания нету, я правильно понимаю?

array(2) {
  ["jh6k9n2vqy"]=>
  array(7) {
    ["id"]=>
    string(10) "jh6k9n2vqy"
    ["cost"]=>
    string(9) "7 630 р."
    ["base_cost"]=>
    string(9) "7 630 р."
    ["single_cost"]=>
    string(9) "7 630 р."
    ["single_weight"]=>
    string(1) "0"
    ["discount"]=>
    string(5) "0 р."
    ["sub_products"]=>
    array(0) {
    }
  }
  ["w8bx5kokfu"]=>
  array(7) {
    ["id"]=>
    string(10) "w8bx5kokfu"
    ["cost"]=>
    string(10) "14 600 р."
    ["base_cost"]=>
    string(10) "14 600 р."
    ["single_cost"]=>
    string(10) "14 600 р."
    ["single_weight"]=>
    string(1) "0"
    ["discount"]=>
    string(5) "0 р."
    ["sub_products"]=>
    array(0) {
    }
  }
}

Повысить оценку Понизить оценку

25 Отредактировано Закусило Александр (01.11.2016 16:50:09)

Re: Убрать товар из корзины и запрет оформления если он выключен [Решено]

Выведите и $product_items тоже