Насколько я понимаю, идея Yii состоит в том, чтобы определить внутри виджета в методе actions() список действий, которые контроллер будет вызывать из определённых для них там же отдельных классов, а уже каждое действие, в свою очередь, может вызвать какой-нибудь метод этого контроллера (его объект передаётся действию при запуске), который покажет виджет и передаст ему нужные данные. По производительности, кстати, это не должно быть сильно хуже, чем вызов "встроенного" действия контроллера, т.к. последнее всё равно сначала превращается в отдельный объект класса CInlineAction, а уж потом этот объект вызывает соответствующий метод контроллера. Вероятно, это сделано для унификации работы с разными видами actions.
Ну и, разумеется, виджет может сам данные забирать прямо в своём методе run(), например, из массива $_GET. А вот “actions”, которые можно было бы заложить в “route”, у самого виджета - увы - нет, несмотря на наличие метода actions().
У меня похожая проблема (виджет загружает CGridView через ajax и при этом рабатает и сортировка и пагинация и фильтрация) я ее решил таким образом для себя не знаю на сколько это верно:
создал 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’) без указания контролера