I want to load html of a particular block and save it in cms/block programmatically by using a CLI command. MagentoFrameworkViewResultPageFactory returns an empty string when calling toHtml() on it. I have also tried MagentoFrameworkViewLayoutFactory but result is same.
What is the right way of loading a block inside cli command in magento 2?
Here is my code:
use MagentoCmsModelBlockFactory;
use MagentoFrameworkViewResultPageFactory;
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;
class Updatetopmenu extends Command
{
private $blockFactory;
private $resultPageFactory;
protected $layoutFactory;
/** @var MagentoFrameworkAppState * */
private $state;
const TOP_MENU_BLOCK_ID = "-------------------";
public function __construct(
BlockFactory $blockFactory,
PageFactory $resultPageFactory,
MagentoFrameworkAppState $state,
MagentoFrameworkViewLayoutFactory $layoutFactory
)
{
$this->blockFactory = $blockFactory;
$this->resultPageFactory = $resultPageFactory;
$this->state = $state;
$this->layoutFactory = $layoutFactory;
parent::__construct();
}
/**
* {@inheritdoc}
*/
protected function execute(
InputInterface $input,
OutputInterface $output
)
{
$this->state->setAreaCode(
MagentoFrameworkAppArea::AREA_FRONTEND
);
// $resultPage = $this->resultPageFactory->create();
$updateBlockLayout = $this->layoutFactory->create();
$updateBlockLayout->getUpdate()
->addHandle('default')
->load();
$updateBlockContent = $updateBlockLayout->createBlock('SmartwavePortoBlockTemplate')
->setTemplate("Magento_Theme::html/header.phtml")
->toHtml();
echo $updateBlockContent;
// $updateBlock = $this->blockFactory->create()
// ->load(self::TOP_MENU_BLOCK_ID);
// if ($updateBlock->getId()) {
// $updateBlock->setContent($updateBlockContent);
// $updateBlock->save();
// }
}
/**
* {@inheritdoc}
*/
protected function configure()
{
$this->setName("--------------");
$this->setDescription("");
parent::configure();
}
}