Magento中为订单添加自定义列存储Google Cookie的实现咨询
嘿,针对你的问题,先明确数据表的选择:
- 如果你用的是Magento 1,目标数据表确实是
sales_flat_order - 如果你用的是Magento 2,对应的数据表是
sales_order(Magento 2已经废弃了flat表结构,订单表采用平表形式)
接下来分版本给你详细的实现步骤,都是符合Magento开发规范的做法:
Magento 1 实现步骤
1. 给sales_flat_order添加自定义列
推荐用Magento的安装脚本(避免直接修改数据库,便于部署和版本控制):
- 在你的自定义模块下创建
sql/[你的模块名]_setup/install-[版本号].php文件,代码如下:
<?php $installer = $this; $installer->startSetup(); $installer->getConnection() ->addColumn( $installer->getTable('sales/order'), 'google_cookie', array( 'type' => Varien_Db_Ddl_Table::TYPE_TEXT, 'length' => 255, 'nullable' => true, 'comment' => 'Google Cookie 存储值' ) ); $installer->endSetup();
- 启用模块后刷新缓存,Magento会自动执行这个脚本完成列的添加。
2. 将Google Cookie保存到订单
需要监听订单提交的事件,推荐用sales_order_save_before事件(订单保存前触发,确保数据能写入):
- 在模块的
config.xml里添加事件监听配置:
<global> <events> <sales_order_save_before> <observers> <[你的模块名]_save_google_cookie> <class>[你的模块名]/observer</class> <method>saveGoogleCookieToOrder</method> </[你的模块名]_save_google_cookie> </observers> </sales_order_save_before> </events> </global>
- 然后创建Observer类
Model/Observer.php:
<?php class [你的命名空间]_[你的模块名]_Model_Observer { public function saveGoogleCookieToOrder(Varien_Event_Observer $observer) { $order = $observer->getEvent()->getOrder(); // 这里假设Google Cookie名为'_ga',根据实际使用的Cookie名调整 $googleCookie = Mage::app()->getRequest()->getCookie('_ga'); if ($googleCookie) { $order->setGoogleCookie($googleCookie); } return $this; } }
Magento 2 实现步骤
1. 给sales_order添加自定义列
创建安装脚本Setup/InstallSchema.php:
<?php namespace [你的命名空间]\[你的模块名]\Setup; use Magento\Framework\Setup\InstallSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; use Magento\Framework\DB\Ddl\Table; class InstallSchema implements InstallSchemaInterface { public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); $tableName = $setup->getTable('sales_order'); $setup->getConnection()->addColumn( $tableName, 'google_cookie', [ 'type' => Table::TYPE_TEXT, 'length' => 255, 'nullable' => true, 'comment' => 'Google Cookie 存储值' ] ); $setup->endSetup(); } }
2. 将Google Cookie保存到订单
创建事件观察者:
- 在
etc/events.xml里添加事件配置:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="sales_order_save_before"> <observer name="[你的模块名]_save_google_cookie" instance="[你的命名空间]\[你的模块名]\Observer\SaveGoogleCookieToOrder" /> </event> </config>
- 创建Observer类
Observer/SaveGoogleCookieToOrder.php:
<?php namespace [你的命名空间]\[你的模块名]\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Stdlib\CookieManagerInterface; class SaveGoogleCookieToOrder implements ObserverInterface { protected $cookieManager; public function __construct(CookieManagerInterface $cookieManager) { $this->cookieManager = $cookieManager; } public function execute(Observer $observer) { $order = $observer->getEvent()->getOrder(); // 替换为你实际要存储的Google Cookie名称,比如'_gid' $googleCookie = $this->cookieManager->getCookie('_ga'); if ($googleCookie) { $order->setData('google_cookie', $googleCookie); } return $this; } }
注意事项
- 确认你要存储的Google Cookie名称正确(常见的有
_ga、_gid、_gat等),根据实际需求调整代码中的Cookie名 - 如果Cookie值较长,可以将列类型改为
TYPE_TEXT(不带长度,默认对应MySQL的TEXT类型)或者TYPE_LONGTEXT - 测试时要验证订单提交后,数据表中
google_cookie列是否正确存储了对应的值 - 尽量遵循Magento开发规范,使用安装脚本和事件观察者,避免直接修改核心代码或数据库
内容的提问来源于stack exchange,提问作者sebb
相关产品推荐
相关产品推荐

