Magento 2 – Error Filtering Template: Invalid Method

magento2

Im currently experiencing a problem. I have a Module, called Vendor_ModName. I am using Magento 2.1.0.

In Block/CustomProductCollection.php im calling

<?php 

namespace Vendor\ModName\Block;

class CustomProductCollection extends \Magento\Framework\View\Element\Template
{
    protected $_productCollectionFactory;
    protected $_categoryFactory;
    private $logger;

    public function __construct(
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Catalog\Model\CategoryFactory $categoryFactory,
    \Magento\Framework\View\Element\Template\Context $context,
    \Psr\Logger\LoggerInterface $logger
    ) {
        $this->_categoryFactory = $categoryFactory;
        $this->_productCollectionFactory = $productCollectionFactory;
        $this->logger = $logger;
        parent::__construct($context);
    }

    public function test(){
        try {
            return "HELLO WORLD";
        } catch (\Exception $e) {
            $this->logger->critical($e);
        }
    }

    public function getProductCollection()
    {
        $collection = $this->_productCollectionFactory->create();
        $collection->addAttributeToSelect('*');
        $collection->addAttributeToFilter('visibility', \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH);
        $collection->addAttributeToFilter('status',\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);

        return $collection;
    }
}

In the desired phtml in the view/frontend/template folder I'm using

<?php $test = $block->test(); ?>
<?php echo $test; ?>

<?php $collection = $block->getProductCollection(); ?>
<?php var_dump($collection); ?>

However, the output on the CMS block page is:

    Error filtering template: Invalid method Magento\Framework\View\Element\Template::test(Array ( ) )

The question now is, what am I doing wrong here? In my CMS Blog I'm using this to call the specific phtml-File:

<p>{{block class="Magento\Framework\View\Element\Template" template="Vendor_ModName::test-slider.phtml"}}</p>

In the exception.log I have this:

[2016-08-19 03:43:56] main.CRITICAL: Magento\Framework\Exception\LocalizedException: Invalid method Magento\Framework\View\Element\Template::test(Array
(
)
) in /home/user00114/public_html/211/vendor/magento/framework/DataObject.php:396
Stack trace:
#0 /home/user00114/public_html/211/app/code/Vendor/ModName/view/frontend/templates/test-slider.phtml(11): Magento\Framework\DataObject->__call('test', Array)
#1 /home/user00114/public_html/211/vendor/magento/framework/View/TemplateEngine/Php.php(59): include('/home/user00114/...')
#2 /home/user00114/public_html/211/vendor/magento/framework/View/Element/Template.php(255): Magento\Framework\View\TemplateEngine\Php->render(Object(Magento\Framework\View\Element\Template), '/home/user00114/...', Array)
#3 /home/user00114/public_html/211/vendor/magento/framework/View/Element/Template.php(279): Magento\Framework\View\Element\Template->fetchView('/home/user00114/...')
#4 /home/user00114/public_html/211/vendor/magento/framework/View/Element/AbstractBlock.php(657): Magento\Framework\View\Element\Template->_toHtml()
#5 /home/user00114/public_html/211/vendor/magento/module-email/Model/Template/Filter.php(366): Magento\Framework\View\Element\AbstractBlock->toHtml()
#6 [internal function]: Magento\Email\Model\Template\Filter->blockDirective(Array)
#7 /home/user00114/public_html/211/vendor/magento/framework/Filter/Template.php(141): call_user_func(Array, Array)
#8 /home/user00114/public_html/211/vendor/magento/module-email/Model/Template/Filter.php(963): Magento\Framework\Filter\Template->filter('{{block class="...')
#9 /home/user00114/public_html/211/vendor/magento/module-cms/Block/Page.php(156): Magento\Email\Model\Template\Filter->filter('{{block class="...')
#10 /home/user00114/public_html/211/vendor/magento/framework/View/Element/AbstractBlock.php(657): Magento\Cms\Block\Page->_toHtml()
#11 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(542): Magento\Framework\View\Element\AbstractBlock->toHtml()
#12 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(518): Magento\Framework\View\Layout->_renderBlock('cms_page')
#13 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(206): Magento\Framework\View\Layout->renderNonCachedElement('cms_page')
#14 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(472): Magento\Framework\View\Layout\Interceptor->renderNonCachedElement('cms_page')
#15 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(193): Magento\Framework\View\Layout->renderElement('cms_page', true)
#16 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(569): Magento\Framework\View\Layout\Interceptor->renderElement('cms_page')
#17 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(520): Magento\Framework\View\Layout->_renderContainer('content')
#18 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(206): Magento\Framework\View\Layout->renderNonCachedElement('content')
#19 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(472): Magento\Framework\View\Layout\Interceptor->renderNonCachedElement('content')
#20 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(193): Magento\Framework\View\Layout->renderElement('content', true)
#21 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(569): Magento\Framework\View\Layout\Interceptor->renderElement('content')
#22 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(520): Magento\Framework\View\Layout->_renderContainer('main')
#23 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(206): Magento\Framework\View\Layout->renderNonCachedElement('main')
#24 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(472): Magento\Framework\View\Layout\Interceptor->renderNonCachedElement('main')
#25 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(193): Magento\Framework\View\Layout->renderElement('main', true)
#26 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(569): Magento\Framework\View\Layout\Interceptor->renderElement('main')
#27 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(520): Magento\Framework\View\Layout->_renderContainer('columns')
#28 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(206): Magento\Framework\View\Layout->renderNonCachedElement('columns')
#29 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(472): Magento\Framework\View\Layout\Interceptor->renderNonCachedElement('columns')
#30 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(193): Magento\Framework\View\Layout->renderElement('columns', true)
#31 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(569): Magento\Framework\View\Layout\Interceptor->renderElement('columns')
#32 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(520): Magento\Framework\View\Layout->_renderContainer('main.content')
#33 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(206): Magento\Framework\View\Layout->renderNonCachedElement('main.content')
#34 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(472): Magento\Framework\View\Layout\Interceptor->renderNonCachedElement('main.content')
#35 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(193): Magento\Framework\View\Layout->renderElement('main.content', true)
#36 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(569): Magento\Framework\View\Layout\Interceptor->renderElement('main.content')
#37 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(520): Magento\Framework\View\Layout->_renderContainer('page.wrapper')
#38 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(206): Magento\Framework\View\Layout->renderNonCachedElement('page.wrapper')
#39 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(472): Magento\Framework\View\Layout\Interceptor->renderNonCachedElement('page.wrapper')
#40 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(193): Magento\Framework\View\Layout->renderElement('page.wrapper', true)
#41 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(569): Magento\Framework\View\Layout\Interceptor->renderElement('page.wrapper')
#42 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(520): Magento\Framework\View\Layout->_renderContainer('root')
#43 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(206): Magento\Framework\View\Layout->renderNonCachedElement('root')
#44 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(472): Magento\Framework\View\Layout\Interceptor->renderNonCachedElement('root')
#45 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(193): Magento\Framework\View\Layout->renderElement('root', true)
#46 /home/user00114/public_html/211/vendor/magento/framework/View/Layout.php(938): Magento\Framework\View\Layout\Interceptor->renderElement('root')
#47 [internal function]: Magento\Framework\View\Layout->getOutput()
#48 /home/user00114/public_html/211/vendor/magento/framework/Interception/Interceptor.php(144): call_user_func_array(Array, Array)
#49 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Layout/Interceptor.php(494): Magento\Framework\View\Layout\Interceptor->___callPlugins('getOutput', Array, Array)
#50 /home/user00114/public_html/211/vendor/magento/framework/View/Result/Page.php(241): Magento\Framework\View\Layout\Interceptor->getOutput()
#51 /home/user00114/public_html/211/vendor/magento/framework/View/Result/Layout.php(162): Magento\Framework\View\Result\Page->render(Object(Magento\Framework\App\Response\Http\Interceptor))
#52 [internal function]: Magento\Framework\View\Result\Layout->renderResult(Object(Magento\Framework\App\Response\Http\Interceptor))
#53 /home/user00114/public_html/211/vendor/magento/framework/Interception/Interceptor.php(74): call_user_func_array(Array, Array)
#54 /home/user00114/public_html/211/vendor/magento/framework/Interception/Chain/Chain.php(70): Magento\Framework\View\Result\Page\Interceptor->___callParent('renderResult', Array)
#55 /home/user00114/public_html/211/vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'renderResult', Object(Magento\Framework\View\Result\Page\Interceptor), Array, 'result-varnish-...')
#56 /home/user00114/public_html/211/vendor/magento/module-page-cache/Model/Controller/Result/VarnishPlugin.php(74): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Response\Http\Interceptor))
#57 [internal function]: Magento\PageCache\Model\Controller\Result\VarnishPlugin->aroundRenderResult(Object(Magento\Framework\View\Result\Page\Interceptor), Object(Closure), Object(Magento\Framework\App\Response\Http\Interceptor))
#58 /home/user00114/public_html/211/vendor/magento/framework/Interception/Chain/Chain.php(67): call_user_func_array(Array, Array)
#59 /home/user00114/public_html/211/vendor/magento/framework/Interception/Interceptor.php(136): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'renderResult', Object(Magento\Framework\View\Result\Page\Interceptor), Array, 'result-builtin-...')
#60 /home/user00114/public_html/211/vendor/magento/module-page-cache/Model/Controller/Result/BuiltinPlugin.php(67): Magento\Framework\View\Result\Page\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Response\Http\Interceptor))
#61 [internal function]: Magento\PageCache\Model\Controller\Result\BuiltinPlugin->aroundRenderResult(Object(Magento\Framework\View\Result\Page\Interceptor), Object(Closure), Object(Magento\Framework\App\Response\Http\Interceptor))
#62 /home/user00114/public_html/211/vendor/magento/framework/Interception/Interceptor.php(140): call_user_func_array(Array, Array)
#63 /home/user00114/public_html/211/var/generation/Magento/Framework/View/Result/Page/Interceptor.php(130): Magento\Framework\View\Result\Page\Interceptor->___callPlugins('renderResult', Array, Array)
#64 /home/user00114/public_html/211/vendor/magento/framework/App/Http.php(119): Magento\Framework\View\Result\Page\Interceptor->renderResult(Object(Magento\Framework\App\Response\Http\Interceptor))
#65 /home/user00114/public_html/211/vendor/magento/framework/App/Bootstrap.php(258): Magento\Framework\App\Http->launch()
#66 /home/user00114/public_html/211/index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
#67 {main} [] []

Best Answer

In your error it says Magento\Framework\View\Element\Template and not CustomProductCollection.

You are referring the wrong block class in your macro:

{{block class="Magento\Framework\View\Element\Template" template="Vendor_ModName::test-slider.phtml"}}

It should be:

{{block class="Vendor\ModName\Block\CustomProductCollection" template="Vendor_ModName::test-slider.phtml"}}

Note the different class attribute value.

P.S:

IMHO you also have constructor errors, you are missing the $data parameter. It should be:

public function __construct(
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Catalog\Model\CategoryFactory $categoryFactory,
    \Magento\Framework\View\Element\Template\Context $context,
    \Psr\Logger\LoggerInterface $logger,
    $data = []
    ) {
        $this->_categoryFactory = $categoryFactory;
        $this->_productCollectionFactory = $productCollectionFactory;
        $this->logger = $logger;
        parent::__construct($context, $data);
    }

Note both the added parameter $data = [] and parent::__construct($context, $data);.

Related Topic