Здравствуйте, мне нужно что бы Поля Фамилия, Организация и Инн были не обязательными при регистрации. Скажите как мне быть?
Перегрузить user.inc.php или можно как то модулем?

Создаем собственный модуль

modules/userscustom/config/file.inc.php

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


class File extends \RS\Orm\ConfigObject
{
   
    
}

modules/userscustom/config/handlers.inc.php

<?php
namespace Userscustom\Config;
use \RS\Orm\Type as OrmType;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this->bind('orm.init.users-user');

    }

    
    public static function ormInitUsersUser (\Users\Model\Orm\User $user) 
    {
        $user['__surname']->removeAllCheckers();
    } 
        
}

modules/userscustom/config/module.xml

<?xml version="1.0" encoding="utf-8"?>
<config>
    <defaultValues>    
        <name multilanguage="true">Модернизация модуля users</name>
        <description multilanguage="true">Модуль делает необязательным поле Фамилия при регистрации</description>        
        <version>1.0.0.0</version>
        <author>My mod</author>      
    </defaultValues>
</config>

Закусило Александр Спасибо, так работает. только осталось одно маленькое но
Можно ли как то сделать, что бы кеш сбрасывался и в 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>

http://storage8.static.itmages.ru/i/16/1102/s_1478076389_7571572_44883d40ea.png

Тоже самое

