It’s easy to create a Cms Page via admin, but when code is moved to another server or in some cases of data loss, might be a chance to lose that page, and is not recoverable. Creating a CMS Page via data patch is easy to use, it will create automatically pages when the source moves to another server, and no worry about data loss.
<?php
declare(strict_types=1);
namespace Mage2\Demo\Setup\Patch\Data;
use Magento\Cms\Api\PageRepositoryInterface;
use Magento\Cms\Model\Page;
use Magento\Cms\Model\PageFactory;
use Magento\Framework\App\Area;
use Magento\Framework\App\State;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Store\Model\Store;
use Psr\Log\LoggerInterface;
/**
* class CustomCmsPage create a Custom Cms page
*/
class CustomCmsPage implements DataPatchInterface
{
private const PAGE_IDENTIFIER = "custom-cms-page";
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var PageFactory
*/
private $pageFactory;
/**
* @var State
*/
private $state;
/**
* @var ModuleDataSetupInterface
*/
private $moduleDataSetup;
/**
* @var PageRepositoryInterface
*/
private $pageRepository;
/**
* @param PageFactory $pageFactory
* @param LoggerInterface $logger
* @param ModuleDataSetupInterface $moduleDataSetup
* @param State $state
* @param PageRepositoryInterface $pageRepository
*/
public function __construct(
PageFactory $pageFactory,
LoggerInterface $logger,
ModuleDataSetupInterface $moduleDataSetup,
State $state,
PageRepositoryInterface $pageRepository
) {
$this->logger = $logger;
$this->pageFactory = $pageFactory;
$this->state = $state;
$this->moduleDataSetup = $moduleDataSetup;
$this->pageRepository = $pageRepository;
}
/**
* Get array of patches that have to be executed prior to this.
*
* @return string[]
*/
public static function getDependencies()
{
return [];
}
/**
* Get aliases (previous names) for the patch.
*
* @return string[]
*/
public function getAliases()
{
return [];
}
/**
* This patch is create Custom Cms Page
*
* @return $this|CustomCmsPage
*/
public function apply()
{
$this->moduleDataSetup->startSetup();
try {
$this->state->emulateAreaCode(
Area::AREA_ADMINHTML,
[$this, 'setupCustomCmsPage']
);
} catch (\Exception $e) {
$this->logger->error(
'Error when Saving settings for patch CustomCmsPage: ' . $e->getMessage()
);
}
$this->moduleDataSetup->endSetup();
return $this;
}
/**
* This patch is to create Custom Cms Page
*/
public function setupCustomCmsPage()
{
$cmsPage = $this->createPage()->setData($this->getPage());
$this->pageRepository->save($cmsPage);
}
/**
* Create page instance.
*
* @return Page
*/
private function createPage()
{
return $this->pageFactory->create();
}
/**
* Get Page Config
*
* @return array
*/
private function getPage(): array
{
return [
'title' => 'Test CMS Page',
'page_layout' => '1column',
'meta_keywords' => '',
'meta_description' => '',
'identifier' => self::PAGE_IDENTIFIER,
'content_heading' => '',
'content' => $this->getCmsPageHtml(),
'layout_update_xml' => '',
'is_active' => 1,
'stores' => [Store::DEFAULT_STORE_ID],
'sort_order' => 0
];
}
/**
* Get Custom CMS page html
*
* @return string
*/
private function getCmsPageHtml(): string
{
// Set HTML content here
$html = <<<HTML
You can set here Html Content
HTML;
return $html;
}
}

