как правильно организовать AJAX

У меня вопрос такого плана

У меня есть контроллеры, скажем

Base1Controller

Base2Controller

и в них есть ajaxAction

которые возвращают json формат

будет ли правильным

запихнуть функциональность этих экшенов скажем

в AjaxController

в акшены

base1Action

base2Action

Да и вообще кто как делает и как правильно?

хех… у меня тоже есть AjaxController))) Это абстрактный класс, то есть не используется напрямик и вообще находится в компонентах. Он расширяет стандартный CController полезным функционалом, и наследуется всеми контроллерами, где необходима работа с аджаксом.

А можно примерчик AjaxController’а

Я вот как делаю обычно:

[list=1]

[*]Сначала сайт без ajax

[*]Делаю js-файлы и подключаю там, где необходим ajax: в каждом файле функция, которая проставляет onclick, onchange, …

[*]В конце необходимых экшенов добавляю проверку Yii::app()->request->isAjaxRequest и, в зависимости от результата проверки, выдаю либо данные в json-формате, либо html

[/list]

Пока все гладко :)

Забыл добавить: а вообще все зависит от конкретной ситуации


abstract class AjaxController extends CController{

    

	protected function ajaxResp($param1 = true, $param2 = false)

	{

		if(is_bool($param1))	return CJSON::encode(array('status'=>$param1, 'msg'=>$param2));

		else			return CJSON::encode(array('status'=>true, 'msg'=>$param1));

	}

	

	protected function filters()

	{

		return array('ajaxOnly', 'checkToken');

	}

...

...



Основные функции. ajaxResp() выдает ответ сразу в нужном формате [‘status’, ‘msg’]. status=false ошибка

filters() по дефолту разрешает только аджакс запросы

плюс куча функций для работы с секьюрити токенами checkToken()getToken()makeToken()filterCheckToken()

Далее


class EditorController extends AjaxController

{

	public function actionRename()

	{

		

		$model=Albums::model()->findByPk($_POST['album_id']);

		if(!$model){

			echo $this->ajaxResp(false, 'Запись не существует'); return 0;

		}

		

		$model->name = $_POST['name'];

		if($model->save()){

			echo $this->ajaxResp(true);

		}else{

			echo $this->ajaxResp(false, $model->getErrorsList());

		}

		

	}

...

...

Я ajax экшины оставляю в тех контроллерах к которым они относятся. Так проще искать в принципе где надо менять код, да и вобще мне кажется красивее. Просто суфикс делаю после "_a" к примеру getAllUsers_a()