Здравствуйте! Хочу добавить допполе к объекту "пункт Меню"

  function init()
    {
        $this->bind('orm.init.menu-menu'); //добавим css
    }
       

   
      public static function ormInitMenuMenu(\Menu\Model\Orm\Menu $orm_menu) 
        {
        $orm_menu->getPropertyIterator()->append(array(//Добавляем свойства к объекту
            t('Основные'), //Закладка, появится в форме редактирования товара
                      'css' => new Type\Varchar(array(
                      'maxLength' => '50',
                       'description' => 'Класс CSS',
                       'hint' => t('Дополнительный CSS класс для пункта меню')
                        
                    ))
       
                 ));
        }     

В таблице поле не создается, а в карточке меню оно есть.
Что-то делаю не так...

Отлично! Избранного не хватает.

Я и моя семья сейчас практически большинство покупок (кроме еды, наверное) делают через интернет. Дешевле, больше выбор. И достаточно часто пользуешься разными устройствами.
У 003, oзон, ситилинк, ибей, элиэкспресс, Днс, Вайлдберрис всегда корзина доступна везде (специально проверил).  Они стараются, чтобы товар, заинтересовавший пользователя, был постоянно на виду.

Изменил, как описал выше. Наблюдаю.

Убрал удаление элементов корзины в handlers.inc.
Доработал модель корзины. Работал топором, буду тестировать:

 /**
    * Получать экземпляр класса можно только через ::currentBasket()
    */
    protected function __construct($mode = self::MODE_SESSION, Orm\Order $order = null)
    {
        $this->session_id = session_id();
        $this->mode = $mode;
        $this->order = $order;
        switch($this->mode) {
            case self::MODE_ORDER: {
                $this->cartitem = new Orm\OrderItem();
                //2016_05 для привязки корзины к пользователю
                $this->select_expression =array('order_id="#order_id1"',array(
                    'order_id1' => $this->order['id']
                ));
                $this->order_expression = 'sortn';
                break;
            }
            case self::MODE_EMPTY: {
                $this->cartitem = new Orm\CartItem();
            }
            default: {
                $this->cartitem = new Orm\CartItem();
                 //2016_05 ТУТ
                $this->select_expression = array('site_id="#site_id1" and (session_id="#session_id1" or (user_id="#user_id1" and user_id>0))',array(
                    'site_id1' => \RS\Site\Manager::getSiteId(),
                    'session_id1' => $this->session_id ,
                    'user_id1' => \RS\Application\Auth::getCurrentUser()->id
                 )   
                );                
                $this->order_expression = 'dateof';
            }
        }
        
        $this->loadCart();
    }

/**
    * Загружает корзину из базы данных
    * 
    * @return void
    */
    function loadCart()
    {
        $q = \RS\Orm\Request::make()
            ->from($this->cartitem)
            ->where($this->select_expression[0],$this->select_expression[1])//ТУТ
            
       $this->items = $q->objects(null, 'uniq');
       if ($this->mode == self::MODE_ORDER) {
           $this->order_items = $this->items;
       }
    }
 /**
    * Удаляет позицию из корзины.
    * 
    * @param string $uniq - Уникальный идентификатор элемента корзины
    * @return bool
    */
    function removeItem($uniq)
    {
        if (isset($this->items[$uniq])) {
            if ($this->mode == self::MODE_SESSION) {
                \RS\Orm\Request::make()
                    ->delete()
                    ->from($this->cartitem)
                   ->where($this->select_expression[0],$this->select_expression[1]) //ТУТ
                    ->where(array(
                        'uniq' => $uniq
                    ))->exec();
            }
            
            unset($this->items[$uniq]);
            unset($this->order_items[$uniq]);
            unset($this->cache_products[$uniq]);
            unset($this->cache_coupons[$uniq]);
        }
        return true;
    }

 /**
    * Очищает корзину
    */
    function clean()
    {
        $this->items = array();
        $this->order_items = array();
        $cache_coupons = null;
        $cache_products = null;
        
        $result = \RS\Orm\Request::make()
            ->delete()
            ->from($this->cartitem)
            ->where(
                 //2016_05_12 eventus поддержка привязки к пользователям
                  'site_id="#site_id1" and (session_id="#session_id1" or (user_id="#user_id1" and user_id>0))',array(
                    'site_id1' => \RS\Site\Manager::getSiteId(),
                    'session_id1' => $this->session_id ,
                    'user_id1' => \RS\Application\Auth::getCurrentUser()->id
                 ))->exec();
        
        $this->cleanInfoCache();
        return true;
    }
   /**
    * Возвращает информацию по количеству товаров и стоимости товаров в корзине
    * 
    * @param mixed $format - форматировать общую сумму заказа
    * @param mixed $in_base_currency - возвращать в базовой валюте
    * @return array
    */
    public static function getCurrentInfo($format = true, $use_currency = true)
    {
           self::currentCart()->cleanInfoCache();     //ТУТ добавил для принудительного обновления инф-ции о корзине 
        $options = (int)$format.(int)$use_currency.\Catalog\Model\CurrencyApi::getCurrentCurrency()->id;
        
        if (!isset($_SESSION[self::CART_SESSION_VAR][$options])) {
            self::currentCart()->getCartData($format, $use_currency);
        }
        
        return $_SESSION[self::CART_SESSION_VAR][$options];
    }
      

