Долго создаются товары через api
Делаю выгрузку товаров. Товары создаются около секунды, что много, учитывая, что нужно выгрузить их более 7000. В чём может быть причина? Категории создаются гораздо быстрее, способ примерно такой же.
<?php
// import_products - таблица, временное хранилище для свойств товара
$total = $this->modx->getCount('import_products', ['imported' => 0]);
$this->log[] = "Товаров для импорта: $total";
$query = $this->modx->newQuery('import_products');
$query->limit($this->cfg['limit_products']); // с лимитом 1 создаётся около секунды
$query->where(['imported' => 0]);
$items = $this->modx->getCollection('import_products', $query);
$imported = 0;
foreach ($items as $item) {
$obj = null;
$data = json_decode($item->data, true) ?? [];
// код get_field() - в конце
$parent = Helpers::get_field('import_categories', 'modx_id', ['import_id' => $item->import_parent_id]);
if (!$parent) {
$this->log[] = "⚠ Нет категории для {$item->name}";
continue;
}
if (empty($data['price'])) {
$this->log[] = "⚠ Нет цены для {$item->name}";
continue;
}
if ($item->modx_id) {
$obj = $this->modx->getObject('msProduct', $item->modx_id);
}
if (empty($obj)) {
$this->log[] = "Создание товара: {$item->name}";
$obj = $this->modx->newObject('msProduct');
$alias = $obj->cleanAlias($item->name) . '-' . $item->id;
$obj->set('alias', $alias);
$obj->set('published', 1);
$obj->set('template', $this->cfg['product_tmpl']);
$obj->set('show_in_tree', 0);
} else {
$this->log[] = "Обновление товара: {$item->name}";
}
if (!empty($data['article'])) {
$obj->set('article', trim($data['article']));
}
$obj->fromArray([
'pagetitle' => trim($item->name),
'parent' => $parent,
'published' => 1,
'template' => $this->cfg['product_tmpl'],
'price' => $data['price'],
]);
if ($obj->save() && $obj->id) {
$item->set('imported', 1);
$item->set('modx_id', $obj->id);
$item->save();
$imported++;
}
}
if ($imported === $total) {
$this->log[] = "Товары импортированы";
return 'done';
} else {
return 'continue';
}
// метод get_field
public static function get_field($object, $field = 'id', $where)
{
global $modx;
$name = 'import_get_field_' . md5(json_encode(func_get_args()));
$cache = $modx->cacheManager->get($name, [\xPDO::OPT_CACHE_KEY => 'resource']);
if (isset($cache)) {
return $cache;
}
$q = $modx->newQuery($object, $where);
$q->select($field);
$value = $modx->getValue($q->prepare());
$modx->cacheManager->set($name, $value, 0, [\xPDO::OPT_CACHE_KEY => 'resource']);
return $value;
}
Комментарии: 3
Обычный ресурс создаётся за 0.02 с, товар minishop — 1.14 c.
file.modx.pro/files/e/9/9/e9948e0ecd5cef36e7f0350e16d96d80.png
file.modx.pro/files/2/9/4/29434f0d0b9976ddfc2d611c00c74699.png
file.modx.pro/files/e/9/9/e9948e0ecd5cef36e7f0350e16d96d80.png
file.modx.pro/files/2/9/4/29434f0d0b9976ddfc2d611c00c74699.png
Вот так создаются за 0,002 с
function create(string $table, array $data) {
global $modx;
$keys = [];
$values = [];
foreach ($data as $key => $value) {
$keys[] = "`$key`";
$values[] = is_int($value) ? $value : "'$value'";
}
$keys = implode(', ', $keys);
$values = implode(', ', $values);
$table = $modx->getOption(xPDO::OPT_TABLE_PREFIX) . $table;
$sql = "INSERT INTO {$table} ({$keys}) VALUES ({$values});";
$stmt = $modx->prepare($sql);
$stmt->execute();
return $modx->lastInsertId();
}
$id = create('site_content', [
'pagetitle' => 'test товар 3',
'parent' => 1,
'class_key' => 'msProduct',
]);
$id = create('ms2_products', [
'id' => $id,
'article' => 'test 1',
'price' => '50.9',
]);
Я точно не в курсе, но вообще когда создаешь через api MODX запускаются дополнительные обработки. Какие надо смотреть класс msProduct. Но скорей всего там tv обрабатываются. Например, при создании через процессор запускаются плагины на событие OnDocFormSave. Через getObject события тоже могут запускаться.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.