【问题标题】:Magento and Drupal sessions conflicts -- how to resolve?Magento 和 Drupal 会话冲突——如何解决?
【发布时间】: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-&gt;system-&gt;configuration-&gt;web. 中将我的 cookie 路径设置为“/”
  • 您是否尝试过使用 ajax 加载 magento 部分?这样两个框架就不会针对同一个请求运行。
  • @regilero -- 这是我的后备想法,但它的优化不如简单地通过 PHP 加载 Magento 应用程序(这实际上会使 Apache 的负载增加一倍) -- 加上它要求用户启用 JavaScript。以下 Sylvain 的解决方案效果很好,我将在今天晚些时候发布我如何为 Drupal 修改他的 JFusion 插件类。

标签: api magento session drupal


【解决方案1】:

我在 Joomla 和 MAgento 之间进行了集成,但遇到了同样的问题。 我提供的解决方案可能不是最好的解决方案,但它是我发现的唯一一个在单个 PHP 脚本进程之间共享会话的解决方案。

我不得不“停止”Joomla 会话,使用 Magento 完成我的工作,然后在同一个脚本过程中重新开始 Joomla 中的会话。这是我为 Joomla 插件所做的示例,您可以从中获得灵感,因为我不了解 Drupal 框架,但在这里您会找到我为 Joomla 插件所做的代码:http://pastie.org/5505841#4

提供的代码中最有趣的部分是方法destroyTemporaryJoomlaSessionloadAndStartMagentoBootstraprestartJoomlaSessionstartMagentoSessionstopMagentoSession

然后我以这种方式在一些Joomla模块中使用这个插件:

$plgMageLib = new plgSystemMagelib ( );
$plgMageLib->destroyTemporaryJoomlaSession ();
if ($plgMageLib->loadAndStartMagentoBootstrap ()) :
    $plgMageLib->startMagentoSession ();

    /* Content of Magento logic, blocks or else */

    $html = '';
    $blockId = $params->get ( 'block_id', '' );
    echo JFusion_Helper_Mageselectblock::callblock ( $blockId );

    /* EOF */

    $plgMageLib->stopMagentoSession ();

endif;
$plgMageLib->restartJoomlaSession ();

希望对你有帮助!

【讨论】:

  • 太棒了。几分钟后我会看一下——今天正在处理这个问题。谢谢!
  • 急诊室。嘛。杰瑞德!我完全有它的工作!我已经为此苦苦挣扎了!我将对其进行更多测试并将其标记为答案 - 非常感谢!
  • 真的很高兴它可以工作,因为我一直在努力为 Jfusion 项目提供它。我不知道它是否适用于 Drupal。
  • JFusion 非常棒,几年前我在几个项目中使用过它——很高兴听到人们仍在用它做很酷的事情!
  • @aendrew:我遇到了同样的问题。你能告诉我如何实现它吗?
【解决方案2】:

Mage_Core_Model_Session_Abstract_Varien::start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2016-02-22
    • 2013-11-09
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多