Разработчикам о предстоящем обновлении Shop-Script 6.3

Александр Викторович Музыченко

Сегодня на github в ветку dev была выложена часть предстоящего обновления.

Ниже я кратко напишу о некоторых новых возможностях Shop-Script 6.3, релиз которого состоится на следующей неделе (точной даты пока нет).

1. Новый хук frontend_products, который вызывается перед любым выводом товаров на витрину (будь то категория, списки на главной, карточка товара, корзина).

В $params передаётся массив array('products' => &$products). Обратите внимание, что массив товаров передаётся по ссылке — это даёт возможность плагинам менять информацию о товаре, например, изменять цены на витрине.
Также в некоторых местах передаётся, помимо 'products', ещё и массив артикулов 'skus' => &skus (например, в карточке товара, и в корзине).

В плагине debug мы сделали пример заглушку, как, например, уменьшить все цены на 10%.

public function frontendProducts(&$params)
{
    // YOUR CONDITION
    if (0) {
        foreach ($params['products'] as &$p) {
            $p['price'] = $p['price'] * 0.9;
            // or
            // $p['price'] = $p['original_price'] * 0.9;
        }
        unset($p);
        if (isset($params['skus'])) {
            foreach ($params['skus'] as &$s) {
                $s['price'] = $s['price'] * 0.9;
                // or
                // $s['price'] = $s['original_price'] * 0.9;
            }
            unset($s);
        }
    }
}

Обратите внимание на original_price (есть еще original_compare_price). Что это и зачем?
Дело в том, что плагинов, которые захотят менять цены через этот хук, может быть несколько.
В original_price сохраняется оригинальная цена, которая задана для товара.
В price же уже может оказаться цена, изменённая плагином, который отработал раньше.

Вариантов для применения нового хука очень много. Если кто-то из разработчиков успеет к официальному релизу сделать хорошие плагины, то мы с большой долей вероятности упомянем о них в блог-посте в качестве примера реализации. Например, плагины оптовые цены, наценка для витрин и т. п.


2. Новый хук product_custom_fields, который позволяет плагину объявить свои собственные поля для товара или для артикула, которые в частности используются при импорте из CSV.
Проще говоря, теперь появилась возможность плагину сделать поддержку импорта из CSV своих полей.
Если успеем, то экспорт тоже сделаем, но пока только импорт.

В плагине debug есть пример объявления таких полей.

    public function productCustomFieldsHandler()
    {
        return array(
            'product' => array(
                'field1' => 'Custom field#1',
                'field2' => 'Custom field#2',
            ),
            'sku'    => array(
                'field1' => 'Custom SKU field#1',
                'field2' => 'Custom SKU field#2',
            ),
        );
    }

В чём разница между 'product' и 'sku'? В том к чему это поле у вас привязано, оно может быть общее для всего товара, тогда product, например наценка в % общая, а может быть для каждого артикула своё (например оптовая цена), тогда sku.

Эти поля можно обрабатывать в хуке 'product_save'

if (isset($params['data']['debug_plugin']['field1'])) {//'Custom field#1'
    //TODO update field at plugin table/run some code/etc
}

Они попадают в ключ {PLUGIN_ID}_plugin массива с данными. Для артикула соответственно в данные артикула.


3. Как выяснилось, на некоторых MySQL-серверах возникают проблемы с фильтрацией товаров, а именно некоторые SQL-запросы сильно нагружают сервера.

Мы сделали две реализации: через exists и через join (по умолчанию и это то, что работает сейчас).
Реализация через exists в общем случае чуть хуже, однако на некоторых проблемных MySQL-серверах, она работает лучше.

Какую из реализаций использовать можно указать в файле-конфиге (wa-config/apps/shop/config.php).

'filters_features' => 'exists'

По умолчанию используетс join, поэтому, если у вас возникли проблемы, то попробуйте указать exists. Практика показала, что это помогает.


4. В настройках уведомлений появилась возможность указать, какое название использовать в качестве имени отправителя.

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

5. В бекенде в списке товаров теперь можно вывести колонку с кодом основного артикула.

Если у товара несколько артикулов и коды у них разные, то выводится будет только один код основного артикула!

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

Для корректной работы этой настройки нужно обновить тему.
Вот изменения для темы Default: https://github.com/webasyst/shop-script/commit/a80...

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