<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="lnx8a39v6h" 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>
array(2) {
  ["jh6k9n2vqy"]=>
  array(2) {
    ["product"]=>
    object(Catalog\Model\Orm\Product)#293 (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(2) "76"
        ["site_id"]=>
        string(1) "1"
        ["title"]=>
        string(33) "Проектор ViewSonic DVP5-P"
        ["alias"]=>
        string(25) "proektor-viewsonic-dvp5-p"
        ["short_description"]=>
        string(172) "Самые захватывающие 3D-эффекты у вас в гостиной — погрузитесь в мир сверхреалистичного 3D-кино."
        ["description"]=>
        string(6260) "
Проектор — световой прибор, перераспределяющий свет лампы с концентрацией светового потока на поверхности малого размера или в малом объёме. Проекторы являются в основном оптико-механическими или оптическо-цифровыми приборами, позволяющими при помощи источника света проецировать изображения объектов на поверхность, расположенную вне прибора — экран. Появление проекционных аппаратов обусловило возникновение кинематографа, относящегося к проекционному искусству.
Виды проекционных приборов



Диаскопический проекционный аппарат — изображения создаются при помощи лучей света, проходящих через светопроницаемый носитель с изображением. Это самый распространённый вид проекционных аппаратов. К ним относят такие приборы как: кинопроектор, диапроектор, фотоувеличитель, проекционный фонарь, кодоскоп и др.

Эпископический проекционный аппарат — создаёт изображения непрозрачных предметов путём проецирования отраженных лучей света. К ним относятся эпископы, мегаскоп.

Эпидиаскопический проекционный аппарат — формирует на экране комбинированные изображения как прозрачных, так и непрозрачных объектов.

Мультимедийный проектор (также используется термин «Цифровой проектор») — с появлением и развитием цифровых технологий это наименование получили два, вообще говоря, различных класса устройств:

На вход устройства подаётся видеосигнал в реальном времени (аналоговый или цифровой). Устройство проецирует изображение на экран. Возможно при этом наличие звукового канала.

Устройство получает на отдельном или встроенном в устройство носителе или из локальной сети файл или совокупность файлов (слайдшоу) — массив цифровой информации. Декодирует его и проецирует видеоизображение на экран, возможно, воспроизводя при этом и звук. Фактически, является сочетанием в одном устройстве мультимедийного проигрывателя и собственно проектора.

Лазерный проектор — выводит изображение с помощью луча лазера.


Аналоговые проекторы телевизионного сигнала


CRT проектор — аналоговое устройство, в котором изображение создаётся на экране трёх электронно-лучевых трубок, затем проецируется на экран тремя объективами.



Проектор с модуляцией света на масляной пленке — разновидность «светоклапанных» пассивных систем. Аналоговое электронно-лучевое и оптическое устройство, рассчитанное на управление мощным световым потоком для создания изображения на экране большого размера. На основе серийно выпускавшейся системы «Эйдофор» был, в частности, реализован первый большой телевизионный экран (чёрно-белый) Центра управления космическими полётами СССР.


Принцип действия проектора с модуляцией света заключается в том, что поток света падает последовательно на два поглощающих свет растра, между которыми находится масляная плёнка на зеркальной поверхности. Если масляная плёнка не возмущена, свет оказывается задержан обоими растрами и экран совершенно чёрный. Масляная плёнка помещается внутрь электронно-лучевой трубки, которая и формирует на ней распределение заряда в соответствии с поступающим видеосигналом. Распределение заряда, в сочетании с приложенным к зеркалу потенциалом, порождает возмущение поверхности плёнки. Проходя через этот участок плёнки, световой поток проходит мимо второго растра и попадает на экран в соответствующую точку.
"
        ["barcode"]=>
        string(13) "04342-RHIXQJL"
        ["weight"]=>
        string(1) "0"
        ["dateof"]=>
        string(19) "2013-08-07 04:17:39"
        ["num"]=>
        string(1) "4"
        ["unit"]=>
        string(1) "0"
        ["min_order"]=>
        NULL
        ["public"]=>
        string(1) "1"
        ["maindir"]=>
        string(2) "27"
        ["reservation"]=>
        string(7) "default"
        ["brand_id"]=>
        string(1) "0"
        ["format"]=>
        string(0) ""
        ["rating"]=>
        string(3) "4.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(25) "proektor-viewsonic-dvp5-p"
        ["xcost"]=>
        array(2) {
          [1]=>
          string(7) "7630.00"
          [2]=>
          string(4) "0.00"
        }
        ["_currency"]=>
        object(Catalog\Model\Orm\Currency)#189 (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(70)
          ["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)#225 (6) {
              ["first_sortn"]=>
              int(0)
              ["_values":protected]=>
              array(15) {
                ["id"]=>
                string(2) "76"
                ["site_id"]=>
                string(1) "1"
                ["product_id"]=>
                string(2) "76"
                ["title"]=>
                NULL
                ["barcode"]=>
                NULL
                ["pricedata"]=>
                string(6) "a:0:{}"
                ["propsdata"]=>
                NULL
                ["num"]=>
                string(1) "4"
                ["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(80)
              ["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) "27"
        }
        ["xspec"]=>
        array(1) {
          [0]=>
          string(1) "1"
        }
      }
      ["_self_class":protected]=>
      string(25) "Catalog\Model\Orm\Product"
      ["_local_id":protected]=>
      int(149)
      ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
      ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
    }
    ["cartitem"]=>
    object(Shop\Model\Orm\CartItem)#191 (5) {
      ["_values":protected]=>
      array(12) {
        ["site_id"]=>
        string(1) "1"
        ["session_id"]=>
        string(26) "lmjdk7s5qffteh9cudomg69ri5"
        ["uniq"]=>
        string(10) "jh6k9n2vqy"
        ["dateof"]=>
        string(19) "2016-10-28 17:28:11"
        ["user_id"]=>
        string(1) "1"
        ["type"]=>
        string(7) "product"
        ["entity_id"]=>
        string(2) "76"
        ["offer"]=>
        string(1) "0"
        ["multioffers"]=>
        string(6) "a:0:{}"
        ["amount"]=>
        string(1) "1"
        ["title"]=>
        string(33) "Проектор ViewSonic DVP5-P"
        ["extra"]=>
        string(32) "a:1:{s:12:"sub_products";a:0:{}}"
      }
      ["_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) {
      }
    }
  }
  ["w8bx5kokfu"]=>
  array(2) {
    ["product"]=>
    object(Catalog\Model\Orm\Product)#199 (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(2) "23"
        ["site_id"]=>
        string(1) "1"
        ["title"]=>
        string(46) "Ноутбук Lenovo ThinkPad Edge 14 0578RE8"
        ["alias"]=>
        string(39) "noutbuk-lenovo-thinkpad-edge-14-0578re8"
        ["short_description"]=>
        string(319) "Ноутбуки серии специально разрабатывались для игр. Мощнейшая графика, возможность разгона и эффектный внешний вид - отличительные признаки серии "Республики геймеров"."
        ["description"]=>
        string(3774) "
Ноутбук (англ. notebook — блокнот, блокнотный ПК) — портативный персональный компьютер, в корпусе которого объединены типичные компоненты ПК, включая дисплей, клавиатуру и устройство указания (обычно сенсорная панель, или тачпад), карманный компьютер, а также аккумуляторные батареи. Ноутбуки отличаются небольшими размерами и весом, время автономной работы ноутбуков изменяется в пределах от 1 до 15 часов.

История

Идею создания портативной вычислительной машины «размером с блокнот, имеющей плоский монитор и умеющей подключаться к сетям без проводов» выдвинул начальник исследовательской лаборатории фирмы Xerox Алан Кей (Alan Key) в 1968 г.

В 1979 г. по заказу NASA Вильям Могридж (компания Grid Systems) создал первый в мире ноутбук Grid Compass (оперативная память на ЦМД объёмом 340 КБ, процессор Intel 8086 с тактовой частотой 8 МГц, люминесцентный экран). Данный ноутбук использовался в программе Space Shuttle.

Первая общегражданская модель Osborne 1 (масса 11 кг, оперативная память 64 Кб, процессор Zilog Z80A с тактовой частотой 4 МГц, два дисковода 5,25 дюйма, три порта, в том числе для подключения модема, монохромный дисплей 8,75х6,6 см, вмещавший 24 строки по 52 символа; 69 клавиш) была создана изобретателем Адамом Осборном (Adam Osborne) в 1981 году и выпущена на рынок по цене $1795. Из-за маркетинговой ошибки, состоявшей в том, что начало продаж последующей модели Osborne Vixen было объявлено задолго до поступления машин в реализацию (а это ударило по продажам Osborne 1), компания разорилась.

В 1982 году компания Compaq успешно представила IBM PC-совместимый портативный компьютер на базе процессора Intel 8080. С 1983 г. многие производители компьютерной техники уже имели собственную линейку ноутбуков (например Epson HX-20). В 1984 г. фирма Apple выпустила первый ноутбук с LCD. В 1986 г. IBM представила первую «трансформируемую» модель ноутбука на базе процессора Intel (масса 5,4 кг, дисковод 3,5 дюйма) по цене $3500.

В 1990 г. Intel был представлен первый специализированный процессор для мобильных ПК — Intel386 SL, а также была предложена технология снижения напряжения питания, увеличившая срок службы батарей.
"
        ["barcode"]=>
        string(13) "15772-HQU2XJH"
        ["weight"]=>
        string(1) "0"
        ["dateof"]=>
        string(19) "2013-08-05 18:09:15"
        ["num"]=>
        string(1) "4"
        ["unit"]=>
        string(1) "0"
        ["min_order"]=>
        NULL
        ["public"]=>
        string(1) "1"
        ["maindir"]=>
        string(1) "9"
        ["reservation"]=>
        string(7) "default"
        ["brand_id"]=>
        string(1) "7"
        ["format"]=>
        string(0) ""
        ["rating"]=>
        string(3) "0.0"
        ["comments"]=>
        string(1) "0"
        ["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(39) "noutbuk-lenovo-thinkpad-edge-14-0578re8"
        ["xcost"]=>
        array(2) {
          [1]=>
          string(8) "14600.00"
          [2]=>
          string(4) "0.00"
        }
        ["_currency"]=>
        object(Catalog\Model\Orm\Currency)#189 (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(70)
          ["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)#200 (6) {
              ["first_sortn"]=>
              int(0)
              ["_values":protected]=>
              array(15) {
                ["id"]=>
                string(2) "23"
                ["site_id"]=>
                string(1) "1"
                ["product_id"]=>
                string(2) "23"
                ["title"]=>
                NULL
                ["barcode"]=>
                NULL
                ["pricedata"]=>
                string(6) "a:0:{}"
                ["propsdata"]=>
                NULL
                ["num"]=>
                string(1) "4"
                ["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(79)
              ["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(3) {
          [0]=>
          string(1) "1"
          [1]=>
          string(1) "9"
          [2]=>
          string(2) "53"
        }
        ["xspec"]=>
        array(2) {
          [0]=>
          string(1) "1"
          [1]=>
          string(2) "53"
        }
      }
      ["_self_class":protected]=>
      string(25) "Catalog\Model\Orm\Product"
      ["_local_id":protected]=>
      int(150)
      ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
      ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
    }
    ["cartitem"]=>
    object(Shop\Model\Orm\CartItem)#193 (5) {
      ["_values":protected]=>
      array(12) {
        ["site_id"]=>
        string(1) "1"
        ["session_id"]=>
        string(26) "lmjdk7s5qffteh9cudomg69ri5"
        ["uniq"]=>
        string(10) "w8bx5kokfu"
        ["dateof"]=>
        string(19) "2016-11-01 16:45:54"
        ["user_id"]=>
        string(1) "1"
        ["type"]=>
        string(7) "product"
        ["entity_id"]=>
        string(2) "23"
        ["offer"]=>
        string(1) "0"
        ["multioffers"]=>
        string(6) "a:0:{}"
        ["amount"]=>
        string(1) "1"
        ["title"]=>
        string(46) "Ноутбук Lenovo ThinkPad Edge 14 0578RE8"
        ["extra"]=>
        NULL
      }
      ["_self_class":protected]=>
      string(23) "Shop\Model\Orm\CartItem"
      ["_local_id":protected]=>
      int(66)
      ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
      ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
      array(0) {
      }
    }
  }
}

Закусило Александр о 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) {
    }
  }
}

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

