在呈现

时间:2015-06-26 06:35:20

标签: cakephp cakephp-3.0

我有一个单页应用程序,页眉,页脚和顶部导航是静态的,"页面"用Ajax打开。

示例:

主导航中的元素:

<a href="javascript:;" data-open-dynamic="/project/controllerName/actionName/">Something</a>

JavaScript的:

$('body').on('click', '[data-open-dynamic]', function () {
    var url = $(this).data('openDynamic');
    openDynamic(url);
})

function openDynamic(url)
{
    $.ajax({
        url: url,
        async: true,
        success: function (data) {
            //some other logic
            $('.content').html(data).fadeIn();
        }
    })
}

问题是我还需要从直接URL打开这些页面。现在,如果我尝试打开domain.com/controllerName/actionName,设计就会被破坏,因为控制器中的布局设置为ajax

public function initialize()
{
    parent::initialize();
    $this->layout = 'ajax';
}

我尝试使用beforeFilter()beforeRender()shutdown()做一些事情,但似乎包含方法openDynamic()的JavaScript文件尚未加载,我可以&#39;叫它。

public function beforeRender(\Cake\Event\Event $event)
{
    parent::beforeRender($event);

    $url = $event->subject->request->here; // the URL is correct
    echo 'openDynamic("' . $url . '");';

    $this->response->stop();
}

此外,我不确定是否会以这种方式正确加载页眉,页脚和导航。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

如果通过AJAX请求页面,只将布局设置为ajax怎么样?您可以使用$this->request->is('ajax'): -

进行测试
public function beforeRender(\Cake\Event\Event $event)
{
    parent::beforeRender($event);
    if ($this->request->is('ajax')) {
        $this->layout = 'ajax';
    }
}

这比在代码中混合JavaScript和PHP更简洁。