我正在尝试使用带有一些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}}添加到页面内容中,就会为该页面提供图像标记。
我有两个与此事件相关的问题。
答案 0 :(得分:0)
请参阅此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');
您可以在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);
}
}
我建议使用code generation with bake来完成这些任务。你会:
1)将lib/Cake/Console/Templates/default
文件夹复制到App/Console/Templates/[theme name]
(主题名称可以是您想要的)
2)使用必要的更改修改或创建视图模板。
3)从命令行运行cake bake view all
,相对于App
目录。
*此解决方案可能是向后退一步,可以向前迈出两步。