I want to add a CMS block option on the cms page admin side. Can anyone please guide me?

Like this: https://prnt.sc/KMSLIdK9Vfoe

1 Answer 1


Follow these steps to complete your requirement.

Step1: app/code/Dotsquares/CmsField/registration.php


Step2: app/code/Dotsquares/CmsField/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Dotsquares_CmsField" />

Step3: app/code/Dotsquares/CmsField/Setup/InstallSchema.php

    namespace Dotsquares\SellerLocator\Setup;
    class InstallSchema implements \Magento\Framework\Setup\InstallSchemaInterface
        public function install(\Magento\Framework\Setup\SchemaSetupInterface $setup, \Magento\Framework\Setup\ModuleContextInterface $context)
            $installer = $setup;
                        'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                        'length' => 255,
                        'nullable' => true,
                        'comment' => 'CMS Block Id'

Step4: app/code/Dotsquares/CmsField/view/adminhtml/ui_component/cms_page_form.xml

<?xml version="1.0" encoding="UTF-8"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="custom_design_update">
        <field name="block_id" formElement="select">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="source" xsi:type="string">page</item>
                <label translate="true">CMS Block</label>
                        <options class="Dotsquares\CmsField\Model\Page\Source\Options"/>
                        <caption translate="true">-- Please Select --</caption>

Step5: app/code/Dotsquares/CmsField/Model/Page/Source/Options.php

namespace Dotsquares\CmsField\Model\Page\Source;

use Magento\Framework\Data\OptionSourceInterface;

class Options implements OptionSourceInterface
    protected $_blockFactory;

    public function __construct(
        \Magento\Cms\Model\BlockFactory $blockFactory
        $this->_blockFactory = $blockFactory;

    public function toOptionArray()
        $blockOptions = $this->_blockFactory->create()->getCollection();
        $options = [];
        foreach ($blockOptions as $key => $value)
            $options[] = [
                'label' => $value->getTitle(),
                'value' => $value->getBlockId(),
        $this->options = $options;

        return $options;
  • I think this answer will help, but i want to add few notes about your code that might help you to improve your skills. 1. missed dependency in etc/module.xml. 2. Better use declaration in etc/db_schema.xml instead of InstallSchema. 3. If you want to use collection better use CollectionFactory instead of ModelFactory. Commented Jun 14, 2022 at 13:30
  • Ok sure, thank you
    – Dotsquares
    Commented Jun 14, 2022 at 13:44
  • @Dotsquares: Thank you for your answer. CMS block is now visible on the cms page, but after saving value is not saved. can you please let me know what is missing from my side? prnt.sc/S2gkaRQ-Luee Commented Jun 16, 2022 at 6:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.