2012-01-11 64 views
0

在客户将物品添加到购物车后,我正在寻找一种称为Modalbox的方法。Magento将物品添加到购物车后调用Modalbox的最佳方式

如何从PHP内部调用Modalbox?我想在CartController.php中的成功消息之后调用modalbox,但是,我不知道如何从PHP执行此操作,只能从与OnClick的HTML链接执行此操作。

+0

谷歌对于“Magento Ajax加入购物车”。当客户添加到购物车(不更改页面)时,您将能够返回javascript函数(创建模式框)的唯一方法是使用Ajax,并且Magento不提供通过通过购物车添加到购物车的本地支持阿贾克斯。 – 2012-01-11 03:00:05

回答

1

显然你不能这样做,因为PHP在服务器上运行,Modalbox在客户端的浏览器中运行在JavaScript中 - 可能位于世界的另一边,尽管我们想忘记物理障碍确实有效在软件上。我们能做的最好的事情是在合适的地方插入Javascript代码,以便浏览器最终执行它。

添加项目的第一个具体标志是checkout_cart_product_add_after事件。创建一个模块并修改它的​​3210文件;

<config> 
    <!-- ...usual blocks, helpers and models stuff here... --> 
    <frontend> 
     <!-- this is the safest way to catch items being added --> 
     <events> 
      <checkout_cart_product_add_after> 
       <observers> 
        <yourmodule_product_add> 
         <class>yourmodule/observer</class> 
         <method>onProductAdd</method> 
        </yourmodule_product_add> 
       </observers> 
      </checkout_cart_product_add_after> 
     </events> 
     <!-- will need to insert a block later --> 
     <layout> 
      <updates> 
       <yourmodule> 
        <file>yourmodule.xml</file> 
       </yourmodule> 
      </updates> 
     </layout> 
    </frontend> 
</config> 

声明它预计Your/Module/Model/Observer.php找到一个观察者;

class Your_Module_Model_Observer 
{ 
    public function onProductAdd() 
    { 
     // page might redirect immediately so make a flag for now 
     Mage::getSingleton('checkout/session')->setShowModalbox(true); 
    } 
} 

您应该能够看到接下来会发生什么。一个文件早先被宣布为app/design/frontend/base/default/layout/yourmodule.xml;

<layout> 
    <!-- hook this block for all pages because anything 
     might be shown after adding a product --> 
    <default> 
     <reference name="before_body_end"> 
      <block type="yourmodule/modalbox" name="yourmodule_modalbox" /> 
     </reference> 
    </default> 
    <default> 
</layout> 

最后一步是制作Your/Module/Block/Modalbox.php,它会在必要时插入相关的Javascript;

class Your_Module_Block_Modalbox extends Mage_Core_Block_Text_Tag_Js 
{ 
    protected function _toHtml() 
    { 
     if (!Mage::getSingleton('checkout/session')->getShowModalbox()) 
      return $this; 

     $url = 'URL to show in Modalbox'; 
     $this->setContents("Modalbox.show({$url}, {width: 600});"); 
     Mage::getSingleton('checkout/session')->unsShowModalBox(); 

     return parent::_toHtml(); 
    } 
} 

这是唯一的最佳实践方法,我能想到的,但我很迷恋有Mage_Core_Block_Text_Tag_Js只是发现了它。正如俗话所说,“当你拥有的只是一把锤子,所有的问题都会像钉子一样”。我可能会错过更简单,更明显的事情。

+0

我打算给clockworkgeek的解决方案一个尝试,但是,我相信我只是将CartController.php复制到本地代码文件夹中,并更改产品成功消息以在会话变量上设置一点。检查该位和产品页面上设置的另一个变量,看看它是否应该在页面模板的主体中回显onload以用于激活Modalbox ...脏但它确实有效! – TravelingAdMan 2012-01-13 17:32:27