The Magento 2 Dynamic CMS Page List module provides a seamless way to manage and display CMS pages directly from the store configuration settings.
This module enables you to dynamically add CMS pages with customizable labels within a configurable dropdown list, allowing for easy management of page-specific details at the store level.
Perfect for administrators, this tool simplifies the customization of CMS page lists and descriptions through a user-friendly interface in the configuration settings.
You can find the complete module on GitHub at Magelearn_DynamicPageList
Or Check the below images for a better understanding of the functionality of this module.
Let's start it by creating a custom extension.
Create a folder inside app/code/Magelearn/DynamicPageList
Add registration.php file in it:
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Magelearn_DynamicPageList', __DIR__ );
Add composer.json file in it:
{ "name": "magelearn/magento2-module-dynamic-page-list", "description": "The Dynamic Row Image Upload Magento module enables administrators to upload and manage multiple images directly in Admin System Configuration with dynamic rows.", "type": "magento2-module", "license": "Apache-2.0", "authors": [ { "name": "Vijay Rami", "email": "vijaymrami@gmail.com" } ], "minimum-stability": "dev", "prefer-stable": true, "version":"1.0", "require": { "php": ">=8.0.0" }, "repositories": [ { "type": "package", "package": { "name": "magelearn/magento2-module-dynamic-file-upload", "version": "1.0", "source": { "url": "https://github.com/vijayrami/Magelearn_DynamicFileUpload.git", "type": "git", "reference": "main" } } } ], "autoload": { "files": [ "registration.php" ], "psr-4": { "Magelearn\\DynamicPageList\\": "" } } }
Add etc/module.xml file in it:
<?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="Magelearn_DynamicPageList" setup_version="1.0.0"> <sequence> <module name="Magento_Backend"/> <module name="Magento_Config"/> <module name="Magento_Cms"/> </sequence> </module> </config>
Add etc/acl.xml file.
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd"> <acl> <resources> <resource id="Magento_Backend::admin"> <resource id="Magento_Backend::stores"> <resource id="Magento_Backend::stores_settings"> <resource id="Magento_Config::config"> <resource id="Magelearn_DynamicPageList::config" title="Magelearn DynamicPageList Section" sortOrder="50" /> </resource> </resource> </resource> </resource> </resources> </acl> </config>
Now to give the CMS Page list options at System configuration at admin,
we will add etc/adminhtml/system.xml file.
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd"> <system> <tab id="magelearn" translate="label" sortOrder="10"> <label>Magelearn Modules</label> </tab> <section id="dynamic_list" translate="label" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1"> <class>separator-top</class> <label>Dynamic CMS Page List</label> <tab>magelearn</tab> <resource>Magelearn_DynamicPageList::config</resource> <group id="selection" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1"> <label>General Configuration</label> <field id="cms_pages" translate="label" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1"> <label>CMS Page Mapping</label> <frontend_model>Magelearn\DynamicPageList\Block\Adminhtml\Form\Field\DynamicRows</frontend_model> <backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model> <class>required-entry validate-select</class> </field> </group> </section> </system> </config>
Now as per highlighted code above, we will add
app/code/Magelearn/DynamicPageList/Block/Adminhtml/Form/Field/DynamicRows.php file
<?php declare(strict_types=1); namespace Magelearn\DynamicPageList\Block\Adminhtml\Form\Field; use Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray; use Magento\Framework\DataObject; use Magento\Framework\Exception\LocalizedException; class DynamicRows extends AbstractFieldArray { /** * @var CmsPageOptions */ private $cmsPageRenderer; /** * Prepare rendering the new field by adding all the needed columns */ protected function _prepareToRender() { $this->addColumn('cms_page', [ 'label' => __('CMS Page'), 'renderer' => $this->getCmsPageRenderer() ]); $this->addColumn('custom_text', [ 'label' => __('Custom Text'), 'class' => 'required-entry' ]); $this->_addAfter = false; $this->_addButtonLabel = __('Add Row'); } /** * Get CMS Page renderer * * @return CmsPageOptions * @throws LocalizedException */ private function getCmsPageRenderer() { if (!$this->cmsPageRenderer) { $this->cmsPageRenderer = $this->getLayout()->createBlock( CmsPageOptions::class, '', ['data' => ['is_render_to_js_template' => true]] ); } return $this->cmsPageRenderer; } /** * Prepare existing row data object * * @param DataObject $row * @throws LocalizException */ protected function _prepareArrayRow(DataObject $row) { $options = []; $cmsPage = $row->getCmsPage(); if ($cmsPage) { $options['option_' . $this->getCmsPageRenderer()->calcOptionHash($cmsPage)] = 'selected="selected"'; } $row->setData('option_extra_attrs', $options); } }
And as per highlighted above, we will add
app/code/Magelearn/DynamicPageList/Block/Adminhtml/Form/Field/CmsPageOptions.php file.
<?php declare(strict_types=1); namespace Magelearn\DynamicPageList\Block\Adminhtml\Form\Field; use Magento\Framework\View\Element\Html\Select; use Magento\Framework\View\Element\Context; use Magento\Cms\Model\ResourceModel\Page\CollectionFactory; class CmsPageOptions extends Select { /** * @var CollectionFactory */ private $collectionFactory; /** * @param Context $context * @param CollectionFactory $collectionFactory * @param array $data */ public function __construct( Context $context, CollectionFactory $collectionFactory, array $data = [] ) { parent::__construct($context, $data); $this->collectionFactory = $collectionFactory; } /** * Set "name" for <select> element * * @param string $value * @return $this */ public function setInputName($value) { return $this->setName($value); } /** * Set "id" for <select> element * * @param string $value * @return $this */ public function setInputId($value) { return $this->setId($value); } /** * Render block HTML * * @return string */ public function _toHtml(): string { $this->setClass('required-entry validate-select'); if (!$this->getOptions()) { $this->setOptions($this->getCmsPageOptions()); } return parent::_toHtml(); } /** * Get CMS pages options * * @return array */ private function getCmsPageOptions(): array { $collection = $this->collectionFactory->create(); $options = []; $options[] = ['label' => __('-- Please Select --'), 'value' => '']; foreach ($collection as $page) { $options[] = [ 'label' => $page->getTitle(), 'value' => $page->getId() ]; } return $options; } }
0 Comments On "Configuring CMS Pages as Dynamic Rows in Magento 2 Store Settings"