Как вызвать файл PHTML на странице CMS Magento 2?

16

Magento 2

Я установил образец модуля Bannerslider, загруженного из Magestore.

Когда я захожу bannerslider.phtmlна домашнюю страницу CMS, на домашней странице отображается ненадежная ошибка.

{{block class="Magento\Bannerslider\Block\Slideshow" template="bannerslider.phtml"}}

Сообщение об ошибке We're sorry, an error has occurred while generating this email.

Я также изменил класс блока, но он все еще показывает ту же ошибку. Можете ли вы предложить мне правильный путь?

Если вам нужно больше подробностей кода, пожалуйста, упомянул меня в комментарии. Я действительно застрял здесь.

После uncoment SetEnv MAGE_MODE developerв .htaccessфайле сообщение об ошибке меняется и отображается

Error filtering template: Invalid block type: Magento\Bannerslider\Block\Slideshow

Кстати, административная часть этого модуля работает нормально.

Блок-класс

namespace Magento\Bannerslider\Block;
use Magento\Framework\View\Element\Template;
use Magento\Framework\View\Element\Template\Context;
use Magento\Framework\Filesystem;
use Magento\Framework\App\Filesystem\DirectoryList;
class Slideshow extends Template
{
    public function __construct(
        Context $context,
        \Magento\Bannerslider\Model\BannerFactory $bannerFactory,
        \Magento\Framework\Filesystem $fileSystem,
        \Magento\Framework\StoreManagerInterface $storeManager,
        array $data = array()
    ) {
        $this->_fileSystem = $fileSystem;
        $this->_bannerFactory = $bannerFactory;
        $this->_storeManager = $storeManager;
        parent::__construct($context, $data);
    }
    public function _prepareLayout()
    {
        return parent::_prepareLayout();
    }
    public function getBaseJs($fileName){

        return $this->_storeManager->getStore()->getBaseUrl(
                \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
            ).'bannerslider/js/'.$fileName;
    }
    public function getBannerData(){
        $banners = $this->_bannerFactory->create()
                        ->getCollection()
                        ->addFieldToFilter('status',1);
        foreach ($banners as $banner){
                $result['banners'][] = $banner->getData();
        }
        return $result;
    }
    public function getBannerImage($imageName) {

        $mediaDirectory = $this->_storeManager->getStore()->getBaseUrl(
                \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
            );
        return $mediaDirectory.'bannerslider/images'.$imageName;
    }
}

Module.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="Magento_Bannerslider" setup_version="1.0.0"/>
</config>
Прафул Раджпут
источник
3
Вам необходимо откомментировать разработчик SetEnv MAGE_MODE из файла .htaccess, чтобы вывести ошибку.
Тарал Патолия
Спасибо Тарал. Я сделал это. Теперь сообщение об ошибке было изменено. Я редактировал свой вопрос сейчас.
Praful Раджпут
Пожалуйста, покажите мне свой класс блока и код module.xml.
Амит Бера
Я добавил в класс блочный класс и код module.xml.
Praful Раджпут
@TaralPatoliya Спасибо за ваше предложение ... Это действительно помогло мне!
ДРАДЖИ

Ответы:

35

Попробуйте код ниже на странице cms, если вы хотите вызвать phtml с помощью страницы cms.

{{block class="Magento\Bannerslider\Block\Slideshow" template="Magento_Bannerslider::bannerslider.phtml"}} 
Кейур Шах
источник
21

В magento, если вы хотите добавить класс блока на странице cms, вы можете использовать код ниже

{{block class="Magento\Bannerslider\Block\Slideshow" template="Magento_Bannerslider::bannerslider.phtml"}} 

Формула это:

{{block class="[BlockClassFullName]" template="[VendorName]_[ModuleName]::[YourTemplateFileLocation].phtml"}} 

Блок по умолчанию:

{{block class="Magento\Framework\View\Element\Template" template="[VendorName]_[ModuleName]::[YourTemplateFileLocation].phtml"}} 

Это равно коду версии Magento 1.X

{{ block type="core/template" template="YourtemplateFileLocation.phtml"}}
Амит Бера
источник
Привет @Amit, мы можем использовать cacheable = "false" здесь? при использовании в cms
Джафар Пинджар
Можно использовать, но это делает тебя не кэшируемым
Амит Бера
Да, мне нужен тот, какой синтаксис в использовании cms, я использовал его, но это не сработало
Джафар Пинджар