Magento 2.3.* - How to override ViewModel for override block?
-
11-04-2021 - |
Вопрос
Magento 2.3.*
I want to override ViewModel
for the override block
(custom.block.name
). But the issue is my .phtml
a file called from the block and it is calling on some condition. Not every time call.
My frontend layout.xml
file content is,
<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="core.block.name">
<block name="custom.block.name" class="Vendor\Module\Block\CoreBlock" before="-">
</block>
</referenceBlock>
<referenceBlock name="custom.block.name">
<arguments>
<argument name="viewModel" xsi:type="object">Vendor\Module\ViewModel\CustomModel</argument>
</arguments>
</referenceBlock>
</body>
</page>
My .phtml
file render from block file. If I set the template in .xml
then it is working properly.
Any help will be appreciated.
Решение
Based on your comment, You need to set custom.block.name
as referenceBlock
. Try to use this below code :
app/code/Vendor/Module/view/frontend/layout/customer_account.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="customer_account_navigation">
<block name="custom.block.name" class="Vendor\Module\Block\CoreBlock" before="-">
</block>
</referenceBlock>
<referenceBlock name="custom.block.name">
<arguments>
<argument name="viewModel" xsi:type="object">Vendor\Module\ViewModel\CustomModel</argument>
</arguments>
</referenceBlock>
</body>
</page>
NOTE: Replace the argument name(viewModel
) with your core ViewModel Name.
app/code/Vendor/Module/Block/CoreBlock.php
<?php
namespace Vendor\Module\Block;
class CoreBlock extends \Magento\Framework\View\Element\Template
{
/**
* @var string
*/
protected $_template = 'Vendor_Module::temp.phtml';
}
app/code/Vendor/Module/ViewModel/CustomModel.php
<?php
namespace Vendor\Module\ViewModel;
class CustomModel implements \Magento\Framework\View\Element\Block\ArgumentInterface
{
public function getYourFunction()
{
$text = "test";
return $text;
}
}
app/code/Vendor/Module/view/frontend/templates/temp.phtml
echo $block->getData('viewModel')->getYourFunction();
NOTE: Replace viewModel
with your argument name of customer_account.xml
.
Output :