ugie-cake / cakephp-content-blocks
CakePHP的内容块插件
Requires
- php: >=8.1
- ext-json: *
- cakephp/cakephp: 5.0.*
- ezyang/htmlpurifier: ^4.16
Requires (Dev)
- phpunit/phpunit: ^8.5 || ^9.3
README
关于
使网站之前静态的部分动态化。允许管理员和最终用户在不需要编辑模板文件的情况下,编辑网站上的内容块。
下面的左右截图显示相同的视图+布局,但管理员能够修改标志、标题、主要内容以及页脚文本。所有这些只需在CakePHP应用程序中几行代码即可完成。
以下是查看和编辑内容块的行政界面
使用方法
通过composer安装插件
使用composer将此插件安装到您的CakePHP应用程序中。
composer require ugie-cake/cakephp-content-blocks
加载插件
您可以使用cake
CLI
bin/cake plugin load ContentBlocks
或者手动将以下行添加到您的src/Application.php
文件的bootstrap()
函数中
$this->addPlugin('ContentBlocks');
加载视图助手
将以下行添加到您的src/View/AppView.php
文件的initialize()
函数中
$this->loadHelper('ContentBlocks.ContentBlock');
在数据库中创建content_blocks
表
注意:这必须在您部署网站的所有环境中(localhost、dev、prod等)执行。这也要求您已设置
app.php
或app_local.php
文件,并包含适当的DataSource
块以连接到数据库。
bin/cake migrations migrate --plugin=ContentBlocks
定义内容块
在您的模板中显示内容之前,您必须首先定义可用的块。这是通过在content_blocks
表中插入记录来完成的,这通常通过Seeds来完成。
以下是一个创建每种类型(html
、text
和image
)内容块的示例种子
<?php declare(strict_types=1); use Migrations\AbstractSeed; class ContentBlocksSeed extends AbstractSeed { public function run(): void { $data = [ [ 'parent' => 'global', 'label' => 'Website Title', 'description' => 'Shown on the home page, as well as any tabs in the users browser.', 'slug' => 'website-title', 'type' => 'text', 'value' => 'ugie-cake/cakephp-content-blocks-example-app', ], [ 'parent' => 'global', 'label' => 'Logo', 'description' => 'Shown in the centre of the home page, and also in the top corner of all administration pages.', 'slug' => 'logo', 'type' => 'image', ], [ 'parent' => 'home', 'label' => 'Home Page Content', 'description' => 'The main content shown in the centre of the home page.', 'slug' => 'home-content', 'type' => 'html', 'value' => '<p>Example app showcasing the <code>ugie-cake/cakephp-content-blocks</code> plugin.</p>', ], [ 'parent' => 'home', 'label' => 'Copyright Message', 'description' => 'Copyright information shown at the bottom of the home page.', 'slug' => 'copyright-message', 'type' => 'text', 'value' => '(c) Copyright 2023, enter copyright owner here.', ], ]; $table = $this->table('content_blocks'); $table->insert($data)->save(); } }
将定义的内容块插入数据库
一旦在种子(见上面)中定义了您的内容块,然后您可以运行“Seed”以在数据库中创建记录
# Replace 'ContentBlocksSeed' with the name of your seed class from the previous step.
bin/cake migrations seed --seed ContentBlocksSeed
链接到管理界面
为了让您的管理员能够访问内容块管理页面,您的模板需要链接到ContentBlocks
控制器的index
操作
<?= $this->Html->link('Content Blocks', ['plugin' => 'ContentBlocks', 'controller' => 'ContentBlocks', 'action' => 'index']) ?>
在视图中使用内容块
通过在视图中输出相关内容块而不是硬编码内容,管理员无需更改代码(或雇佣某人更改代码)即可更改模板的大部分内容。
这是通过相关的ContentBlocksHelper
函数完成的
<?= $this->ContentBlock->html('home-content'); ?> <?= $this->ContentBlock->image('logo'); ?> <?= $this->ContentBlock->text('website-title'); ?>
覆盖管理页面模板
出于各种原因,您可能想自定义管理页面的外观。如果是这种情况,您可以通过在您的CakePHP应用程序的templates
文件夹中创建一个名为plugin
的文件夹(如果尚未创建),并在plugin
文件夹内创建路径ContentBlocks/ContentBlocks
(即文件夹内的文件夹)来覆盖提供的模板。目录结构应如下所示
templates/plugin/ContentBlocks/ContentBlocks/
跳过授权检查
如果您在项目中实现了授权插件,但未添加所需的策略,您可能会看到如下错误信息:对 `/content-blocks/content-blocks` 的请求未应用任何授权检查
。您可能需要通过添加以下配置键来在 content-blocks
插件中跳过授权检查。
// In /config/app_local.php add:
'ContentBlocks' => [
'ignoreAuthorization' => true,
]
参考
HTML块
添加HTML块
向 content_blocks
表添加一个类型为 html
的新记录。
示例种子可以在 HtmlBlockSeed.php
文件中找到,请参阅这里
<?php # File: config/Seeds/HtmlBlockSeed.php class HtmlBlockSeed extends \Migrations\AbstractSeed { public function run(): void { $data = [ [ 'parent' => 'about-us', 'slug' => 'about-us-content', 'label' => 'About Us - Main Content', 'description' => 'Main block of code shown on the About Us page.', 'type' => 'html', 'value' => ' <h2>Our Story</h2> <p>We are a small business, established in 2023 who sell candles to sick children.</p> ', ], ]; $this->table('content_blocks')->insert($data)->save(); } }
渲染HTML块
在布局或视图模板中添加以下内容:
<?= $this->ContentBlock->html('block-name') ?>
文本块
添加文本块
向 content_blocks
表添加一个类型为 text
的新记录。
示例种子可以在 TextBlockSeed.php
文件中找到,请参阅这里
<?php # File: config/Seeds/TextBlockSeed.php class TextBlockSeed extends \Migrations\AbstractSeed { public function run(): void { $data = [ [ 'parent' => 'home', 'slug' => 'website-title', 'label' => 'Website Title', 'description' => 'Heading shown on the main page, and also in the browser tab.', 'type' => 'text', 'value' => 'CakePHP Content Blocks Plugin', ], ]; $this->table('content_blocks')->insert($data)->save(); } }
图片块
添加图片块
向 content_blocks
表添加一个类型为 image
的新记录。
示例种子可以在 ImageBlockSeed.php
文件中找到,请参阅这里
<?php # File: config/Seeds/ImageBlockSeed.php class ImageBlockSeed extends \Migrations\AbstractSeed { public function run(): void { $data = [ [ 'parent' => 'global', 'slug' => 'logo', 'label' => 'Logo', 'description' => 'Shown on the home page, and also in the top left of each other page.', 'type' => 'image', ], ]; $this->table('content_blocks')->insert($data)->save(); } }