Question

I'm trying to create a dynamic block by making an UpgradeData on magento 2.3, someone knows how this do it?

Was it helpful?

Solution 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);
}

}

OTHER TIPS

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();
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top