使用cakephp创建自定义HTML块

时间:2015-02-24 17:41:27

标签: php cakephp cakephp-2.0 cakephp-appmodel

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

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

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

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

如果找到匹配数据库'block'表中的下一个查找并获得块密钥的匹配内容并替换'block key',如下所示。

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

执行此操作后,我想将html内容呈现给浏览器。

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

我有两个与此事件相关的问题。

  1. 如何在渲染之前获取和阅读html内容。(尝试查看 - >&gt; get()函数但不适用于我)
  2. 是否可以使用 appcontroller appmodule 来搜索和替换功能。 (我正在尝试将此方法应用于每个视图而不更改每个控制器和模型文件。因为现在我有超过60个操作) 我真的陷入了困境。任何人都可以帮忙??

1 个答案:

答案 0 :(得分:0)

问题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

您可以在app控制器中编写一个使用Folder & File api和preg_replace的任意函数。

<?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(我的推荐)

我建议使用code generation with bake来完成这些任务。你会:

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

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

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

*此解决方案可能是向后退一步,可以向前迈出两步。