نحوه تنظیم زبان سیستم بر اساس Url

[font="Tahoma"][rtl]سلام.

فرض کنید قراره 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]

[right]

[font="Tahoma"]سلام

در پاسخ به پرسش اول تون، من قواعدی که خودم در پروژه ها استفاده میکنم به شکل زیر هست. البته در صورت لزوم میتونید تغییرات لازم رو بدید، اما کلیات قضیه به همین شکل هست[/font]

[/right]


				

'<language:(fa|en)>/<controller:\w+>'=>'<controller>',

'<language:(fa|en)>/<module:\w+>/<controller:\w+>'=>'<module>/<controller>',

'<language:(fa|en)>/<controller:\w+>/<id:\d+>'=>'<controller>/view',

'<language:(fa|en)>/<module:\w+>/<controller:\w+>/<id:\d+>'=>'<module>/<controller>/view',

'<language:(fa|en)>/<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

'<language:(fa|en)>/<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

'<language:(fa|en)>/<module:\w+>/<controller:\w+>/<action:\w+>'=>'<module>/<controller>/<action>',



[right]

[font="Tahoma"]

برای قسمت دوم و کنترلر برنامه، کد زیر پاسخگوی نیاز من بوده و هست

[/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 قید نشده بود، زبان قبلی که باهاش کار میکرده انتخاب بشه

[/rtl]

[/font]

[/right]

[right][font="Tahoma"][rtl]

یه نکته دیگه هم وجود داره. شما باید تابع ساخت آدرس خود فریمورک ـ تابع 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 های پروژه قرار بدید. و در نهایت در کانفیگ برنامه تغییرات زیر رو اعمال کنید:

[/rtl][/font][/right]




'urlManager'=>array(

  'class'=>'application.components.UrlManager',

  'urlFormat'=>'path',

  'rules'=>array(

    /* proper rules, mentioned before */

  ),

),



[right][font="Tahoma"][rtl]

امیدوارم کمکی شده باشه : )

[/rtl][/font][/right]

[font="Tahoma"]

[rtl]

سلام دوست عزیز

خیلی ممنون از کمک شما

در خصوص پاسخ اول. من هم به همون ترکیب رسیده بودم. منتها به خاطر طولانی شدن کد و مبتدی بودنم فکر می کردم شاید

بعدها مشکلاتی ایجاد بشه. ممنونم که خیالم رو راحت کردید.

اما پیرامون کد بالا که زحمت کشیدید. ای کاش محل قرار دادن این کد رو هم مشخص می کردید.

اولین جایی که به ذهن من میرسید کنترلر بود. اما اینطوری باید تو هر کنترلر این کد تکرار بشه

بعد سعی کردم یک مدخل ورودی ایجاد کنم تا بلافاصله بعد از ست شدن کانفیگ، این کد اجرا بشه اما تا الان موفق نبودم.

اتفاقا سوال دیگری هم در این خصوص مطرح کردم که هنوز کسی از دوستان جوابی نداده.

[/rtl]

[/font]

[right][rtl][font="Tahoma"]

سلام

در رابطه با قواعد آدرس ها، خوشبختانه من تا بحال باهاش مشکلی نداشتم، اما اگر هم مشکلی وجود اومد مطرح بفرمایید دوستان اینجا کمک میکنند. و یا در فروم انگلیسی مطرح کنید که حتما پاسخ میگیرید

در رابطه با اون قطعه کد، محل قرار گرفتنش دقیقا همون جایی هست که شما تو پست اولتون قرار دادید. کلاس Controller که از کلاس CController ارث بری میکنه! کدی که من نوشتم تو تابع init() اون کلاس قرار میگیره.

و فقط کافیه که همه کنترلرهای شما از این کلاس Controller جدید ارث بری کنند.

[/font][/rtl][/right]