我们说我有一个Comments
模型,其中有一个名为text
的字段,可以存储格式化的(html)文本
大多数情况下,此文字来自表单,并且像往常一样保存Comments->patchEntity()
等等...
有时我会自动生成评论。现在我在控制器中创建该内容。这样的事情(注意这是一个过于简单的例子):
// PostsController
public function view($id)
{
//
//
// if Post views are >= 1 billion
$comment = $this->Comments->newEntity();
$comment->text = "<strong>Congratulations!</strong> your Post just
hit 1 billion views! This is an auto generated
comment";
$this->Posts->Comments->save($comment);
}
我知道这是错误的,它违背了MVC模式。
此外,我无法在控制器中使用HtmlHelper,因此我必须手动创建html标签。
我已经看过this问题,但这似乎不是一个干净的方法(也是蛋糕2的问题)
那么:在没有打破MVC的情况下,实现我已经做过的更干净的方法是什么?
其他信息
问题一般是关于如何使用cakephp 3将生成的(HTML)内容保存到数据库。以上只是一个示例:我可以将该代码移动到afterSave方法或创建一个监听器。我可以使用Element或Helper来生成内容(或者更可能是两者)
我认为应该有类似于Email类的方式:我可以在我的代码(控制器,模型,监听器)中的任何地方调用Email(),并使用模板生成电子邮件正文。我想做同样的事情并保存到DB
我为什么需要这个?
也许这是一个XY问题,所以这是我的实际问题
我有一个非常复杂的视图,它取决于许多表中存储的记录。我希望每次发生更改时跟踪此视图的历史记录,因此我的想法是创建一个侦听器,将此侦听器附加到创建视图所涉及的每个表,并在每次存在时保存视图的快照。更新
答案 0 :(得分:0)
所以,按照@ndm的建议,这就是我所做的
$vars = [/* my viewVars here */]
$view = new ViewBuilder();
$content = $view->setTemplate("path_to_my_template")
->setLayout(false) // I need an empty layout
->setHelpers(['Number']) // I need some additional helper
->build($vars) //here I pass my vars to the template
->render();
通过这种方式,我可以获得我生成的内容。我可以在模型或事件侦听器中使用以上代码。即在模型中我可以做到
$entity = $this->newEntity():
$entity->content = $content;
$this->save($entity);