Настройка Экспорта/импорта Данных Из Дополнительного Модуля

Прошу помочь с настройкой вывода данных из дополнительно установленного модуля Product Tabs Extra (HW) разработчика Hungryweb. Модуль служит для удобного ввода и отображения данных в дополнительных вкладках товара - подробнее см. в описании модуля в магазине: http://marketplace.cs-cart.com/add-ons/customer-experience/cs-cart-product-tabs-extra-by-hungryweb.html?sl=ru

Задача: настройка программного экспорта/импорт данных из модуля для каждого предмета.

Что делал:

1) посмотрел видеоинструкцию: http://www.cs-cart.ru/videos/devel/b.4.6-novaya-nastroyka-tovara-eksport-import.html

2) на основе файла products.post.php YandexMarket создал аналогичный файл для модуля со следующим кодом:

$schema['export_fields']['hw_extra_tabs'] = array (
    'table' => 'hw_extra_tabs_content',
    'db_field' => 'value',
);

return $schema;

переменные для кода взял из файла "addon.xml", содержащегося в папке с модулем: /www/app/addons/hw_extra_tabs

3) поместил созданный файл products.post.php в предварительно созданную папку "exim" внутри папки модуля: /www/app/addons/hw_extra_tabs/schemas/exim

4) при попытке экспорта и заходе в соотвествующий раздел меню "Администрирование/Экспорт данных" выходит ошибка "Неправильное формирование рисунка: таблица ссылок пропущена", а экспорт товаров становится недоступным (см прикрепленный скриншот).
Профессионалы, буду благодарен за Вашу помощь в решении проблемы!

Администрирование____Экспорт_данных_-_Панель_администратора.jpg

Не хватает связи между таблицей товаров (:?products) и новой таблицей (hw_extra_tabs_content). Для этого в схему надо добавить элемент в массив references.

