How to add CMS Dynamic Block Programmatically using UpgradeData in Magento 2?
-
15-03-2021 - |
문제
I'm trying to create a dynamic block by making an UpgradeData on magento 2.3, someone knows how this do it?
해결책 2
After reviewing a lot information and reviewing code, finally found the solution.
Here it is:
<?php
/**
* Logger
* @var LoggerInterface
*/
private $logger;
/**
* Validator
* @var Validator
*/
protected $bannerValidator;
/**
* Banner
* @var Model\Banner
*/
private $model;
/**
* @var DirectoryList
*/
private $directoryList;
/**
* Constuct
*
* @param \Psr\Log\LoggerInterface $logger
* @param \Magento\Banner\Model\Banner\Validator $bannerValidator
* @param \Magento\Banner\Model\Banner $model
* @param DirectoryList $directoryList
*/
public function __construct(
\Psr\Log\LoggerInterface $logger,
\Magento\Banner\Model\Banner\Validator $bannerValidator,
\Magento\Banner\Model\Banner $model,
DirectoryList $directoryList
){
$this->logger = $logger;
$this->bannerValidator = $bannerValidator;
$this->model = $model;
}
/**
* Create dynamic block
*
* @param integer $ruleId
* @return void
*/
public function createDynamicBlock()
{
$data = [
"default_contents" => "",
"use_default_value" => "false",
"show_use_default_value" => "false",
"name" => "Test ",
"is_enabled" => "1",
"types" => ['content'],
"customer_sectment_ids" => [],
"banner_sales_rules" => [],
"store_id" => 0,
"content_readonly" => false,
"readonly" => false
];
/** @var \Magento\Banner\Model\Banner $model */
$model = $this->model;
$data = $this->bannerValidator->prepareSaveData($data);
try {
$this->prepareBannerModelData($model, $data);
$model->save();
} catch (\Exception $e) {
$this->logger->error('Cannot save the dynamic block, Exeption: ' . $e . '. Please try again.');
}
}
/**
* Prepare banner model data
*
* @param \Magento\Banner\Model\Banner $model
* @param array $data
* @return void
*/
protected function prepareBannerModelData(\Magento\Banner\Model\Banner $model, array $data)
{
$content = $this->dynamicBlockContent();
$data['store_contents'] = [
0 => "Some content"
];
$data['default_contents'] = [
0 => "Some content"
];
$model->setData($data);
}
}
다른 팁
You can do that using this code.
<?php
namespace Vendor\Extension\Setup;
use Magento\Cms\Model\BlockFactory;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
private $blockFactory;
public function __construct(BlockFactory $blockFactory)
{
$this->blockFactory = $blockFactory;
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
$cmsBlockData = [
'title' => 'Custom CMS Block',
'identifier' => 'custom_cms_block',
'content' => "Your CUSTOM TEXT HERE",
'is_active' => 1,
'stores' => [0],
'sort_order' => 0
];
$this->blockFactory->create()->setData($cmsBlockData)->save();
}
}
NOTE: You can call cms block using below code
echo $block->getLayout()
->createBlock('Magento\Cms\Block\Block')
->setBlockId('custom_cms_block') // cms block identifier
->toHtml();
제휴하지 않습니다 magento.stackexchange