CakePHP:如何在控制器内部使用视图元素

时间:2013-04-18 13:35:46

标签: php cakephp cakephp-2.0

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

我知道,我知道:“不要这样做!” (99%的时间这是正确答案)

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

这可能吗?

6 个答案:

答案 0 :(得分:22)

易:

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

此外:

不要做任何事情!!!

答案 1 :(得分:9)

有时,您需要从视图中呈现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');
}

答案 2 :(得分:5)

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

    bteq <<EOF
.RUN FILE $DBENV/1logon.txt
.export data file=$PMRootDir/$FOLDER_NME/SessLogs/pdbasis_count.txt
.set recordmode OFF;
.set sidetitles OFF;
.set titledashes off;

#This Select Statement is being replaced by the Stored Procedure Call
SELECT trim(COUNT(*))
FROM [Removed]
WHERE [Removed]

.IF ERRORCODE <> 0 THEN .QUIT 11;

.export reset;
.logoff;
.quit   

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

  

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

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

答案 3 :(得分:2)

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

答案 4 :(得分: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>');
            }
        }
    });
};

这只是袖口上写的一个例子。显然你需要编写自己的实现。

答案 5 :(得分:0)

我在Cake中进行任何ajax处理的方式是拥有自己的AjaxController。 ajax-kind的任何交互都会在那里进行,然后使用自己的视图(并查看partials / elements)。这样你就可以保持你的代码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