{$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>
Закусило Александр пишет:

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

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

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

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

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


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

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

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

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

Закусило Александр, Ярослав Простите не увидел сразу. Вот такую ошибку выдает в консоли 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>

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

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

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

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

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

Если я привожу к такому виду код то получаю ошибку вида
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']);

Подскажите что не так?
При попытке открыть карзину, просто идет загрузка диалогового окна 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);
            
            }
        }
    }

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

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

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

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)
}

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

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

Вообщем дело было в ("двойных кавычках") нужно было заменить на одинарные, поэтому регулярка не применялась.

А ошибка выдавалась из за , -1, null

И рабочий вариант оказался таким

<td>{preg_replace('#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#', '$1 ($2) $3-$4-$5', $user.phone)}</td>

не понял Вас что имеенно убирать. Уже что только не пробовыл, убирал и изменял, ни как.
Ошибка уходит если убрать -1 но тогда регулярка не применяется

Вот так работает

{$string = '+79020087658'}
{$pattern = '#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#'}
{$replacement = '$1 ($2) $3-$4-$5'}
{preg_replace($pattern, $replacement, $string)}

Я пытаюсь это сделать на странице Печатной формы по ссылке
http://ready.local/admin/shop-orderctrl … =orderform

Вот что выдает var_dump($user)

                            object(Users\Model\Orm\User)#468 (15) {
  ["default_group":protected]=>
  string(5) "guest"
  ["authorized_user_group":protected]=>
  string(7) "clients"
  ["access_menu_table":protected]=>
  string(16) "iazw_access_menu"
  ["access_module_table":protected]=>
  string(18) "iazw_access_module"
  ["cache_cost_id":protected]=>
  NULL
  ["cache_mod_access":protected]=>
  NULL
  ["cache_menu_access":protected]=>
  NULL
  ["cache_admin_menu_access":protected]=>
  NULL
  ["cache_allow_sites":protected]=>
  NULL
  ["groups":protected]=>
  NULL
  ["_values":protected]=>
  array(4) {
    ["surname"]=>
    string(16) "Тестовый"
    ["name"]=>
    string(10) "заказ"
    ["e_mail"]=>
    string(12) "test@mail.ru"
    ["phone"]=>
    string(12) "+79020045678"
  }
  ["_self_class":protected]=>
  string(20) "Users\Model\Orm\User"
  ["_local_id":protected]=>
  int(159)
  ["cache_behavior_instances":"RS\Behavior\AcceptBehavior":private]=>
  array(0) {
  }
  ["instance_behaviors":"RS\Behavior\AcceptBehavior":private]=>
  array(0) {
  }
}

