Action для Widget

Добрый день!

Есть Widget:

class MyWidget extends CWidget

Вызывается:

$this->widget(‘application.components.MyWidget’);

В нём пользователь вводит данные, и отправляет серверу.

Но, данные отправляются текущему контроллеру.

В принципе, непостижимым образом работает правильно, если у текущего контроллера нет своих форм. Но виджет показывается практически на всех страницах.

Изменить такое положение можно. Нужно указать action для

$form=$this->beginWidget(‘CActiveForm’, array(

  'action'=>'controller/action',)

Но, для Widget проблема указать controller/action

Вопрос: Как передать данные именно виджету?

Или нужно создавать к виджету контроллер?

Насколько я понимаю, идея Yii состоит в том, чтобы определить внутри виджета в методе actions() список действий, которые контроллер будет вызывать из определённых для них там же отдельных классов, а уже каждое действие, в свою очередь, может вызвать какой-нибудь метод этого контроллера (его объект передаётся действию при запуске), который покажет виджет и передаст ему нужные данные. По производительности, кстати, это не должно быть сильно хуже, чем вызов "встроенного" действия контроллера, т.к. последнее всё равно сначала превращается в отдельный объект класса CInlineAction, а уж потом этот объект вызывает соответствующий метод контроллера. Вероятно, это сделано для унификации работы с разными видами actions.

Ну и, разумеется, виджет может сам данные забирать прямо в своём методе run(), например, из массива $_GET. А вот “actions”, которые можно было бы заложить в “route”, у самого виджета - увы - нет, несмотря на наличие метода actions(). :)

У меня похожая проблема (виджет загружает CGridView через ajax и при этом рабатает и сортировка и пагинация и фильтрация) я ее решил таким образом для себя не знаю на сколько это верно:

  1. создал action в отдельном файле

?php

class ActionMy extends CAction

{

	public function run()

	{

		if(isset($_GET['id'])) {

			$model=new Model('search');

			if(isset($_GET['Model']))

				$model->attributes=$_GET['Model'];


			$model->service_id=$_GET['id'];


			if(isset($_GET['ajax'])) {

				$this->controller->renderPartial('/model/show',array(

					'model'=>$model,

				),false,true);

			} else {

				$this->controller->render('/model/show',array(

					'model'=>$model,

				));

			}

		} else throw new CHttpException(404,'The requested page does not exist.');

	}

}

2.В контролере в котором в виеве используеться виджет прописываем


	public function actions()

	{

		return array(

			'my' => 'admin.components.action.ActionMy',

		);

	}

3.Не забываем про accessRules.

Как быть с виджетом содержащую форму тут можно поступить так, заменить input submit на ajaxSubmitButton и в success прописать нужные действия, урл указать как array(‘my’) без указания контролера

На форуме русскоязычного сайта Yii есть аналогичная тема.

Контроллер для виджета - как-то не правильно (моё мнение).

После экспериментов понял, данные FORM отправляются и контроллеру страницы и всем виджетам/гаджетам, которые есть на странице.

Я решил эту проблему так:

1)Для всех FORM проекта прописываю: CActiveForm, array(‘id’=>‘my_controller-form’)

2)Для всех submitButton array(‘id’ => ‘ххх’, ‘name’=>‘ххххх’)

3)Во всех обработчиках, вводимых пользователем данных, проверяю: из какой формы пришли данные, какая кнопка нажата…

captcha-м присвоил уникальные имена му_module-captcha.

Всё работает.