Вот так выглядит пример в стандартной схеме

    'references' => array(
        'product_descriptions' => array(
            'reference_fields' => array('product_id' => '#key', 'lang_code' => '#lang_code'),
            'join_type' => 'LEFT'
        ),

В вашем случае не очень понятна структура таблицы hw_extra_tabs_content, но наверняка там должна быть связь с product ID.

Таким образом, в схему (в тот же самый файл products.post.php) надо добавить код:

$schema['references']['hw_extra_tabs_content'] = array (
     'reference_fields' => array('product_id' => '#key'),
     'join_type' => 'LEFT'
);

разумеется, до return $schema;

Конкретно этот код сработает, если в таблице hw_extra_tabs_content действительно есть поле product_id для связи с товаром.

Возможно, это не так. Тогда лучше приведите структуру таблицы hw_extra_tabs_content (можно взять из addon.xml)

@simtechdev огромное спасибо за оперативный совет и предложенное решение! Буду благодарен, если поможете довести дело до конца. Привожу содержимое addon.xml из папки модуля /www/app/addons/hw_extra_tabs:

<?xml version="1.0"?>

   hw_extra_tabs
   1.2
   700
   0
   active
   en
   MULTIVENDOR,ULTIMATE
   
       
           Hungryweb
           info@hungryweb.net
           https://www.hungryweb.net
       
   
    
        DROP TABLE IF EXISTS ?:hw_extra_tabs;
        DROP TABLE IF EXISTS ?:hw_extra_tabs_content;
        DROP TABLE IF EXISTS ?:hw_extra_tabs_desc;
        
          CREATE TABLE `?:hw_extra_tabs` (
            `tab_id` int(11) NOT NULL AUTO_INCREMENT,
            `status` varchar(1) NOT NULL DEFAULT 'A',
            `position` int(11) NOT NULL DEFAULT '0',
            `company_id` int(11) NOT NULL DEFAULT '0',
            `created` int(11) NOT NULL DEFAULT '0',
            `type` varchar(1) NOT NULL DEFAULT 'T',
            `usergroup_ids` varchar(255) NOT NULL DEFAULT '0',
            PRIMARY KEY (`tab_id`)
          ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
        
        
          CREATE TABLE `?:hw_extra_tabs_content` (
            `content_id` int(11) NOT NULL AUTO_INCREMENT,
            `tab_id` int(11) NOT NULL,
            `product_id` int(11) NOT NULL,
            `value` text NOT NULL,
            `lang_code` varchar(5) NOT NULL DEFAULT 'en',
            PRIMARY KEY (`content_id`)
          ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
        
        
          CREATE TABLE `?:hw_extra_tabs_desc` (
            `tab_id` int(11) NOT NULL,
            `name` varchar(250) NOT NULL,
            `value` text NOT NULL,
            `lang_code` varchar(10) NOT NULL DEFAULT 'en'
          ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
        
        REPLACE INTO ?:privileges (privilege, is_default, section_id) VALUES ('view_extra_tabs', 'Y', 'design');
        REPLACE INTO ?:privileges (privilege, is_default, section_id) VALUES ('manage_extra_tabs', 'Y', 'design');
        REPLACE INTO ?:usergroup_privileges (usergroup_id, privilege) VALUES ('4', 'view_extra_tabs');
        REPLACE INTO ?:usergroup_privileges (usergroup_id, privilege) VALUES ('4', 'manage_extra_tabs');
        DELETE FROM ?:privileges WHERE privilege IN ('view_extra_tabs', 'manage_extra_tabs')
        DELETE FROM ?:usergroup_privileges WHERE privilege IN ('view_extra_tabs', 'manage_extra_tabs')
     <item for="uninstall">DROP TABLE IF EXISTS ?:hw_extra_tabs;</item>
     <item for="uninstall">DROP TABLE IF EXISTS ?:hw_extra_tabs_content;</item>
     <item for="uninstall">DROP TABLE IF EXISTS ?:hw_extra_tabs_desc;</item>
</queries>
fn_hw_extra_tabs_install fn_hw_extra_tabs_uninstall

Все прекрасно, вижу структуру нужной таблицы

В схему надо добавить lang_code, судя по всему:

$schema['references']['hw_extra_tabs_content'] = array (
     'reference_fields' => array('product_id' => '#key', 'lang_code' => '#lang_code'),
     'join_type' => 'LEFT'
);

$schema[‘export_fields’][‘hw_extra_tabs’] = array (
‘table’ => ‘hw_extra_tabs_content’,
‘db_field’ => ‘value’,
);

return $schema;

Попробуйте.

Спасибо, экспорт заработал, но при импорте данные из колонки "hw_extra_tabs" csv файла не подтягиваются...

Также при создании нескольких вкладок товаров, при экспорте в csv данные из вкладок отображаются в 2 строчки одна под другой с одинаковым артикулом товара, но разными значениями поля - см. скриншот http://joxi.ru/krDx3WJS00w6Mr. Есть ли возможность сделать так, чтобы данные из разных вкладок экспортировались/импортировались в отдельные колонки csv?

Заранее спасибо!

Для этого нужно сделать несколько полей в exported_fields, вроде hw_extra_tabs1, hw_extra_tabs2 или более осмысленные.

И простым полем не обойтись, увы. Надо писать функцию извлечения нужных данных по tab_id.

Схема будет уже другая:

$schema['references']['hw_extra_tabs_content'] = array (
     'reference_fields' => array('product_id' => '#key', 'lang_code' => '#lang_code'),
     'join_type' => 'LEFT'
);

$schema[‘export_fields’][‘hw_extra_tabs1’] = array (
‘table’ => ‘hw_extra_tabs_content’,
‘db_field’ => ‘value’,
‘process_get’ => array(‘fn_export_hw_extra_tabs’, ‘#key’, ‘#this’, ‘#lang_code’, ‘1’),
);

$schema[‘export_fields’][‘hw_extra_tabs2’] = array (
‘table’ => ‘hw_extra_tabs_content’,
‘db_field’ => ‘value’,
‘process_get’ => array(‘fn_export_hw_extra_tabs’, ‘#key’, ‘#this’, ‘#lang_code’, ‘2’),
);

// … по новому export_fields для каждого таба

return $schema;

Функцию лучше положить отдельно в func.php

function fn_export_hw_extra_tabs($product_id, $data, $lang_code, $tab_id)
{
     return db_get_field("SELECT value FROM hw_extra_tabs_content WHERE product_id = ?i AND lang_code = ?s AND tab_id = ?i", $product_id, $lang_code, $tab_id);
}

ID табов сами выясняете.

(!) Решение в лоб и не тестировано.

ID табов легко нашел в админке наведением на заголовок соответствующего таба - это цифры по порядку: 1, 2 ит.д.

Функцию прописал в файл func.php в папке модуля: /www/app/addons/hw_extra_tabs

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

Также буду благодарен за совет как побороть импорт - он не происходит даже в случае с 1 вкладкой: данные из колонки "hw_extra_tabs" csv файла не подтягиваются.

Также буду благодарен за совет как побороть импорт - он не происходит даже в случае с 1 вкладкой: данные из колонки "hw_extra_tabs" csv файла не подтягиваются.

В данный момент схема ничего не знает об этой таблице. И импорт всегда сложнее, на коленке не сделаешь

В данный момент схема ничего не знает об этой таблице. И импорт всегда сложнее, на коленке не сделаешь

Не поможете по моим вопросам за умеренную оплату? =)

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

Можете оставить запрос в нашем HelpDesk. Будем рады помочь

Добрый день, пытаюсь расширить схему qty_discounts.php, добавить в Экспорт "Оптовых скидок" поля "Наименование продукта", "Описание" и "Опции". Создал в app/addons/my_changes/schemas/exim файл qty_discounts.post.php с кодом:

<?php
/***************************************************************************
*                                                                          *
*   (c) 2004 Vladimir V. Kalynyak, Alexey V. Vinokurov, Ilya M. Shalnev    *
*                                                                          *
* This  is  commercial  software,  only  users  who have purchased a valid *
* license  and  accept  to the terms of the  License Agreement can install *
* and use this program.                                                    *
*                                                                          *
****************************************************************************
* PLEASE READ THE FULL TEXT  OF THE SOFTWARE  LICENSE   AGREEMENT  IN  THE *
* "copyright.txt" FILE PROVIDED WITH THIS DISTRIBUTION PACKAGE.            *
****************************************************************************/

$schema[‘export_fields’][‘Product name’] => array(
‘table’ => ‘product_descriptions’,
‘db_field’ => ‘product’,
‘multilang’ => true,
‘process_get’ => array(‘fn_export_product_descr’, ‘#key’, ‘#this’, ‘#lang_code’, ‘product’),
‘process_put’ => array(‘fn_import_product_descr’, ‘#this’, ‘#key’, ‘product’),
);

$schema[‘export_fields’][‘Description’] => array(
‘table’ => ‘product_descriptions’,
‘db_field’ => ‘full_description’,
‘multilang’ => true,
‘process_get’ => array(‘fn_export_product_descr’, ‘#key’, ‘#this’, ‘#lang_code’, ‘full_description’),
‘process_put’ => array(‘fn_import_product_descr’, ‘#this’, ‘#key’, ‘full_description’),
);

$schema[‘export_fields’][‘Options’] => array(
‘process_get’ => array(‘fn_exim_get_product_options’, ‘#key’, ‘#lang_code’, ‘@features_delimiter’),
‘process_put’ => array(‘fn_exim_set_product_options’, ‘#key’, ‘#this’, ‘#lang_code’, ‘@features_delimiter’),
‘linked’ => false, // this field is not linked during import-export
‘multilang’ => true,
);

return $schema;

После очистки кэша в Экспорт вообще не заходит, может кто знает что я делаю не так?

Поменяйте

=> array(

на

= array(

Исправил, в экспорт заходит, но мигает ошибка ОшибкаНеправильное формирование рисунка: таблица ссылок пропущена

и пропадает закладка "Оптовые скидки" Вот код:

$schema['export_fields']['Product name'] = array(
            'table' => 'product_descriptions',
            'db_field' => 'product',
            'multilang' => true,
            'process_get' => array('fn_export_product_descr', '#key', '#this', '#lang_code', 'product'),
            'process_put' => array('fn_import_product_descr', '#this', '#key', 'product'),
        );

$schema[‘export_fields’][‘Description’] = array(
‘table’ => ‘product_descriptions’,
‘db_field’ => ‘full_description’,
‘multilang’ => true,
‘process_get’ => array(‘fn_export_product_descr’, ‘#key’, ‘#this’, ‘#lang_code’, ‘full_description’),
‘process_put’ => array(‘fn_import_product_descr’, ‘#this’, ‘#key’, ‘full_description’),
);

$schema[‘export_fields’][‘Options’] = array(
‘process_get’ => array(‘fn_exim_get_product_options’, ‘#key’, ‘#lang_code’, ‘@features_delimiter’),
‘process_put’ => array(‘fn_exim_set_product_options’, ‘#key’, ‘#this’, ‘#lang_code’, ‘@features_delimiter’),
‘linked’ => false, // this field is not linked during import-export
‘multilang’ => true,
);

return $schema;

А если в начало добавляю это:

$schema['references']['product_prices'] = array (
			'reference_fields' => array('product_id' => '#key', 'Description' => '#full_description', 'product_name' => '#product', 'Options' => '#Options', 'lang_code' => '#lang_code'),
            'join_type' => 'INNER',
            'alt_key' => array('lower_limit', 'usergroup_id', '#key'),

);

То снова в экспорт товаров вообще не заходит :-(

Сейчас поправил, ошибок не выдает, поля добавились в админке, но правда ничего не экспортирует

Вот код

<?php
/***************************************************************************
*                                                                          *
*   (c) 2004 Vladimir V. Kalynyak, Alexey V. Vinokurov, Ilya M. Shalnev    *
*                                                                          *
* This  is  commercial  software,  only  users  who have purchased a valid *
* license  and  accept  to the terms of the  License Agreement can install *
* and use this program.                                                    *
*                                                                          *
****************************************************************************
* PLEASE READ THE FULL TEXT  OF THE SOFTWARE  LICENSE   AGREEMENT  IN  THE *
* "copyright.txt" FILE PROVIDED WITH THIS DISTRIBUTION PACKAGE.            *
****************************************************************************/
$schema['references']['product_descriptions'] = array (
			'reference_fields' => array('product_id' => '#key', 'Description' => '#full_description', 'product_name' => '#product', 'Options' => '#Options', 'lang_code' => '#lang_code'),
            'join_type' => 'INNER',
            'alt_key' => array('lower_limit', 'usergroup_id', '#key'),

);

$schema[‘export_fields’][‘Product name’] = array(
‘table’ => ‘product_descriptions’,
‘db_field’ => ‘product’,
‘multilang’ => true,
‘process_get’ => array(‘fn_export_product_descr’, ‘#key’, ‘#this’, ‘#lang_code’, ‘product’),
‘process_put’ => array(‘fn_import_product_descr’, ‘#this’, ‘#key’, ‘product’),
);

$schema[‘export_fields’][‘Description’] = array(
‘table’ => ‘product_descriptions’,
‘db_field’ => ‘full_description’,
‘multilang’ => true,
‘process_get’ => array(‘fn_export_product_descr’, ‘#key’, ‘#this’, ‘#lang_code’, ‘full_description’),
‘process_put’ => array(‘fn_import_product_descr’, ‘#this’, ‘#key’, ‘full_description’),
);

$schema[‘export_fields’][‘Options’] = array(
‘process_get’ => array(‘fn_exim_get_product_options’, ‘#key’, ‘#lang_code’, ‘@features_delimiter’),
‘process_put’ => array(‘fn_exim_set_product_options’, ‘#key’, ‘#this’, ‘#lang_code’, ‘@features_delimiter’),
‘linked’ => false, // this field is not linked during import-export
‘multilang’ => true,
);

return $schema;

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

Скорее всего проблема в том, что указанные вами функции находятся в файле products.functions.php, который у вас не подключается.

А как их правильно подключить? Добавил в начало строчки

use Tygh\Registry;
include_once(Registry::get('config.dir.schemas') . 'exim/products.functions.php');
Но к сожалению ничего не происходит и не заходит в Экспорт товаров

В Экспорт товаров зашло, все норм. Но по прежнему не выгружает, только блымает и все.

Включите отображение ошибок, на странице экспорта с помощью консоли разработчика с формы уберите класс cm-ajax и запустите экспорт для того, чтобы отдебажить проблему

Мы с cs-cart работаем недавно, отображение ошибок включил, ничего не показало. А как на странице экспорта с помощью консоли разработчика с формы убрать класс cm-ajax не в курсе. :-(

Проблема решена, все заработало, может кому пригодится, вот правильное решение:

<?php
/***************************************************************************
*                                                                          *
*   (c) 2004 Vladimir V. Kalynyak, Alexey V. Vinokurov, Ilya M. Shalnev    *
*                                                                          *
* This  is  commercial  software,  only  users  who have purchased a valid *
* license  and  accept  to the terms of the  License Agreement can install *
* and use this program.                                                    *
*                                                                          *
****************************************************************************
* PLEASE READ THE FULL TEXT  OF THE SOFTWARE  LICENSE   AGREEMENT  IN  THE *
* "copyright.txt" FILE PROVIDED WITH THIS DISTRIBUTION PACKAGE.            *
****************************************************************************/
use Tygh\Registry;

include_once(Registry::get(‘config.dir.schemas’) . ‘exim/products.functions.php’);
include_once(Registry::get(‘config.dir.schemas’) . ‘exim/features.functions.php’);

$schema[‘references’][‘product_descriptions’] = array (
‘reference_fields’ => array(‘product_id’ => ‘#key’, ‘lang_code’ => ‘#lang_code’),
‘join_type’ => ‘INNER’,
‘alt_key’ => array(‘lower_limit’, ‘usergroup_id’, ‘#key’),

);

$schema[‘export_fields’][‘Product name’] = array(
‘table’ => ‘product_descriptions’,
‘db_field’ => ‘product’,
‘multilang’ => true,
‘process_get’ => array(‘fn_export_product_descr’, ‘#key’, ‘#this’, ‘#lang_code’, ‘product’),
‘process_put’ => array(‘fn_import_product_descr’, ‘#this’, ‘#key’, ‘product’),
);

$schema[‘export_fields’][‘Description’] = array(
‘table’ => ‘product_descriptions’,
‘db_field’ => ‘full_description’,
‘multilang’ => true,
‘process_get’ => array(‘fn_export_product_descr’, ‘#key’, ‘#this’, ‘#lang_code’, ‘full_description’),
‘process_put’ => array(‘fn_import_product_descr’, ‘#this’, ‘#key’, ‘full_description’),
);

$schema[‘export_fields’][‘Options’] = array(
‘process_get’ => array(‘fn_exim_get_product_options’, ‘#key’, ‘#lang_code’, ‘@features_delimiter’),
‘process_put’ => array(‘fn_exim_set_product_options’, ‘#key’, ‘#this’, ‘#lang_code’, ‘@features_delimiter’),
‘linked’ => false, // this field is not linked during import-export
‘multilang’ => true,
);

return $schema;