Трудности с импортом остатков из xml (модуль modimporter)

Доброго времени! Сразу скажу, в php не силен. Возникла трудность с задачей, прощу направить. Модуль, как я понял, позволяет импортировать в базу сайта информацию выгруженную из 1с. В выгруженном файле есть остатки — «Количество». Находятся на уровне с ценами. Для примера:

<Предложение>
 	<Ид>ab43f47d-b47a-11e6-9504-406186caa5f1<Ид/>
    	<Артикул/>
    	<Наименование>Кондитерское изделие фигурное Дед Мороз 60г<Наименование/>
    	<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">
    	    <Пересчет>
    	        <Единица>796<Единица/>
    	        <Коэффициент>1<Коэффициент/>
    	    <Пересчет/>
    	<БазоваяЕдиница/>
    	<Цены>
    		<Цена>
    			<Представление> 57 RUB за шт<Представление/>
    			<ИдТипаЦены>70f63c69-5c82-11e6-8eb6-406186caa5f1<ИдТипаЦены/>
    			<ЦенаЗаЕдиницу>57<ЦенаЗаЕдиницу/>
    			<Валюта>RUB<Валюта/>
    			<Коэффициент>1<Коэффициент/>
    		<Цена/>
    	<Цены/>
    	<strong><Количество>27<Количество/></strong>
    	<Склад ИдСклада="456684b4-0cd2-4157-a228-4ed059397969" КоличествоНаСкладе="27"/>
    <Предложение/>

В процессоре модуля есть метод StepImportCreatePrices() в классе console.class.php Так вот изначально метод, видимо, добавляет только цены, хотя, перед методом есть коментарий "// Создаем цены и остатки" Во всяком случае кусок метода выглядит вот так:

$prices = current((array)$raw_data['Цены']); //['Цена']
            $data = array(
                "price"     => !empty($prices['ЦенаЗаЕдиницу']) ? $prices['ЦенаЗаЕдиницу'] : 0,
            );

попробовал аналогично сделать с остатками:

$prices = current((array)$raw_data['Цены']); //['Цена']
$amount = current($raw_data['Количество']);
    $data = array(
        "price"     => !empty($prices['ЦенаЗаЕдиницу']) ? $prices['ЦенаЗаЕдиницу'] : 0,
        "amount"     => !empty($raw_data['Количество']) ? $raw_data['Количество'] : 0
    );

Но это не сработало. Причем в процессе экспериментов возникло ощущение, что, возможно, в запросе с апдейтом строки amount совсем отсутствует (формирование самого запроса найти не смог пока).

Подскажите, пожалуйста, куда стоит копать, может я вообще не в том месте ищу, остатки не берутся из файла совсем или не ту переменную использовать пытаюсь? Никак не удается самому разобраться в работе модуля.

Comments

Зачастую импорт приходится доделывать, поскольку у разных клиентов форматы файлов могут отличаться. В принципе, то, что Вы показали, верно и должно прописаться. Только я бы немного поправил:

$prices = current((array)$raw_data['Цены']);
$amount = current($raw_data['Количество']);
$data = array(
    "price"=>!empty($prices['ЦенаЗаЕдиницу']) ? $prices['ЦенаЗаЕдиницу'] : 0,
    "amount" => !empty($amount) ? $amount : 0
    );

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

print_r($data);
exit;

Это поможет увидеть, какие данные Вы получаете из xml. Также вывод можно сделать после записи в объект или после вызова процессора.

Спасибо! А подскажите… глупый, наверное, вопрос… как правильно вызвать модуль импорта из консоли? Были мысли ее как-то использовать, но я не знаю, как верно вызвать нужный модуль.

Есть скрипт:

print '<pre>';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
 
$namespace = 'modimporter';        // Неймспейс комопонента


// Добавить веб-сессию текущего пользователя
// Если вы не авторизованы во фронте, можете получить 
// в результате выполнения сообщение Доступ запрещён!
// $modx->user->addSessionContext('web');