Итого:
1. если были товары в корзине при авторизации, то они попадут к в корзину авторизованному.
2. Любые изменения в корзине на разных устройствах под одним и тем же пользователем синхронизированы

Как раз я привел примеры работы крупных розничных магазинов, где сам покупаю товары и моя корзина доступна мне на любом устройстве (домашний, офисный, планшет).
В нашем случае надо следить, чтобы при авторизации корзина была пустой или затрется предыдущая. Т.е. каждый раз очищать предварительно корзину. Ничто так не раздражает, как потерянный заказ.

Подавляющее число оптовиков - ИПшники без работников. И они в связи своей мобильностью как раз и чаще всего попадают с удаленным заказом.

Достаточно ли правки модели корзины,чтоб для авторизованных пользователей не использовать session_id? Или где то еще используется привязка?

Возможно я разобрался с пропадающими корзинами. Все дело в привязке элементов корзины к сессии у авторизованных пользователей.
1. В одном браузере авторизованный пользователь набрал корзину.
2. Зашел в другом браузере (например, дома). Элементы корзины перепривязываются при авторизации ко второй сессии, но в другом то браузере пользователь не выходил! В результате в первой сессии пользователь теряет корзину. 

Просто уже достаточно много жалоб на пропадающие корзины у оптовиков.  Под одним и тем же логином заходят разные менеджеры и перехватывают друг у друга корзины.


Только что провел эксперимент:
1. Набрал в разных сессиях авторизованным пользователем корзины.
2. В сессии 1 вышел. (при этом корзина сохраняется и видна)
3. Сразу же авторизовался в сессии 1
4. В сессии 2 корзина сразу опустела.


Проверил у крупных магазинов логику:
1. Добавленный товар с разных авторизованных сессий  виден в корзине у обоих. Корзина общая, привязана к авторизованному пользователю или к сессии у гостя.
2. Если авторизоваться с заполненными корзинами, то содержимое корзин объединяется, а не заменяется новой как у нас.

Спасибо за пояснение!

Имеется организатор, который постоянно добавляет. Пока я решил частично проблему "костылем".
- Убрал ограничение по сумме заказа (ранее было 5000)
-  Добавил новый способ доставки "Добавить к основному заказу" и способ оплаты "использовать оплату основного заказа". Связал их.  Они действуют с 0 рублей. Добавил к ним пояснения для чего они.
- Все остальные типы доставки и оплаты действуют от 5000 руб. Т.о. необходимо сформировывать какой то первоначальный заказ.
В 1с потом просто сформируют итоговый счет из основного заказа и добавок и рассчитают вручную стоимость доставки.
Сейчас пользователи уже начали пользоваться добавками и увеличивают средний чек.
1. Можно еще заказ с такими типами доставки в другой статус переводить ("Добавление к заказу") и потом в 1с при загрузке заказов автоматом с основным заказом сливать.
2. Еще вариант - по крону модулем сливать заказы пользователей с основным заказом в 1, но тут у меня вопрос упирается в перерасчет стоимости доставки и оплаты, так как логику оформления заказа еще не смотрел.

Спасибо за ответ!

admin пишет:

Когда пользователь авторизовывается и у него есть товары в корзине:
- Товары, которые были привязаны  user_id до этого удаляются (т.к. пользователь собрал новую корзину)

Здесь не совсем понял про удаление.

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

Здравствуйте! Совместные закупки достаточно популярная сейчас тема.
Но с организаторами совместных закупок не очень удобно работать, так как постоянно приходится делать добавление товара в заказ вручную.
Думаю, как лучше сделать функционал добавления в заказ товара самим пользователем:
1. Добавлять в корзину заказы из уже сделанного заказа ( уже предлагал в улучшениях).  Пользователь заново делает оформление заказа, старый заказ по запросу удаляется.
Проблема в складских остатках.
2. Сделать объединение заказов при оформлении. (добавить чек-бокс "Объединить с предыдущим заказом")
Получится перехватить оформление заказа хуком и объеденить заказы? Получится ли перерасчитать стоимость доставки?

Кто-нибудь реализовывал подобное? Работаете ли с совместными закупками?

Спасибо, Александр! Посмотрю ролики сегодня.

