【问题标题】:Methods to automate magmi自动化 magmi 的方法
【发布时间】:2013-05-04 14:55:19
【问题描述】:

谁能告诉我如何自动化 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

【问题讨论】:

    标签: magento magento-1.7 magmi


    【解决方案1】:

    如果您可以使用系统 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!

    你有这个想法,对吧?

    就是这样。

    【讨论】:

    • 但是我每次执行导入时都必须专门构建这个数组吗?我为我的客户创建了这个。他没有编程的想法。
    • 是的,但是在创建 CSV 文件时无论如何你都会这样做。相反,您应该将 CSV 构建逻辑转换为创建 $items 数组。就我而言,我正在从外部 WebService 获取数据。
    • 我们已按照上述说明进行了设置,但在下方收到此消息,并带有 cron 错误,抱歉。关于如何调试/纠正的任何想法?执行 magmi_update 时出现 Cron 错误:异常 'Mage_Core_Exception' 并在 /home/sites/galaxystores.co.uk/public_html/app/Mage.php:595中显示消息“无效回调:company_magmi/cron::magmi_update 不存在” >
    【解决方案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);
    

    【讨论】:

    • 我也做了同样的事情,只是更改了配置文件名称、模式和文件名,但不起作用。你能告诉我剩下的我应该改变什么吗?
    【解决方案3】:

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

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

    这些文件对我有用。

    【讨论】:

    • 一旦您有更多的声誉,这可能会作为评论添加到上面的帖子或答案中。在那之前,欢迎来到 Stackoverflow....
    【解决方案4】:

    使用@sickelap 的代码作为基础并使用@Ranjith 对所需文件进行注释,我刚刚为 Magento 创建了一个扩展,允许您通过 Magento 的 cron 运行 Magmi。希望这会有所帮助

    在这里免费下载 -> https://github.com/cameraki/Magento-Magmi-Via-Cron-Extension/

    正如 cmets 所提到的,我在此处发布代码是有道理的,以防链接脱机,所以在这里。 ps,由于我在 github 上制作了带有扩展名的自述文件,因此我在底部添加了此信息以帮助您入门。再次感谢@sickelap 和@Ranjith,因为这是建立在他们的回答之上的

    app/code/local/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();
            }
        }
    }
    

    app/code/local/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>
    

    app/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 设置。我添加的是: 目录产品属性目录产品价格 cataloginventory_stock 您可能想要添加更多或更改这些。
    • 在 app/code/local/Oli/Magmi/Cron.php 的第 37 行,这是 Magmi 模式。 "create" 创建和更新项目,"update" 仅更新,"xcreate" 仅创建。
    • 在 app/code/local/Oli/Magmi/Cron.php 的第 38 行将其更改为匹配 您在 Magmi 中创建的配置文件的名称。您可以使用 'default' 如果你想使用默认配置文件但是这是 值得一看,因为您想确保 On the Fly 索引是 关闭,因为此扩展重新索引您的 magento 商店 结束。如果您使用具有 On the Fly 索引的配置文件,它将 每个产品后重新索引,占用大量服务器负载 原因。

    更多信息 您可以在此处找到有关 Magmi DataDump API 的更多信息 -> http://wiki.magmi.org/index.php/Magmi_Datapump_API

    【讨论】:

    • 请不要只发布一些工具或库作为答案。至少在答案本身中展示how it solves the problem
    • 我已更新答案以提供代码。希望这足以消除反对票?
    猜你喜欢
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 2016-04-15
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多