使用cakephp创建自定义HTML块


Create custom HTML block using cakephp

我正在尝试使用带有一些CMS功能的cakefp(2.5)来构建网站。所以,我想给网络管理员一个特权来更改网页中的一些块(而不是蛋糕块)。我在几天内一直在构建这个功能。我将在下面用一些例子进行解释。

示例-如果有多个页面具有相同的图像,并且管理员希望不时更改它。所以我的方法视图文件有这样的代码段。

<div id='image'>{{block_same_image}}</div>

然后,在渲染每个页面之前,我获得页面html内容,并使用正则表达式({{block-[a-zA-Z0-9]*}})搜索"块密钥"

如果发现与数据库"块"表中的下一个匹配项相匹配,请查找块关键字的匹配内容并替换"块关键字",如下所示。

 <div id='image'><img src='.....'></div>

完成此操作后,我想将html内容呈现到浏览器。

我还为这个网站开发了静态页面创建模块,这样管理员就可以创建html页面并将其保存在数据库中。如果管理员想使用上面的图片中的一个页面,那么只需将{{block_same_image}}添加到页面内容中,就会为该页面提供图像标记。

我有两个问题与这位参议员有关。

  1. 如何在渲染之前获取和读取html内容。(尝试查看->get()函数,但对我不起作用)
  2. 是否可以使用appcontrollerappsodule来执行搜索和替换功能。(我正在尝试将这种方法应用于每个视图,而不更改每个控制器和模型文件。因为现在我有60多个操作)我真的陷入了困境。有人能帮忙吗

问题1

请参阅这篇Heady Nation的帖子。您需要将$this->autoRender设置为false,并实例化一个View对象。

<?php
/* Make sure the controller doesn't auto render. */
$this->autoRender = false;
/* Set up new view that won't enter the ClassRegistry */ 
$view = new View($this, false);
$view->set('text', 'Hello World');
$view->viewPath = 'elements';
/* Grab output into variable without the view actually outputting! */
$view_output = $view->render('box');

问题2-A

您可以在应用程序控制器中编写任意函数,该函数使用Folder&使用preg_replace的文件api。

<?php
App::uses('Controller', 'Controller');
App::uses('Folder', 'Utility');
App::uses('File', 'Utility');
class AppController extends Controller {
    //Your logic
    public function searchAndReplace(){
        $ViewFile = new File('../View/Tests/sample.ctp');
        $content = $ViewFile->read();
        $content = preg_replace('/something/', 'something else', $content);
        $ViewFile->write($content);
    }
}

问题2-B(我的建议)

对于这类任务,我建议使用代码生成和烘焙。你会:

1) 将lib/Cake/Console/Templates/default文件夹复制到App/Console/Templates/[theme name](主题名称可以是您想要的)

2) 使用必要的更改修改或创建视图样板。

3) 相对于App目录,从命令行运行cake bake view all

*这个解决方案可能是一个倒退,允许向前迈出两步。