// Удалить веб-сессию текущего пользователя
// $modx->user->removeSessionContext('web');


// Сбросить сессию компонента
// $_SESSION["SM_1C_IMPORT"] = array();

// Вывести данные сессии компонента
// print_r($_SESSION["SM_1C_IMPORT"]);

// print_r($_SESSION["SM_1C_IMPORT"]);
// unset($_SESSION["modImporter"]);


$params = array(  
    // "step"  => "SDFsdf",
    // "debug" => false,
    // "mode" => "checkauth",
    // "modimporter_step" => "modimporter_checkauth",
    // "modimporter_step" => "modimporter_console_init",
    // "modimporter_step" => "modimporter_drop_tmp_tables",
    // "modimporter_step" => "modimporter_create_tmp_tables",
    // "modimporter_step" => "modimporter_write_tmp_xlsx_shared_strings",
    // "modimporter_step" => "modimporter_write_tmp_categories",
    "modimporter_step" => "modimporter_write_tmp_data",
    // "modimporter_step" => "modimporter_import_data",
    // "modimporter_step" => "modimporter_import_update_categories",
    // "modimporter_step" => "modimporter_import_update_categories",
    // "modimporter_step" => "modimporter_import_create_categories",
    // "modimporter_step" => "modimporter_import_update_goods",
    // "modimporter_step" => "modimporter_import_create_goods",
    // "modimporter_step" => "modimporter_import_flush_prices",
    // "modimporter_step" => "modimporter_import_create_prices",
    
    // "filename"  => "import.xml",
    // "username"  => "admin", 
    // "password"  => "wefwef", 
    "outputCharset" => "utf-8",
);

// $_SERVER['PHP_AUTH_USER'] = 'admin';
// $_SERVER['PHP_AUTH_PW'] = 'admin';

if(!$response = $modx->runProcessor('modimporter/import/console',
$params
, array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}

 
$memory = round(memory_get_usage(true)/1024/1024, 4).' Mb';
print "<div>Memory: {$memory}</div>";
$totalTime= (microtime(true) - $modx->startTime);
$queryTime= $modx->queryTime;
$queryTime= sprintf("%2.4f s", $queryTime);
$queries= isset ($modx->executedQueries) ? $modx->executedQueries : 0;
$totalTime= sprintf("%2.4f s", $totalTime);
$phpTime= $totalTime - $queryTime;
$phpTime= sprintf("%2.4f s", $phpTime);
print "<div>TotalTime: {$totalTime}</div>";

print_r($response->getResponse());

// $objects = $response->getObject();
// foreach($objects as $object){
// }

Спасибо большое. Наконец вернулся к задаче и с Вашей помощью удалось дойти до следующей «мертвой точки». Данные верно попадают куда надо в переменных, кроме запроса. Запрос с ценой формируется в коде так:

$q2 = $this->modx->newQuery('modResource');
            $q2->command('update');
            $q2->set($data);
            $q2->where(array(
                "id"    => $tmp_object->resource_id,
            ));

и формируется честно, например:

UPDATE `modx_site_content` SET `price` = 19 WHERE `modx_site_content`.`id` = 37216

а вот как только я пытаюсь, даже не добавить в дату, а заменить price на «amount» или хотя бы «test» запрос перестает нормально формироваться:

UPDATE `modx_site_content` WHERE `modx_site_content`.`id` = 21043

Насколько удалось понять — при формировании запроса (так и не нашел конкретное место, честно говоря) происходит что-то вроде проверки валидности наименования (price, amount и тд). И наименования полей к типу modResource (с указанием таблицы без префикса: site_content) прописаны в паре файлов xml и описаны в файлах php. Но ключевая проблема, что как раз таки где все это описано, конкретно описание «price» так и не удалось обнаружить во всем ядре. Не могли бы Вы подсказать в каком направлении можно дальше подумать, а то идеи кончились. Может, например, известно, где может быть описано данное поле (ptice), что бы оно как-то обрабатывалось при формировании sql?