Платформа Kohana - лучшие практики реализации Ajax - PullRequest
10 голосов
/ 06 апреля 2011

Я занимаюсь разработкой приложения в рамках Kohana. Я хотел бы знать лучшие практики в реализации Ajax в Kohana. До сих пор я использую другой контроллер для AJAX. Я думаю, что важными проблемами будет минимизация потребностей в ресурсах и обработка сессий.

Заранее спасибо

Ответы [ 4 ]

11 голосов
/ 10 апреля 2011

Я использую это:

В шаблоне Controller_Template:

    public function before()
    {
        $this->auto_render = ! $this->request->is_ajax(); 
        if($this->auto_render === TRUE)
        {
            parent::before();
        }
    }

А внутри моих действий:

      if ($this->request->is_ajax())    
        {
            ...         
            $this->response->headers('Content-type','application/json; charset='.Kohana::$charset);
            $this->response->body($jsonEncoded);
        }
5 голосов
/ 13 апреля 2011

Как сказано выше, вам не нужен отдельный контроллер для ваших действий ajax. Вы можете воспользоваться объектом запроса Kohana для определения типа запроса. Это можно сделать следующим образом:

<?php

class Controller_Test extends Controller_Template {
    /**
     * @var     View    Template container
     */
    protected $template = 'template';
    /**
     * @var     View    Content to render
     */
    protected $content = 'some/content/view';
    // Inherited from parent class
    protected $auto_template_render = TRUE;
    public function before()
    {
        parent::before();
        if ($this->request->is_ajax() OR !$this->request->is_initial()) {
            $this->auto_template_render = FALSE;
        }    
    }

    public function after()
    {
        if ($this->auto_template_render == FALSE) {
            // We have ajax or internal request here
            $this->template = $this->content;            
        } else {
            // We have regular http request for a page
            $this->template = View::factory($this->template)
                ->set('content', $this->content);
        }
        // Call parent method
        parent::after();
    }
}

Хотя пример очень прост, он может быть улучшен до того, что вы хотите заархивировать. По сути, я закончил писать свой Controller_Template, чтобы делать то, что мне нужно. Также вы можете рассмотреть возможность добавления параметра формата к вашим URL-адресам, чтобы URL-адреса .html возвращали обычное html-представление данных, а URL-адреса .json делали то же самое, но в формате json. Для получения дополнительной информации (и, возможно, идеи) см. Kerkness неофициальные вики Kohana

1 голос
/ 08 апреля 2011

Кроме того, если вы используете Kohana_Controller_Template в качестве родителя / предка контроллера, не забудьте отключить автоматическую визуализацию при доступе через AJAX, чтобы предотвратить загрузку и рендеринг всего шаблона.

if ($request->is_ajax()) $this->auto_render = FALSE;
1 голос
/ 06 апреля 2011

Вам не нужен отдельный контроллер, вы также можете использовать Kohana_Controller_Template для обработки AJAX-запросов.

Вам решать, каким будет ответ в случае запроса AJAX (или подзапроса, обычно он такой же). У меня обычно шаблон отображается только в том случае, если запрос является исходным (а не-ajax), в противном случае он отображает $ content var.

Кроме того, вы можете легко проверить, является ли запрос AJAX / подзапросом:

if ($request->is_ajax())
if ( ! $request->is_initial()) 
...