Kohana как правильно организовать получение данных через json

mstdmstd

Новичок
Всем привет,
А как правильно организовать получение данных через json ?
Проблема в том 1) убрать вывод общего темплейта 2) Правильно вывести данные
Делаю в темплейте:
PHP:
  var HRef = "{$base_url}main/get_regions_list_by_state_id/" + state_id + "/html/" + current_region_id;
  alert(HRef) // Если скопировать этот урл и вставить в брузер  то запускается актион ниже
  $.getJSON(HRef, function (data) {
    alert( var_dump(data) ) // Не вызывается 
    if (data.ErrorCode == 0) {
       alert(data.html)
PHP:
class Controller_Main extends Controller_Common {
...
	public function action_get_regions_list_by_state_id() {
		$ModelRegion = new Model_Region();
		// $this->template = ''; // если раскоментарить эту строку  Call to a member function render() on a non-object SYSPATH/classes/Kohana/Controller/Template.php [ 44 ]
                ...
		$ResArray= array('ErrorMessage' => '', 'ErrorCode' => 0, 'html'=> $html ); // Вывожу массив с данными

		$this->request->headers('Content-type','application/json; charset='.Kohana::$charset);
		$this->response->body( json_encode( $ResArray ) );
                // 2 строки выше не выводят ничего на экран кроме общего темплейта


                // Если 2 строки выше закоментировать и 2 строки ниже раскоментировать то на экран  данные выводятся, но остается проблема общего темплейта 
		//header("Content-Type: application/json");
		//echo json_encode( $ResArray );

	}


abstract class Controller_Common extends Controller_Template {
	public $template = 'admin/admin_template.tpl'; // Общий темплейт для всех контролов
	public function before()
	{
        ...
Наверно можно решить проблему с темплейтом, если сделать один контрол исключительно под ajax, но нехотелось бы этого делать. Мне удобнее распологать методы по логическому разделению.
Как убрать родительский темплейт
если писать
PHP:
// $this->template = ''; // если раскоментарить эту строку то ошибка  Call to a member function render() on a non-object SYSPATH/classes/Kohana/Controller/Template.php [ 44 ]
А как правильно?
 

archcoffe

Новичок
Если я правильно понял, - вы про это?
PHP:
class Controller_Common extends Controller_Template 
{
    protected $is_Ajax = false;
    public function before() 
    {
        if( .... ) 
        {
            $is_Ajax = true; 
        }
    }
    public function after() 
    {
        if($this->is_Ajax)
        {
            $this->request->response()->body('');
            return;
        }
    }
}
 

mstdmstd

Новичок
Если я правильно понял, - вы про это?
PHP:
        {
            $this->request->response()->body('');
На эту строку выдает ошибку :
: Call to undefined method Request::response()
Если написать
PHP:
	public function after()
	{
		if($this->is_Ajax and !empty($this->response))
		{
      $this->response->body('');
			//$this->request->response()->body('');
			return;
		}
		parent::after();
	}
То работает - спасибо !
 

mstdmstd

Новичок
А еще подскажите а как лучше сделать чтобы вернуть в массиве json-а отображение темплейта и еще несколько параметров
Делаю :

PHP:
		$html= View::factory( 'admin/loaded_tour_highlights_list.tpl', $data );
		echo '<pre> $html ::'.print_r( $html, true ).'</pre><br>';
		$ResArray= array('ErrorMessage' => '', 'ErrorCode' => 0,  'rows_count' => count($Tour_HighlightsList), 'data' => $html );
		header("Content-Type: application/json");
		echo json_encode( $ResArray );
В переменной $html не строка, как я ожидал а обьект и print_r выводит :
PHP:
 $html ::View Object
(
    [_file:protected] => .../admin/loaded_tour_highlights_list.tpl
    [_data:protected] => Array
        (
            [Tour_HighlightsList] => Array
                (
                    [0] => Array
                        (
                            [id] => 12
                            [highlight_id] => 
                            [tour_id] => 21
                            [name] =>  Cras porta massa risus. Suspendisse a euismod lacus.
                            [created_at] => 2013-06-30 22:29:07
                        )

                    [1] => Array
                        (
                            [id] => 11
                            [highlight_id] => 
                            [tour_id] => 21
                            [name] => Nunc laoreet rhoncus magna nec gravida. Nunc ultrices nibh at enim volutpat fringilla.
                            [created_at] => 2013-06-30 22:29:00
                        )

                    [2] => Array
                        (
                            [id] => 10
                            [highlight_id] => 
                            [tour_id] => 21
                            [name] => Ut a vehicula velit. Integer et vehicula diam.
                            [created_at] => 2013-06-30 22:28:52
                        )

                )

            [tour_id] => 21
        )

)
А как получить вывод темплейта одной строкой ?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Что бы получить результат работы вида, нужно его сделать ->render()
 
Сверху