使用@sickelap 的代码作为基础并使用@Ranjith 对所需文件进行注释,我刚刚为 Magento 创建了一个扩展,允许您通过 Magento 的 cron 运行 Magmi。希望这可以帮助
在这里免费下载-> https://github.com/cameraki/Magento-Magmi-Via-Cron-Extension/
正如评论所提到的,我在这里发布代码是有道理的,以防链接脱机,所以就在这里。ps,因为我在 github 上做了一个带有扩展的自述文件,所以我在底部添加了这些信息来帮助你开始。再次感谢@sickelap 和@Ranjith,因为这是建立在他们的回答之上
应用程序/代码/本地/Oli/Magmi/Cron.php
<?php
/**
* Created by PhpStorm.
* User: Oli
* Date: 02/11/2017
* Time: 17:05
*/
/* Change importer to the name of your Magmi directory */
require_once(Mage::getBaseDir() . "/importer/plugins/inc/magmi_datasource.php");
require_once(Mage::getBaseDir() . "/importer/integration/inc/productimport_datapump.php");
class Oli_Magmi_Cron {
const LOG_DIRECTORY = "oli-extensions.log";
public function runMagmi()
{
try {
$directory = Mage::getBaseDir('var') . '/import/';
$magmiCsvFile = $directory . 'magmiUploadReady.csv';
if(!file_exists($magmiCsvFile)) {
throw new Exception('CSV file for Magmi to upload cant be found.');
}
} catch (Exception $e) {
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === Could not load todays magmiupload file. It must not have run today. This script will now stop: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
die();
}
$productArray = $this->csvToArray($magmiCsvFile);
$indexes = 'catalog_product_attribute,catalog_product_price,cataloginventory_stock';
$mode = 'update';
$profile = 'cronUpdatePrices';
try {
$this->import($productArray, $mode, $profile);
} catch (Exception $e) {
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === There was an issue importing the products: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
}
try {
$this->reindex($indexes);
} catch (Exception $e) {
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === There is a problem with the reindex function: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
}
/* log that it actually ran */
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === Has finished running";
Mage::log($message, null, self::LOG_DIRECTORY);
}
public function csvToArray($filename)
{
$productArray = array_map('str_getcsv', file($filename));
array_shift($productArray);
$newProductArray = array();
/* Customise the item array index's to match the file you are importing */
foreach ($productArray as $key => $item) {
$newProductArray[$key]['sku'] = $item[0];
$newProductArray[$key]['buy_price'] = $item[1];
$newProductArray[$key]['price'] = $item[2];
$newProductArray[$key]['store'] = $item[3];
$newProductArray[$key]['price_updated'] = $item[4];
$newProductArray[$key]['amazon_euros'] = $item[5];
$newProductArray[$key]['amazon_dollars'] = $item[6];
$newProductArray[$key]['qty'] = $item[7];
$newProductArray[$key]['is_in_stock'] = $item[8];
}
return $newProductArray;
}
private function import($items, $mode, $profile)
{
if (count($items) > 0) {
try{
$dp = new Magmi_ProductImport_DataPump();
$dp->beginImportSession($profile, $mode);
foreach ($items as $item) {
$dp->ingest($item);
}
$dp->endImportSession();
} catch (Exception $e) {
$message = date('F jS (l) Y h:i:s A') . " === MAGMI (" . __METHOD__ . ") === Seems to be an issue with the import function: ".$e->getMessage();
Mage::log($message, null, self::LOG_DIRECTORY);
}
}
}
private function reindex($string)
{
/** @var $indexer Mage_Index_Model_Indexer */
$indexer = Mage::getModel('index/indexer');
$processes = array();
if ($string == 'all') {
$processes = $indexer->getProcessesCollection();
} else {
$codes = explode(',', $string);
foreach ($codes as $code) {
$process = $indexer->getProcessByCode(trim($code));
if ($process) {
$processes[] = $process;
}
}
}
/** @var $process Mage_Index_Model_Process */
foreach ($processes as $process) {
$process->reindexEverything();
}
}
}
应用程序/代码/本地/Oli/Magmi/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Oli_Magmi>
<version>0.0.1</version>
</Oli_Magmi>
</modules>
<global>
<models>
<oli_magmi>
<class>Oli_Magmi</class>
</oli_magmi>
</models>
</global>
<crontab>
<jobs>
<update_prices_via_magmi>
<schedule>
<cron_expr>30 3 * * 2</cron_expr>
</schedule>
<run>
<model>oli_magmi/cron::runMagmi</model>
</run>
</update_prices_via_magmi>
</jobs>
</crontab>
</config>
应用程序/etc/modules/Oli_Magmi.xml
<?xml version="1.0"?>
<config>
<modules>
<Oli_Magmi>
<active>true</active>
<codePool>local</codePool>
</Oli_Magmi>
</modules>
</config>
Magento Magmi 通过 Cron 扩展
Magento 扩展通过 Magento 的 cron 从 CSV 文件运行 Magmi
注意:这仅适用于 Magmi(Magento Mass Importer)
这是做什么的?
Magmi 允许您快速批量更改产品。它的速度很快,因为它直接导入数据库。因此请谨慎使用 Magmi,并在导入之前备份您的数据库。
这个扩展允许你使用 Magento 的 cron 自动运行 Magmi。非常适合每天自动更新产品定价,或每周一次批量更改库存水平。
我可以开箱使用吗?
您需要确保您的服务器上有 Magmi。然后:
- 在 app/code/local/Oli/Magmi/Cron.php 的第 10 和 11 行,将“/importer/....”更改为 Magmi 安装的位置。例如,“/magmi/....”
- 在 app/code/local/Oli/Magmi/Cron.php 的第 23 行,将 $magmiCsvFil 更改为您要从中导入的 CVS 文件的地址。更改此设置后,更改第 66 行周围的行以将 CSV 文件中的列映射到数组中。$newProductArray[$key]['...'] 的键应该与您正在更改的属性相匹配。例如,如果您想更新库存水平,您将使用 $newProductArray[$key]['qty'] 因为 'qty' 是 Magento 的库存水平。
定制
- 在 app/code/local/Oli/Magmi/Cron.php 的第 36 行,它设置了您要重新索引的 Magento 设置。我添加的是: catalog_product_attribute catalog_product_price cataloginventory_stock 您可能想要添加更多或更改这些。
- 在 app/code/local/Oli/Magmi/Cron.php 的第 37 行,这是 Magmi 模式。“create”创建和更新项目,“update”仅更新,“xcreate”仅创建。
- 在 app/code/local/Oli/Magmi/Cron.php 的第 38 行,将其更改为与您在 Magmi 中创建的配置文件的名称相匹配。如果您想使用默认配置文件,您可以使用“默认”,但是这值得一看,因为您要确保关闭动态索引,因为这个扩展重新索引最后是您的 magento 存储。如果您使用具有动态索引的配置文件,它将在每个产品之后重新索引,无缘无故地占用大量服务器负载。
更多信息
您可以在此处找到有关 Magmi DataDump API 的更多信息 -> http://wiki.magmi.org/index.php/Magmi_Datapump_API