如何通过ZF实现Ajax调用的“深层链接”?

时间:2010-11-30 14:15:56

标签: jquery ajax zend-framework deep-linking

我认为需要允许浏览器返回按钮工作,以及允许用户为他们看到的内容添加书签。

我在Zend路线上不是多才多艺,但我暂时无法改变它。

这是我正在使用的ajax实现方法:

class TestController extends Zend_Controller_Action {

public function init()
{
    /* Initialize action controller here */
    if ($this->getRequest()->isXMLHttpRequest()) {
        $this->_helper->layout()->setLayout('blank');
        $logger = $this->getInvokeArg('bootstrap')->getResource('Log');
        $logger->debug('AJAX Call');
    }
}


public function indexAction()
{
    // render the default page
}

public function somethingelseAction()
{
    // do something else render something.
}

}

让我的初始视图使用目标div渲染,以及一些链接......这是我的index.phtml:

<h1>Tests...</h1>
        <a class="ajaxloader"
            href="<?php echo $this->url(array('controller'=> 'test', 'action' => 'speed'), null, true);?>">Speed</a>
        <a class="ajaxloader"
            href="<?php echo $this->url(array('controller'=> 'test', 'action' => 'somethingelse'), null, true);?>">Something Else</a>
        <div id="testresults">
        <h1>Default stuff to show.</h1>
        </div>

一些jQuery代码附加到这些'ajaxloader'链接并将结果定位到'testresults'div。

$(function() {
$('.ajaxloader').click(function(event) {
    var target = $(this).attr('href');
    window.location.hash = target;
    $('#testresults').fadeOut('slow', function() {
        // complete fadeout, load new content while it's hiding!
        $.ajax( {
            url : target,
            success : function(data) {
                $('#testresults').html(data);
                $('#testresults').fadeIn();
            }
        });
    });
    return false;
})
});

如何在此处实施深层链接?

非常感谢, MEM

PS - 这项实施的好成绩归功于Darryl E. Clarke。 我可以把坏的。

1 个答案:

答案 0 :(得分:1)

对于深层链接:我必须做同样的事情(我们的代码看起来几乎相同!)并在一段时间后发现jQuery Address。但是,IE存在问题。其中一个功能导致它停止工作。据我所知,我没有使用该功能,所以我只是让它返回而不是做它正在做的事情。在当前版本(1.3.1)中,它是第77行的函数(_search = function(el))。就像我说的那样,我只是在函数的顶部放置了一个返回,现在一切都很好。

至于路线...... The documentation应该是您的第一个停靠港。 我为路由做的是在我的bootstrap文件中,创建一个_init函数并执行以下操作:

$this->bootstrap('frontController');
/* @var $frontcontroller Zend_Controller_Front */
$frontcontroller = $this->getResource('frontController');
$router = $frontcontroller->getRouter();
$router->addRoute(
    'page',
    new Zend_Controller_Router_Route_Regex('(.*)\.html',
        array('controller' => 'index',
        'action' => 'page',
            'module' => 'default'),
            array('page' => 1),
        '%s.html'
    )
);

但是将自己的路线放在一起以满足您的需求(例如,您可能不想使用正则表达式路线)。