Magento 2 में प्रोग्रामेटिक रूप से CMS ब्लॉक कैसे जोड़ें?


13

मैं एक स्थापित / उन्नयन स्क्रिप्ट के माध्यम से एक सीएमएस ब्लॉक जोड़ने की जरूरत है। मैंने पहले ही पता लगा लिया है कि "सामान्य" सीएमएस पृष्ठों को कैसे जोड़ा जाए जैसा कि नीचे की स्क्रिप्ट में देखा गया है। लेकिन चूंकि मुझे Google या यहाँ पर Magento 2 के कोड में 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


यह "सीएमएस ब्लॉक" नहीं बल्कि "सीएमएस पेज" है .. भ्रामक शीर्षक ..
OZZIE

@OZZIE यह नहीं है। यदि आपने वह विवरण पढ़ा है जो आप जानते होंगे कि उपरोक्त कोड वास्तव में एक पृष्ठ जोड़ने के लिए है, लेकिन सवाल यह है कि इसे CBI ब्लॉक इंस्टॉलर में बदलना है।

जवाबों:


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 कारखानों के बजाय डेटा इंटरफेस (ब्लॉकइंटरफेस) और रिपॉजिटरी (ब्लॉकरिपोरेटरी इन्टरफेस) का बेहतर इस्तेमाल करते हैं।
वासिलि बर्लाकु

@VasiliiBurlacu आप सही हैं। मैंने इसे 1.5 साल पहले लिखा था जब रिपॉजिटरी अभी तक समाप्त नहीं हुए थे।
मेरियस

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

यदि आपके मॉड्यूल को अपग्रेड की आवश्यकता है तो UpgradData.php का उपयोग करें और नीचे दिए चरणों का पालन करें।

  1. मॉड्यूल . xml में setup_version बढ़ाएं
  2. गोटो सेटअप निर्देशिका और UpgradData.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();
       }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.