فرض کنید قراره URL ها در سایت به شکل زیر پیاده سازی بشه: (سایت دوزبانه بصورت fa/en هست)[/rtl]
Domain.com/language/module/controller/action
Or
Domain.com/language/controller/action
Example:
Domain.com/fa/admin/user/view
Domain.com/fa/user/view
[rtl]
2 مشکل هست.
1- در config/main چطور تنظیمات urlManager رو بنویسیم تا فورمات بالا پیاده سازی بشه؟
من بخش مربوط به این مبحث رو در مستندات Yii مطالعه کردم و چند راه حل به ذهنم رسید که البته برای هر کدام چند اشکال احتمالی هم ذهنم میاد.
ممنون میشم راه حل پیشنهادی دوستان رو بدونم.
2- چطور بر اساس پارامتر language که در URL قید شده، پارامتر Yii::app->language رو ست کنیم؟
من چند جا مثل خود فایل config/main.php و یا index.php سعی کردم اما موفق نبودم.
مثلا کد زیر هم پیام خطا می داد.
[/rtl]
class Controller extends CController
{
/**
* Init the Controller to set the language according the URL, first.
*/
public function init()
{
if (isset($_get('lang')) && strtolower($_get('lang'))=='fa')
{ Yii::app()->language='fa'; }
else {
Yii::app()->language='en';}
}
...
result:
Fatal error: Can't use function return value in write
context in .../protected/components
/Controller.php on line 13
در پاسخ به پرسش اول تون، من قواعدی که خودم در پروژه ها استفاده میکنم به شکل زیر هست. البته در صورت لزوم میتونید تغییرات لازم رو بدید، اما کلیات قضیه به همین شکل هست[/font]
برای قسمت دوم و کنترلر برنامه، کد زیر پاسخگوی نیاز من بوده و هست
[/font]
[/right]
// Set the application language if provided by GET or session
if(isset($_GET['language'])) {
Yii::app()->language = $_GET['language'];
Yii::app()->user->setState('language', $_GET['language']);
}
else if (Yii::app()->user->hasState('language')){
Yii::app()->language = Yii::app()->user->getState('language');
}
else{
Yii::app()->language = 'fa';
}
[right]
[font="Tahoma"]
[rtl]
زبان انتخابی کاربر در session هم ذخیره میشه تا اگر در URL قید نشده بود، زبان قبلی که باهاش کار میکرده انتخاب بشه
یه نکته دیگه هم وجود داره. شما باید تابع ساخت آدرس خود فریمورک ـ تابع createUrl ـ رو هم تغییر بدید
این کار باعث میشه که لینک هایی که با استفاده از این تابع میسازید ( که قاعدتا باید همه لینک های برنامه تون باشه ) هم قواعد زبانی رو رعایت کنند و با توجه به زبان فعلی، لینک های صحیحی بسازند
برای این کار باید یک کلاس UrlManager جدید بنویسید که از CUrlManager ارث بری میکنه. کد این کلاس به شکل زیر هست:
[/rtl][/font][/right]
<?php
class UrlManager extends CUrlManager
{
public function createUrl($route,$params=array(),$ampersand='&')
{
if (!isset($params['language'])) {
if (Yii::app()->user->hasState('language')){
Yii::app()->language = Yii::app()->user->getState('language');
}
$params['language']=Yii::app()->language;
}
return parent::createUrl($route, $params, $ampersand);
}
}
?>
[right][font="Tahoma"][rtl]
این فایل رو در پوشه component های پروژه قرار بدید. و در نهایت در کانفیگ برنامه تغییرات زیر رو اعمال کنید:
در رابطه با قواعد آدرس ها، خوشبختانه من تا بحال باهاش مشکلی نداشتم، اما اگر هم مشکلی وجود اومد مطرح بفرمایید دوستان اینجا کمک میکنند. و یا در فروم انگلیسی مطرح کنید که حتما پاسخ میگیرید
در رابطه با اون قطعه کد، محل قرار گرفتنش دقیقا همون جایی هست که شما تو پست اولتون قرار دادید. کلاس Controller که از کلاس CController ارث بری میکنه! کدی که من نوشتم تو تابع init() اون کلاس قرار میگیره.
و فقط کافیه که همه کنترلرهای شما از این کلاس Controller جدید ارث بری کنند.