Comment ajouter un bloc CMS par programmation dans Magento 2?

13

J'ai besoin d'ajouter un bloc CMS via un script d'installation / mise à niveau. J'ai déjà compris comment ajouter des pages CMS "normales" comme indiqué dans le script ci-dessous. Mais comme je ne trouve aucun moyen d'ajouter des blocs CMS dans le code de Magento 2, sur Google ou ici, je suis assez coincé.

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

Je comprends que je n'ai pas besoin de toutes les valeurs définies dans le $testPagetableau, je les ai donc supprimées comme suit:

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

Quelqu'un sait-il ce que je dois changer pour transformer cette page de test en bloc de test?

Remarque: J'ai basé mon script sur le script de données d'installation dans le module CMS Magento 2 situé dans vendor/magento/module-cms/Setup/InstallData.php.

7ochem
la source
Ce n'est pas un "Bloc CMS" mais une "Page CMS" .. titre trompeur ..
OZZIE
@OZZIE Ce n'est pas le cas. Si vous aviez lu la description, vous auriez su que le code ci-dessus est en effet d'ajouter une page, mais la question est de la changer en un installateur de blocs CMS.

Réponses:

20

ajoutez ceci à votre classe:

private $blockFactory;

et faites ressembler votre constructeur à ceci:

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

vous pouvez même supprimer la $pageFactorydépendance si vous n'en avez plus besoin.

Remplacez ensuite:

$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();

avec

$testBlock = [
    'title' => 'Test block title',
    'identifier' => 'test-block',
    'stores' => [0],
    'is_active' => 1,
];
$this->blockFactory->create()->setData($testBlock)->save();
Marius
la source
2
Quelque chose en moi me dit que j'aurais pu le comprendre moi-même. Réponse agréable et facile. Merci beaucoup. PS: Je voudrais voter pour que vous répondiez, mais ma réputation ne me le permettra pas.
Simple mais efficace. @KeesHak Je l'ai voté pour vous: P
7ochem
@KeesHak utilise mieux l'interface de données (BlockInterface) et les référentiels (BlockRepositoryInterface) au lieu des usines.
Vasilii Burlacu
@VasiliiBurlacu Vous avez raison. J'ai écrit cela il y a 1,5 ans alors que les dépôts n'étaient pas encore terminés.
Marius
13

Vous pouvez essayer la solution suivante:

Ajoutez 2 classes au constructeur:

/**
 * @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;
}

Et utilisez-les de la manière suivante:

$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);

Le code fonctionne. Voici le résultat pour ce bloc:

entrez la description de l'image ici

MageWorx
la source
J'ai également implémenté la fonctionnalité de référentiel de blocs pour enregistrer le bloc. Semble en effet une pratique légèrement meilleure. Je vous remercie.
0

Si votre module nécessite une mise à niveau, utilisez UpgradeData.php et suivez les étapes ci-dessous.

  1. augmenter la configuration_version dans module.xml
  2. Aller au répertoire d' installation et créer UpgradeData.php
  3. Importez ses dépendances comme suit,

    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
la source