【发布时间】:2012-11-15 07:47:51
【问题描述】:
我正在尝试编写一个将 Magento 购物车加载到 Drupal 块内的块。
以下代码(位于 /test.php)正确加载购物车及其内容(Magento 安装位于 /magento):
<?php
/*
* Initialize magento.
*/
require_once('magento/app/Mage.php');
umask(0);
Mage::app('default');
Mage::getSingleton('core/session', array('name'=>'frontend'));
Mage::getSingleton('customer/session');
/*
* Add specific layout handles to our layout and then load them.
*/
$layout = Mage::app()->getLayout();
$layout->getUpdate()
->addHandle('default')
->load();
/*
* Generate blocks, but XML from previously loaded layout handles must be
* loaded first.
*/
$layout->generateXml()
->generateBlocks();
/*
* Now we can simply get any block in the usual way.
*/
$cart = $layout->getBlock('cart_sidebar')->toHtml();
echo $cart;
?>
(我正在使用 FirePHP 来调试会话值——这就是 fb(); 调用的目的。)
如果我在 Drupal 中使用完全相同的代码(通过 hook_menu 回调),我会收到以下错误:
致命错误:Mage_Core_Model_Session_Abstract::getMessages(): 脚本试图执行一个方法或访问一个不完整的属性 目的。请确保类定义 你是对象的“Mage_Core_Model_Message_Collection” 尝试操作被加载之前 unserialize() 被调用或 提供一个 __autoload() 函数来加载类定义 /home/aendrew/workspace/drupgento/magento/app/code/core/Mage/Core/Model/Session/Abstract.php 在第 215 行
我的猜测是 Drupal 正在执行某种与 Magento 相冲突的会话处理——如果我在脚本开头取消设置 $_SESSION,它会显示一个空购物车(不管里面是否真的有物品) .我也尝试将现有会话放在一个临时变量中,然后在最后执行 array_merge(),但这也不起作用。
知道我该怎么做吗?谢谢!
【问题讨论】:
-
@Zyava 我已经经历过了。方法
cart.info需要整数quoteId,即现有购物车的ID。如果我有quoteId,我可以避免这一切,但我不知道如何为当前用户获取它(尤其是在 Magento 会话之外)——这确实是我在第 2 点中所要求的. -
值得补充的是,我在
admin->system->configuration->web.中将我的 cookie 路径设置为“/” -
您是否尝试过使用 ajax 加载 magento 部分?这样两个框架就不会针对同一个请求运行。
-
@regilero -- 这是我的后备想法,但它的优化不如简单地通过 PHP 加载 Magento 应用程序(这实际上会使 Apache 的负载增加一倍) -- 加上它要求用户启用 JavaScript。以下 Sylvain 的解决方案效果很好,我将在今天晚些时候发布我如何为 Drupal 修改他的 JFusion 插件类。
标签: api magento session drupal