Symfony 1.4 и pjax (ajax pushstate)? - PullRequest
0 голосов
/ 13 июля 2011

symfony: http://www.symfony -project.org pjax: https://github.com/defunkt/jquery-pjax

Привет всем,

Я пытаюсь использовать pjax в symfony, чтобы ускорить наш веб-сайт (большую часть времени мы будем поддерживать статические заголовки и нижний колонтитул, а также избегать перезагрузки большого количества css / js и других файлов).

У меня нет проблем с ajax или symfony, но я хочу знать, есть ли лучший способ:

  1. Является ли хорошей идеей использовать postExecute для немедленного возврата html-кода без sf-перехода к шаблону вообще
  2. Если так, могу ли я как-то написать это только один раз для всех модулей? Я представляю, что я могу сделать:

    mySfActions расширяет sfActions

    moduleActions extends mySfActions

Интересно, есть ли лучший способ? 3. Есть ли способ получить текущее имя макета (определенное в модуле view.yml) внутри контроллера / действия?

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Вопрос 1: Не используйте post-execute, как это. Если вам нужно вернуть html из ajax-вызова в вашем действии, то ваше действие должно возвращаться так:

return $this->renderText("<p>Your html result.</p>");

Это пропустит вызов шаблона.

Вопрос 2: Это правильно. Вы написали лучший способ написать функцию один раз и сделать ее доступной для всех действий модуля.

0 голосов
/ 27 июля 2011

Спасибо всем за помощь, все ваши ответы были полезны и указали мне правильное направление. Я хотел проголосовать за оба ответа, но поскольку я могу принять только один, я принял самый первый ответ.

Во всяком случае, вот что я сделал:

Во-первых, я расширил класс sfActions, поэтому мне не нужно добавлять preExecute для каждого модуля:

<?php 

class mySfActions extends sfActions{
    public function preExecute(){
        $request = $this->getRequest(); 
        if ($request->getParameter('_pjax')) {
            $this->setLayout(false);
        }       
    }
}

Тогда, конечно, каждый мой класс действий модуля должен расширять этот новый класс.

Внутри моего индивидуального шаблона у меня есть что-то вроде этого:

<?php if($sf_request->getParameter('_pjax')):?>
         <script type="text/javascript" src="/js/question_list.js"></script>
<?php endif;?>

Мне кажется, в настоящее время это работает довольно хорошо, я наслаждаюсь невероятной скоростью загрузки, когда поддерживается pushstate, и все еще могу откатиться, когда это не так (на немом IE, например)

0 голосов
/ 13 июля 2011

Ничего не поделаешь.

При вызове действия через XmlHttpRequest, Symfony автоматически пропускает рендер Layout и возвращает только рендер модуля.

Вам нужно поместить все ваши "статические" ресурсы и HTML в ваш макет, и все.

...