จะเพิ่มบล็อก CMS โดยทางโปรแกรมใน Magento 2 ได้อย่างไร


13

ฉันต้องเพิ่มบล็อก CMS ผ่านสคริปต์การติดตั้ง / อัปเกรด ฉันได้เรียนรู้วิธีเพิ่มหน้า CMS "ปกติ" ดังที่เห็นในสคริปต์ด้านล่าง แต่เนื่องจากฉันไม่พบวิธีเพิ่มบล็อก CMS ในรหัสของ Magento 2 บน Google หรือที่นี่ฉันจึงค่อนข้างติดขัด

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'
];

ใครบ้างรู้ว่าฉันต้องเปลี่ยนอะไรเพื่อให้หน้าทดสอบนี้เป็นบล็อกทดสอบ

หมายเหตุ:ผมตามสคริปต์ของฉันในการติดตั้งสคริปต์ข้อมูลในโมดูลวีโอไอพี 2 CMS vendor/magento/module-cms/Setup/InstallData.phpที่ตั้งอยู่ใน


นี่ไม่ใช่ "CMS Block" แต่เป็น "CMS Page" .. ชื่อที่ทำให้เข้าใจผิด ..
OZZIE

@OZZIE มันไม่ใช่ หากคุณได้อ่านคำอธิบายคุณจะรู้ว่ารหัสข้างต้นคือการเพิ่มหน้าแน่นอน แต่คำถามคือการเปลี่ยนไปติดตั้ง CMS block

คำตอบ:


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
บางสิ่งในตัวฉันบอกฉันว่าฉันสามารถคิดออกเอง คำตอบที่ดีและง่าย ขอบคุณมาก. PS: ฉันต้องการโหวตคุณตอบ แต่ชื่อเสียงของฉันจะไม่ให้ฉัน

เรียบง่าย แต่มีประสิทธิภาพ @KeesHak ฉันได้ทำการโหวตให้คุณแล้ว: P
7ochem

@KeesHak ใช้ Data interface (BlockInterface) และ repositories (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. เพิ่มsetup_versionใน module.xml
  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.