Добавление external_id в xml файл выгрузки YML-экспорт

Да не, просто примерно знать. Если у вас всё окей, значит я даже тему создавать не буду. Надо решать быстро, а с этими темами и обращениями в ТП может выйти совсем долго.

Закрываю для себя тему всех этих правок. Этот модуль переделывать нужно под корень, как минимум генерацию ICML вынести в нечто самостоятельное. Потому что особенности генерации YML только мешают.

Сделай на своем примере экспорт Товар id=163 (externalId=40413) с параметрами id, external id и код товара. Потом посмотри, какое поле соответствует значению 40413 и напиши всем нам.

Ошибки или нотисы? Мне нотисы не мешают, если они по времени отрабатывают не по 30 минут и не вномят кучу ошибок в исходящие массивы.

Где ты логи, кстати, смотришь, о которых пишешь?

Да стандартно.
В настройках генерации прайс-листа YML стоит галка:
image

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

указан файл yml2 965 строка. Что там? Ну, или сбрось модуль на ноль

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

У вас на картинке выделено было, про него и подумал. Надо глубже копать, навскидку не скажу

Product code;Language;Store;Product id;external id
“38032777”;“ru”;“Фирма”;“40413”;“40888”
“38032333”;“ru”;“Фирма”;“40414”;“40414”

cs-coding победил первую напасть, external_id передается вместо product_id. До передачи external_id в заказ руки еще не дошли. Потом кучей покажу решения

2 лайка

Ye? по-поводу подмены product-id я начал сомневаться и сделал пока что только впихивание внешнего кода в файл экспорта такой штукой
public function build($product)
{
$category_id = $product[‘category_id’];

    $available = 'true';
    if ($product['tracking'] == 'B' && $product['amount'] <= 0) {
        $available = 'false';
    }

$external_id = db_get_field(“SELECT external_id FROM ?:products WHERE product_id =?i”, $product[‘product_id’]);
$offer = array(
‘attr’ => array(

          'id' => $product['product_id'], 
          'available' => $available,
          'externalid' => $external_id,
          
            
        ),

Но… почему-то СРМ все-равно упорно не хочет сопоставлять товар с каталогом своим и выгружать его в мой склад. Изначальная задача была выполнена, а айди товара используется в стольких файлах тут, что подмена не лучшее решенее. По крайней мере для меня.
У кого-то есть еще идеи. Уже голову сломал себе

Писал в другой ветке какие файлы нужно подредактировать, чтобы связать 1С (Мойсклад), CS-Cart и RetailCRM. В YML нужно добавить XmlId, значения которого в CS-Cart хранятся в поле external_id.
Отредактировать нужно 2 файла:

  1. app/addons/retailcrm/Tygh/Addons/Retailcrm/Ym/Offers/Simple.php
    public function gatherAdditional($product)
    {
    parent::gatherAdditional($product);

     //$this->schema[] = 'purchasePrice';
     // @fm
     if (!in_array('name', $this->schema)) {
         $this->schema[] = 'name';
     }
     if (!in_array('productName', $this->schema)) {
         $this->schema[] = 'productName';
     }
     if (!in_array('xmlId', $this->schema)) {        
     	$this->schema[] = 'xmlId';
     }
    
     $this->offer['attr'] = array_merge($this->offer['attr'], self::getRetailCrmOfferAttributes($product));
     $this->offer['items'] = $this->getRetailCrmOfferItem($this->offer['items'], $product);
    
     return true;
    

    }

public static function getRetailCrmOfferItem($offer_item, $product)
{
if (!empty($product[‘yml2_purchase_price’])) {
$offer_item[‘purchasePrice’] = $product[‘yml2_purchase_price’];
}

    if (empty($offer_item['name'])) {
        $offer_item['name'] = $product['product'];
    }
    
    if (empty($offer_item['productName'])) {
        $offer_item['productName'] = $product['product'];
    }
    
    if (!empty($product['external_id'])) {
        $offer_item['xmlId'] = $product['external_id'];
    }
    
    $param = array(
                    'attr' => array(
                        'name' => 'Артикул',
                        'code' => 'article'
                    ),
                    'value' => $product['product_code']
                );
    
    $offer_item['param'][] = $param;
    
    
    return $offer_item;
}

и аналогично
2. app/addons/retailcrm/Tygh/Addons/Retailcrm/Ym/Offers/Vendor.php

public function gatherAdditional($product)
{
parent::gatherAdditional($product);

	// @fm_mod
    //$this->schema[] = 'purchasePrice';
    if (!in_array('name', $this->schema)) {
        $this->schema[] = 'name';
    }
    if (!in_array('productName', $this->schema)) {
        $this->schema[] = 'productName';
    }
	if (!in_array('xmlId', $this->schema)) {        
    	$this->schema[] = 'xmlId';
    }

    $this->offer['attr'] = array_merge($this->offer['attr'], Simple::getRetailCrmOfferAttributes($product));
    $this->offer['items'] = Simple::getRetailCrmOfferItem($this->offer['items'], $product);

    return true;
}
1 лайк

Ну как Вам сказать? Я вендор не редактирован, а просто прогнал код на синксис - нашел ошибку и все стало выгружаться. Так что код верный. В моем прайсе external_id появился и все замечательно выгружается. В если что-то не сработает у кого-то, то нужно больше в модуле СРМ копаться в другом файле app/addons/retailcrm/Tygh/Addons/Retailcrm/Converters/OrderConverter.php
Хотя, Ваше решение тоже интересное))

ВОПРОС РЕШИЛИ!

1 лайк

@fevzi сделал как описано, но к сожалению файл генерируется без xmlId. Ваше решение было представлено уже давно, возможно с обновлениями движка что то изменилось, не подскажете?

а вы нашли решение? А то у меня такая же проблема(