11

我试图弄清楚如何在控制器中使用我的一个视图元素......

我知道,我知道: “不要那样做!” (99% 的情况下这是正确答案)

但我认为我其实有一个很好的理由。该操作正在处理返回标记的 AJAX 请求。返回的标记是一个列表,我使用元素在其他任何地方显示。因此,为了使我的代码保持干燥,我认为在这里这样做是合适的。

这可能吗?

4

6 回答 6

22

简单的:

$view = new View($this, false);
$content = $view->element('my-element', $params);

还:

不要再那样做了!!!

于 2013-04-18T13:39:00.363 回答
10

有时,您需要从视图渲染 CakePhp 元素并同时使用 AJAX 将其内容注入页面。在这种情况下,将元素渲染为来自控制器的常规视图比创建仅包含 的专用视图更好<?php echo $this->element('some_element') ?>,并且可以通过以下方式完成:

<?php
public function ajax_action() {
    // set data used in the element
    $this->set('data', array('a'=>123, 'b'=>456, 'd'=>678));

    // disable layout template
    $this->layout = 'ajax';

    // render!
    $this->render('/Elements/some_element');
}
于 2015-05-26T15:58:51.560 回答
5

我知道这是一个老问题,其他人已经给出了基本相同的答案,但我想指出这种方法(由 Serge S. 提供)......

<?php
public function ajax_action() {
    // set data used in the element
    $this->set('data', array('a'=>123, 'b'=>456, 'd'=>678));

    // disable layout template
    $this->layout = 'ajax';

    // render!
    $this->render('/Elements/some_element');
}

...不是一个 hacky 解决方法,但实际上是CakePHP 文档针对这个常见且合法的用例推荐的方法:

如果 $view 以“/”开头,则假定它是相对于 /app/View 文件夹的视图或元素文件。这允许直接渲染元素,在 AJAX 调用中非常有用。

(再次:感谢 Serge S. 上面的代码)

于 2015-07-01T16:29:12.847 回答
2

$this->view = '/Elements/myelement';

于 2013-04-18T20:15:41.657 回答
1

您应该使用客户端模板。您永远不应该从 Web 服务或 API 返回标记,只返回数据。让您的 JavaScript 获取数据,然后按照您的意愿对其进行格式化。

例如:

function getItems() {
    $.get('/some/url', function(response) {
        if (response.data.length > 0) {
            for (var i = 0; i < response.data.length; i++) {
                var item = response.data[i];
                $('.results').append('<li>' + item.title + '</li>');
            }
        }
    });
};

这只是一个即兴发挥的例子。显然,您需要编写自己的实现。

于 2013-04-18T20:21:10.837 回答
0

我在 Cake 中进行任何 ajax 处理的方式是拥有自己的 AjaxController。ajax-kind 的任何交互都在那里,而后者又使用自己的视图(和视图部分/元素)。这样你就可以保持你的代码 DRY 并在那里隔离和传播所有 ajax 用例。

示例摘录:

<?php
class AjaxController extends AppController {
    /**
    * (non-PHPdoc)
    * Everything going to this controller should be accessed by Ajax. End of story.
    * @see Controller::beforeFilter()
    */
    public function beforeFilter() {
        parent::beforeFilter();
        $this->autoRender = false;
        $this->layout = false;
        if (!$this->request->is('ajax')) {
            $this->redirect('/');
        }
    }
    public function preview() {
        if ($this->request->is('ajax')) {
            $this->set('data', $this->data);
            $this->render('/Elements/ajaxpreview');
        }
    } 
?>

这是来源:https ://github.com/Sobient/dosspirit/blob/master/app/Controller/AjaxController.php

于 2014-08-27T12:05:05.570 回答