[font="Tahoma"][rtl]
شاید خیلی مرسوم نباشه ولی واقعاً بعضی جاها نیاز پیدا میکنید که اکشن یا کلاً متد خاصی از یک کنترلر رو توی یک کنترلر دیگه صدا بزنید. این مسئله بخصوص وقتهایی ضروری میشه که یک کنترلر اصلی داشته باشین که نقش Router رو ایفا میکنه و همه درخواستها به اون میرسه (با کمک urlManager یا htaccess) و حالا توی اون کنترلر اصلی نیاز دارین که برحسب درخواست کاربر، اکشن خاصی رو از کنترلر دیگه، صدا بزنید. مثلاً فرض کنید urlManager رو اینطوری تنظیم کردین:
[/rtl][/font]
'urlManager' => array(
'urlFormat' => 'path',
'showScriptName' => false,
'rules' => array(
'<action:.+>' => 'site/index',
),
),
[font="Tahoma"][rtl]
حالا با چنین کدی توی actionIndex از کنترلر SiteController میتونید کارهای لازم رو برای فراخوانی اکشن مناسب از کنترلر دلخواه انجام بدین:
[/rtl][/font]
class SiteController extends Controller {
...
public function actionIndex() {
if(isset($_GET['action'])) {
switch(strtolower($_GET['action'])) {
case 'users/login':
list($users) = Yii::app()->createController('users');
$users->actionLogin();
break;
case 'users/register':
list($users) = Yii::app()->createController('users');
$users->actionRegister();
break;
default:
$this->render('error');
break;
}
}
}
...
}
[font="Tahoma"][rtl]البته یک روش دیگه هم هست:[/rtl][/font]
class SiteController extends Controller {
...
public function actionIndex() {
if(isset($_GET['action'])) {
Yii::import('application.controllers.*');
switch(strtolower($_GET['action'])) {
case 'users/login':
$users = new UsersController;
$users->actionLogin();
break;
case 'users/register':
$users = new UsersController;
$users->actionRegister();
break;
default:
$this->render('error');
break;
}
}
}
...
}
[font="Tahoma"][rtl]یا روش بهینه تر:[/rtl][/font]
class SiteController extends Controller {
...
public function actionIndex() {
if(isset($_GET['action'])) {
switch(strtolower($_GET['action'])) {
case 'users/login':
Yii::import('application.controllers.UserController');
$users = new UsersController;
$users->actionLogin();
break;
case 'users/register':
Yii::import('application.controllers.UserController');
$users = new UsersController;
$users->actionRegister();
break;
default:
$this->render('error');
break;
}
}
}
...
}
[font="Tahoma"][rtl]این روش از این جهت بهینه تره که برای هر کنترلر، فقط همون رو Import میکنه و به بقیه کنترلرها کاری نداره.
[/rtl][/font]