【问题标题】:Magento installer setup agnostic insertMagento 安装程序设置不可知插入
【发布时间】:2012-11-01 07:25:07
【问题描述】:

我完成了关于 Magento 设置资源的 this 教程。

在某些时候我看到它支持更多的数据库后端,但在提到的教程中只描述了您可以创建表的方式。

我需要一些关于插入不可知脚本)数据到以前创建的表中的方法的资源/示例。

【问题讨论】:

    标签: magento installation database-agnostic


    【解决方案1】:

    就像 Magento(和开源)的所有东西一样,最好的办法是看看其他开发人员,特别是 Magento 核心开发人员是如何做同样的事情的。举几个例子

    #File: app/code/core/Mage/Tax/sql/tax_setup/mysql4-upgrade-0.7.2-0.7.3.php
    $installer = $this;
    /* @var $installer Mage_Core_Model_Resource_Setup */
    
    $installer->startSetup();
    
    if (!$installer->getConnection()->fetchOne("select * from {$this->getTable('tax_class')} where `class_name`='Shipping' and `class_type`='PRODUCT'")) {
        $installer->run("
            insert  into {$this->getTable('tax_class')} (`class_name`,`class_type`) values ('Shipping','PRODUCT');
        ");
    }
    
    $installer->endSetup();
    

    ...

    #File: app/code/core/Mage/Sales/sql/sales_setup/mysql4-upgrade-0.8.29-0.9.0.php
    $installer->getConnection()->insert($installer->getTable('sales_flat_quote'), $quoteData);
    

    您基本上是针对数据库运行原始 SQL,因此您(即开发人员的责任)将使其保持足够通用以在各种 SQL(MySQL、SQL Server、Oracle 等)环境中运行.

    我不建议在设置资源中使用标准 Magento 模型。 Magento 运行这些迁移脚本的上下文与模型通常运行的上下文不匹配。您可能能够摆脱它,但是如果模型对完全自举的 Magento 系统。

    您可以通过一些搜索自己找到更多示例。如果你精通命令行,试试这个

    $ cd app/code/core/Mage
    $ find . -type f -wholename '*/sql/*'  | xargs grep -i -r insert 
    $ find . -type f -wholename '*/sql/*'  | xargs ack -i insert       #if you use ack
    

    【讨论】:

    • 不确定它是否与 db 无关插入。
    【解决方案2】:

    您应该使用相应的模型来插入数据。来自app/code/core/Mage/Dataflow/data/dataflow_setup/data-install-1.6.0.0.php的示例:

    $dataflowData = array(
        array(
            'name'         => 'Export All Products',
            'actions_xml'  => '<action type="catalog/convert_adapter_product" method="load">\r\n    <var name="store"><![CDATA[0]]></var>\r\n</action>\r\n\r\n<action type="catalog/convert_parser_product" method="unparse">\r\n    <var name="store"><![CDATA[0]]></var>\r\n</action>\r\n\r\n<action type="dataflow/convert_mapper_column" method="map">\r\n</action>\r\n\r\n<action type="dataflow/convert_parser_csv" method="unparse">\r\n    <var name="delimiter"><![CDATA[,]]></var>\r\n    <var name="enclose"><![CDATA["]]></var>\r\n    <var name="fieldnames">true</var>\r\n</action>\r\n\r\n<action type="dataflow/convert_adapter_io" method="save">\r\n    <var name="type">file</var>\r\n    <var name="path">var/export</var>\r\n    <var name="filename"><![CDATA[export_all_products.csv]]></var>\r\n</action>\r\n\r\n',
            'gui_data'     => 'a:5:{s:4:"file";a:7:{s:4:"type";s:4:"file";s:8:"filename";s:23:"export_all_products.csv";s:4:"path";s:10:"var/export";s:4:"host";s:0:"";s:4:"user";s:0:"";s:8:"password";s:0:"";s:7:"passive";s:0:"";}s:5:"parse";a:5:{s:4:"type";s:3:"csv";s:12:"single_sheet";s:0:"";s:9:"delimiter";s:1:",";s:7:"enclose";s:1:""";s:10:"fieldnames";s:4:"true";}s:3:"map";a:3:{s:14:"only_specified";s:0:"";s:7:"product";a:2:{s:2:"db";a:0:{}s:4:"file";a:0:{}}s:8:"customer";a:2:{s:2:"db";a:0:{}s:4:"file";a:0:{}}}s:7:"product";a:1:{s:6:"filter";a:8:{s:4:"name";s:0:"";s:3:"sku";s:0:"";s:4:"type";s:1:"0";s:13:"attribute_set";s:0:"";s:5:"price";a:2:{s:4:"from";s:0:"";s:2:"to";s:0:"";}s:3:"qty";a:2:{s:4:"from";s:0:"";s:2:"to";s:0:"";}s:10:"visibility";s:1:"0";s:6:"status";s:1:"0";}}s:8:"customer";a:1:{s:6:"filter";a:10:{s:9:"firstname";s:0:"";s:8:"lastname";s:0:"";s:5:"email";s:0:"";s:5:"group";s:1:"0";s:10:"adressType";s:15:"default_billing";s:9:"telephone";s:0:"";s:8:"postcode";s:0:"";s:7:"country";s:0:"";s:6:"region";s:0:"";s:10:"created_at";a:2:{s:4:"from";s:0:"";s:2:"to";s:0:"";}}}}',
            'direction'    => 'export',
            'entity_type'  => 'product',
            'store_id'     => 0,
            'data_transfer'=> 'file'
        ),
        // ... 
    );
    
    foreach ($dataflowData as $bind) {
        Mage::getModel('dataflow/profile')->setData($bind)->save();
    }
    

    【讨论】:

    • 最初的问题是专门询问设置资源/迁移系统,而不是插入产品/目录数据。
    • 问题不清楚,这个答案很好,因为它强调了模型应该用于插入数据的事实(这在升级脚本中完全可以。)顺便说一句,如果迈克尔真的想粗略地插入数据,他的教程给了他解决方案:$installer->run("SQL");
    • 我需要在一些自定义表中插入数据(特定模块需要),但我想使用那种类型的不可知脚本,以确保与可能在某些情况下使用的任何数据库管理系统兼容特定的 magento 商店。
    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 2010-10-06
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多