0

谁能告诉我如何自动化 magmi 以每天在预定时间执行导入。

我听说它可以通过 cli 完成,但不知道如何使用 cli。

请给我一个关于如何 cli 以及用于自动导入的命令的逐步过程。

我看到 magmi wiki 网站对如何使用 cli 不太了解。

请给我一个关于如何使 magmi 自动化的适当解决方案。

我什至尝试使用下面的链接,但它现在正在工作

wget "http://user:password@example.com/magmi/web/magmi_run.php?mode=create&profile=default&engine=magmi_productimportengine:Magmi_ProductImportEngine&CSV:filename=/magmitest.csv" -O /dev/null
4

4 回答 4

4

如果您可以使用系统 cron(针对您的问题的 cli 版本),那么这是我在我的一个项目(简化版本)中使用的完整解决方案。

我将使用Company作为供应商名称,模块名称将是Magmi

第一步是照常安装magmi。而且我认为您已经安装了它。

接下来,使用以下内容创建 app/etc/modules/Company_Magmi.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Company_Magmi>
            <active>true</active>
            <codePool>local</codePool>
            <version>0.0.1</version>
        </Company_Magmi>
    </modules>
</config>

然后使用以下内容创建 app/code/local/Company/Magmi/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Company_Magmi>
            <version>0.0.1</version>
        </Company_Magmi>
    </modules>
    <global>
        <models>
            <company_magmi>
                <class>Company_Magmi</class>
            </company_magmi>
        </models>
    </global>
    <crontab>
        <jobs>
            <magmi_update>
                <schedule>
                    <cron_expr>*/5 * * * *</cron_expr>
                </schedule>
                <run>
                    <model>company_magmi/cron::magmiUpdate</model>
                </run>
            </magmi_update>
        </jobs>
    </crontab>
</config>

使用以下内容创建 app/code/local/Company/Magmi/Cron.php 文件

<?php

require_once(dirname(__FILE__) . "/../../../../../magmi/plugins/inc/magmi_datasource.php");
require_once(dirname(__FILE__) . "/../../../../../magmi/integration/productimport_datapump.php");

class Company_Magmi_Cron {

    public function magmiUpdate()
    {
        $items = array(); // build your own list of items to create/update

        $this->import($items);
    }

    private function import($items, $mode = 'create', $indexes = 'all')
    {
        if (count($items) > 0) {
            $dp = new Magmi_ProductImport_DataPump();
            $dp->beginImportSession("PROFILE_NAME", $mode);
            foreach ($items as $item) {
                $dp->ingest($item);
            }
            $dp->endImportSession();
            $this->reindex($indexes);
        }
    }

    private function reindex($string = 'all')
    {
        /** @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();
        }
    }
}

最后将 PROFILE_NAME 更改为您在 magmi 中的个人资料名称。

有了所有这些,您将不得不构建要创建/更新的项目列表。这真的很简单。这是一个例子:

假设您想更新产品的库存。您将像这样创建 CSV 文件:

sku,qty
"SOMESKU","10"
"SNOTHERSKU","2"

只需像这样构建 $items :

$items[] = array(
    "sku" => "SOMESKU",
    "qty" => "10"
);
$items[] = array(
    "sku" => "ANOTHERSKU",
    "qty" => "2"
);

并且不要忘记为 Magento 设置 cron!

你有这个想法,对吧?

就是这样。

于 2013-05-05T17:48:29.850 回答
2

我们也可以通过 curl 命令实现自动化,这很容易

$url="http://learning.iksuladev.com/satyendra/magmi/web/magmi_run.php?mode=create&profile=satyendra&engine=magmi_productimportengine:Magmi_ProductImportEngine&CSV:filename=../../var/import/sample.csv -O /dev/null";

$ch = curl_init($Url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
于 2013-06-06T13:42:28.217 回答
0

添加到上面的答案:如果上面的required文件不起作用,请使用下面的文件。

require_once(dirname(__FILE__) . "/../../../../../magmi/inc/magmi_defs.php");
require_once(dirname(__FILE__) . "/../../../../../magmi/integration/inc/productimport_datapump.php");

这些文件对我有用。

于 2015-07-23T11:14:19.743 回答
0

使用@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

于 2018-07-09T13:35:50.900 回答