Последние темы


Catalogfill и minishop2

  • Ребята, кто-нибудь в курсе, может ли catalogfill делать импорт/экспорт в minishop2?

  • @ImHappy Подробных инструкций не находил, но в форумах писали, что это делали. Правда для minishop уже есть другие модули загрузки, которые специально для работы с минишопом.

  • @slaad Если вы про msImportExport, то, как выяснилось, в нем есть большой недостаток: он может импортировать только весь список TV целиком, т.е. если надо обновить значения только части TV, то все равно в данные для импорта надо загонять значения всех TV у всех товаров, иначе значения тех TV, что отсутсвуют в файле импорта, затрутся, станут пустыми. При небольшом количестве TV это не критично, но вот сейчас у меня в работе сайт с более чем 350 TV полями, и каждый раз при обновлении данных делать выгрузку всех полей, править эту простыню и загружать обратно - крайне неудобно. Catalogfill же, насколько я помню, вполне может обновлять значения только части TV, хоть одной, без необходимости загонять ему весь список TV со всеми значениями у всех товаров.

  • Участник @ImHappy написал в Catalogfill и minishop2:

    @slaad Catalogfill же, насколько я помню, вполне может обновлять значения только части TV, хоть одной, без необходимости загонять ему весь список TV со всеми значениями у всех товаров.

    Все верно, Catalogfill может грузить сколько угодно ТВшек и ничего не затирает.
    Мне этим шопкипер и нравится, он гораздо гибче.

    Вот вам простой пример. Я храню название параметра в ТВ категории, а значение в товаре.
    Т.е. если в каталоге для сковородок мне нужно вывести Цвет: Красный для одного товара и Цвет: Синий для другого,

    То у меня 1 ТВ для категории со значением Цвет и одна ТВ в поле Товара (я товары в отдельной таблице храню) со значением Красный у одного товара и Синий у другого.
    Для другой категории, например утюги, у меня та же ТВ используется под значение Материал корпуса и в товаре Пластик.

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

  • @slaad Я знаю, сам так делал ) Но я не про то, что лучше, Shopkeeper или Minishop, а как импортировать в minishop с помощью catalogfiil. Есть у кого ответ?

  • @ImHappy С самими товарам и их TV работать не проблема — просто добавляете в значения по умолчанию:

    'class_key' => 'msProduct',
    'show_in_tree' => 0,
    

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

  • @rpa Спасибо, попробую! Как правило обновление характеристик (TV) и обновление опций minishop2 (например цены) - это две разные операции, обычно они разделены во времени. Так что вполне допустимо для них использовать разные компоненты.

  • @ImHappy
    Если так, то можно вообще малой кровью обойтись (хоть и криво)).
    Сделать у товаров TV-шки с которыми будет работать catalogFill.
    И сделать сниппет, который будет брать эти значения и писать в свойства товара miniShop:

    //Получаем ID товаров miniShop
    $ids = $modx->runSnuppet('pdoResources', array(
        'parents' => 0, //ID каталога
        'where'=> '{"class_key":"msProduct"}',
        'limit'=>0,
        'returnIds'=>1
    ));
    
    $arr = explode(',', $ids);
    foreach($arr as $id){
        $product = $modx->getObject('msProduct', $id);
        $tv_price = $product->getTVValue('price'); //Цена из TV
        $ms_price = $product->get('price'); //Цена минишоп
        if($ms_price != $tv_price){ //если разные, то пишем TV в цену товара
            $product->set('price', $tv_price);
            $product->save();
        }
    }
    //чистим кеш
    $cm = $modx->getCacheManager();
    $cm->refresh();
    

    Можно, в принципе, любые данные добавить. Для опций вот.
    И запускать этот сниппет после импорта или по расписанию.

  • @rpa Не, там в опциях мало чего, цена, старая цена, популярный, т.е. только то, что по умолчанию есть в минишопе, а все характеристики сделаны через TV. Так вот задача в том, что бы обновлять отдельные характеристики, поэтому если catalogfill сможет это, то будет замечательно. А цены пусть по прежнему через msImportExport обновляют.

  • Покажите полный конфиг.

  • @Andchir конфиг

    не дало загрузить файл, вставлю сюда:

    <?php
    
    //разбивка по столбцам при импорте и экспорте (content|tv|category)
    $cf_config['content_row'] = array(
        array('Наименование',array('pagetitle','content')),
        array('connect_phase',array(20,'tv'))
    );
    
    //значения по умолчанию при импорте или проверка при экспорте
    $cf_config['imp_content_default'] = array(
        'content' => array(
            'deleted' => 0,
            'published' => 1,
            'template' => 7,
            // 'class_key' => 'msProduct',
            //'createdon' => strtotime("now")
            //'publishedon' => strtotime("now")
            //'pub_date' => strtotime("now")
            //'editedby' => 1
            //'editedon' => strtotime("now")
        ),
        'tv' => array(
            //7 => 0
        )
    );
    
    //первая строка - названия полей
    $cf_config['include_captions'] = true;
    
    //число товаров импортируемых за один раз (загрузка по группам). 0 - не ограничивать.
    $cf_config['batch_import'] = 300;
    
    //разбивать по категориям
    $cf_config['include_categories'] = true;
    
    //удалять дочерние категории при очистке и обновлении каталога
    $cf_config['delete_subcategories'] = false;
    
    //по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении).
    $cf_config['imp_chk_field'] = 'pagetitle';
    
    //проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении).
    $cf_config['imp_chk_tvid_val'] = false;
    
    //Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field)
    $cf_config['imp_if_not_exist'] = false;
    
    //удалять HTML-теги при экспорте
    $cf_config['exp_strip_tags'] = false;
    
    //автоматически генерировать псевдоним (alias) при импорте
    //false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит.
    $cf_config['imp_autoalias'] = false;
    
    //Изменить значения поля для всех вложенных товаров до начала импорта.
    //Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе.
    //первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым)
    $cf_config['imp_before_change'] = false;//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены
    
    //удалить файл после экспорта (скачивания)
    $cf_config['exp_delete_file'] = true;
    
    //кодировка CSV-файла при экспорте
    $cf_config['exp_csv_charset'] = 'UTF-8'; //'windows-1251'
    
    //Импортировать (обновлять) пустые значения
    $cf_config['imp_empty'] = ture;
    
    //Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import".
    $cf_config['imp_custom_processor'] = '';
    
    //путь (xpath) в XML структуре до товаров
    $cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers';
    
    //Структура XML файла для импорта
    $cf_config['imp_xml_structure'] = <<<EOF
    <Good>
        <Kod>tv8</Kod>
        <Name>pagetitle</Name>
        <Options>
            <Stock>tv5</Stock>
            <Image>tv2</Image>
        </Options>
        <Prices>
            <RegularPrice>tv1</RegularPrice>
            <OldPrice>tv20</OldPrice>
        </Prices>
    </Good>
    EOF;
    
    //тестирование конфигурации (без записи в БД). Отчёты -> Журнал ошибок.
    $cf_config['imp_testmode'] = false;
    
    //функция для фильтрации значений при ИМПОРТЕ
    function filter_import($value_arr){
        $output_arr = $value_arr;
        /*
        if(isset($output_arr['content']['pagetitle']))
            $output_arr['content']['pagetitle'] = mb_strtoupper($output_arr['content']['pagetitle'], 'UTF-8');
        */
        return $output_arr;
    }
    
    
    //функция для фильтрации значений при ЭКСПОРТЕ
    function filter_export($value_arr,$doc_id=0){
        $output_arr = $value_arr;
        //var_dump($value_arr,$output_arr);
        //exit;
        /*
        if(isset($output_arr['price']))
            $output_arr[1] = floatval($output_arr[1]) - 200;
        */
        return $output_arr;
    }
    
    
    ?>
    
  • Короче catalogfill без проблем импортирует TV в minishop. У меня проблема была в неправильных правах на конфигурационный файл. Поправил и заработало. Как выше уже написал rpa достаточно добавить 'class_key' => 'msProduct'

  • @ImHappy Спасибо за тест! Поменяйте тему на Решено, пожалуйста.

    Andchir, а есть ли в планах добавить комментарии к дополнениям на сайте дополнений?

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

  • @slaad Не могу сообразить как поменять тему.

  • @ImHappy в настройках темы, сначала поставьте - вопрос, а потом - решено))

  • Участник @rpa написал в Catalogfill и minishop2:

    @ImHappy
    Если так, то можно вообще малой кровью обойтись (хоть и криво)).
    Сделать у товаров TV-шки с которыми будет работать catalogFill.
    И сделать сниппет, который будет брать эти значения и писать в свойства товара miniShop:

    //Получаем ID товаров miniShop
    $ids = $modx->runSnuppet('pdoResources', array(
        'parents' => 0, //ID каталога
        'where'=> '{"class_key":"msProduct"}',
        'limit'=>0,
        'returnIds'=>1
    ));
    
    $arr = explode(',', $ids);
    foreach($arr as $id){
        $product = $modx->getObject('msProduct', $id);
        $tv_price = $product->getTVValue('price'); //Цена из TV
        $ms_price = $product->get('price'); //Цена минишоп
        if($ms_price != $tv_price){ //если разные, то пишем TV в цену товара
            $product->set('price', $tv_price);
            $product->save();
        }
    }
    //чистим кеш
    $cm = $modx->getCacheManager();
    $cm->refresh();
    

    Можно, в принципе, любые данные добавить. Для опций вот.
    И запускать этот сниппет после импорта или по расписанию.

    Привет, есть пара вопросов:

    К примеру я создаю TV в него указываю значение, далее создаю снипет.
    Как запустить то снипет, и логика работы, он запишет данные из TV в ячейку miniShop2?

    У меня задача, выгрузить товары в минишоп - один раз, я для товаров сделаю два TV (цена + картинка). Выгружаю все товары, далее из этих полей мне нужно переместить данные в miniShop2

    Ты можешь пост немного подробнее расписать, что куда и как. Большой спасибо!

 

