Magento 2에서 프로그래밍 방식으로 CMS 블록을 추가하는 방법은 무엇입니까?


13

설치 / 업그레이드 스크립트를 통해 CMS 블록을 추가해야합니다. 아래 스크립트에서 볼 수 있듯이 "일반"CMS 페이지를 추가하는 방법을 이미 알고 있습니다. 그러나 Magento 2의 코드, Google 또는 여기에서 CMS 블록을 추가 할 수있는 방법을 찾을 수 없으므로 상당히 잼되어 있습니다.

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

$testPage배열에 정의 된 모든 값이 필요하지 않다는 것을 이해 하므로 다음과 같이 제거했습니다.

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

이 테스트 페이지를 테스트 블록으로 만들기 위해 내가 무엇을 변경해야하는지 아는 사람이 있습니까?

참고 : 스크립트는에있는 Magento 2 CMS 모듈의 설치 데이터 스크립트를 기반으로합니다 vendor/magento/module-cms/Setup/InstallData.php.


이것은 "CMS 블록"이 아니라 "CMS 페이지"입니다 .. 오해의 소지가있는 제목입니다.
OZZIE

@OZZIE 아닙니다. 설명을 읽었다면 위의 코드가 실제로 페이지를 추가하는 것이지만 CMS 블록 설치 프로그램으로 변경하는 것이 문제라는 것을 알고 있었을 것입니다.

답변:


20

이것을 수업에 추가하십시오 :

private $blockFactory;

생성자를 다음과 같이 만드십시오.

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

$pageFactory더 이상 필요하지 않으면 종속성을 제거 할 수도 있습니다 .

그런 다음 교체하십시오.

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

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

2
내 안에 뭔가 내가 그것을 알아낼 수 있다고 말해줍니다. 좋고 쉬운 대답. 대단히 감사합니다. 추신 : 당신이 대답한다고 투표하고 싶지만 내 명성이 나에게 도움이되지 않습니다.

간단하지만 효과적인. @KeesHak 나는 당신을 위해 그것을 찬성했습니다 : P
7ochem

@KeesHak은 팩토리 대신 데이터 인터페이스 (BlockInterface) 및 리포지토리 (BlockRepositoryInterface)를 사용하는 것이 좋습니다.
Vasilii Burlacu

@VasiliiBurlacu 당신이 맞아요. 나는 1.5 년 전에 저장소가 아직 끝나지 않았을 때 썼다.
Marius

13

다음 해결책을 시도해보십시오.

생성자에 2 개의 클래스를 추가하십시오.

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

그리고 다음과 같은 방식으로 사용하십시오.

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

코드가 작동 중입니다. 이 블록의 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


블록을 저장하기 위해 블록 저장소 기능을 구현했습니다. 실제로 약간 더 나은 연습처럼 보입니다. 감사합니다.

0

모듈을 업그레이드 해야하는 경우 UpgradeData.php 를 사용 하고 아래 단계를 따르십시오.

  1. module.xml 에서 setup_version 을 늘리십시오.
  2. 고토 설치 디렉토리 생성 UpgradeData.php
  3. 다음과 같이 종속성을 가져옵니다.

    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();
       }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.