Bagaimana cara menambahkan blok CMS secara terprogram di Magento 2?

13

Saya perlu menambahkan blok CMS melalui skrip install / upgrade. Saya sudah menemukan cara menambahkan halaman CMS "normal" seperti yang terlihat dalam skrip di bawah ini. Tetapi karena saya tidak dapat menemukan cara untuk menambahkan blok CMS dalam kode Magento 2, di Google atau di sini, saya cukup macet.

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

Saya mengerti bahwa saya tidak memerlukan semua nilai yang didefinisikan dalam $testPagearray, jadi saya menghapusnya sebagai berikut:

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

Adakah yang tahu apa yang perlu saya ubah untuk menjadikan halaman pengujian ini menjadi blok uji?

Catatan: Saya mendasarkan skrip saya pada skrip data instal di modul Magento 2 CMS yang terletak di vendor/magento/module-cms/Setup/InstallData.php.

7ochem
sumber
Ini bukan "Blok CMS" tetapi "Halaman CMS" .. judul yang menyesatkan ..
OZZIE
@ OZZIE Tidak. Jika Anda telah membaca deskripsi, Anda akan tahu bahwa kode di atas memang untuk menambahkan halaman, tetapi pertanyaannya adalah mengubahnya menjadi installer blok CMS.

Jawaban:

20

tambahkan ini ke kelas Anda:

private $blockFactory;

dan buat konstruktor Anda terlihat seperti ini:

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

Anda bahkan dapat menghapus $pageFactoryketergantungan jika Anda tidak membutuhkannya lagi.

Kemudian ganti:

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

dengan

$testBlock = [
    'title' => 'Test block title',
    'identifier' => 'test-block',
    'stores' => [0],
    'is_active' => 1,
];
$this->blockFactory->create()->setData($testBlock)->save();
Marius
sumber
2
Sesuatu dalam diri saya memberi tahu saya bahwa saya bisa mengetahuinya sendiri. Jawaban yang bagus dan mudah. Terima kasih banyak. PS: Saya ingin memilih Anda menjawab, tetapi reputasi saya tidak akan membiarkan saya.
Sederhana tetapi efektif. @KeesHak Saya telah memutakhirkannya untuk Anda: P
7ochem
@KeesHak lebih baik menggunakan antarmuka data (BlockInterface) dan repositori (BlockRepositoryInterface) daripada pabrik.
Vasilii Burlacu
@VasiliiBurlacu Anda benar. Saya menulis ini 1,5 tahun yang lalu ketika repositori belum selesai.
Marius
13

Anda dapat mencoba solusi berikut:

Tambahkan 2 kelas ke konstruktor:

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

Dan gunakan dengan cara berikut:

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

Kode berfungsi. Inilah hasil untuk blok ini:

masukkan deskripsi gambar di sini

MageWorx
sumber
Saya menerapkan fungsi repositori blok juga untuk menyimpan blok. Tampaknya praktik yang sedikit lebih baik. Terima kasih.
0

Jika modul Anda memerlukan peningkatan, gunakan UpgradeData.php dan ikuti langkah-langkah di bawah ini.

  1. tingkatkan setup_version di module.xml
  2. Direktori Pengaturan Goto dan buat UpgradeData.php
  3. Impor dependensinya sebagai berikut,

    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
sumber