【问题标题】:Programmatically remove block from layout以编程方式从布局中删除块
【发布时间】:2012-12-25 20:50:06
【问题描述】:

我想根据登录用户通过前端路由器控制器从产品视图页面中删除 product_options_wrapper 块。

我知道我可以以编程方式附加一个新块,但我没有找到删除函数。 :-(

试过了。像这样

$this->getLayout()->unsetBlock('product_options_wrapper');

$this->getLayout()->getBlock('product.info')->remove('product_options_wrapper');

但没有任何效果。

【问题讨论】:

    标签: magento magento-1.6


    【解决方案1】:

    要使用其父块删除块,请使用以下代码

    $this->getLayout()->getBlock('product.info')->unsetChild('product_options_wrapper');
    

    【讨论】:

    • 对我不起作用。 :-( 代码执行没有任何错误,但块仍然存在。
    • @AndreAusB 然后在你调用 unsetChild 之后,有些东西正在重新添加块。
    • 嘿艾伦,谢谢你的回答,也许这就是原因。也许我应该更详细地解释我正在尝试做什么。在可配置产品的产品详细信息页面上,我想删除属性的包装器,因为我想显示所有相关简单产品的表格以及库存商品的数量。这应该只发生在可以在管理界面中配置的特定客户组。要以编程方式编辑产品详细信息页面的布局,我已经覆盖了 Mage_Catalog_ProductController->_initProductLayout()。
    • 在 initProductLayout 我调用第一个 parent::_initProductLayout($product);
    • 之后我尝试删除我不需要的块。
    【解决方案2】:

    如果 OP 代码使用正确的块名称,即 product.info.options.wrapper,而不是块别名,它应该可以工作。

    $this->loadLayout();
    //e.g. 
    if (Mage::getSingleton('customer/session')->getCustomerGroupId() == [id]){
         $this->getLayout()->unsetBlock('product.info.options.wrapper');
    }
    $this->renderLayout();
    

    【讨论】:

      【解决方案3】:

      这应该可行:

          $blockName = 'left'; // Add yours
          $update = Mage::app()->getLayout()->getUpdate();
          $removeInstruction = "<remove name=\"$blockName\"/>";
          $update->addUpdate($removeInstruction);
      

      为什么?查看文件Mage_Core_Model_Layout 在方法generateXml() 中解析XML 并为块设置删除,属性忽略被添加到块中。在generateBlocks()方法中,所有具有该属性的块都不会被添加。

      【讨论】:

      • 看来这个 sn-p 不起作用。该页面留空,当调试执行停止在 $this->getLayout()->getBlock('product_options_wrapper')->addAttribute('ignore',true);没有任何提示。我认为 addAttribute 方法是未知的。
      • @AndreAusB 是的,对不起,块没有那个方法,函数中的块实际上是一个xml节点,所以我重构了代码以使其正确。我在产品视图页面的左侧块中对其进行了测试。
      • 对我不起作用。 :-( 代码执行没有任何错误,但块仍然存在。
      • 我永远不会告诉任何人不要使用适合他们的解决方案——但是创建 XML 更新字符串并在 PHP 中应用它们有点愚蠢。创建 XML 更新语言是为了提供一种无需 PHP 代码即可更新布局的方法。如果您使用 PHP,最好直接在布局对象中操作块。
      • @Alan Storm I. 完全同意。但是,您似乎无法仅使用 PHP 轻松删除块。如果你知道怎么做,请创建另一个答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2021-11-07
      • 2022-08-18
      相关资源
      最近更新 更多