Да, возможно вариант с внешним шаблоном у первого и последнего контейнера подойдет.

Вот структура по документации к шаблону. wrapper оборачивает только часть данных.:

<!DOCTYPE html>
<html lang="en-us">
  
    <head>
        [HEAD_META]
    </head>
 
    <body class="smoothscroll enable-animation">
 
        <div id="slidetop">
            [SLIDE_TOP]
        </div>
 
        <div id="wrapper">
         
            <div id="topBar">
                [TO_BAR]
            </div>
 
            <div id="header">
                [BUTTONS]
                [LOGO]
                [NAV_MAIN]
            </div>
 
            <section>
                [SECTION_1]
            </section>
 
            ....
 
            <section>
                [SECTION_N]
            </section>
 
        </div>
  
 
        <!-- FOOTER -->
        <footer id="footer">
            [FOOTER_CONTENT]
        </footer>
        <!-- /FOOTER -->
 
        [PAGE_JAVASCRIPTS]
 
    </body>
</html>

Вопрос остается  с row, так как они не везде нужны (на примере в первом посте - меню и слайдер). Возможно ли переопределить tpl в системном шаблоне system?

Здравствуйте!
Верстаю тему с одного шаблона на BS 3.
Необходимо оборачивать несколько контейнеров.
Вкладывать контейнеры в конструкторе можно, но было бы неплохо для некоторых контейнеров и строк иметь возможность указывать генерировать ли конструкцию"<div class="container"> " <div class="row"> или нет.

Поясню на примере, где иногда не надо оборачивать container и когда не нужен row:

                 <!-- Несколько container оборачиваются div -->
<div id="wrapper">
         
            <div id="topBar">
                 
            </div>
 
            <div id="header">
            <div class="container">
                 <!-- ТУТ НЕ нУЖЕН ROW-->
                    <ul class="top-links list-inline pull-right">
                        <li class="text-welcome hidden-xs">Welcome, <strong>John Doe</strong></li>
    
                    </ul>
              </div>
            </div>
 
            <section>
           <div class="container">

            <h2 class="owl-featured noborder"><strong>FEATURED</strong> PRODUCTS</h2>
                 <!-- ТУТ НЕ нУЖЕН ROW-->
             </div>
                [SECTION_1]
            </section>
 
            ....
 
            <section>
                [SECTION_N]
            </section>
 
        </div>

Т.е. не получается в конструкторе сделать несколько повторяющихся контейнеров, обернутых одним div.

Как вариант, можно не генерировать div с классом container или row при указанном внешнем шаблоне, так как в нем и так можно добавить нужную конструкцию.

Ура, функционал сделан в Мегамаркете!

Благодарю, Александр!

id - в списке статей в колонке "№"


Прошу прощения, в файле feedback.inc.php в самом начале в строке

namespace evAddons\Model\CommentType;

надо заменить на

namespace Article\Model\CommentType;

Отлично! А то костыли использую

544

(2 ответов, оставленных в Вопросы по работе с системой)

Спасибо, помогло!

Спасибо, тоже полезно будет, как без модуля реализуется.

Уважаемые разработчики, подскажите, пожалуйста, какие средствами отладки, логирования, разработки советуете пользоваться при работе с RS?

547

(2 ответов, оставленных в Сайт ReadyScript)

А https://docs.google.com/spreadsheets/d/ … li=1#gid=0 посчитали по баллам. ReadyScript - 2 место

548

(2 ответов, оставленных в Вопросы по работе с системой)

Здравствуйте! Возникла проблемка при переходе с 5.6 на 7
Посыпались ошибки:
[Tue Mar 29 00:32:43.999460 2016] [cgi:error] [pid 18347] [client 2.94.189.63:38941] AH01215: PHP Fatal error:  Cannot use 'String' as class name as it is reserved in /var/www/-----/data/www/-----/core/rs/orm/type/string.inc.php on line 14

549

(2 ответов, оставленных в Сайт ReadyScript)

http://research.cmsmagazine.ru/obzor-sa … magazinov/
А RS очень даже неплохо смотрится на фоне многих

Замените префикс таблиц wlzd на свой и вставьте идентификаторы (номера) характеристик.

 SELECT id,wp.title,barcode,wpl.prop_id,wpl.val_str,wpl.val_int FROM wlzd_product wp,  wlzd_product_prop_link  wpl WHERE
  wp.id=wpl.product_id AND 
  wpl.prop_id IN ( 342) AND -- список идентификаторов характеристик (Номера) через запятую
  (wpl.val_int IS NULL OR wpl.val_int=0) -- если строковая переменная, то вместо val_int  будет  val_str

Вот запрос для вывода списка товаров с незаполненным весом:

 SELECT id,wp.title,barcode FROM wlzd_product wp WHERE wp.weight IN ('',0, ' ') OR wp.weight IS null