آموزش: بازنویسی تنظیمات پیشفرض سایت

[font="Tahoma"][rtl]

چیزی که ما میخوایم دقیقاً مشابه این مثاله: با وجودیکه زبان اصلی سایت توی فایل تنظیمات مشخص شده، بشه با کمک لینکهای خاصی، هرجا خواستیم زبان رو عوض کنیم و توی کل سایت، تا زمانی که زبان رو خودمون دوباره تغییر ندادیم، زبان جدید اعمال بشه و تنظیمات کلی سایت، نادیده گرفته بشه. حالا توضیح راه حل:

فرض کنید توی protected/config/main.php چنین تنظیماتی گذاشتین:

[/rtl][/font]




return array(

    ...

    'language' => 'rev',

    ...

    'params'=>array(

        ...

        'languages'=>array(

            'en_us',

            'rev',

        ),

    ),

);



[font="Tahoma"][rtl]

توی کد فوق، علاوه بر تنظیمات زبان، کل زبانهای مجاز تحت عنوان پارامتر languages توی برنامه تعریف میشه تا هرجا خواستیم با روش ['Yii::app()->params['languages بتونیم بهش دسترسی پیدا کنیم.

حالا اول از همه توی پوشه protected/components یک فایل جدید به اسم MyController.php بسازین و این کد رو داخلش بنویسید:

[/rtl][/font]




<?php

class MyController extends Controller

{

    public function init()

    {

        parent::init();

        $app = Yii::app();

        if (isset($app->session['lang']) && in_array($app->session['lang'], $app->params['languages']))

        {

            $app->setLanguage($app->session['lang']);

        }

    }

}



[font="Tahoma"][rtl]

اگه دقت کنید، این کلاس توی متد init (که بعد از construct__ توی Yii صدا زده میشه) داره میگه که اگه توی سشنهای برنامه، lang وجود داشت و جزو زبانهای مجاز بود، اونرو بعنوان زبان برنامه انتخاب کنه.

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

[/rtl][/font]




class SiteController extends MyController {

    ...

}



[font="Tahoma"][rtl]

حالا توی layout اصلی میخوایم دو تا گزینه به منوی بالای صفحه اضافه کنیم که کاربر بتونه زبان رو انتخاب کنه (شما میتونید DropDownList یا هر چیزی دیگه بگذارین). توی مثالی که گذاشتم، فایل layout توی مسیر themes/newtheme/views/layouts/main.php قرار گرفته. این دو منو رو اضافه میکنیم:

[/rtl][/font]




        <?php $this->widget('zii.widgets.CMenu',array(

            'items'=>array(

                array('label'=>'English', 'url'=>array('/site/lang', 'locale'=>'en_us')),

                array('label'=>'Reverse', 'url'=>array('/site/lang', 'locale'=>'rev')),

                ...

            ),

        )); ?>



[font="Tahoma"][rtl]

حالا اکشن lang رو به صورت زیر به protected/controllers/SiteController.php اضافه کنید:

[/rtl][/font]




    public function actionLang($locale) {

        $app = Yii::app();

        if(in_array($locale, $app->params->languages)) {

            $app->setLanguage($locale);

            $app->session['lang'] = $app->language;

        }

        $this->redirect($app->user->returnUrl);

    }



[font="Tahoma"][rtl]

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

[/rtl][/font]