поток данных magento: как вызвать действие один раз перед обработкой любой строки

Контекст: версия Magento 1.7.0.0. Мне нужно импортировать данные csv с расширенными профилями magento dataflow. Я сделал адаптер, который реализует Mage_Dataflow_Model_Convert_Adapter_Abstract. Я реализовал метод saveRow() для обработки каждой строки, хорошо.

Следующий шаг: я хочу запустить некоторый код перед обработкой любой строки: что-то вроде метода save() или beforeSave()... Как это сделать?

Я предполагаю, что мне нужно реализовать метод save() из Mage_Dataflow_Model_Convert_Adapter_Abstract и добавить что-то в раздел Actions XML в моем профиле импорта:

<!-- adapter: loading data from local csv file-->
<action type="dataflow/convert_adapter_io" method="load">
    <var name="type">file</var>
    <var name="path">var/import</var>
    <var name="filename"><![CDATA[blabla.csv]]></var>
    <var name="format"><![CDATA[csv]]></var>
</action>

<!-- parsing: transform into database entities -->
<action type="dataflow/convert_parser_csv" method="parse">
    <var name="delimiter"><![CDATA[,]]></var>
    <var name="enclose"><![CDATA[']]></var>
    <var name="fieldnames">true</var>
    <var name="store"><![CDATA[0]]></var>
    <var name="number_of_records">1</var>
    <var name="adapter">mymodule/convert_adapter_blabla</var>
    <var name="method">saveRow</var>
</action>

Любые предложения будут приветствоваться, спасибо! :)


person Katapofatico    schedule 05.06.2012    source источник


Ответы (1)


метод save() будет запускаться только один раз для импорта, поэтому я не думаю, что это тот способ, которым вы хотите воспользоваться. Хотя он имеет доступ к данным коллекции, поэтому, в зависимости от операции, которую вы хотите выполнить, он может подойти.
Поскольку вы реализовали метод saveRow(), не можете ли вы включить в него вызов некоторого (частного) метод, прежде чем делать что-либо еще?

public function saveRow()
{
    $this->_somePrivateMethod();
    ...
    /** the rest of saveRow() method **/
    ...
}

private function _somePrivateMethod()
{
    /** the code you want to execute before every row is saved **/
}
person OSdave    schedule 05.06.2012
comment
Большое спасибо @OSdave, я протестировал его, и он не работает :( : Обработка импорта выполняется с помощью вызовов AJAX из веб-консоли импорта, один раз в строке!: Вот почему новый объект адаптера создается в Mage_Adminhtml_System_Convert_ProfileController-› batchRunAction(): $adapter = Mage::getModel($batchModel->getAdapter()); ... $adapter->saveRow($importData);. Экстренная точка заключается в том, что он ищет ожидание коллекции строк, последний код находится в цикле for: foreach ($rowIds as $importId) {... Решения: а) другой стандартный способ magento б) как обработать все строки в одном вызове AJAX - person Katapofatico; 05.06.2012