Como adicionar um bloco CMS programaticamente no Magento 2?

13

Preciso adicionar um bloco CMS por meio de um script de instalação / atualização. Eu já descobri como adicionar páginas CMS "normais", como visto no script abaixo. Mas como não consigo encontrar nenhuma maneira de adicionar blocos CMS no código do Magento 2, no Google ou aqui, estou bastante atolado.

namespace [Vendor]\[Module]\Setup;

use Magento\Cms\Model\Page;
use Magento\Cms\Model\PageFactory;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;

class UpgradeData implements UpgradeDataInterface
{
    /**
     * Page factory.
     *
     * @var PageFactory
     */
    private $pageFactory;

    /**
     * Init.
     *
     * @param PageFactory $pageFactory
     */
    public function __construct(PageFactory $pageFactory)
    {
        $this->pageFactory = $pageFactory;
    }

    /**
     * Upgrade.
     *
     * @param ModuleDataSetupInterface $setup
     * @param ModuleContextInterface $context
     */
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();

        if (version_compare($context->getVersion(), '0.0.1') < 0) {
            $testPage = [
                'title' => 'Test page title',
                'identifier' => 'test-page',
                'stores' => [0],
                'is_active' => 1,
                'content_heading' => 'Test page heading',
                'content' => 'Test page content',
                'page_layout' => '1column'
            ];

            $this->pageFactory->create()->setData($testPage)->save();
        }

        $setup->endSetup();
    }
}

Entendo que não preciso de todos os valores definidos na $testPagematriz, então reduzi-o para o seguinte:

$testPage = [
    'title' => 'Test block title',
    'identifier' => 'test-block',
    'stores' => [0],
    'is_active' => 1
    'content' => 'Test block content'
];

Alguém sabe o que eu preciso alterar para transformar essa página de teste em um bloco de teste?

Nota: Baseei meu script no script de instalação de dados no módulo Magento 2 CMS localizado em vendor/magento/module-cms/Setup/InstallData.php.

7ochem
fonte
Este não é um "CMS Block", mas um "CMS Página" título .. enganosa ..
OZZIE
@OZZIE Não é. Se você tivesse lido a descrição, saberia que o código acima é realmente uma página, mas a questão é alterá-la para um instalador de bloco do CMS.

Respostas:

20

adicione isso à sua classe:

private $blockFactory;

e faça seu construtor ficar assim:

public function __construct(
    PageFactory $pageFactory,
    \Magento\Cms\Model\BlockFactory $blockFactory
  )
{
    $this->pageFactory = $pageFactory;
    $this->blockFactory = $blockFactory;
}

você pode até remover a $pageFactorydependência se não precisar mais dela.

Substitua então:

$testPage = [
    'title' => 'Test page title',
    'identifier' => 'test-page',
    'stores' => [0],
    'is_active' => 1,
    'content_heading' => 'Test page heading',
    'content' => 'Test page content',
    'page_layout' => '1column'
];

$this->pageFactory->create()->setData($testPage)->save();

com

$testBlock = [
    'title' => 'Test block title',
    'identifier' => 'test-block',
    'stores' => [0],
    'is_active' => 1,
];
$this->blockFactory->create()->setData($testBlock)->save();
Marius
fonte
2
Algo dentro de mim me diz que eu poderia ter descoberto isso sozinho. Resposta agradável e fácil. Muito obrigado. PS: Eu gostaria de votar em sua resposta, mas minha reputação não me deixa.
Simples mas efetivo. @KeesHak Voto a favor para você: P
7ochem
O @KeesHak deve usar melhor a interface de dados (BlockInterface) e os repositórios (BlockRepositoryInterface) em vez de fábricas.
Vasilii Burlacu
@VasiliiBurlacu Você está certo. Eu escrevi isso 1,5 anos atrás, quando os repositórios ainda não estavam concluídos.
Marius
13

Você pode tentar a seguinte solução:

Adicione 2 classes ao construtor:

/**
 * @var \Magento\Cms\Model\BlockFactory
 */
protected $blockFactory;

/**
 * @var \Magento\Cms\Model\BlockRepository
 */
protected $blockRepository;

/**
 * @param PageFactory $resultPageFactory
 * @param \Magento\Cms\Model\BlockFactory $blockFactory
 * @param \Magento\Cms\Model\BlockRepository $blockRepository
 */
public function __construct(
    PageFactory $resultPageFactory,
    \Magento\Cms\Model\BlockFactory $blockFactory,
    \Magento\Cms\Model\BlockRepository $blockRepository
) {
    $this->resultPageFactory = $resultPageFactory;
    $this->blockFactory = $blockFactory;
    $this->blockRepository = $blockRepository;
}

E use-os da seguinte maneira:

$data = [
    'title' => 'Test block title',
    'identifier' => 'test-block',
    'stores' => ['0'],
    'is_active' => 1,
    'content' => 'Test block content'
];
$newBlock = $this->blockFactory->create(['data' => $data]);
$this->blockRepository->save($newBlock);

O código está funcionando. Aqui está o resultado para este bloco:

insira a descrição da imagem aqui

MageWorx
fonte
Também implementei a funcionalidade do repositório de blocos para salvar o bloco. Parece uma prática um pouco melhor. Obrigado.
0

Se o seu módulo precisar de atualização, use UpgradeData.php e siga as etapas abaixo.

  1. aumente o setup_version em module.xml
  2. Goto Setup diretório e criar UpgradeData.php
  3. Importe suas dependências da seguinte maneira,

    namespace Vendor\YourModule\Setup;
    
    use Magento\Framework\Setup\UpgradeDataInterface;
    use Magento\Framework\Setup\ModuleContextInterface;
    use Magento\Framework\Setup\ModuleDataSetupInterface;
    use Magento\Cms\Model\BlockFactory;
    
    class UpgradeData implements UpgradeDataInterface {
    
    private $blockFactory;
    
    public function __construct(LoggerInterface $logger, BlockFactory $blockFactory) {
        $this->blockFactory = $blockFactory;
    }
    
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) {
    
        $setup->startSetup();
    
        if (version_compare($context->getVersion(), '1.1.0') < 0) {
            try{
              $staticBlockInfo = [
                        'title' => 'Title of Sample block',
                        'identifier' => 'sample_block',
                        'stores' => ['0'],
                        'is_active' => 1,
                        'content' => 'This is the sample block content'
                      ];
                $this->blockFactory->create()->setData($staticBlockInfo)->save();
            }catch (Exception $e){
                echo $e->getMessage();
            }
         }
    
         $setup->endSetup();
       }
    }
TS Guhan
fonte