2017-02-03 81 views
0

我有一个ajax方法,它接收标记数组的id并执行一些处理以确保标记未被使用。然后我需要将HTML发送回客户端,以便使用JavaScript呈现标签。只需一个标签,通过调用Ajax方法呈现多个元素

$this->render('/Element/tag'); 

来自控制器,因为'render'生成的响应的主体将包含该元素的html。如何将我的标签数组转换为每个元素并将其发送回客户端?

+0

根据[在另一个问题上的这个答案](http://stackoverflow.com/a/16092328/7100404)我不应该发回像这样的HTML,应该只发送数据并在javascript中构建我的元素。但是,有什么好的元素模板呢?我如何在这个用例中利用这个模板? – pjenk213

+0

我通常不同意这种观点,它可以减少通过CakePHP呈现HTML的目的(为什么不用JavaScript构建整个应用程序,并在JSON中直接发送所有内容?)。这是一种有效但不同的做事方式。 CakePHP也可以使用[view routing](https://book.cakephp.org/3.0/en/development/routing.html#routing-file-extensions)来允许相同的端点有时提供HTML,而JSON数据可以在其他时间。 – ahoffner

回答

0

您只能调用render一次 - 将其视为您希望在Controller代码末尾使用哪个“视图”。

如果您需要呈现多个标记的视图,则可以定义一个新视图,例如/src/Template/Tags/tags.ctp

你可以通过任何你想给你的视图(Tags/tags.ctp文件),包括标签的数组:

$tags = ['Tag 1', 'Tag 2']; 

$this->set('tags', $tags); 

$this->render('Tags/tags'); 

然后tags.ctp内,使用标签元素,从而使得各一个:

<?php foreach ($tags as $tag) { 
    echo $this->element('tags', [ 
     "tag" => $tag 
    ]); 
} 
+0

这与[这个答案](http://stackoverflow.com/a/4405533/7100404)是一样的,虽然它可以工作,但它不是非常干燥。有没有一种解决方案是DRYer? – pjenk213

+0

元素的全部重点是定义可重复使用的HTML的短位,您可以将其插入到视图中..它们是继续从多个视图访问代码的重复工具,非常干燥的原则。这个“重复”你想避免的部分是什么? – ahoffner

+0

我现在有一个渲染单个标签和另一个渲染多个标签的元素。我希望能够将数据发送回像多个标签的render(),并使用一个'tag'元素。 – pjenk213