Magento2:将自定义模板添加到下面的产品详细信息页面中的添加到购物车部分


10

我正在尝试将自定义模板添加到社交共享部分下的产品页面。在我的模块中,我遵循布局文件default.xml中的代码

 <body>
 <referenceContainer name="product.info.social">
  <block class="Magento\Framework\View\Element\Template" name="product.info.custom" template="Lapisbard_Product::social.phtml" after="product.info.addtocart">
  </block>
 </referenceContainer>
</body>

social.phtml内容

<p>Hey there !</p>
<?php //$_product = $block->getProduct();

它工作正常,并在产品页面上显示模板内容。当我使用块类Magento\Catalog\Block\Product\View而不是Magento\Framework\View\Element\Template使用时$block->getProduct();,可以使用来在模板中获取产品对象。

1.我在这里犯什么错误?
2.修改产品页面的最佳方法是什么?
3.是否有一个参考布局文件,可以用来向产品页面的任何部分添加新模板,以在模块中编写布局代码?


@amiteshree可能是您的phtml文件,其中包含在Magento \ Catalog \ Block \ Product \ View块文件中定义的函数
Shaheer Ali

@ShaheerAli:在我的phtml文件中,$_product = $block->getProduct();当我使用Magento\Catalog\Block\Product\View块时,我试图使用产品对象 。
amitshree

然后,为什么要将Magento \ Framework \ View \ Element \ Template块分配给模板。
Shaheer Ali

1
@amiteshree如果要使用产品视图功能,则需要将Magento \ Catalog \ Block \ Product \ View分配给模板phtml。您将自定义模板添加到产品页面的方法是正确的
Shaheer Ali

1
空白页通常意味着发生了一些错误。您是否查看了error.log?magento例外日志?您使用什么模式?
安东·克里尔

Answers:


24

出现“白页”错误是因为Magento\Framework\View\Element\Template没有getProduct()方法。

因此,我认为最“干净”的方法是使用自定义块,布局和模板创建一个自定义模块(不用担心,这只需几分钟,您已经完成了一些工作)

模块文件:

在此处输入图片说明

(我会跳过/etc/module.xmlregistration.php因为琐碎,但是您可以在此处找到完整的示例。)

让我们从阻止php文件开始:

Test \ Catalog \ Block \ Product \ View \ Extra.php

<?php

namespace Test\Catalog\Block\Product\View;

use Magento\Catalog\Block\Product\AbstractProduct;

class Extra extends AbstractProduct
{

}

如您所见,它只是扩展(IMO)最轻量级的Product Abstract Block的具体类。您也可以扩展,Magento\Framework\View\Element\Template但在这种情况下,您将需要实现该getProduct()方法并在构造函数中更改上下文,以获取对注册表的访问权限。

因此,让我们转到布局文件:

测试/目录/视图/前端/布局/catalog_product_view.xml

<?xml version="1.0"?>
<body>
    <referenceContainer name="product.info.social">
        <block class="Test\Catalog\Block\Product\View\Extra"
            name="product.view.extra"
            template="Test_Catalog::product/view/extra.phtml"
            after="-">
        </block>
    </referenceContainer>
</body>

最后是模板文件:

测试/目录/视图/前端/模板/产品/视图/extra.phtml

<?php /* @var $block \Test\Catalog\Block\Product\View\Extra */?>
<?php $_product = $block->getProduct() ?>
<h3><?php echo 'My Product Name Is: ' . $_product->getName(); ?></h3>

如您所见,它比M1更加简单明了

请记住,所有自定义逻辑都应在Extra.phpblock类中实现,以保持视图整洁。

即:

Extra.php类中:

public function getSomething()
{
    return 'something'
}

extra.phtml视图中:

<?php echo $block->getSomething() ?>

2
因此,当我在产品页面上时,模块的catalog_product_view.xml布局会自动加载吗?
阿米什里

2
绝对!它与M1非常相似,但是现在每个句柄都在单独的文件中。
MauroNigrele '16

5

公认答案的补充

可接受的答案是好的,但现在AbstractProduct弃用

/**
 * Class AbstractProduct
 * @api
 * @deprecated 101.1.0
 * @SuppressWarnings(PHPMD.NumberOfChildren)
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 * @since 100.0.2
 */
class AbstractProduct extends \Magento\Framework\View\Element\Template

因此,我们必须使用Magento\Framework\Registry来实现Block,Block示例如下:

<?php
namespace Vendor\Module\Block;

use Magento\Framework\View\Element\Template;
use Magento\Framework\Registry;

class ProductView extends Template
{
    /**
     * @var Registry
     */
    protected $registry;

    /**
     * @var \Magento\Catalog\Model\Product
     */
    protected $product;

    /**
     * ProductView constructor.
     * @param Template\Context $context
     * @param array $data
     * @param Registry $registry
     */
    public function __construct(
        Template\Context $context,
        array $data = [],
        Registry $registry
    )
    {
        $this->registry = $registry;
        parent::__construct($context, $data);
    }

    /**
     * @return \Magento\Catalog\Model\Product
     */
    public function getProduct()
    {
        if (is_null($this->product)) {
            $this->product = $this->registry->registry('product');
        }

        return $this->product;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.