Magento 2'de programlı olarak bir CMS bloğu nasıl eklenir?


13

Bir yükleme / yükseltme komut dosyası aracılığıyla bir CMS bloğu eklemeniz gerekir. Ben zaten aşağıdaki komut dosyasında görüldüğü gibi "normal" CMS sayfaları eklemek için nasıl anladım. Ancak Magento 2'nin koduna, Google'da veya burada CMS blokları eklemenin bir yolunu bulamadığım için oldukça sıkıldım.

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

Ben $testPagedizide tanımlanan tüm değerlere ihtiyacım yok , bu yüzden aşağı sıyırdı:

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

Bu test sayfasını test bloğuna dönüştürmek için neyi değiştirmem gerektiğini bilen var mı?

Not: Komut dosyanızı, Magento 2 CMS modülündeki kurulum veri komut dosyasına dayandırdım vendor/magento/module-cms/Setup/InstallData.php.


Bu bir "CMS Bloğu" değil, bir "CMS Sayfası" .. yanıltıcı başlık ..
OZZIE

@OZZIE Öyle değil. Açıklamayı okuduysanız, yukarıdaki kodun gerçekten bir sayfa eklemek olduğunu biliyor olabilirsiniz, ancak soru bunu bir CMS blok yükleyicisine değiştirmek.

Yanıtlar:


20

bunu sınıfınıza ekleyin:

private $blockFactory;

ve kurucunuzu şöyle görünmesini sağlayın:

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

$pageFactoryartık ihtiyacınız yoksa bağımlılığı bile kaldırabilirsiniz .

Sonra değiştirin:

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

ile

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

2
İçimdeki bir şey bana bunu kendim çözebileceğimi söylüyor. Güzel ve kolay cevap. Çok teşekkür ederim. Not: Cevap verdiğiniz oyu yükseltmek istiyorum ama itibarım bana izin vermiyor.

Basit ama etkili. @KeesHak Senin için oyladım: P
7ochem

Fabrikalar yerine Veri arabirimi (BlockInterface) ve depoları (BlockRepositoryInterface) daha iyi kullanın.
Vasilii Burlacu

@VasiliiBurlacu Haklısın. Bunu 1.5 yıl önce depoların henüz bitmediği yazdı.
Marius

13

Aşağıdaki çözümü deneyebilirsiniz:

Yapıcıya 2 sınıf ekleyin:

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

Ve bunları aşağıdaki şekilde kullanın:

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

Kod çalışıyor. İşte bu blok için sonuç:

resim açıklamasını buraya girin


Bloğu kaydetmek için blok veri havuzu işlevselliğini de uyguladım. Gerçekten biraz daha iyi bir uygulama gibi görünüyor. Teşekkür ederim.

0

Modülünüz yükseltme gerektiriyorsa UpgradeData.php dosyasını kullanın ve aşağıdaki adımları izleyin.

  1. artırmak setup_version module.xml içinde
  2. Goto Kurulum dizini ve oluşturmak UpgradeData.php
  3. Bağımlılıklarını aşağıdaki gibi içe aktarın,

    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();
       }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.