4.1 Кастомний код при обході товара

Кастомний код дозволяє зробити імпорт максимально гнучким. Застосовуючи php код, можна модифікувати імпорт так, як вам буде зручно та потрібно.

Деякі завдання, які може вирішувати кастомний код

І багато іншого. Усі завдання важко перелічити через їхню можливу різноманітність.

У кастомному коді можна працювати з такими змінними

Корисна підказка. Для того щоб розуміти, з чим працюєте, рекомендую зробити print_r потрібних даних. Дивитися рекомендується через Посилання запуску по CRON внизу вікна ліворуч. Це посилання відкрийте в браузері для налагодження.

Детальніше нижче.

Наприклад, щоб переглянути масив товару, достатньо прописати код

echo "<pre>";
print_r($product);
exit();

Для перегляду конфігурації та самого XML код

echo "<pre>";
print_r($data);
exit();

Для перегляду об'єкта XML з поточним товаром

echo "<pre>";
print_r($row);
exit();

Давайте розглянемо на прикладах

Завантаження кастомного тегу в кастомне поле.

Наприклад, нам треба з тегу <big_opt_price> завантажити ціну закупівлі в поле zakupka таблиці product.

Для початку в кастомному коді зробимо вибірку з XML потрібних нам даних у потрібний ключ масиву товару.

$product['zakupka'] = $this->importGetXmlData($row, 'big_opt_price');

Далі достатньо додати ще рядок

$data['fields_p']['zakupka'] = 'zakupka';

Де в масив $data['fields_p'] додаємо ключ zakupka зі значенням zakupka.

Тут працює так: $data['fields_p']['поле в таблиці product'] = 'ключ у масиві $product';

Якщо треба додати в таблицю product_description, додаємо в $data['fields_pd']

Завантаження ключових слів keywords у meta_keywords

$product['meta_keyword'] = $this->importGetXmlData($row, 'keywords');
$data['fields_pd']['meta_keyword'] = 'meta_keyword';

Завантаження country_of_origin в атрибут Країна виробник

$country = $this->importGetXmlData($row, 'country_of_origin');
if($country){
  $product['attributes'][] = array(
    'name' => 'Країна виробник',
    'value' => $country
  );
}

Фільтрація товару за забороненими категоріями

$stop_category = array(
307,308,309,310,
311,312,344,361,255,256,258,
259,380,381,350,351,354,355,
356,357,358,378,379,396,367,
);
if(in_array((int)$product['category_id'], $stop_category)){
  $product['continue'] = true;
}

Фільтрація товару за наявністю. Тобто не завантажувати те, чого немає в наявності

$product['continue'] = false;
if($product['quantity'] == 'false'){
  $product['continue'] = true;
}

Для завантаження нестандартних атрибутів (у нестандартному вигляді) (для інформації як можна, оскільки такий формат атрибутів модуль вже завантажує через налаштування)

наприклад

<properties>
<property>
<property_name>Торгівельна марка</property_name>
<property_value>YES</property_value>
</property>
<property>
<property_name>Тип</property_name>
<property_value>Зошит преміум</property_value>
</property>
</properties>

достатньо додати код

$product['attributes'] = array();
foreach($row->properties->property as $attr){
  $name = trim((string)$attr->property_name);
  $value = trim((string)$attr->property_value);

  $product['attributes'][] = array(
    'name' => $name,
    'value' => $value
  );
}
Для унікалізації ключа, наприклад за моделлю, можна додати префікс постачальника, наприклад kr_
$product['model'] = 'kr_' . $product['model'];
if(isset($data['products'][$product['model']])){   $data['status'] = 'update'; //оновлюємо   $product['product_id'] = $data['products'][$product['model']]; } if(isset($data['fieldset']['products']['nadd_value']) && $data['status'] == 'add'){   $product['continue'] = true; }
і тоді якщо у фіді буде модель 540, а в магазині буде kr_540, все буде оновлюватися. Тільки треба вимкнути функцію "Не додавати нові товари"

Якщо вам потрібно для нових товарів завантажити в якусь певну категорію, достатньо поставити рядок

$product['custom_category_id'] = 435;

де 435 — id категорії в магазині

Якщо не треба оновлювати категорію для конкретного товару, можна поставити рядок

$product['category_save'] = true;

Якщо треба вмикати товар, який був вимкнений, але вже в наявності, потрібно додати

$this->importSetProductQuantity($data, $product);
if($product['product_id'] != $product['product_xml_id'] && $product['quantity']){
  $product['status'] = 1;
  $data['fields_p']['status'] = 'status';
}

Якщо вам треба завантажити в опції оригінальні значення, можна поставити

$data['option_data'] = array(
  'price_prefix' => (string)$row->price_prefix,
  'price' => (string)$row->price,
  'quantity' => (string)$row->quantity_in_stock,
  'weight' => (string)$row->option_weight,
  'is_default' => (string)$row->is_default,
);

тут вище в опції можна додавати/оновлювати будь-які дані. Наприклад is_default — це кастомне поле, але якщо воно буде тут, то буде оновлюватися. Якщо в масиві чогось немає, то не додає і не оновлює. Можна додавати у значення тег з XML, масив товару або ж саме значення.

Якщо вам треба імпортувати атрибути з групами (у фіді в param буде атрибут group з групою атрибута), достатньо додати код

$product['attributes'] = array();
foreach($row->param as $param){
  $attr_data = $this->importGetXmlDataAttribute($param);
  $product['attributes'][] = array(
    'name' => $attr_data['name'],
    'value' => (string)$param,
    'group' => $attr_data['group'],
  );
}

Фільтрація товару

Наприклад, якщо в тегу <pod_zakaz> буде значення 1 (ситуації можуть бути різні)

Для цього треба взяти дані з цього тегу рядком і зробити перевірку. Якщо там 1, тоді присвоюємо товару ключ continue, і він буде ігноруватися імпортом взагалі.

$pod_zakaz = $this->importGetXmlData($row, 'pod_zakaz');
if((int)$pod_zakaz == 1){
  $product['continue'] = true;
}

Щоб завантажити товари тільки зі зіставлених категорій, треба додати код

if(!isset($data['acats'])){
  $data['acats'] = [];
  foreach($data['replace_category'] as $catxml => $catoc){
    if($catoc[0] != 0){
      $catxml = explode('-', $catxml);
      $data['acats'][] = $catxml[0];  
    }
  }
}
if(!in_array($product['category_id'][0], $data['acats'])){
  $product['continue'] = true;
}
Як бачимо, кастомний код — це можливість гнучкого налаштування імпорту практично для будь-якої ситуації
×
Актуальна версія UniXML 7.7

Розробник модуля - Прут Микола.

Працюю з opencart з 2010 року.

Створив успішні модулі UniXML Pro, MicrodataPro, Easyphoto, Редиректор 301 та інші.

Авторське право на модуль UniXML та інформацію на цьому сайті належить Прут Миколі.

Копіювання матеріалу або використання неліцензійного модуля заборонено.