irs / module-cmssetup
CMS内容迁移模块。
Requires
- php: >=8.1
- magento/module-cms: 104.0.*
This package is auto-updated.
Last update: 2024-09-12 20:39:44 UTC
README
此模块简化了开发期间和发布时的CMS内容管理。它允许将CMS块、页面和媒体资产定义为模块的一部分,并通过bin/magento setup:upgrade
命令或使用bin/magento setup:cms:import
命令导入来部署。
该模块还允许以可用于以后导入的格式导出包含使用媒体资产的CMS块和页面。
内容导出
导出作为管理面板中内容 > 元素 > 页面和内容 > 元素 > 块网格中的操作实现。要导出所有页面或块,请从网格操作下拉菜单中选择导出操作。要导出特定的页面或块,请在网格的第一列中选中它们,然后从下拉菜单中选择导出操作。
导出的内容将被打包成ZIP存档,可能包含以下目录
- blocks
- pages
- media
块和页面将包含具有特殊头部的HTML文件。每个页面或块一个文件。媒体文件夹将包含块和页面中使用的媒体资产。如果CMS块通过小部件注入到导出页面中,它们也将添加到存档中。此内容可以部署到其他环境。
内容更新策略
由于该模块更新的是可以由许多用户共享的环境,因此存在覆盖不应覆盖的内容的风险。内容更新策略被实施来处理这种情况。
此模块引入了允许覆盖属性到CMS块 & 页面。在初始内容导入时设置为“是”,在管理面板中保存块或页面时设置为“否”。策略定义了如果内容存档中的块或页面已存在于数据库中,并且不允许覆盖时应该做什么。
有三种内容更新策略
- 错误是默认策略。它引发错误并停止导入。
- 跳过策略省略不允许更新的CMS块或页面。
- 强制策略覆盖任何块和任何页面。
默认策略可以通过以下方式在配置中定义
bin/magento config:set dev/irs_cmssetup/update_strategy <error|skip|force>
命令或在管理面板 > 商店 > 配置 > 高级 > 开发者 > CMS设置 > 内容更新策略选项。此选项仅在开发模式下在管理面板中可用。
预计将在预发布环境中使用强制策略,因为不期望在管理面板中进行数据修改。跳过和错误策略可以在客户可能修改CMS内容的环境中使用。全局策略可以在app/etc/env.php
中定义,以下命令
bin/magento config:set --lock-env dev/irs_cmssetup/update_strategy <error|skip|force>
内容导入
可以使用bin/magento setup:cms:import
命令将创建的内容存档导入到环境中。它接受内容存档或内容目录作为参数。默认情况下,命令仅报告错误。要查看执行进度信息,请使用-vv
或-vvv
详细级别选项。
导入命令支持一些选项,允许覆盖当前内容部署策略
--force
强制更新由于选定的内容更新策略而无法更新的所有块 & 页面。--skip
跳过由于选定的策略而无法更新的所有块 & 页面,而不会出现错误。--dry-run
选项执行更新操作但不修改环境。
内容部署
该模块支持使用 Irs\CmsSetup\Setup\ContentUpdatePatch
部署 CMS 内容。这个补丁应该在包含要部署内容的某些模块中扩展。模块的最小结构应该如下所示
app/code/Foo/Bar/
content/
blocks/
pages/
media/
etc/
module.xml
Setup/
Patch/
Data/
ContentUpdateV1.php
registration.php
Foo\Bar\Setup\Patch\Data\ContentUpdateV1
数据补丁应扩展 Irs\CmsSetup\Setup\ContentUpdatePatch
。补丁的名称可以是任意的。它将从 content/
目录部署 CMS 块、页面和媒体内容。blocks/
和 pages/
目录应包含相应的 CMS 块和页面文件。文件格式在Cookbook章节中有详细描述。按照该格式,块和页面也可以按照内容导出章节中描述的方式导出。模块 media/
目录中的文件将被复制到项目维护的目录结构下的 pub/media/
目录。
内容更新补丁可以使用 strategy
属性覆盖默认策略。
class ContentUpdateV1 extends ContentUpdatePatch { protected UpdateStrategy $strategy = UpdateStrategy::Skip; }
Cookbook
如何部署 CMS 块?
将块文件放入模块的 content/blocks
目录。
id: promo-block-drills-drivers title: Promo Block - Category - Drills Drivers ---- <style> ... </style> <h3>Everyday low prices on quality brands</h3> <p> Browse our huge range of handheld power drills, cordless drills and drill drivers from big name brands like <a href="/brand/makita">Makita</a>, <a href="/brand/stanley-fatmax">Stanley FatMax</a>, <a href="/brand/dewalt">DeWalt</a>, <a href="/brands/bosch">Bosch</a>, <a href="/brand/rockwell">Rockwell</a> and more. Don’t get caught out without a cordless drill - our everyday low prices mean bigger savings on the best products for your projects. </p>
文件名和扩展名可以是任意的,但使用 html
扩展名以便进行语法高亮是有意义的。块文件由两部分组成:标题和正文。这两部分由只包含 ----
字符的行分开。每个标题由一个名称和一个与冒号 :
分隔的值组成。标题名称不区分大小写。从标题名称和值中删除前导和尾随字符。因此,以下标题与上一个文件相同
ID : promo-block-drills-drivers Title : Promo Block - Category - Drills Drivers
然后在模块中创建继承抽象类 Irs\CmsSetup\Setup\ContentUpdatePatch:
的数据补丁:
namespace Foo\Bar\Setup\Patch\Data; class UpdateContentV1 extends \Irs\CmsSetup\Setup\ContentUpdatePatch {}
运行 bin/magento setup:upgrade.
如果需要在 content/blocks
目录修改文件后重新部署块,需要将数据补丁重命名为新的名称,例如 UpdateContentV2
,然后再次运行 bin/magento setup:upgrade
。
content/blocks
目录中的块可以组织在任意级别的任意子目录中。
如何部署禁用 CMS 块?
有一个可选的标题 active
,它有两个可能的值:yes
和 no
。标题的名称和值不区分大小写。默认设置为 yes
。
Id: promo-block-drills-drivers Title: Promo Block - Category - Drills Drivers Active: No ---- <h3>Everyday low prices on quality brands</h3> ...
如何将 CMS 块部署到特定商店?
默认情况下,块被添加到所有商店视图。只有通过 stores
标题才能为特定商店启用。此标题包含逗号分隔的商店代码列表
id: promo-block-drills-drivers TITLE: Promo Block - Category - Drills Drivers Stores: default, eu_store, au_store ---- <h3>Everyday low prices on quality brands</h3> ...
由于我们可以有具有相同标识符的几个块,因此将根据商店选择更新块。以下算法被使用
- 选择所有具有给定标识符的块。
- 在这些块中找到具有相同商店集合的块。
- 如果没有找到这样的块,则创建一个新的块。
当你尝试修改已创建块的商店时,可能会出现问题。例如,你已经在数据库中创建了以下块,使用 content/blocks/Drills Drivers.html
文件。
Id: promo-block-drills-drivers Title: Promo Block - Category - Drills Drivers Stores: eu_store, au_store ---- <h3>Everyday low prices on quality brands</h3> ...
然后你从文件中删除 eu_store
以允许此块仅在 au_store
中使用
Id: promo-block-drills-drivers Title: Promo Block - Category - Drills Drivers Stores: au_store ---- <h3>Everyday low prices on quality brands</h3> ...
并运行 bin/magento setup:upgrade.
在这一点上,你会收到一个错误,因为它将尝试创建一个新的带有标识符 promo-block-drills-drivers
的块,允许在 au_store
中使用,但 eu_store
和 au_store
商店中已经存在具有相同标识符的块。
要解决这个问题,你需要首先删除具有数据补丁的块
namespace Foo\Bar\Setup\Patch\Data; class UpdateMediaV3 extends \Irs\CmsSetup\Setup\ContentUpdatePatch { public function apply() { $this->deleteBlock('promo-block-drills-drivers', ['eu_store', 'au_store']); parent::apply(); } }
如何将具有相同标识符的两个 CMS 块部署到不同的商店?
创建两个具有不同名称的文件,例如
content/blocks/Drills Drivers (Europe).html
content/blocks/Drills Drivers (Australia).html
两个文件应具有相同的id
标题头,但在stores
标题头中具有不同的存储代码
Id: promo-block-drills-drivers Title: Promo Block - Category - Drills Drivers - Australia Stores: au_store ---- <h3>Everyday low prices on quality brands</h3> ...
Id: promo-block-drills-drivers Title: Promo Block - Category - Drills Drivers - Europe Stores: eu_store ---- <h3>Everyday low prices on quality brands</h3> ...
如何部署CMS页面?
CMS页面的部署方式与CMS块类似。您需要将页面文件添加到content/pages
目录中。创建继承自Irs\CmsSetup\Setup\ContentUpdatePatch
的数据补丁,并运行bin/magento setup:upgrade
。同一个数据补丁可以同时部署CMS块和页面。
页面文件与块文件具有相同的格式。
id: 2017-calendar title: 2017 CALENDAR stores: gb_store layout: 1column content heading: 2017 CALENDAR ---- <div data-content-type="row" ...
它支持相同的标题和一些针对CMS页面的特定标题
- 内容标题
- 布局
- 元标题
- 元关键词
- 元描述
相同的加载和创建规则适用于它们。可以使用以下代码删除已存在的页面
namespace Foo\Bar\Setup\Patch\Data; class UpdateMediaV4 extends \Irs\CmsSetup\Setup\ContentUpdatePatch { public function apply() { $this->deletePage('2017-calendar', ['gb_store']); parent::apply(); } }