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


CatalogFill игнорирует изменение категорий.

  • Добрый день, при загрузке категорий использую конфигуратор с поддержкой категорий, обновление у меня происходит по tv полю sku, если товара не существует то все хорошо, он создает новый товар и присваивает его в ту категорию которую я поставил в прайс листе, но вот если товар уже существует,, то категорию он не меняет!!! Странно что цену меняет, производителя меняет, а категорию не хочет никак.. Кто сталкивался, если нужно могу прислать конфигуратор.. Но думаю дело не в нем.

  • Да, это не предусмотрено. Но могу подсказать где в коде поправить. Покажите конфигурацию.

  • @andchir

    <?php
    
    //разбивка по столбцам при импорте и экспорте (content|tv|category)
    $cf_config['content_row'] = array(
       array('SKU',array(21,'tv')),
       array('Пропуск',array('null','null')),
       array('Наименование',array('pagetitle','content')),
       array('Цена',array(2,'tv')),
       array('Валюта',array(23,'tv')),
       array('Пропуск',array('null','null')),
       array('Публикация',array('published','content')),
       array('Производитель',array(17,'tv')),
       array('Категория',array(27,'category')),//3 - ID шаблона категории
       array('Подкатегория',array(27,'category')),//3 - ID шаблона подкатегории
       array('Подкатегория2',array(27,'category'))//3 - ID шаблона категории
    
    );
    
    //значения по умолчанию при импорте или проверка при экспорте
    $cf_config['imp_content_default'] = array(
       'content' => array(
           'published' => 1,
           'template' => 35
           //'createdon' => 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'] = true;
    
    //по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении).
    $cf_config['imp_chk_field'] = false;
    
    //проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении).
    $cf_config['imp_chk_tvid_val'] = '21';
    
    //Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field)
    $cf_config['imp_if_not_exist'] = true;
    
    //удалять HTML-теги при экспорте
    $cf_config['exp_strip_tags'] = false;
    
    //автоматически генерировать псевдоним (alias) при импорте
    //false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит.
    $cf_config['imp_autoalias'] = true;
    
    //Изменить значения поля для всех вложенных товаров до начала импорта.
    //Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе.
    //первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым)
    $cf_config['imp_before_change'] = false;//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены
    
    //удалить файл после экспорта (скачивания)
    $cf_config['exp_delete_file'] = false;
    
    //кодировка CSV-файла при экспорте
    $cf_config['exp_csv_charset'] = 'UTF-8';//'windows-1251'
    
    //Импортировать (обновлять) пустые значения
    $cf_config['imp_empty'] = true;
    
    //Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import".
    $cf_config['imp_custom_processor'] = '';
    
    //путь (xpath) в XML структуре до товаров
    $cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers'
    
    //Структура XML файла для импорта
    $cf_config['imp_xml_structure'] = '';
    
    //тестирование конфигурации (без записи в БД)
    $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;
    
    
       return $output_arr;
    }
    
    ?>
    
  • Какая версия CatalogFill у вас?

  • Если версия 2.4.9-pl1 то в файле catalogfill.class.php найти строку 947 и раскомментировать её (убрать // в начале строки)

    unset( $insertArr['content'][$this->config['parent_field']] );
    
  • Версия 2.4.7pl

    	//Обновление товара
            if($is_update && $upd_id){
                
                $sql = "UPDATE `".$this->config['table_name']."` SET\n";
                
                unset( $insertArr['content'][$this->config['parent_field']] );
                
                foreach(array_keys($insertArr['content']) as $fname){
                    $sql .= " `{$fname}` = ?,\n";
                }
                
                $sql = substr($sql,0,-2);
                
                $sql .= "\nWHERE `id` = '{$upd_id}' LIMIT 1";
                
                $stmt = $this->modx->prepare($sql);
                if($stmt && $stmt->execute(array_values($insertArr['content']))){
                    
                    $stmt->closeCursor();
                    $this->updateTVs($insertArr['tv'],$upd_id);
                    $output = true;
                    
                }else{
                    
                    $this->modx->log(modX::LOG_LEVEL_ERROR, "catalogFill: ".implode(', ',$stmt->errorInfo()));
                    $stmt->closeCursor();
                    $output = false;
                    
                }
                
                $output = true;
    
  • У меня эти строки уже раскомментированы, но как я понимаю, это не помогает,при одновлении категории не меняются..

  • Эта запись удалена!
  • Надо использовать последнюю версию.

  • Приобрел версию 2.4.9pl
    Раскомментировал в файле catalogfill.class.php
    строку

    unset( $insertArr['content'][$this->config['parent_field']] );
    

    Взял для примера нативный конфигуратор width_categories,php
    Перенастроил на свой шаблон и свои поля
    Сделал экспорт => удалил все товары кроме одного => в нем заменил цену и подкатегорию и импортировал этим же конфигуратором обратно через "обновить"
    Результат: цена изменилась, конечная категория не поменялась.

  • Если конфигурация изменилась, то надо её показать. Так же очень желательно показать файл, который импортируете.

  • Конфигурация

    <?php
    
    //разбивка по столбцам при импорте и экспорте (content|tv|category)
    $cf_config['content_row'] = array(
        array('Категория',array(27,'category')),//3 - ID шаблона категории
        array('Подкатегория',array(27,'category')),//3 - ID шаблона подкатегории
    	 array('Подкатегория2',array(27,'category')),//3 - ID шаблона подкатегории
        array('Наименование',array('pagetitle','content')),
        array('Цена',array(2,'tv')),
        array('Валюта',array(23,'tv')),
        array('Производитель',array(17,'tv')),
    	 array('SKU',array(21,'tv'))
    );
    
    //значения по умолчанию при импорте или проверка при экспорте
    $cf_config['imp_content_default'] = array(
        'content' => array(
            'published' => 1,
            'template' => 35
            //'createdon' => 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'] = false;
    
    //проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении).
    $cf_config['imp_chk_tvid_val'] = '21';
    
    //Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field)
    $cf_config['imp_if_not_exist'] = true;
    
    //удалять HTML-теги при экспорте
    $cf_config['exp_strip_tags'] = false;
    
    //автоматически генерировать псевдоним (alias) при импорте
    //false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит.
    $cf_config['imp_autoalias'] = true;
    
    //Изменить значения поля для всех вложенных товаров до начала импорта.
    //Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе.
    //первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым)
    $cf_config['imp_before_change'] = false;//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены
    
    //удалить файл после экспорта (скачивания)
    $cf_config['exp_delete_file'] = false;
    
    //кодировка CSV-файла при экспорте
    $cf_config['exp_csv_charset'] = 'UTF-8';//'windows-1251'
    
    //Импортировать (обновлять) пустые значения
    $cf_config['imp_empty'] = true;
    
    //Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import".
    $cf_config['imp_custom_processor'] = '';
    
    //путь (xpath) в XML структуре до товаров
    $cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers'
    
    //Структура XML файла для импорта
    $cf_config['imp_xml_structure'] = '';
    
    //тестирование конфигурации (без записи в БД)
    $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;
    }
    
    ?>
    

    Пример файла в котором обновил подкатегорию у одного товара.
    Было "АНАЛИЗАТОРЫ СПЕКТРА", должно стать "АНАЛИЗАТОРЫ ЦЕПЕЙ"
    https://yadi.sk/i/YCMZ8Ffi3Vt9Tb
    При прогрузке если меняю цену или производителя или валюту все, меняется, но родительская категория в админке на странице товара как была "АНАЛИЗАТОРЫ СПЕКТРА" так и осталась.

  • А если вернуть как было? Вроде в последней версии уже было сделано то что нужно. Не нужно раскомментировать строчку.

  • Участник @andchir написал в CatalogFill игнорирует изменение категорий.:

    А если вернуть как было? Вроде в последней версии уже было сделано то что нужно. Не нужно раскомментировать строчку.

    Да, спасибо!!! ВСЕ ЗАРАБОТАЛО!!!

 

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

  • M

    @Andchir , спасибо. Проблема и правда была в одном из плагинов, который на другом сайте нормально работает

    Читать далее
  • Что нового в 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 (красным выделено, то что приходится постоянно удалять

    Читать далее