Làm cách nào để thêm một khối CMS lập trình trong Magento 2?


13

Tôi cần thêm một khối CMS thông qua tập lệnh cài đặt / nâng cấp. Tôi đã tìm ra cách thêm các trang CMS "bình thường" như được thấy trong tập lệnh bên dưới. Nhưng vì tôi không thể tìm thấy bất kỳ cách nào để thêm các khối CMS trong mã của Magento 2, trên Google hoặc ở đây, tôi khá bị kẹt.

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

Tôi hiểu rằng tôi không cần tất cả các giá trị được xác định trong $testPagemảng, vì vậy tôi đã loại bỏ nó xuống như sau:

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

Có ai biết những gì tôi cần thay đổi để biến trang thử nghiệm này thành một khối thử nghiệm không?

Lưu ý: Tôi dựa vào tập lệnh của mình dựa trên tập lệnh dữ liệu cài đặt trong mô-đun Magento 2 CMS được đặt trong vendor/magento/module-cms/Setup/InstallData.php.


Đây không phải là "Khối CMS" mà là "Trang CMS" .. tiêu đề gây hiểu lầm ..
OZZIE

@OZZIE Không phải vậy. Nếu bạn đã đọc mô tả, bạn sẽ biết rằng đoạn mã trên là để thêm một trang thực sự, nhưng câu hỏi là thay đổi nó thành trình cài đặt khối CMS.

Câu trả lời:


20

thêm phần này vào lớp của bạn:

private $blockFactory;

và làm cho hàm tạo của bạn trông như thế này:

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

bạn thậm chí có thể loại bỏ sự $pageFactoryphụ thuộc nếu bạn không cần nó nữa.

Sau đó thay thế:

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

với

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

2
Một cái gì đó bên trong tôi nói với tôi rằng tôi có thể tự mình tìm ra điều đó. Câu trả lời hay và dễ. Cảm ơn rât nhiều. Tái bút: Tôi muốn bình chọn bạn trả lời, nhưng danh tiếng của tôi sẽ không cho phép tôi.

Đơn giản mà hiệu quả. @KeesHak Tôi đã nâng cấp nó cho bạn: P
7ochem

@KeesHak sử dụng tốt hơn giao diện Dữ liệu (BlockInterface) và kho lưu trữ (BlockRep repositoryInterface) thay vì các nhà máy.
Vasilii Burlacu

@VasiliiBurlacu Bạn nói đúng. Tôi đã viết điều này 1,5 năm trước khi các kho lưu trữ chưa hoàn thành.
Marius

13

Bạn có thể thử giải pháp sau:

Thêm 2 lớp vào hàm tạo:

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

Và sử dụng chúng theo cách sau:

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

Mã đang hoạt động. Đây là kết quả cho khối này:

nhập mô tả hình ảnh ở đây


Tôi đã thực hiện chức năng lưu trữ khối cũng như để lưu khối. Có vẻ thực tế tốt hơn một chút. Cảm ơn bạn.

0

Nếu mô-đun của bạn yêu cầu nâng cấp thì hãy sử dụng Nâng cấpData.php và làm theo các bước dưới đây.

  1. tăng setup_version trong module.xml
  2. Goto Setup thư mục và tạo nâng cấpData.php
  3. Nhập phụ thuộc của nó như sau,

    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();
       }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.