Вот кусок шаблона из orderform.tpl

<div class="bordered">
                <h3>Покупатель</h3>
                <table class="order-table">
                        <tr class="{cycle values=$hl name="user"}">
                            <td class="otitle">
                                Фамилия Имя Отчество:
                            </td>
                            <td>
                                {$user.surname} {$user.name} {$user.midname} {if $user.id}({$user.id}){/if}
                                {if $user.is_company}<div class="company_info">{$user.company}, ИНН: {$user.company_inn}</div>{/if}
                            </td>
                        </tr>
                        <tr class="{cycle values=$hl name="user"}">
                            <td class="otitle">
                                Пол:
                            </td>
                            <td>{$user.__sex->textView()}</td>
                        </tr>
                        <tr class="{cycle values=$hl name="user"}">
                            <td class="otitle">Телефон:</td>
                            {$phone = $user.phone}
                            <td>{$phone = preg_replace("#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#", "$1 ($2) $3-$4-$5", $phone , -1, null)}{$phone}</td>
                            
                        </tr>
                        <tr class="{cycle values=$hl name="user"}">
                            <td class="otitle">E-mail:</td>
                            <td>{$user.e_mail}</td>
                        </tr>
                        {foreach from=$user->getUserFields() item=item name=uf}
                        <tr class="{cycle values=$hl name="user"}">
                            <td class="otitle">{$item.title}</td>
                            <td>{$item.current_val}</td>
                        </tr>                
                        {/foreach}
                </table>
            </div>

