Как реализовать «Deep Link» на вызовах Ajax через ZF? - PullRequest
2 голосов
/ 30 ноября 2010

Я чувствую необходимость позволить кнопке браузера вернуться к работе, а также позволить пользователям добавлять в закладки то, что они видят.

Я не универсален на маршрутах 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' и нацеливания результатов на div 'testresults'.

$(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 - Хорошие кредиты за эту реализацию достаются Дэррилу Кларку. Я могу взять плохих.

1 Ответ

1 голос
/ 03 декабря 2010

Для глубоких ссылок: мне пришлось сделать то же самое (наш код выглядит почти идентично!) И через некоторое время нашел jQuery Address . Однако есть проблема с IE. Одна из функций заставляет его перестать работать. Насколько я могу судить, я не использую эту функцию, поэтому мне нужно только вернуть ее вместо того, чтобы делать то, что она делает. В текущей версии (1.3.1) это функция в строке 77 (_search = function (el)). Как я уже сказал, я просто поместил возврат в верхнюю часть функции, и теперь все работает прекрасно.

Что касается маршрутов ... Документация должна быть вашим первым портом захода. То, что я делаю для маршрутов, находится в моем файле начальной загрузки, создайте функцию _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'
    )
);

Но составьте свои собственные маршруты в соответствии с вашими потребностями (например, вы, вероятно, не хотите использовать маршруты регулярных выражений).

...