501

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

У клиента аудит сео-контора производила, так они наоборот заставили убрать фильтры.  Достаточно страниц брендов с описанием.

Выкладываю пример наипростейшего модуля,  который добавляет поле CSS класс для пунктов меню: https://yadi.sk/d/9lRQ7IQ-sZgQv
Подсмотрел у Joomla, там к каждому пункту меню можно добавлять классы.
Потом просто его можно вывести шаблоне меню как {$item.cssclass}:

{foreach from=$menu_level item=item}
<li class="{if !empty($item.child)}dropdown{/if}{if $item.fields.typelink=='separator'} separator{/if}
{if $item.fields->isAct()} active{/if} {$item.cssclass}" {if $item.fields.typelink != 'separator'}{$item.fields->getDebugAttributes()}{/if}>
    {if $item.fields.typelink!='separator'}
        <a href="{$item.fields->getHref()}" {if !empty($item.child)}dropdown-toggle{/if} {$item.cssclass}" {if $item.fields.target_blank}target="_blank"{/if}>{$item.fields.title}</a>
    {else}
     <li class="divider"></li>
    {/if}
    {if !empty($item.child)}
    <ul class="dropdown-menu {$item.cssclass}_dropdown">
        {include file="blocks/menu/top_branch.tpl" menu_level=$item.child}
    </ul>
    {/if}
</li>
{/foreach}

Пример для меню темы на базе bootstrap 3. Получилось подружить с конструктором достаточно интересную тему http://theme.stepofweb.com/Smarty/v1.1. … start.html

503

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

К сожалению, скрипт отдельно идет на микрофреймворке, так как используется для нескольких разных движков.  Да и во время создания опыта разработки под RS не было.

У клиентов тоже возможности перейти на 8 нет из-за множества переделок. Как говорится "работает - не трогай")

504

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

или WinMerge для массового сравнения

505

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

Интеграция идет с любой системой, поддерживающей commerce ML2 (мой склад, 1С 8 и другие). В 1с 7.7 выгрузки из коробки в данном формате нет. Но возможно найти дополнения.
Можно написать со стороны 1с выгрузку csv файлика с данными, а со стороны RS загрузку. И загрузку заказов из RS.
Был опыт реализации подобного для 2 магазинов.

506

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

Совершенно верно. НА самом деле, программисты 1с могут и сделать загрузку товаров из заказов.

507

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

Добрый день! Да, заказы выгружаются в 1с без проблем.
Подробнее здесь http://readyscript.ru/manual/catalog_exchange_1c.html

Что у вас в настройках модуля?
http://take.ms/YbuRb
Возможно не проставлено "несколько комментариев с 1 ip адреса"

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

Уже написал в поддержке. С Виталием уже спор идет)

http://helpdesk.readyscript.ru/ticket/Harakteristiki-i-1s-n632089.html

Там же в теме выслал примеры. Если надо, продублирую

Впервые настраивали импорт для УТ 11.2. Как обычно, в новых версиях и терминология другая и интерфейс.

Как показала практика, для версии УТ 11.2 узел "Свойства" для товарных предложений может находится не только в файле "import.xml", но и "offers.xml", в результате чего свойства не загружаются и характеристики не создаются.

Решается путем   добавления '\Exchange\Model\Importers\CatalogProperty' в массив в api.inc.php (146 строка):

}elseif(preg_match('/offers/iu',$filename)){ //offers.xml
//Очистим сессию с id складов для получения
$_SESSION[\Exchange\Model\Importers\Warehouse::SESS_KEY_WAREHOUSE_IDS] = array();
return $this->matcher->applyImporters($full_filename,
array(
'\Exchange\Model\Importers\CatalogProperty',//ЗДЕСЬ ДОБАВЛЕНО!
'\Exchange\Model\Importers\PriceType',
'\Exchange\Model\Importers\Warehouse',
'\Exchange\Model\Importers\Offer',

),
$offset, $max_exec_time);

В описании файла offers.xml узел "Свойства" есть - http://dev.1c-bitrix.ru/api_help/sale/xml/offers.php

Спасибо разработчикам, модуль написан красиво. Много каких модулей импорта видел в других системах и там бы одной строчкой не отделался.

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

Создал handlers.inc.php в папке своего модуля evaddons со следующим содержанием:

<?php
namespace evAddons\Config;
use \RS\Orm\Type;
/**
* Класс содержит обработчики событий, на которые подписан модуль

ДЛя 8 марта и темы evTheme
2016_05_06 Добавление поля css к меню
*/
class Handlers extends \RS\Event\HandlerAbstract
{
    /**
    * Добавляет подписку на события
    * 
    * @return void
    */
    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 класс для пункта меню')
                        
                    ))
       
                 ));
        }     
}

Досмотрел до 44 минуты) И там как раз то что надо. Создал файл install.inc.php и все заработало, спасибо! В текстовой документации не нашел данные рекомендации.

<?php
namespace evAddons\Config;

/**
* Класс отвечает за установку и обновление модуля
*/
class Install extends \RS\Module\AbstractInstall
{
function install()
    {
        
        $result = parent::install();
        if ($result) {
            $menu = new \Menu\Model\Orm\Menu();
            $menu->dbUpdate();
        }
        
        return $result;
    }
    
    /**
    * Функция обновления модуля, вызывается только при обновлении
    */
    function update()
    {
        $result = parent::update();
        if ($result) {
            $menu = new \Menu\Model\Orm\Menu();
            $menu->dbUpdate();
        }
        return $result;
    }     
}

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

  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. Сделать объединение заказов при оформлении. (добавить чек-бокс "Объединить с предыдущим заказом")
Получится перехватить оформление заказа хуком и объеденить заказы? Получится ли перерасчитать стоимость доставки?

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

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