22 декабря 2015
  • Syrnik.com 20 декабря 2015 16:29

    Если импортировать товар с выбором характеристик, то custom-поля для sku в хук product_save не попадают

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

    Сергей, исправили.

  • В связи с введением настройки Максимальная скидка % от суммы заказа для партнёрской программы, темы всё же пришлось немного тронуть.
    Вот на примере темы Default:
    https://github.com/webasyst/shop-script/commit/a80...

  • ITFrogs 22 декабря 2015 13:11

    Отличная новость. Сейчас переделаю оптовый плагин с учетом нового хука и заново пошлю на модерацию. Больше там особых подводных камней я не замечал.

  • Павел Гордовой 22 декабря 2015 15:32

    Круто! Долгожданные вкусняшки поспели! :)

  • Эдуард 23 декабря 2015 10:34

    Здравствуйте!

    Надеюсь теперь кто-то выпустит плагин разных цен для товаров на витринах и в бекенде. Желательно с возможностью в процентном соотношении менять стоимость товара на витринах от основной цены.

  • Игорь 23 декабря 2015 13:17

    Нововведения хорошие, Спасибо видно что постарались!
    Пожалуйста обратите внимание в следующем обновлении на работу с многовитринностью, а точнее просмотр статусов заказов раздельно для каждой витрины.
    Общий список всех заказов со всех витрин ломает всю логику, проще уже отдельные магазины открыть.
    Спасибо за внимание.

  • ITFrogs 24 декабря 2015 01:13

    Эдуард, напишите мне на почтовый ящик covoxx@gmail.com, я как раз этим занимаюсь, и хотел бы лучше понять что нужно сделать.

  • Игорь Гапонов 24 декабря 2015 10:47

    А подскажите такой момент:

    Вот у меня плагины Купить в 1 клик, Гибкие скидки и прочие. Им придется работать с обработанными товарами, которые прогоняются через frontend_products. Раньше я в бекенде по ID брал информацию либо о товаре, либо о его артикуле.

    Сейчас можно получить обработанный массив через shopProductsCollection, но в нем только информация о товаре без его артикулов.

    Как-нибудь можно получить обработанный товар или отдельно его артикул в бекенде? Что-нибудь типа getFrontendProducts($product_id, $sku_id)

    Возможно я плохо искал. Буду благодарен за подсказку!

  • Про купить в 1 клик, как мне кажется, учитывая что вы обходите корзину, правильнее просто в плагине кидать событие frontend_products, передавая туда массив товаров и артикулов, аналогично тому как это делается в корзине.

    $event_params = array(
            'products' => &$products,
            'skus' => &$skus
    );
    wa('shop')->event('frontend_products', $event_params);

    Про остальные я не совсем понимаю как вам там приходится работать с обработанными товарами, если вы про вычисление скидки, то в том событии уже передаётся вся информация о товарах и артикулах.

  • ITFrogs 24 декабря 2015 10:59

    Вопрос про конвертацию валют на витрине. У нас метод shop_currency, запущенный не из смарти сам понимает на какой он витрине запущен?

  • Андрей, да.
    Но переводить нужно для products в основную валюту.
    А для skus в валюту, которая указана в currency для товара в массиве products.
    В карточке товара из-за округления цен пришлось давно еще сделать хак, чтобы не пришлось менять сильно темы дизайна.
    И потому, из какой валюты (то есть той, в которой сохранены ваши цены) переводить нужно получать либо из unconverted_currency, а если такого ключа нет, то просто из currency.

  • ITFrogs 24 декабря 2015 12:17

    Из какой указано в продукте. А в какую? Или там null?

  • ITFrogs 24 декабря 2015 12:54

    Вот как-то так получилось.

    Для продукта:

    $p['price'] = shop_currency($prices[$p['sku_id']]['price'], $p['currency'], $primary, false);

    Для ску:

    $s_cur = $params['products'][$s['product_id']]['currency'];
    $s['price'] = shop_currency($prices[$s['id']]['price'],null , $s_cur, false);

    Надеюсь правильно.

    У меня сомнения по поводу null в вычислении цены для ску.

  • Игорь Гапонов 24 декабря 2015 14:34

    Заметил ошибку:

    Настройка валют: Основная - рубль, При переводе цен в основную валюту: округлять до 100. Только вверх.
    Имеется доллар: 1$ = 75 руб. Округлять до 10. Только вверх.

    Товар: 500 руб.

    Включен плагин debug. На витрине выбираем отображение в долларах. Стоимость товара равна 9. Добавляем в корзину. В корзине стоимость заказа 10.

  • Андрей, неправильно, я же написал вам выше.
    Вы просто задайте цену в долларах, а выводите в рублях и проверьте в карточке товара, в списке (в категории) и в корзине.
    Валюта из которой переводить хранится либо в unconverted_currency либо если такого ключа нет просто в currency в массиве products.
    Валюта в которую переводить указана в currency в массиве products.


  • Игорь, есть такая проблема, но это всё же довольно сомнительный случай, когда округление стоит до 10 долларов, и цена меняется на 1 доллар...
    Но постараемся что-то с этим сделать, почему так происходит с технической точки зрения понятно.

  • ITFrogs 25 декабря 2015 04:22
    Но переводить нужно для products в основную валюту. А для skus в валюту, которая указана в currency для товара в массиве products. В карточке товара из-за округления цен пришлось давно еще сделать хак, чтобы не пришлось менять сильно темы дизайна. И потому, из какой валюты (то есть той, в которой сохранены ваши цены) переводить нужно получать либо из unconverted_currency, а если такого ключа нет, то просто из currency.



    Андрей, неправильно, я же написал вам выше. Вы просто задайте цену в долларах, а выводите в рублях и проверьте в карточке товара, в списке (в категории) и в корзине. Валюта из которой переводить хранится либо в unconverted_currency либо если такого ключа нет просто в currency в массиве products. Валюта в которую переводить указана в currency в массиве products.

    Эти две цитаты немного расходятся между собой. Хотелось бы получить какой-то четкий алгоритм конвертации валюты. Думаю он пригодится не только мне.

    Вот что я попытался сделать исходя из этих двух цитат:

    if (isset($p['unconverted_currency']) && !empty($p['unconverted_currency'])) {
        $cur_in = $p['unconverted_currency'];
    }
    else {
        $cur_in = $p['currency'];
    }
    $cur_out = $p['currency'];
    
    $p['price'] = shop_currency($prices[$p['sku_id']]['price'], $cur_in, $cur_out, false);

    В итоге допустим у нас цена продукта в долларах, исходная цена в долларах и витрина в долларах, то никакой конвертации в этом методе не происходит, а вот витрина сама по себе конвертирует как будто я отдал ей цену в рублях.

    Если же поставить

    $cur_out = $primary;

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

    Это алгоритм конвертации для продукта.

    Для ску надо так:

    $cur_out = $product['currency'];


  • Одно моё сообщение лишь дополняет другое. Противоречий нет.

    Для элементов products $cur_out = основная валюта
    Для элементов skus $cur_out = та цена, которая указана для соответствующего элемента в products в ключе currency

    А про $cur_in я уже достаточно подробно написал выше.

  • Иван Chers 25 декабря 2015 05:01

    Нам тоже нужен поиск заказа по трек номеру. Ситуаций масса:


    • звонят сотрудники почты или другой транспортной службы говорят: проблема с посылкой трек номер такой-то. нашего номера заказа у них нет
    • звонит клиент говорит трек номер. часто клиенты вообще не понимают что такое номер заказа. спасает номер телефона, но иногда звонит с другого номер и не помнит, с какого он заказывал.
    • клиент пишет на почту: номер посылки такой-то, проблема. имейла у нас его не было до этого.


    И т.п.


  • Shaman 25 декабря 2015 05:06

    Поддерживаю оба поднятых тут вопроса:

    1) поиск по трекномеру. Звонок клиента или просто дали декларацию и никто не помнит номера заказа, а найти нужно

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

    И давно ждали возможности оплаты бонусами только части заказов. Но вот еще не помешает такая штука как "Использовать бонусы только спустя Х дней после заказа". А то бывают ситуации первая покупка, потом вторая бонусами, после чего некоторые хитрые, пользуясь законодательством возвращают первый заказ.

  • DemoLLC 25 декабря 2015 05:13

    Поиск по трекномеру есть в плагине Фильтр и экспорт заказов

  • Shaman 25 декабря 2015 05:16

    Александр, я в запросе 1296812 подробно описал и продемонстрировал на вашем хостинге еще одну проблему. Подскажите, в данном обновлении что-то делали по этому поводу?

  • ITFrogs 25 декабря 2015 05:18

    Александр, если так, то я вроде правильно написал. Или есть какие-то замечания?

  • Андрей, в вашем примере вы меняете цену у переменной $p (я так понимаю это products) и там у вас $cur_out = $p['currency'] и это неправильно, вы сами же пишете что так работает неправильно.

  • Николай, это было исправлено в последнем обновлении.

  • ITFrogs 25 декабря 2015 06:24

    Александр, ну да. Я у себя поменял на primary и во всех тестах стало показывать правильно. В примере забыл поменять. А погрешности при такой двойной конвертации не будет накапливаться?

  • DemoLLC 25 декабря 2015 06:52

    900, 3600, 900 - конкуренция нарастает

  • ITFrogs 25 декабря 2015 07:38

    3600... Это явно с блекджеком и шлюхами :)



Чтобы добавить комментарий, зарегистрируйтесь или войдите