Wie füge ich programmatisch einen CMS-Block in Magento 2 hinzu?


13

Ich muss einen CMS-Block über ein Installations- / Upgrade-Skript hinzufügen. Ich habe bereits herausgefunden, wie man "normale" CMS-Seiten hinzufügt, wie im folgenden Skript gezeigt. Aber da ich bei Google oder hier keine Möglichkeit finde, CMS-Blöcke in den Code von Magento 2 einzufügen, bin ich ziemlich überfordert.

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

Ich verstehe, dass ich nicht alle im $testPageArray definierten Werte benötige , daher habe ich es auf Folgendes reduziert:

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

Weiß jemand, was ich ändern muss, um diese Testseite in einen Testblock zu verwandeln?

Hinweis: Mein Skript basierte auf dem Installationsdatenskript im Magento 2 CMS-Modul in vendor/magento/module-cms/Setup/InstallData.php.


Dies ist kein "CMS-Block", sondern eine "CMS-Seite" .. irreführender Titel ..
OZZIE

@OZZIE Ist es nicht. Wenn Sie die Beschreibung gelesen hätten, hätten Sie gewusst, dass der obige Code zwar das Hinzufügen einer Seite ist, aber die Frage ist, sie in ein CMS-Blockinstallationsprogramm zu ändern.

Antworten:


20

füge dies zu deiner Klasse hinzu:

private $blockFactory;

und lass deinen Konstruktor so aussehen:

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

Sie können die $pageFactoryAbhängigkeit sogar entfernen, wenn Sie sie nicht mehr benötigen.

Dann ersetzen Sie:

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

mit

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

2
Etwas in mir sagt mir, dass ich das selbst hätte herausfinden können. Schöne und einfache Antwort. Vielen Dank. PS: Ich würde gerne abstimmen, dass du antwortest, aber mein Ruf lässt mich nicht.

Einfach aber effektiv. @ KeesHak Ich habe es für Sie hochgeladen: P
7ochem

@KeesHak verwendet besser Datenschnittstelle (BlockInterface) und Repositorys (BlockRepositoryInterface) anstelle von Fabriken.
Vasilii Burlacu

@ VasiliiBurlacu Sie haben Recht. Ich habe das vor 1,5 Jahren geschrieben, als die Repositories noch nicht fertig waren.
Marius

13

Sie können die folgende Lösung ausprobieren:

Fügen Sie dem Konstruktor 2 Klassen hinzu:

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

Und benutze sie wie folgt:

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

Der Code funktioniert. Hier ist das Ergebnis für diesen Block:

Bildbeschreibung hier eingeben


Ich habe auch die Block-Repository-Funktionalität implementiert, um den Block zu speichern. Scheint in der Tat eine etwas bessere Übung zu sein. Vielen Dank.

0

Wenn für Ihr Modul ein Upgrade erforderlich ist, verwenden Sie UpgradeData.php und befolgen Sie die folgenden Schritte.

  1. Erhöhen Sie die setup_version in module.xml
  2. Goto - Setup - Verzeichnis und erstellen UpgradeData.php
  3. Importieren Sie die Abhängigkeiten wie folgt:

    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();
       }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.