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


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 Спасибо! 👍

 

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

  • Документация: https://modx-shopkeeper.ru/docs/shopkeeper-3/shopkeeper-3
    Там написано какие плейсхолдеры доступны.
    Если имеется ввиду цена одного товара, то [[+price]] - это цена без доп. параметров.

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

    Такой вопрос: как вывести цену без дополнительных атрибутов? В мини-корзине.

    Читать далее
  • в категорию assets/catalogfill/files/ экспорт происходит нормально.

    Что-то в вашем сообщении всё перемешано. Папки или категории? А если папки (с файлами), то какие у них могут быть id...
    Если появляется сообщение про категорию, то это имеется ввиду категория каталога (документ MODX).

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

    Добрый день!

    Искал такой функционал в настройках или в конфигах, найти не получилось. Суть такая: клиент может загружать файлы только в media/ (Источник файлов 1 Filesystem, но есть еще один с полным доступом в корень id 4), таким образом, при загрузке файлов CatalogFill не видит файлы. Возникакет ошибка о том что нет такого каталога. Создаю его в ФС. Загрузка не происходит. в категорию assets/catalogfill/files/ экспорт происходит нормально. Есть какие-то возможности переключить именно для catalogfill возможность загрузить в четверый источник без модификации самого компонента?

    Версия последняя, производил обновление сегодня.

    Заранее благодарен.

    Читать далее