magento 数据流:如何在处理任何行之前调用一次操作
Posted
技术标签:
【中文标题】magento 数据流:如何在处理任何行之前调用一次操作【英文标题】:magento dataflow: how to call action once before processing any row 【发布时间】:2012-06-09 08:11:39 【问题描述】:上下文: Magento 1.7.0.0 版本。我必须使用 magento 数据流高级配置文件导入 csv 数据。 我制作了一个实现 Mage_Dataflow_Model_Convert_Adapter_Abstract 的适配器。我已经实现了 saveRow() 方法来处理每一行,好的。
下一步:我想在处理任何行之前运行一些代码:类似于 save() 或 beforeSave() 方法... 我该怎么做 ?
我想我必须从 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>
欢迎提出建议,谢谢! :)
【问题讨论】:
【参考方案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 **/
【讨论】:
非常感谢@OSdave,我已经对其进行了测试,但它不起作用 :( :导入处理是通过来自导入 Web 控制台的 AJAX 调用执行的,每行一次!:这就是为什么一个新的适配器对象是在 Mage_Adminhtml_System_Convert_ProfileController->batchRunAction() 上创建的:$adapter = Mage::getModel($batchModel->getAdapter()); ... $adapter->saveRow($importData);
。额外的一点是它看起来等待集合 o 行,最后一个代码在 for 循环中:foreach ($rowIds as $importId) ...
解决方案: a) 另一种标准的 magento 方式 b) 如何在单个 AJAX 调用中处理所有行以上是关于magento 数据流:如何在处理任何行之前调用一次操作的主要内容,如果未能解决你的问题,请参考以下文章
如何以原子方式运行 2 个 SQL“SELECT”?或者在我处理它们之前获取行数的任何其他更好的方法