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


CatalogFill: не работает импорт в таблицу MIGXDB

  • Добрый день! Не получается осуществить импорт в свою таблицу MIGX DB через CatalogFill.

    Вот что пишет в логе:

    [2019-02-11 12:48:11] (/httpdocs/core/components/catalogfill/model/catalogfill.class.php : 80) PHP warning: array_keys() expects parameter 1 to be array, null given
    [2019-02-11 12:48:11] (ERROR @ /httpdocs/core/components/catalogfill/model/catalogfill.class.php : 80) PHP warning: array_merge(): Argument #2 is not an array
    [2019-02-11 12:48:11] (ERROR @ /httpdocs/core/components/catalogfill/model/catalogfill.class.php : 774) PHP warning: in_array() expects parameter 2 to be array, null given
    [2019-02-11 12:50:44] (ERROR @ /httpdocs/core/components/catalogfill/model/catalogfill.class.php : 999) catalogFill: 42S02, 1146, Table 'kazathletics.flaMD$rk18_' doesn't exist
    

    Таблица в БД существует, называется "flaMD$rk18_custom_toplist", класс и название пакета правильные. Если добавлять из админки, то в таблицу все успешно добавляется.
    Вот конфиг по которому пытаюсь сделать импорт:

    <?php
    //Название класса таблицы товаров в БД
    $cf_config['className'] = 'customtoplist';
    //Название пакета таблицы товаров в БД
    $cf_config['packageName'] = 'recordtoplist';
    //Название поля ID родителя
    $cf_config['parent_field'] = 'resource_id';
    
    //разбивка по столбцам при импорте и экспорте (content|tv|category)
    $cf_config['content_row'] = array(
        array('title',array('pagetitle','content')),
        array('number',array('number','content')),
        array('year',array('year','content')),
        array('discipline_category',array('disciplineCategory','content')),
        array('result',array('result','content')),
        array('environment',array('environment','content')),
        array('sport_title',array('sportTitle','content')),
        array('athlete',array('athlete','content')),
        array('dob',array('dob','content')),
        array('region',array('region','content')),
        array('place',array('place','content')),
        array('date',array('date','content'))
    );
    
    //значения по умолчанию при импорте или проверка при экспорте
    $cf_config['imp_content_default'] = array(
        'content' => array(
            'deleted' => 0,
            'published' => 1,
            //'template' => 3,
            //'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'] = false;
    
    //удалять дочерние категории при очистке и обновлении каталога
    $cf_config['delete_subcategories'] = true;
    
    //по какому полю проверять соответствие товара при обновлении. 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'] = true;
    
    //удалять 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'] = 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;
    }
    
    
    ?>
    

    Вот XML схема:

    <?xml version="1.0" encoding="UTF-8"?>
    <model package="recordtoplist" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
            <object class="customtoplist" table="custom_toplist" extends="xPDOSimpleObject" >  
            <field key="resource_id" dbtype="int" precision="11" phptype="integer" null="false" default="0" />
            <field key="pagetitle" dbtype="varchar" precision="255" phptype="string" null="false" default="" index="fulltext"/>
    		<field key="number" dbtype="int" precision="10" phptype="integer" null="false" default="" />
    		<field key="year" dbtype="int" precision="10" phptype="integer" null="false" default="" />
    		<field key="disciplineCategory" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="result" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="environment" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="sportTitle" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="athlete" dbtype="text" phptype="string" null="false" default="" />
    		<field key="dob" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="region" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="place" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
    		<field key="date" dbtype="varchar" precision="255" phptype="string" null="false" default="" />
            <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
            <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" />
            <field key="createdon" dbtype="datetime" phptype="datetime" null="true" />
            <aggregate alias="Resource" class="modResource" local="resource_id" foreign="id" cardinality="one" owner="foreign" />
            <aggregate alias="Creator" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign" />
            </object>
    </model>
    

    Помогите пожалуйста разобраться, в чем может быть проблема

  • Если добавлять из админки, то в таблицу все успешно добавляется.

    Как вы это проверяете? Покажите скриншот.

  • @Andchir Открываю необходимый ресурс, в него добавляю запись, в tv с типом migxdb, сохраняю
    0_1549892795378_migx_2.png
    1_1549892795378_migx_3.png
    В phpMyAdmin открываю таблицу "flaMD$rk18_custom_toplist" и вижу там только что созданную запись
    0_1549892888936_phpMyAdmin.png
    Данные из этой таблицы вывожу на сайте, все выводится

  • Покажите содержимое файла core/components/recordtoplist/model/recordtoplist/mysql/customtoplist.map.inc.php.

  • @Andchir customtoplist.map.inc.php

    <?php
    $xpdo_meta_map['customtoplist']= array (
      'package' => 'recordtoplist',
      'version' => '1.1',
      'table' => 'custom_toplist',
      'extends' => 'xPDOSimpleObject',
      'tableMeta' => 
      array (
        'engine' => 'MyISAM',
      ),
      'fields' => 
      array (
        'resource_id' => 0,
        'pagetitle' => '',
        'number' => 0,
        'year' => 0,
        'disciplineCategory' => '',
        'result' => '',
        'environment' => '',
        'sportTitle' => '',
        'athlete' => '',
        'dob' => '',
        'region' => '',
        'place' => '',
        'date' => '',
        'deleted' => 0,
        'published' => 0,
        'createdon' => NULL,
      ),
      'fieldMeta' => 
      array (
        'resource_id' => 
        array (
          'dbtype' => 'int',
          'precision' => '11',
          'phptype' => 'integer',
          'null' => false,
          'default' => 0,
        ),
        'pagetitle' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
          'index' => 'fulltext',
        ),
        'number' => 
        array (
          'dbtype' => 'int',
          'precision' => '10',
          'phptype' => 'integer',
          'null' => false,
          'default' => 0,
        ),
        'year' => 
        array (
          'dbtype' => 'int',
          'precision' => '10',
          'phptype' => 'integer',
          'null' => false,
          'default' => 0,
        ),
        'disciplineCategory' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'result' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'environment' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'sportTitle' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'athlete' => 
        array (
          'dbtype' => 'text',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'dob' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'region' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'place' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'date' => 
        array (
          'dbtype' => 'varchar',
          'precision' => '255',
          'phptype' => 'string',
          'null' => false,
          'default' => '',
        ),
        'deleted' => 
        array (
          'dbtype' => 'tinyint',
          'precision' => '1',
          'attributes' => 'unsigned',
          'phptype' => 'integer',
          'null' => false,
          'default' => 0,
        ),
        'published' => 
        array (
          'dbtype' => 'tinyint',
          'precision' => '1',
          'attributes' => 'unsigned',
          'phptype' => 'integer',
          'null' => false,
          'default' => 0,
        ),
        'createdon' => 
        array (
          'dbtype' => 'datetime',
          'phptype' => 'datetime',
          'null' => true,
        ),
      ),
      'aggregates' => 
      array (
        'Resource' => 
        array (
          'class' => 'modResource',
          'local' => 'resource_id',
          'foreign' => 'id',
          'cardinality' => 'one',
          'owner' => 'foreign',
        ),
        'Creator' => 
        array (
          'class' => 'modUser',
          'local' => 'createdby',
          'foreign' => 'id',
          'cardinality' => 'one',
          'owner' => 'foreign',
        ),
      ),
    );
    
    
  • Укажите версии всех, связанных с вопросом, компонентов и самого MODX. На будущее читайте рекомендации
    http://forum.modx-shopkeeper.ru/topic/15/рекомендации-по-оформлению-темы-с-вопросом

  • @Andchir

    На будущее читайте рекомендации
    http://forum.modx-shopkeeper.ru/topic/15/рекомендации-по-оформлению-темы-с-вопросом

    Да, хорошо

    Версии:
    Версия MODX: MODX Revolution 2.7.0-pl
    MIGX: 2.12.0-pl
    catalogfill: 2.4.9-pl1

    P.S. пробовала сделать импорт\экспорт на другом хостинге, ошибки те же что и на действующем

  • Версия PHP?

  • Попробую проверить у себя. О результатах напишу.

  • @Andchir Хорошо, буду ждать

  • Проблема в следующем: По правилам PHP название класса должно начинаться с большой буквы. Это есть в примере, который есть в составе Shopkeeper https://github.com/andchir/shopkeeper3/blob/master/core/components/shopkeeper3/docs/shop.mysql.schema.xml
    Но т.к. вы делаете не по правилам, то вам надо открыть файл core/components/catalogfill/model/catalogfill.class.php
    и строку 76

    $metaMap = $xpdo_meta_map[ucfirst($this->config['className'])];
    

    заменить на такую

    $metaMap = $xpdo_meta_map[$this->config['className']];
    
  • @Andchir Большое спасибо за потраченное время и за помощь в решении проблемы! Теперь все работает. Изначально название класса написала правильно, но потом почему-то решила что так неверно..
    Подскажите пожалуйста, это в будущем еще как-то может выйти мне боком? Неправильное название класса

  • Подскажите пожалуйста, это в будущем еще как-то может выйти мне боком? Неправильное название класса

    Мне не известно какие компоненты Вы будете использовать в будущем. Если есть возможность, то лучше сразу делать красиво и по правилам. Сейчас вы можете удалить папку компонента таблицы, поправить схему и сгенерировать новые классы в MIGXDB.

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

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

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

    tmRefresh

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

    Читать далее