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.

7ochem
quelle
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();
Marius
quelle
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

MageWorx
quelle
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();
       }
    }
TS Guhan
quelle