Magento2 自定义小部件未出现
Magento2 Custom Widget Not Appearing
我创建了一个带有自定义小部件的模块。当登录到管理员,转到 content->widgets
,创建一个实例,并将该实例设置为显示在主页上时,小部件按预期显示。
我已删除此实例,现在正尝试通过转至 content->pages
、编辑 homepage -> content
部分并选择 insert widget
来创建小部件。我创建了一个新的小部件实例,并在 homepage -> content
部分添加了一些额外的 text
。
当我加载主页时,小部件没有出现,但 text
的其余部分确实出现了。
正在调用小部件的块(我用 var_dump
和 exit
对此进行了测试)。
但是模板没有被渲染。
这是我的街区:
<?php
namespace MyNamespace\Slider\Block\Widget;
use Magento\Framework\View\Element\Template;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Catalog\Block\Product\Context;
class Slider extends Template
{
protected $_template = "Yamazaki_Slider::widget/slider.phtml";
/**
* @var CollectionFactory
*/
protected $_productCollectionFactory;
/**
* @var CollectionFactory
*/
protected $_imageHelper;
/**
* @param Context $context
* @param CollectionFactory $productCollectionFactory
*/
public function __construct(Context $context, CollectionFactory $productCollectionFactory)
{
$this->_imageHelper = $context->getImageHelper();
$this->_productCollectionFactory = $productCollectionFactory;
parent::__construct($context);
}
/**
* Retrieve featured products collection
*/
public function getProducts()
{
$collection = $this->_productCollectionFactory->create();
return $collection->addAttributeToSelect('*')->addAttributeToFilter('is_featured','1');
}
}
和我的模板:
<?php $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\ListProduct'); ?>
<?php foreach($this->getProducts() as $product): ?>
<?php $productImage = $imageBlock->getImage($product, 'product_page_image_large'); ?>
<?php echo $productImage->toHtml(); ?>
<?php endforeach ?>
我模块中的其他文件是:
etc/widget.xml:
<?xml version="1.0" encoding="UTF-8"?>
<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget.xsd">
<widget id="yamazaki_slider" class="MyNamespace\Slider\Block\Widget\Slider">
<label translate="true">My Image Slider</label>
<description>My Image Slider</description>
</widget>
</widgets>
module.xml 和 registration.php.
我没有 etc/layout.xml
文件,因为我注意到一些 widget/modules 包含。我需要这个文件还是任何其他文件?
另外,如果我 "Hide the Editor" 在 content->pages->edit->content
里面,我会看到:
<p>{{widget type="MyNamespace\Slider\Block\Widget\Slider"}}</p>`
如果我将其替换为
{{block class="MyNamespace\Slider\Block\Widget\Slider" template="widget/slider.phtml"}}
内容按预期显示
我设法得到要渲染的块
我必须将 implements \Magento\Widget\Block\BlockInterface
添加到 MyNamespace\Slider\Block\Widget\Slider
。
我不确定为什么会在添加 implements
之前使用第一种方法而不是第二种方法进行渲染。
Magento 严重缺乏文档!
我创建了一个带有自定义小部件的模块。当登录到管理员,转到 content->widgets
,创建一个实例,并将该实例设置为显示在主页上时,小部件按预期显示。
我已删除此实例,现在正尝试通过转至 content->pages
、编辑 homepage -> content
部分并选择 insert widget
来创建小部件。我创建了一个新的小部件实例,并在 homepage -> content
部分添加了一些额外的 text
。
当我加载主页时,小部件没有出现,但 text
的其余部分确实出现了。
正在调用小部件的块(我用 var_dump
和 exit
对此进行了测试)。
但是模板没有被渲染。
这是我的街区:
<?php
namespace MyNamespace\Slider\Block\Widget;
use Magento\Framework\View\Element\Template;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Catalog\Block\Product\Context;
class Slider extends Template
{
protected $_template = "Yamazaki_Slider::widget/slider.phtml";
/**
* @var CollectionFactory
*/
protected $_productCollectionFactory;
/**
* @var CollectionFactory
*/
protected $_imageHelper;
/**
* @param Context $context
* @param CollectionFactory $productCollectionFactory
*/
public function __construct(Context $context, CollectionFactory $productCollectionFactory)
{
$this->_imageHelper = $context->getImageHelper();
$this->_productCollectionFactory = $productCollectionFactory;
parent::__construct($context);
}
/**
* Retrieve featured products collection
*/
public function getProducts()
{
$collection = $this->_productCollectionFactory->create();
return $collection->addAttributeToSelect('*')->addAttributeToFilter('is_featured','1');
}
}
和我的模板:
<?php $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\ListProduct'); ?>
<?php foreach($this->getProducts() as $product): ?>
<?php $productImage = $imageBlock->getImage($product, 'product_page_image_large'); ?>
<?php echo $productImage->toHtml(); ?>
<?php endforeach ?>
我模块中的其他文件是:
etc/widget.xml:
<?xml version="1.0" encoding="UTF-8"?>
<widgets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Widget:etc/widget.xsd">
<widget id="yamazaki_slider" class="MyNamespace\Slider\Block\Widget\Slider">
<label translate="true">My Image Slider</label>
<description>My Image Slider</description>
</widget>
</widgets>
module.xml 和 registration.php.
我没有 etc/layout.xml
文件,因为我注意到一些 widget/modules 包含。我需要这个文件还是任何其他文件?
另外,如果我 "Hide the Editor" 在 content->pages->edit->content
里面,我会看到:
<p>{{widget type="MyNamespace\Slider\Block\Widget\Slider"}}</p>`
如果我将其替换为
{{block class="MyNamespace\Slider\Block\Widget\Slider" template="widget/slider.phtml"}}
内容按预期显示
我设法得到要渲染的块
我必须将 implements \Magento\Widget\Block\BlockInterface
添加到 MyNamespace\Slider\Block\Widget\Slider
。
我不确定为什么会在添加 implements
之前使用第一种方法而不是第二种方法进行渲染。
Magento 严重缺乏文档!