Да я это сразу поправил:) нет не помогло sad

Тоже самое

Fatal error: Only variables can be passed by reference in Z:\home\ready.local\www\core\smarty\sysplugins\smarty_internal_templatebase.php(151) : eval()'d code on line 102

Выдает ошибку при вставке это в шаблон, получается нужно переделать регулярку?
Fatal error: Only variables can be passed by reference in Z:\home\ready.local\www\core\smarty\sysplugins\smarty_internal_templatebase.php(165) : eval()'d code on line 101

Не работает, я уже по васякому пробовал sad

Добрый день. Делаю вывод телефона с помощью регулярки, но она почему не применяется не поправите?

<td>{$user.phone = preg_replace("#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#", "+\\1 (\\2) \\3-\\4-\\5", $user.phone)}
                            {$user.phone}</td>

и так

<td>{$phone = preg_replace("#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#", "+\\1 (\\2) \\3-\\4-\\5", $user.phone)}
                            {$phone}</td>

Решение

<td>{preg_replace('#(\d{1})(\d{3})(\d{3})(\d{2})(\d{2})#', '$1 ($2) $3-$4-$5', $user.phone)}</td>

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

Скрин:
http://storage8.static.itmages.ru/i/16/0926/s_1474876927_8278891_7681b6677d.png