Последние комментарии

  • Что нового в Shopkeeper 4.0.3:

    Исправлено некорректное определение языка по умолчанию В настройках в админке скрываются пароли. Добавлена возможность загружать картинки для категорий. shopkeeper.js - добавлена функция updateProductsPrice() для поддержки текстовых полей для цены. Twig-функции contentList() и includeContent() вынесены в отдельный класс. Добавлено событие "order.before_create". Сортировка всех полей типа контента перетаскиванием. Автоматическое сохранение сортировки полей при сохранении типа контента (не нужно нажимать на отдельную кнопку). В интерфейсе админа добавлено поле поиска для списка Composer-пакетов.

    Скачать можно на главной странице https://modx-shopkeeper.ru/

    Читать далее
  • Вот этот плагин:
    0_1550334109280_screenshot_022.png

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

    Читать далее
  • J

    @Andchir Если нажимаю кнопочку "Обновить значения", то в фильтрах появляются как раз те самые удаленные значения фильтра.. Потом приходится Ручками выбирать эти удаленные значения.
    вот так выглядит Управление фильтрами когда удаляешь ручками: https://yadi.sk/i/_zw64CGkZ_sAYg
    А вот так выглядит когда просто нажимаешь "Обновить значения": https://yadi.sk/i/7WFbXC6xV5sQAw (красным выделено, то что приходится постоянно удалять

    Читать далее
  • J

    Участник @Jokerit написал в TagManager2 отображает в фильтре удаленные значения TV-полей:

    tmRefresh

    Так и не смог найти как включить

    Читать далее