آموزش فریمورک yii

آموزش فریمورک yii

مقدمه

انتخاب یک پلتفرم یا فریمورک یا به بیان ساده تر چهارچوب برای پیاده سازی یک سایت مقوله مهم برای برنامه نویسان و طراحان وب است. شاید برنامه نویسان ویندوز انتخاب های مختلفی نداشته باشند و راحت باشند اما برای برنامه نویسان متن باز(open source) انتخاب فیریمورک بسیار مهم و سخت است.یکی ازفریمورک های مورد استفاده در برنامه نویسی php، فریمورکyii است که توسط برنامه نویسان مجرب ارائه شد.

آنچه در این مقاله می خوانید:

انتخاب یک پلتفرم یا فریمورک یا به بیان ساده تر چهارچوب برای پیاده سازی یک سایت مقوله مهم برای برنامه نویسان و طراحان وب است. شاید برنامه نویسان ویندوز انتخاب های مختلفی نداشته باشند و راحت باشند اما برای برنامه نویسان متن باز(open source) انتخاب فیریمورک بسیار مهم و سخت است.یکی ازفریمورک های مورد استفاده در برنامه نویسی php، فریمورکyii است که توسط برنامه نویسان مجرب ارائه شد.

Yii فقط از نسخه 5 و بالاتر پشتیبانی می کند. شاید در نگاه اول یک عیب محسوب شود اما سایر فریمورک ها برای تطابق با نسخه ۴ مجبورند بسیاری از قابلت های نسخه ۵ را نادیده بگیرند ولی با فریمورک yii  میتوانید از تمام قابلیت های نسخه 5 استفاده کنید.

مزایا و معایب فریمورک yii

مزایا و معایب فریمورک yii

مزایا:

گسترش پذیر و متن باز

ظرفیت ذخیره سازی بالا

قابلیت تغییر کلاس ها و توابع بدون نیاز به رمزگذاری

پاسخگویی با سرعت بالا

دارای اسناد و فایل جهت معرفی کلاس ها و توابع

معایب:

ساده نیست و کار با ان سخت است.

سرعت در توسعه ان پایین است.

مدیریت کلاس ها و توابع دشوار است.

 

نصب فریم ورک yii

بهترین راه برای شروع با (Yii2) استفاده از قالب برنامه ای است که توسط تیم یYii2 فراهم شده است.این قالب همچنین از طریق ابزارComposer قابل استفاده است

  • گام اول

یک پوشه مناسب در هارد پیداکنید وComposerرو با فرمان زیر دانلود کنید.

curl -sS https://getcomposer.org/installer | php
  • گام دوم

سپس این آرشیو رو به پوشه Binانتقال دهید.

mv composer.phar /usr/local/bin/composer
  • گام سوم

بانصبComposer شما میتونید قالب پایه فریم ورک یی رو نصب کنید.این فرمان رو اجراکنید.

composer global require "fxp/composer-asset-plugin:~1.1.1

composer create-project --prefer-dist yiisoft/yii2-app-basic helloworld

دستور اول پلاگین های مورد نیاز رانصب میکند،که NPMوفایل های وابسته به آن را مدیریت میکند.فرمان دوم قالب های پایه ومورد نیاز یی2 را در یک پوشه به نام”Hello world”نصب میکنئ

  • گام چهارم

اکنون پوشه”Hello world”رو باز کنید وفایلWebserver.phpرو اجراکنید.

php -S localhost:8080 -t web

البته این فریم ورک  را میتوانید از لینک www.yiiframework.com/downloadبصورت آرشیو شده دریافت کنید و در پوشه local خودقرار دهید.

  • گام پنجم

سپس آدرس  http://localhost:8080 را در مرورگرخود باز کنید. صفحه خوش آمد گویی را خواهید دید.

 

بیشتر بخوانید :

ساختار یک اپلیکیشن در Yii

یک پوشه در کدپایه کلی وجود دارد که عموما برای وب سرور موجود است و آن Web directoryاست.پوشه های دیگر بیرون  Web root directoryبرای وب سرور غیر قابل دسترس است.

نکته:همه وابسته های پروژه در فابل Composer.json قراردارد. yii 2  پکیج های تقریبا مهم رادارد که قبلا در فایل Composer.json قرارگرفته است.پکیج های عبارتند از:

 

  • Gii – The code generator tool
  • The debug console
  • The Codeception testing framework
  • The SwiftMailer library
  • The Twitter Bootstrap UI library

سه پکیج اول فقط برای محیط برنامه نویسی قابل استفاده اند.

ساختار اپلیکیشن های yii2  دقیق و واضح است وشامل پوشه های زیر است:

Assets

این پوشه شامل همه فایل های باپسوند(.js)و(.css) که به صفحه وب اشاره میکنند است.

Commands

این پوشه ها شامل کنترلر هایی است که میتولند درTerminalاستفاده شوند.

Config

این پوشه شامل فایلهایConfigکه برای مدیریت پایگاه داده اپلیکیشن ها وپارامتر های اپلیکیشن استفاده میشود است.

Mail

lاین پوشه شامل Mail layoutاست.

Models

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

Runtime

این پوشه برای نگهداری داده های زمان اجراست.

Tests

این پوشه شامل تمام تست های برنامه میشود(مثل پذیرش،ولحد ها وتایعی).

Vendor

این پوشه شامل تمام پکیج هایThird-partyاست که باcomposerمدیریت میشوند.

Views

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

Web

این پوشه برای نقطه دسترسی از وب است.

ساختار اپلیکیشن

این ارائه نموداری زیر ساختار اپلیکیشن رامعرفی میکند.

 

yii2 -اشیا

لیست زیر شامل تمام اشیا موجود در yii است مدل ها،Viewهاوکنترلرها

مدل ها برای ارائه داده هااست(معمولا از پایگه داده)Viewبرای نشان دادن داده وکنترلرهابرای پردازش درخواست هاو تولید پاسخ هستند.

کامپوننت ها

برای قابلیت استفاده مجدد،کاربر میتواند کامپوننت موردنظر خود رابنویسد،کامپوننت ها فقط اشیایی هستند که حاوی منطق است،برای مثال یک کامپوننت میتواند یک مبدل وزن باشد.

کامپوننت های برنامه

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

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

فیلترها

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

افزونه ها

افزونه ها پکیج هایی هستند که میتوانند باComposerمدیریت شوند.

مدل ها در Yii

مدل ها اشيايي هستند که منطق و قانون را نشان مي دهند. براي ساخت يک مدل بايد کلاسyii \base\Model يا زير کلاس هايش را گسترش دهيم.

ويژگي ها

صفت ها يا همان ويژگي ها داده هاي تجاري را نشان مي دهند. آنها مي توانند مانند عناصر يک آرايه يا خصوصيات يک شي در برنامه نویسی بدست آيند.

هر صفت يک خصوصيت با دسترسي عمومي از يک مدل است. براي تعيين کردن اينکه يک مدل داراي چيست، شما بايد مقدار متد attributes() را از yii \base\Model دوباره تغيير دهيد.

بگذاريد به مدل ContactForm از قالب پايه برنامه نگاه بيندازيم:

 

<?php

   namespace app\models;

   use Yii;

   use yii\base\Model;

   /**

   * ContactForm is the model behind the contact form.

   */

   class ContactForm extends Model {

      public $name;

      public $email;

      public $subject;

      public $body;

      public $verifyCode;

      /**

      * @return array the validation rules.

      */

      public function rules() {

         return [

            // name, email, subject and body are required

            [['name', 'email', 'subject', 'body'], 'required'],

            // email has to be a valid email address

            ['email', 'email'],

            // verifyCode needs to be entered correctly

            ['verifyCode', 'captcha'],

         ];

      }

      /**

      * @return array customized attribute labels

      */

      public function attributeLabels() {

         return [

            'verifyCode' => 'Verification Code',

         ];

      }

      /**

      * Sends an email to the specified email address using the information

         collected by this model.

      * @param  string  $email the target email address

      * @return boolean whether the model passes validation

      */

      public function contact($email) {

         if ($this->validate()) {

            Yii::$app->mailer->compose()

               ->setTo($email)

               ->setFrom([$this->email => $this->name])

               ->setSubject($this->subject)

               ->setTextBody($this->body)

               ->send();

            return true;

         }

         return false;

      }

   }

?>

گام اول—يک تابع به نام n actionShowContactModel درSiteController با کد زير ايجاد کنيد:

public function actionShowContactModel() {

   $mContactForm = new \app\models\ContactForm();

   $mContactForm->name = "contactForm";

   $mContactForm->email = "user@gmail.com";

   $mContactForm->subject = "subject";

   $mContactForm->body = "body";

   var_dump($mContactForm);

}

در کد بالا،ما مدلContactForm را تعريف کرديم،ويژگي ها را تنظيم کرديم ومدل را در صفحه نمايش داديم.

گام دوم—اکنون اگر http://localhost:8080/index.php?r=site/show-contact-model را تايپ کنيم تصوير زير را خواهيم ديد:

اگر مدل شما از پوشه yii\base\Model گسترش يابد پس همه متغير هاي آن صفاتش هستند.سه صفت در مدلContactForm وجود دارد ازجمله: name, email, subject, body, verifyCode البته ميتوانيد صفات ديگري اضافه کنيد.

برچسب صفات

گاهي اوقات نياز داريد که برچسب هايي که باصفات در ارتباطند را نشان دهيد.بطور پيش فرض برچسب هاي صفات بطور خودکار بوسيله متدgenerateAttributeLabel()  درyii \base\Model توليد ميشود براي مقدار دهي دستي برچسب هاي صفات بايد متدattributeLabels()  رادرyii \base\Model مقداردهي کنيد.

گام اول—اگر آدرس http://localhost:8080/index.php?r=site/contact زير را باز کنيد اين تصوير را خواهيد ديد:

توجه داشته باشيد که برچسب هاي صفات همان نام هايشان هستند.

گام دوم—اکنون تابع – attributeLabelsراکه در مدلContactForm است،به اين شکل تغيير دهيد:

public function attributeLabels() {

   return [

      'name' => 'name overridden',

      'email' => 'email overridden',

      'subject' => 'subject overridden',

      'body' => 'body overridden',

      'verifyCode' => 'verifyCode overridden',

   ];

}

 

گام سوم—اگر آدرس http://localhost:8080/index.php?r=site/contact رادوباره باز کنيد،متوجه خواهيد شد که برچسب همانطور که در تصوير مي بينيد تغيير کرده اند.

سناريو ها

شما ميتوانيد يک مدل را در سناريو هاي مختلفي استفاده کنيد.براي مثال زماني که يک مهمان ميخواهد که يک فرم ارتباط بفرستد،ما تمام صفات مدل را نياز داريم. وقتي کاربر بخواهد اين کار را انجام دهد اگر قبلا لاگين شده باشد،پس ما نامش را نياز نداريم پس به سادگي ميتوانيم نامش را ازديتابيس بخوانيم.

براي اعلام سناريو، ما بايد تابعscenarios() را مقدار دهي کنيم. در نتيجه يک آرايه برمي گرداند که کليد هايش نام هاي سناريو و مقدارهايش صفات فعال (active attributes)است. صفات فعال براي معتر کردن سناريو است.که ميتواند به مقدار زيادي اختصاص داده شوند.

گام اول—مدل ContactForm را به اين صورت تغيير ميدهيم:

<?php

   namespace app\models;

   use Yii;

   use yii\base\Model;

   /**

   * ContactForm is the model behind the contact form.

   */

   class ContactForm extends Model {

      public $name;

      public $email;

      public $subject;

      public $body;

      public $verifyCode;

      const SCENARIO_EMAIL_FROM_GUEST = 'EMAIL_FROM_GUEST';

      const SCENARIO_EMAIL_FROM_USER = 'EMAIL_FROM_USER';

      public function scenarios() {

         return [

            self::SCENARIO_EMAIL_FROM_GUEST => ['name', 'email', 'subject',

               'body', 'verifyCode'],

            self::SCENARIO_EMAIL_FROM_USER => ['email' ,'subject', 'body',

               'verifyCode'],

         ];

      }

      /**

      * @return array the validation rules.

      */

      public function rules() {

         return [

            // name, email, subject and body are required

            [['name', 'email', 'subject', 'body'], 'required'],

            // email has to be a valid email address

            ['email', 'email'],

            // verifyCode needs to be entered correctly

            ['verifyCode', 'captcha'],

         ];

      }

      /**

      * @return array customized attribute labels

      */

      public function attributeLabels() {

         return [

            'name' => 'name overridden',

            'email' => 'email overridden',

            'subject' => 'subject overridden',

            'body' => 'body overridden',

            'verifyCode' => 'verifyCode overridden',

         ];

      }

      /**

      * Sends an email to the specified email address using the information

         collected by this model.

      * @param  string  $email the target email address

      * @return boolean whether the model passes validation

      */

      public function contact($email) {

         if ($this -> validate()) {

            Yii::$app->mailer->compose()

               ->setTo($email)

               ->setFrom([$this->email => $this->name])

               ->setSubject($this->subject)

               ->setTextBody($this->body)

               ->send();

            return true;

         }

         return false;

      }

   }

?>

 

ما دو سناريو را اضافه کرديم. يکي براي مهمان و ديگري براي کاربر شناسايي شده. وقتي يک کاربر شناسايي ميشود،مابه نامش نيازي نداريم.

گام دوم—اکنون تابع actionContact را ازSiteController تغيير ميدهيم:

public function actionContact() {

   $model = new ContactForm();

   $model->scenario = ContactForm::SCENARIO_EMAIL_FROM_GUEST;

   if ($model->load(Yii::$app->request->post()) && $model->

      contact(Yii::$app->params ['adminEmail'])) {

         Yii::$app->session->setFlash('contactFormSubmitted');

         return $this->refresh();

   }

   return $this->render('contact', [

      'model' => $model,

   ]);

}

 

گام سوم—آدرس http://localhost:8080/index.php?r=site/contact راوارد کنيد. متوجه خواهيد شد که تمام صفات مدل ها ضروري است.

گام چهارم—اگر سناريوي يک مدل را درactionContact تغيير دهيد، همينطور که در کد زير آمده،شما مي بينيد که صفت نام ديگر ضروري نيست.

$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;

اختصاص دادن انبوه يا کلي

مقداردهي انبوه يک راه آسان براي ساخت يک مدل باورودي هاي چندتايي فقط بايک خط کد است!!

کدها اين هستند

$mContactForm = new \app\models\ContactForm;

$postData = \Yii::$app->request->post('ContactForm', []);

$mContactForm->name = isset($postData['name']) ? $postData['name'] : null;

$mContactForm->email = isset($postData['email']) ? $postData['email'] : null;

$mContactForm->subject = isset($postData['subject']) ? $postData['subject'] : null; $mContactForm->body = isset($postData['body']) ? $postData['body'] : null;

    : کد بالامعادل کد زير است

کد قبلي ساده تر است. البته توجه داشته باشيد که مقداردهي انبوه فقط رويsafe attributes اعمال ميشود. آنها فقط صفات سناريو جاري هستند که در تابعscenario() ليست شده اند.

خروجي گرفتن از داده مدل ها معمولا نياز به خروجي گرفتن در فرمت هاي مختلف است.براي تبديل مدل به آرايه بايد تابعactionShowContactModel را ازSiteController ويرايش کنيد

 

public function actionShowContactModel() {

   $mContactForm = new \app\models\ContactForm();

   $mContactForm->name = "contactForm";

   $mContactForm->email = "user@gmail.com";

   $mContactForm->subject = "subject";

   $mContactForm->body = "body";

   var_dump($mContactForm->attributes);

}

 

به آدرس http://localhost:8080/index.php?r=site/show-contact-model برويد نتيجه به اين شکل است:

براي تبديل مدل به فرمتJSON تابع actionShowContactModel را به اين شکل ويرايش کنيد:

public function actionShowContactModel() {

   $mContactForm = new \app\models\ContactForm();

   $mContactForm->name = "contactForm";

   $mContactForm->email = "user@gmail.com";

   $mContactForm->subject = "subject";

   $mContactForm->body = "body";

   return \yii\helpers\Json::encode($mContactForm);

}

خروجي مرورگر

{

   "name":"contactForm",

   "email":"user@gmail.com",

   "subject":"subject",

   "body":"body ",

   "verifyCode":null

}

نکات مهم

مدل ها معمولا از کنترلر سريع و درقالب و طراحي بهتري هستند مدل ها بايد:

شامل business logic

شامل قوانين اعتبار سنجي

شامل ويژگي ها وصفات

شامل کلمه HTML نباشد

دسترسي مستقيم به تقاضا ها ندارد

پاسخ ها در Yii

وقتی که اپلیکیشن یک درخواست را مدیریت میکند،یک شی پاسخ را که شامل سربرگ های body,HTTP کدهای وضعیت HTTPاست راتولید میکند دربیشتر مواقع شما از کامپوننت پاسخ برنامه استفاده میکنید بطور پیش فرض یک  شی از نوعyii\web\Response است.

برای مدیریت کدهای وضعیتHTTP،ازاین خصوصیت استفاده کنیدyii\web\Response::$statusCode

مقدار پیش فرض آن 200 است.

گام اول—یک تابع به نامactionTestResponse در SiteController اضافه کنید.

public function actionTestResponse() {

   Yii::$app→response->statusCode = 201;

}

گام دوم—اگربه آدرسhttp://localhost:8080/index.php?r=site/testresponse بروید خواهید دید که 201یک پاسخ وضعیتHTTP ایجاد کرده است.

اگر بخواهید نشان دهید که درخواست ناموفق است باید یکی از استثناهای ازپیش تعریف شده HTTP را استفاده کنید:

  • yii\web\BadRequestHttpException − کدوضعیت 400.
  • yii\web\UnauthorizedHttpException − کدوضعیت 401.
  • yii\web\ForbiddenHttpException − کدوضعیت 403.
  • yii\web\NotFoundHttpException − کدوضعیت 404.
  • yii\web\MethodNotAllowedHttpException − کدوضعیت 405.
  • yii\web\NotAcceptableHttpException − کدوضعیت 406.
  • yii\web\ConflictHttpException − کدوضعیت 409.
  • yii\web\GoneHttpException − کدوضعیت 410.
  • yii\web\UnsupportedMediaTypeHttpException − کدوضعیت 415.
  • yii\web\TooManyRequestsHttpException − کدوضعیت 429.
  • yii\web\ServerErrorHttpException − کدوضعیت 500. گام سوم—تابع actionTestResponse را همانطور که نشان داده شده را ویرایش کنید.
public function actionTestResponse() {

   throw new \yii\web\GoneHttpException;

}

گام چهارم—به این آدرس بروید http://localhost:8080/index.php?r=site/test-response میبینید که کد پاسخ ناموفق(410) در این تصویر دیده میشود.

گام پنجم—شمامیتوانید سربرگ های HTTPرا با ویرایش خصوصیتHeaders از کامپوننت response ارسال کنید،برای اضافه کردن یک headerجدید به response،تابع actionTestResponse را به این شکل ویرایش کنید.

public function actionTestResponse() {

   Yii::$app->response->headers->add(‘Pragma’, ‘no-cache’);

}

گام ششم—به آدرس http://localhost:8080/index.php?r=site/test-response بروید سربرگ برنامه مان راخواهید دید.

Yiiفرمت پاسخ های زیر را پشتیبانی میکند:

HTML—پیاده سازی شده با yii\web\HtmlResponseFormatter

XML—پیاده سازی شده با yii\web\XmlResponseFormatter

JSON—پیاده سازی شده با yii\web\JsonResponseFormatter

JSONP—پیاده سازی شده با yii\web\JsonResponseFormatter

RAW—پاسخ بدون هیچ فرمتی

گام هفتم—برای پاسخ دادن در فرمتJSON،تابع  actionTestResponse را ویرایش کنید.

public function actionTestResponse() {

   \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

   return [

      'id' => '1',

      'name' => 'Ivan',

      'age' => 24,

      'country' => 'Poland',

      'city' => 'Warsaw'

   ];

}

 

گام هشتم—اکنون به آدرسhttp://localhost:8080/index.php?r=site/test-response بروید میتوانید پاسخ زیر را بافرمتJSON ببینید.

Yiiیک تغییر مسیر در مرورگر را با ارسان محل سربرگHTTP را پیاده میکند.شمامیتوانیدمتد redirect() را برای ارجاع کاربر به آدرس دیگر استفاده کنید.

گام نهم—تابع actionTestResponse را به این شکل ویرایش کنید.

public function actionTestResponse() {

   return $this->redirect('http://www.tutorialspoint.com/');

}

ارسال فایلها

Yii روش های زیر را برای پشتیبانی از ارسال فایلها فراهم میکند.

  • yii\web\Response::sendFile()—فایل موجود را ارسال میکند.
  • yii\web\Response:: sendStreamAsFile() —فایل استریم موجود را به عنوان یک فایل ارسال میکند.
  • yii\web\Response::sendContentAsFile()—یک رشته متن را به عنوان یک فایل ارسال میکند.

تابعactionTestResponse را به این شکل ویرایش کنید.

public function actionTestResponse() {

   return \Yii::$app->response->sendFile('favicon.ico');

}

 

به این آدرس برویدhttp://localhost:8080/index.php?r=site/test-response یک کادر برای دانلود فایلfavicon.ico خواهید دید.

پاسخ ارسال نخواهد شد تاوقتیکه تابع send() خوانده نشده است بطور پیش فرض این متد درآخر متذ run() فراخوانی میشود

برای ارسال یک پاسخ ،متد send() این مراحل را طی میکند.

  • رویدادyii\web\Response::EVENT_BEFORE_SEND را اجرا میکند.
  • متد yii\web\Response::prepare() را فراخوانی میکند.
  • رویداد yii\web\Response::EVENT_AFTER_PREPARE را اجرا میکند.
  • متد yii\web\Response::sendHeaders() را فراخوانی میکند.
  • متد yii\web\Response::sendContent() را فراخوانی میکند.
  • رویداد yii\web\Response::EVENT_AFTER_SEND را اجرا میکند.

ویجت ها در فریمورک yii

ویجت یک کد با قابلیت استفاده مجدد طرف کلاینت است،که شامل CSS,JS , زبان برنامه نویسی HTML میشود. ساخت ویجت ها در برنامه نویسی فریم ورک yii یک کد منطقی کوچک است که داخل شی yii\base\Widget قرار دارد.که ما به راحتی میتوانیم این شی را در هرViewاضافه و اعمال کنیم.

گام اول—برای دیدن ویجت ها در اکشن،باید یک تابعactionTestWidget را در SiteController باکد زیر ایجاد کنیم:

public function actionTestWidget() {

return $this->render('testwidget');

}

در مثال بالا،ما یک Viewبه نام“testwidget”. را برگرداندیم.

گام دوم—اکنون داخل پوشهviews/site یک فایلViewبه نامtestwidget.php ایجاد کنید:

<?php

   use yii\bootstrap\Progress;

?>

<?= Progress::widget(['percent' => 60, 'label' => 'Progress 60%']) ?>

گام سوم—اگر به آدرس http://localhost:8080/index.php?r=site/test-widget بروید،این نوار پیشرفت را خواهید دید:

استفاده از ویجت

برای استفاده از آن در یکView،باید تابعwidget() را از yii\base\Widget فراخوانی کنید.این تابع یک آرایه پیکربندی برای مقدار دهی اولیه نیاز دارد.درمثال قبلی ما یک نوار پیشرفت باعلامت درصد اضافه کردیم وپارامترهای پیکربندی شی نشان داده شدند.

بعضی از آن ها یک بلوک از محتوا را می گیرند.که باید با توابع begin() وend() درyii\base\Widget محصور شود.

برای مثال ویجت زیر یک فرم ارتباط را نشان می دهد:

<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>

   <?= $form->field($model, 'name') ?>

   <?= $form->field($model, 'email') ?>

   <?= $form->field($model, 'subject') ?>

   <?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>

   <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [

      'template' =>

         '<div class="row">

            <div class = "col-lg-3">{image}</div>

            <div class = "col-lg-6">{input}</div>

         </div>',

   ]) ?>

   <div class = "form-group">

      <?= Html::submitButton('Submit', ['class' => 'btn btn-primary',

         'name' => 'contact-button']) ?>

   </div>

<?php ActiveForm::end(); ?>

ساخت ویجت ها

برای ساخت آن ها ،از پوشهyii\base\Widget استفاده کنید.سپس باید توابعinit() وrun() راازyii\base\Widget مقداردهی کنید.تابعrun() باید نتیجه رندر را نشان دهد وتابعinit() باید خصوصیات ویجت را نرمال سازی کند.

گام اول—یک پوشه components درپوشه اصلی پروژه ایجاد کنید.داخل آن پوشه یک فایل به نام FirstWidget.php  باکد زیر بسازید:

<?php

   namespace app\components;

   use yii\base\Widget;

   class FirstWidget extends Widget {

      public $mes;

      public function init() {

         parent::init();

         if ($this->mes === null) {

            $this->mes = 'First Widget';

         }

      }

      public function run() {

         return "<h1>$this->mes</h1>";

      }

   }

?>

گام دوم—testwidget view رابه شکل زیر ویرایش کنید:

<?php

   use app\components\FirstWidget;

?>

<?= FirstWidget∷widget() ?>

گام سوم—به این آدرس برویدhttp://localhost:8080/index.php?r=site/test-widget تصویر زیر ظاهر میشود:

آموزش 0 تا 100 ویجت ها

گام چهارم—برای محصور کردن محتوا بین توابعbegin() وend() شما باید فایلFirstWidget.php را ویرایش کنید:

<?php

   namespace app\components;

   use yii\base\Widget;

   class FirstWidget extends Widget {

      public function init() {

         parent::init();

         ob_start();

      }

      public function run() {

         $content = ob_get_clean();

         return "<h1>$content</h1>";

      }

   }

?>

گام پنجم—اکنون تگ های H1 کل محتوا را می گیرند.توجه داشته باشید که ما ازتابع ob_start() برای دخیره موقت خروجی استفاده می کنیم. testwidget view را همان طور که در کد زیر آمده ویرایش کنید:

<?php

   use app\components\FirstWidget;

?>

<?php FirstWidget::begin(); ?>

   First Widget in H1

<?php FirstWidget::end(); ?>

شما خروجی زیررا خواهید دید:

آموزش 0 تا 100 ویجت ها

نکات مهم

ویجت ها باید:

  • با الگوی MVC ساخته شده باشد.شما باید لایه های ارایه درViewو Logicرادر کلاس های widget نگهداری کنید.
  • طراحی شده برای داشتن خودکار داده ها.توسعه دهنده نهایی باید قادر به طراحی آن به یکviewباشد.

ماژول ها در Yii

ماژول یک موجودیت است که مدل ها، viewها، کنترلرها و احتمالا ماژول های دیگر خودش را دارد. در واقع ماژول یک اپلیکیشن داخل اپلیکیشن دیگر است.

گام اول—یک پوشه به نام Modules داخل پوشه اصلی پروژه خود ایجاد کنید. داخل آن پوشه یک پوشه دیگر به نام hello بسازید. این پوشه اصلی برای ماژول Hello خواهد بود.

گام دوم—داخل پوشه Hello یک فایل به نام Hello.php با کدهای زیر ایجاد کنید.

<?php

   namespace app\modules\hello;

   class Hello extends \yii\base\Module {

      public function init() {

         parent::init();

      }

   }

?>

ما یک کلاس ماژول ساختیم. این کلاس باید در مسیر اصلی قرار داده شود.هروقت که به آن دستیابی می شود، یک شی مطابق کلاس module ساخته میشود.تابع init () برای مقداردهی اولیه خصوصیات آن استفاده میشود.

گام سوم—اکنون دو پوشه داخل پوشه Hello اضافه کنید—کنترلر ها و viewها .یک فایل به نام CustomController.php داخل پوشه کنترلر اضافه کنید.

<?php

   namespace app\modules\hello\controllers;

   use yii\web\Controller;

   class CustomController extends Controller {

      public function actionGreet() {

         return $this->render('greet');

      }

   }

?>

گام چهارم—داخل یک پوشه دلخواه یک فابل به نام greet.php با کد زیر ایجاد کنید.

<h1>Hello world from custom module!</h1>

ما یک view برای actionGreet مان ایجاد کردیم. برای استفاده از این module جدید،باید اپلیکیشن راپیکربندی کنیم. ما باید module مان را به خصوصیات module ها  اپلیکیشن اضافه کنیم.

گام  پنجم—فایلconfig/web.php راویرایش کنید.

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this is

               //required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'levels' => ['error', 'warning'],

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

مسیر کنترلر module باید با ID ماژول به همراه ID کنترلر و action ID شروع شود.

گام ششم—برای اجرای actionGreet در اپلیکیشن مان باید از مسیر زیر استفاده کنیم.

hello/custom/greet

جایی که hello یک module است custom یک controller ID است و greet یک action ID.

گام هفتم—اکنون به آدرسhttp://localhost:8080/index.php?r=hello/custom/greet  بروید تصویر زیرراخواهید دید.

نکات مهم

ماژول ها باید:

  • در اپلیکیشن ها بزرگ استفاده شوند. شما میتوانید ویژگی هایش را به گروه های مختلف تقسیم کنید. هرگروه خصوصیت میتواند بعنوان یک module توسعه داده شود.
  • قابل استفاده مجدد باشند. بعضی ها عموما خصوصیات استفاده شده اند، بعنوان مدیریت SEO یا مدیریت وبلاگ که میتوانند بعنوان یک module توسعه یابند و به سادگی میتوانید در پروژه های آینده استفاده کنید.

 

استفاده از اعمال(Actions) در Yii

برای ساخت یک اکشن در کلاس کنترلر باید یک متد عمومی که نام اون با حرف(Action)شروع میشود تعریف کنید.داده خروجی اکشن جوابی که به کاربر نهایی ارسال میشود رانشان میدهد.

گام اول—اکشن Hello-worldرا در Examplecontrollerخود معرفی کنیم:

<?php

   namespace app\controllers;

   use yii\web\Controller;

   class ExampleController extends Controller {

      public function actionIndex() {

         $message = "index action of the ExampleController";

         return $this->render("example",[

            'message' => $message

         ]);

      }

      public function actionHelloWorld() {

         return "Hello world!";

      }

   }

?>

گام دوم—ا آدرس زیررا در مرورگرتان وارد کنید.

http://localhost:8080/index.php?r=example/hello-world تصویرزیررامی بینید:

Action IDها معمولاکاری را انجام میدهند مثل ساختن،آپدیت،حذف وغیره.بخاطر همین اکشن هااغلب برای انجام یک تغییر طراحی شده اندو

Action IDها باید فقط شامل این کاراکتر هاباشند.حروف کوچک انگلیسی،اعدلد،فاصله ها وزیرپخط ها.

دونوع اکشن وجوددارند: داخلی  و مستقل

اکشن های داخلی درکلاس کنترلر تعریف میشوند نام اکشن ها به این طریق از Action IDهابدست می آید:

  • حرف اول تمام کلمه هارا درAction ID به حروف کوچک تبدیل کنید.
  • فاصله هاراپاک کنید.
  • پیشوند Actionرااضافه کنید.

مثال ها

  • شاخص ها تبدیل بهAction indexمیشوند.
  • اکشن Hello-world که در مثال بالادیدیم تبدیل به Actionhelloworldمیشود.

ساخت یک کلاس اکشن مستقل

برای ساخت یک اکشن کلاس مستقل باید پوشه yii\base\Actionیا یک کلاس زیر مجموعه راگسترش دهید ویک متدrun() پیاده سازی کنید.

گام اول—یک پوشه Componentsدر پوشه اصلی پروژه خود ایجاد کنید.داخل آن پوشه یک فایل به نام GreetingAction.php باکد زیر ایجاد کنید.

<?php

   namespace app\components;

   use yii\base\Action;

   class GreetingAction extends Action {

      public function run() {

         return "Greeting";

      }

   }

?>

ما یک اکشن باقابلیت استفاده مجدد ایجاد کردیم.برای استفاده در ExampleController مان باید اکشن خودمان را در action map بوسیله overriding کردن متدactions() مقداردهی کنیم.

گام دوم—فایل ExampleController.php را به این صورت تغییر دهید:

  public function actionIndex() {

         $message = "index action of the ExampleController";

         return $this->render("example",[

            'message' => $message

         ]);

      }

      public function actionHelloWorld() {

         return "Hello world!";

      }

   }

?>

متدactions() یک آرایه ای بامقدارهای نام های کلاس وکلید ها وaction Ids را برمیگرداند.

گام سوم —به آدرس http://localhost:8080/index.php?r=example/greetingبروید خروجی را خواهید دید.

گام چهارم—شماهمچنین میتوانید کاربر را به آدرس دیگری بفرستید.اکشن زیر را در فایلExampleController.php

واردکنید.

public function actionOpenGoogle() {

   // redirect the user browser to http://google.com

   return $this->redirect('http://google.com');

}

 

حالا،اگر آدرس http:/خصوصیت را /localhost:8080/index.php?r=example/open-google را باز کنید،به صفحهhttp://google.com. ارجاع داده میشوید.متدهای اکشن میتوانند پارامتر بگیرند که اون وقت action parameters نامیده میشوند.مقدارهای انها از$_GET بااستفاده از پارامترKeyبدست می آید.

گام پنجم—اکشن زیر را در example controller خود اضافه کنید.

public function actionTestParams($first, $second) {

   return "$first $second";

}

گام ششم—آدرس http://localhost:8080/index.php?r=example/testparams&first=hello&second=world رادر مرورگر وارد کنید.نتیجه به این شکل است:

هرکنترلری یک اکشن پیش فرض دارد.زمانی که یک مسیر فقط شاملcontroller ID باشد،به این معنی است که این اکشن پیش فرض درخواست شده است.بطور پیش فرض اکشن یا عمل همانindex است.شما به آسانی میتوانید این خصوصیت را در کنترلر دوباره تغییر دهید.

گام هفتم—فایلExampleController خود را به این شکل تغییر می دهیم:

<?php

   namespace app\controllers;

   use yii\web\Controller;

   class ExampleController extends Controller {

      public $defaultAction = "hello-world";

      /* other actions */

   }

?>

 

گام هشتم—اکنون اگر به آدرس http://localhost:8080/index.php?r=example بروید این تصویر راخواهید دید:

برای انجام درخواست،کنترلر این چرخه را دنبال می کند:

  • متدinit() درyii\base\Controller فراخوانی میشود.
  • کنترلر یک اکشن براساسActionIDایجاد میکند.
  • کنترلر به ترتیب متدbeforeAction() راازبرنامه وب،ماژول وکنترلر فراخونی میکند.
  • کنترلر اکشن را اجرامیکند.
  • کنترلر به ترتیب متد afterAction() راازبرنامه وب،ماژول وکنترلر فراخونی میکند.
  • اپلیکیشن نتیجه اجرای اکشن را به جواب ارجاع می دهد.
  • نکته مهم

کنترلر باید:

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

ازViewبرای پاسخ استفاده کنید.

کلمه Htmlراقرار ندهید.

به داده های  درخواست دسترسی پیدا کنید.

متد های مدل ها را فراخوانی کنید.

داده های درخواست را پردازش نکنید.آنها باید در مدل پردازش شوند.

کنترلر ها در Yii

در yii  قسمت کنترلر ها مسئول پردازش تقاضاها و جواب دادن به کاربر است. کنترلر داده مورد تقاضا را آنالیز میکند و آنها را به مدل ها می دهد و سپس مدل نتیجه را به یک view می دهد و یک پاسخ را به کاربر ایجاد میکند.

کنترلر ها شامل اکشن ها (اعمال) هستند. آنها واحد های اصلی هستند که کاربر میتواند درخواست اجرا کند. یک کنترلر میتواند یک یا چند اکشن یا عمل داشته باشد
بگذارید نگاهی به sitecontroller درقالب پایه برنامه بیندازیم.

<?php

   namespace app\controllers;

   use Yii;

   use yii\filters\AccessControl;

   use yii\web\Controller;

   use yii\filters\VerbFilter;

   use app\models\LoginForm;

   use app\models\ContactForm;

   class SiteController extends Controller {

      public function behaviors() {

         return [

            'access' => [

               'class' => AccessControl::className(),

               'only' => ['logout'],

               'rules' => [

                  [

                     'actions' => ['logout'],

                     'allow' => true,

                     'roles' => ['@'],

                  ],

               ],

            ],

            'verbs' => [

               'class' => VerbFilter::className(),

               'actions' => [

                  'logout' => ['post'],

               ],

            ],

         ];

      }

      public function actions() {

         return [

            'error' => [

               'class' => 'yii\web\ErrorAction',

            ],

            'captcha' => [

               'class' => 'yii\captcha\CaptchaAction',

               'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,

            ],

         ];

      }

      public function actionIndex() {

         return $this->render('index');

      }

      public function actionLogin() {

         if (!\Yii::$app->user->isGuest) {

            return $this->goHome();

         }

         $model = new LoginForm();

         if ($model->load(Yii::$app->request->post()) && $model->login()) {

            return $this->goBack();

         }

         return $this->render('login', [

            'model' => $model,

         ]);

      }

      public function actionLogout() {

         Yii::$app->user->logout();

         return $this->goHome();

      }

      public function actionContact() {

         //load ContactForm model

         $model = new ContactForm();

         //if there was a POST request, then try to load POST data into a model

         if ($model->load(Yii::$app->request->post()) && $model>contact(Yii::$app->params

            ['adminEmail'])) {

            Yii::$app->session->setFlash('contactFormSubmitted');

            return $this->refresh();

         }

         return $this->render('contact', [

            'model' => $model,

         ]);

      }

      public function actionAbout() {

         return $this->render('about');

      }

      public function actionSpeak($message = "default message") {

         return $this->render("speak",['message' => $message]);

      }

   }

?>

قالب پایه برنامه (Basic application template) را با استفاده ازPHP built-in server اجرا کنید و این آدرس را در مرورگر وارد کنید (http://localhost:8080/index.php?r=site/contact.) صفحه زیر را مشاهده خواهید کرد.

زمانی که این صفحه را باز کردید عملکرد ارتباطSitecontroller اجرا میشود ابتدا کد مدل Contactform را بارگزاری میکند. سپس Contactview را رندر (ارئه) میکند و به مدل آن میدهد.

اگر فرم را کامل کنید و کلید ثبت را بزنید تصویر زیر را خواهید دید.

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

if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app>params ['adminEmail'])) {

   Yii::$app->session->setFlash('contactFormSubmitted');

   return $this->refresh();

}

 

اگر یک درخواست Post داشته باشیم ما داده های POST رابه مدل ارجاع میدهیم وتلاش به ارسال ایمیل میکنیم. اگر موفقیت آمیز بود یک پیام باعنوان”ممنون ازارتباطتون مابه زودی به شما پاسخ میدهیم “تنظیم میکنیم.و صفحه را دوباره لود میکنیم.

درک مسیر

درمثال بالا در آدرس (http://localhost:8080/index.php?r=site/contact) مسیر مورد نظرsite/contact است. عمل ارتباط (actionContact) درSiteController اجراخواهد شد.

در yii  قسمت کنترلر ها مسئول پردازش تقاضاها و جواب دادن به کاربر است. کنترلر داده مورد تقاضا را آنالیز میکند و آنها را به مدل ها می دهد و سپس مدل نتیجه را به یک view می دهد و یک پاسخ را به کاربر ایجاد میکند.

کنترلر ها شامل اکشن ها (اعمال) هستند. آنها واحد های اصلی هستند که کاربر میتواند درخواست اجرا کند. یک کنترلر میتواند یک یا چند اکشن یا عمل داشته باشد
بگذارید نگاهی به sitecontroller درقالب پایه برنامه بیندازیم.

<?php

   namespace app\controllers;

   use Yii;

   use yii\filters\AccessControl;

   use yii\web\Controller;

   use yii\filters\VerbFilter;

   use app\models\LoginForm;

   use app\models\ContactForm;

   class SiteController extends Controller {

      public function behaviors() {

         return [

            'access' => [

               'class' => AccessControl::className(),

               'only' => ['logout'],

               'rules' => [

                  [

                     'actions' => ['logout'],

                     'allow' => true,

                     'roles' => ['@'],

                  ],

               ],

            ],

            'verbs' => [

               'class' => VerbFilter::className(),

               'actions' => [

                  'logout' => ['post'],

               ],

            ],

         ];

      }

      public function actions() {

         return [

            'error' => [

               'class' => 'yii\web\ErrorAction',

            ],

            'captcha' => [

               'class' => 'yii\captcha\CaptchaAction',

               'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,

            ],

         ];

      }

      public function actionIndex() {

         return $this->render('index');

      }

      public function actionLogin() {

         if (!\Yii::$app->user->isGuest) {

            return $this->goHome();

         }

         $model = new LoginForm();

         if ($model->load(Yii::$app->request->post()) && $model->login()) {

            return $this->goBack();

         }

         return $this->render('login', [

            'model' => $model,

         ]);

      }

      public function actionLogout() {

         Yii::$app->user->logout();

         return $this->goHome();

      }

      public function actionContact() {

         //load ContactForm model

         $model = new ContactForm();

         //if there was a POST request, then try to load POST data into a model

         if ($model->load(Yii::$app->request->post()) && $model>contact(Yii::$app->params

            ['adminEmail'])) {

            Yii::$app->session->setFlash('contactFormSubmitted');

            return $this->refresh();

         }

         return $this->render('contact', [

            'model' => $model,

         ]);

      }

      public function actionAbout() {

         return $this->render('about');

      }

      public function actionSpeak($message = "default message") {

         return $this->render("speak",['message' => $message]);

      }

   }

?>

 

قالب پایه برنامه (Basic application template) را با استفاده ازPHP built-in server اجرا کنید و این آدرس را در مرورگر وارد کنید (http://localhost:8080/index.php?r=site/contact.) صفحه زیر را مشاهده خواهید کرد.

زمانی که این صفحه را باز کردید عملکرد ارتباطSitecontroller اجرا میشود ابتدا کد مدل Contactform را بارگزاری میکند. سپس Contactview را رندر (ارئه) میکند و به مدل آن میدهد.

اگر فرم را کامل کنید و کلید ثبت را بزنید تصویر زیر را خواهید دید.

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

if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app>params ['adminEmail'])) {

   Yii::$app->session->setFlash('contactFormSubmitted');

   return $this->refresh();

}

 

اگر یک درخواست Post داشته باشیم ما داده های POST رابه مدل ارجاع میدهیم وتلاش به ارسال ایمیل میکنیم. اگر موفقیت آمیز بود یک پیام باعنوان”ممنون ازارتباطتون مابه زودی به شما پاسخ میدهیم “تنظیم میکنیم.و صفحه را دوباره لود میکنیم.

درک مسیر

درمثال بالا در آدرس (http://localhost:8080/index.php?r=site/contact) مسیر مورد نظرsite/contact است. عمل ارتباط (actionContact) درSiteController اجراخواهد شد.

Assetها در Yii

در yii  قسمت کنترلر ها مسئول پردازش تقاضاها و جواب دادن به کاربر است. کنترلر داده مورد تقاضا را آنالیز میکند و آنها را به مدل ها می دهد و سپس مدل نتیجه را به یک view می دهد و یک پاسخ را به کاربر ایجاد میکند.

کنترلر ها شامل اکشن ها (اعمال) هستند. آنها واحد های اصلی هستند که کاربر میتواند درخواست اجرا کند. یک کنترلر میتواند یک یا چند اکشن یا عمل داشته باشد
بگذارید نگاهی به sitecontroller درقالب پایه برنامه بیندازیم.

<?php

   namespace app\controllers;

   use Yii;

   use yii\filters\AccessControl;

   use yii\web\Controller;

   use yii\filters\VerbFilter;

   use app\models\LoginForm;

   use app\models\ContactForm;

   class SiteController extends Controller {

      public function behaviors() {

         return [

            'access' => [

               'class' => AccessControl::className(),

               'only' => ['logout'],

               'rules' => [

                  [

                     'actions' => ['logout'],

                     'allow' => true,

                     'roles' => ['@'],

                  ],

               ],

            ],

            'verbs' => [

               'class' => VerbFilter::className(),

               'actions' => [

                  'logout' => ['post'],

               ],

            ],

         ];

      }

      public function actions() {

         return [

            'error' => [

               'class' => 'yii\web\ErrorAction',

            ],

            'captcha' => [

               'class' => 'yii\captcha\CaptchaAction',

               'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,

            ],

         ];

      }

      public function actionIndex() {

         return $this->render('index');

      }

      public function actionLogin() {

         if (!\Yii::$app->user->isGuest) {

            return $this->goHome();

         }

         $model = new LoginForm();

         if ($model->load(Yii::$app->request->post()) && $model->login()) {

            return $this->goBack();

         }

         return $this->render('login', [

            'model' => $model,

         ]);

      }

      public function actionLogout() {

         Yii::$app->user->logout();

         return $this->goHome();

      }

      public function actionContact() {

         //load ContactForm model

         $model = new ContactForm();

         //if there was a POST request, then try to load POST data into a model

         if ($model->load(Yii::$app->request->post()) && $model>contact(Yii::$app->params

            ['adminEmail'])) {

            Yii::$app->session->setFlash('contactFormSubmitted');

            return $this->refresh();

         }

         return $this->render('contact', [

            'model' => $model,

         ]);

      }

      public function actionAbout() {

         return $this->render('about');

      }

      public function actionSpeak($message = "default message") {

         return $this->render("speak",['message' => $message]);

      }

   }

?>

قالب پایه برنامه (Basic application template) را با استفاده ازPHP built-in server اجرا کنید و این آدرس را در مرورگر وارد کنید (http://localhost:8080/index.php?r=site/contact.) صفحه زیر را مشاهده خواهید کرد.

زمانی که این صفحه را باز کردید عملکرد ارتباطSitecontroller اجرا میشود ابتدا کد مدل Contactform را بارگزاری میکند. سپس Contactview را رندر (ارئه) میکند و به مدل آن میدهد.

اگر فرم را کامل کنید و کلید ثبت را بزنید تصویر زیر را خواهید دید.

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

if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app>params ['adminEmail'])) {

   Yii::$app->session->setFlash('contactFormSubmitted');

   return $this->refresh();

}

 

اگر یک درخواست Post داشته باشیم ما داده های POST رابه مدل ارجاع میدهیم وتلاش به ارسال ایمیل میکنیم. اگر موفقیت آمیز بود یک پیام باعنوان”ممنون ازارتباطتون مابه زودی به شما پاسخ میدهیم “تنظیم میکنیم.و صفحه را دوباره لود میکنیم.

درک مسیر

درمثال بالا در آدرس (http://localhost:8080/index.php?r=site/contact) مسیر مورد نظرsite/contact است. عمل ارتباط (actionContact) درSiteController اجراخواهد شد.

طرح ها(layouts) در Yii

Layoutها قسمت های عمومی viewهای چندتایی را نشان می دهد.برای مثال سربرگ وپانوشت صفحه بطور پیش فرض layoutهایی اند که باید در پوشهviews/layouts ذخیره شود.

بگذارید به طرح اصلی قالب پایه برنامه یک نگاهی بیندازیم:

<?php

/* @var $this \yii\web\View */

/* @var $content string */

use yii\helpers\Html;

use yii\bootstrap\Nav;

use yii\bootstrap\NavBar;

use yii\widgets\Breadcrumbs;

use app\assets\AppAsset;

AppAsset::register($this);

?>

<?php $this->beginPage() ?>

<!DOCTYPE html>

<html lang = "<?= Yii::$app->language ?>">

<head>

<meta charset = "<?= Yii::$app->charset ?>">

<meta name = "viewport" content = "width = device-width, initial-scale = 1">

<?= Html::csrfMetaTags() ?>

<title><?= Html::encode($this->title) ?></title>

<?php $this->head() ?>

</head>

<body>

<?php $this->beginBody() ?>

<div class = "wrap">

<?php

NavBar::begin([

'brandLabel' => 'My Company',

'brandUrl' => Yii::$app->homeUrl,

'options' => [

'class' => 'navbar-inverse navbar-fixed-top',

],

]);

echo Nav::widget([

'options' => ['class' => 'navbar-nav navbar-right'],

'items' => [

['label' => 'Home', 'url' => ['/site/index']],

['label' => 'About', 'url' => ['/site/about']],

['label' => 'Contact', 'url' => ['/site/contact']],

Yii::$app->user->isGuest ?

['label' => 'Login', 'url' => ['/site/login']] :

[

'label' => 'Logout (' . Yii::$app->user->identity->username.')',

'url' => ['/site/logout'],

'linkOptions' => ['data-method' => 'post']

],

],

]);

NavBar::end();

?>

<div class = "container">

<?= Breadcrumbs::widget([

'links' => isset($this->params['breadcrumbs']) ? $this>params

['breadcrumbs'] : [],

]) ?>

<?= $content ?>

</div>

</div>

<footer class = "footer">

<div class = "container">

<p class = "pull-left">© My Company <?= date('Y') ?></p>

<p class = "pull-right"><?= Yii::powered() ?></p>

</div>

</footer>

<?php $this->endBody() ?>

</body>

</html>

<?php $this->endPage() ?>

اینlayout صفحه html راکه برای تمام صفحات یکی است،تولید میکند.متغیر$content نتیجه رندرcontent views است.

متد زیر رویدادهای درباره پروسه رندرکردن را به راه می اندازد پس اسکریپت ها وتگ هادر مکان های دیگر اضافه می شود.

head()—باید داخل بخش Head فراخوانی شود.یک جانگه دار تولید میکند،که با HTMLثبت شده در مکان headجایگزین میشود.

beginBody()—باید در شروع بخشbodyفراخوانی شود.رویدادEVENT_BEGIN_BODY را راه اندازی می کند. یک جانگه دار تولید میکند،که با HTMLثبت شده در مکان شروعBODYجایگزین میشود.

endBody()—باید در آخر بخشbodyفراخوانی شود.رویدادEVENT_END_BODY را راه اندازی می کند. یک جانگه دار تولید میکند،که با HTMLثبت شده در مکان پایان BODYجایگزین میشود.

beginPage()—باید در آغاز یک layoutفراخوانی شود.که رویداد EVENT_BEGIN_PAGE را اجرا میکند.

endPage()—باید در پایان یک layoutفراخوانی شود.که رویداد EVENT_END_PAGE را اجرا میکند.

ساخت یک layout

داخل پوشه views/layouts یک فایل به نام newlayout.php با کد زیر بنویسید:

<?php

/* @var $this \yii\web\View */

/* @var $content string */

use yii\helpers\Html;

use yii\bootstrap\Nav;

use yii\bootstrap\NavBar;

use yii\widgets\Breadcrumbs;

use app\assets\AppAsset;

AppAsset::register($this);

?>

<?php $this->beginPage() ?>

<!DOCTYPE html>

<html lang = "<?= Yii::$app->language ?>">

<head>

<meta charset = "<?= Yii::$app->charset ?>">

<meta name = "viewport" content = "width = device-width, initial-scale = 1">

<? = Html::csrfMetaTags() ?>

<title><? = Html::encode($this->title) ?></title>

<?php $this->head() ?>

</head>

<body>

<?php $this->beginBody() ?>

<div class = "wrap">

<div class = "container">

<? = $content ?>

</div>

</div>

<footer class = "footer">

<div class = "container">

<p class = "pull-left">© My Company <?= date('Y') ?></p>

<p class = "pull-right"><? = Yii::powered() ?></p>

</div>

</footer>

<?php $this->endBody() ?>

</body>

</html>

<?php $this->endPage() ?>

ما نوارمنوی بالایی را حذف کردیم.

گام دوم—-برای اعمال این طرح به SiteController خصوصیت $layout رابه کلاس SiteController اضافه کنید:

<?php

namespace app\controllers;

use Yii;

use yii\filters\AccessControl;

use yii\web\Controller;

use yii\filters\VerbFilter;

use app\models\LoginForm;

use app\models\ContactForm;

class SiteController extends Controller {

public $layout = “newlayout”;

/* other methods */

}

?>

گام سوم—اکنون اگر به هرviewاز SiteController بروید،می بینیدکه طرح تغییر کرده است.

گام چهارم—برای ثبت meta tag هاشما می توانید متد registerMetaTag() را در یک content view فراخوانی کنید.

گام پنجم—About viewرا در SiteController ویرایش کنید.

<?php

/* @var $this yii\web\View */

use yii\helpers\Html;

$this->title = 'About';

$this->params['breadcrumbs'][] = $this->title;

$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,

meta, tags']);

$this->registerMetaTag(['name' => 'description', 'content' => 'This is the description

of this page!'], 'description');

?>

<div class="site-about">

<h1><?= Html::encode($this->title) ?></h1>

<p>

This is the About page. You may modify the following file to customize its content:

</p>

<code><?= __FILE__ ?></code>

</div>

 

ما دو meta tag راثبت کردیم—کلمه های کلیدی وتوضیحات—-

گام ششم—اکنون به آدرس http://localhost:8080/index.php?r=site/about بروید.می بینید که meta tag ها در بخشHeadصفحه در تصویر زیر نشان داده شده است.

Viewها رویدادهای زیادی را نشان می دهند.

EVENT_BEGIN_BODY —-در طرح ها بافراخوانی yii\web\View::beginBody().اجرا میشوند.

EVENT_END_BODY—- در طرح ها بافراخوانی yii\web\View::endBody()اجرا میشوند.

EVENT_BEGIN_PAGE—- در طرح ها بافراخوانی yii\web\View::beginPage(). اجرا میشوند.

EVENT_END_PAGE—- در طرح ها بافراخوانی yii\web\View::endPage().اجرا میشوند

EVENT_BEFORE_RENDER—-بوسیله کنترلردر شروع رندریک فایل اجرامیشود.

EVENT_AFTER_RENDER—بعداز رندر یک فایل اجرامیشود.

میتوانید به این رویدادهابرای اعمال محتوابه VIEWها استفاده کنید.

گام هفتم—برای نشان دادن تاریخ وزمان جاری درactionAbout ازSiteController به این شکل ویرایش کنید:

public function actionAbout() {

\Yii::$app->view->on(View::EVENT_BEGIN_BODY, function () {

echo date('m.d.Y H:i:s');

});

return $this->render('about');

}

گام هشتم—به این آدرس برویدhttp://localhost:8080/index.php?r=site/about

نکات مهم

برای مدیریت بهترviewها شما باید:

Viewهای پیچیده رابه کدهای کوچکتر تبدیل کنید.

از layoutها برای بخش های عمومیhtmlاستفاده کنید.

ازویجت های استفاده کنید.

Viewهاباید:

درخواست ها راپردازش نکنید.

خصوصیات مدل را ویرایش نکنید.

پرس وجوهای دیتابیس را انجام ندهید.

Viewها در Yii

Viewها مسئول ارائه داده به کاربران نهایی است.در برنامه های تحت  وب viewها فقط فایل های اسکریپت php هستند که شامل کدهای HTMLوPHPهستند.

ساختview

گام اول—بگذارید یک نگاهی به About viewاز قالب پایه برنامه بیندازیم:

<?php

   /* @var $this yii\web\View */

   use yii\helpers\Html;

   $this->title = 'About';

   $this->params['breadcrumbs'][] = $this->title;

?>

<div class="site-about">

   <h1><?= Html::encode($this->title) ?></h1>

   <p>

      This is the About page. You may modify the following file to customize its content:

   </p>

   <code><?= __FILE__ ?></code>

</div>

متغیر$this به کامپوننت هایviewمراجعه میکند که این قالب viewرامدیریت وارائه می کند:

تصویر صفحه About این شکلی است:

مهم است که داده های فیلتر های Andو OR راکه از کاربر نهایی برای جلوگیری از حملاتXSS می آید را رمز گشایی کنید.شما همیشه باید یک متن ساده را با خواندن تابعencode() ازyii\helpers\Html و محتوای HTML که  باyii\helpers\HtmlPurifier  فراخوانی میشود را رمزگشایی کنید.

گام دوم—About viewرا به این شکل ویرایش کنید.

گام سوم—اکنون به آدرس http://localhost:8080/index.php?r=site/about بروید صفحه زیر را مشاهده خواهید کرد:

توجه،کد جاوا اسکریپت که داخل تابعencode() وجود دارد بعنون یک متن ساده نمایش داده میشود.

همین اتفاق برای خواندن process() ازHtmlPurifier اتفاق می افتد و فقط تگ های H1نمایش می یابد.

Viewها از قوانین زیر پیروی می کنند.

  • Viewهایی که با کنترلر ها ارائه می شوند،باید داخل پوشه@app/views/controllerID قرارداده شوند.
  • viewهایی که با ویجت ارائه میشوند باید داخل پوشه widgetPath/views folder قرارداده شوند.

برای رندریک viewبا کنترلر،شما باید از روش زیر استفاده کنید:

  • render()—یکviewرارندرمی کندو به یک طرح اعمال میکند.
  • renderPartial()—یک viewرا بدون طرح رندر می کند.
  • renderAjax()—یک viewرا بدون طرح رندر می کند اما همه فایل هایCSSو JSرا اعمال میکند.
  • renderFile()—یک viewرا در مسیر فایل داده شده یا زیرمجموعه هایش رندر میکند.

گام چهارم—داخل پوشه views/site دوفایلviewایجاد کنید(part1.php and _part2.php.)

_part1.php –

<h1>PART 1</h1>

_part2.php –

<h1>PART 2</h1>

گام پنجم—بالاخره،این دوviewجدید راداخلAbout viewقراردهید:

<?php

/* @var $this yii\web\View */

use yii\helpers\Html;

$this->title = 'About';

$this->params['breadcrumbs'][] = $this->title;

?>

<div class="site-about">

<h1><?= Html::encode($this->title) ?></h1>

<p>

This is the About page. You may modify the following file to customize its content:

</p>

<?= $this->render("_part1") ?>

<?= $this->render("_part2") ?>

<code><?= __FILE__ ?></code>

</div>

خروجی به این شکل است:

وقتی که یک viewرا رندر میکنید،میتوانید viewرا بااستفاده از نامش یامسیرش تعریف کنید.نام یکviewبه این شکل بدست می آید:

نام یکview میتواند پسوند را حذف کند.برای مثال about view بافایل about.php تطبیق داده میشود.

  • اگرنام یک viewبا کاراکتر “/” شروع میشود،پس ماژول فعال جاری forum باشد، ونام view comment/post باشد،پس مسیر باید @app/modules/forum/views/comment/post باشد اگر ماژولی فعال نباشد،مسیر باید @app/views/comment/post باشد.
  • اگر نام یکviewبا کاراکتر “//” شروع شود،مسیر مرتبط باید @app/views/ViewName باشد.برای مثال، //site/contact با فایل @app/views/site/contact.php مرتبط است.
  • اگر نام view”Contact” باشد،و کنترلر متن SiteController باشد،پس مسیر باید @app/views/site/contact.php باشد.
  • اگر view یpriceبا goods view رندرشده باشد،پس مبلغ(price)باید بعنوان @app/views/invoice/price.php بدست اید اگردر فایل @app/views/invoice/goods.php. رندر شده باشد.

 

 

دسترسی به داده درviewها

برای دسترسی به داده بایک view شما باید داده را بعنوان پارامتر دوم به متد view rendering  بفرستیم.

گام اول—actionAbout را از SiteController ویرایش کنید:

 

public function actionAbout() {

$email = “admin@support.com”;

$phone = “+78007898100”;

return $this->rende‘('abo’t',[

‘ 'ema’l' => $email,

‘ 'pho’e' => $phone

]);

}

درکد بالا،مادو متغیر $email و $phone رابرای رندرکردن در About view میفرستیم.

گام دوم– about view را تغییر دهید:

<?php

/* @var $this yii\web\View */

use yii\helpers\Html;

$this->title = 'About';

$this->params['breadcrumbs'][] = $this->title;

?>

<div class = "site-about">

<h1><?= Html::encode($this->title) ?></h1>

<p>

This is the About page. You may modify the following file to customize its content:

</p>

<p>

<b>email:</b> <?= $email ?>

</p>

<p>

<b>phone:</b> <?= $phone ?>

</p>

<code><?= __FILE__ ?></code>

</div>

ما دومتغیر را که از SiteController دریافت شده را اضافه کردیم.

گام سوم—این آدرس را تایپ کنید http://localhost:8080/index.php?r=site/about این تصویر را خواهید دید:

ساخت مدل و دادن اجازه در Yii

<?php

   namespace app\models;

   use app\components\UppercaseBehavior;

   use Yii;

   /**

   * This is the model class for table "user".

   *

   * @property integer $id

   * @property string $name

   * @property string $email

   */

   class MyUser extends \yii\db\ActiveRecord {

      /**

      * @inheritdoc

      */

      public static function tableName() {

         return 'user';

      }

      /**

      * @inheritdoc

      */

      public function rules() {

         return [

            [['name', 'email'], 'string', 'max' => 255]

         ];

      }

      /**

      * @inheritdoc

      */

      public function attributeLabels() {

         return [

            'id' => 'ID',

            'name' => 'Name',

            'email' => 'Email',

         ];

      }

   }

?>


ساختCRUD

بریم یک مدل به نام MyUser بسازیم.

گام اول—رابط کاربریCRUD را باز کنید وفرم را کامل کنید:

گام دوم—سپس برروی کلید “Preview” و“Generate”  کلیک کنید.به آدرس بروید لیست تمام کاربران راخواهید دید:

گام سوم—به آدرسhttp://localhost:8080/index.php?r=my-user/create بروید یک فرم ساخت کاربر خواهید دید:

دادن اجازه(Authorization)

پروسه شناسايي کاربري که مجوزهاي کافي را دارد authorization ناميده ميشود.Yii يک (Access Control Filter) رافراهم ميکند.يک متد authorization بعنوان yii\filters\AccessControlفراهم ميشود.

تابع behaviors() از SiteController:

public function behaviors() {

   return [

      'access' => [

         'class' => AccessControl::className(),

         'only' => ['about', 'contact'],

         'rules' => [

            [

               'allow' => true,

               'actions' => ['about'],

               'roles' => ['?'],

            ],

            [

               'allow' => true,

               'actions' => ['contact', 'about'],

               'roles' => ['@'],

            ],

         ],

      ],

   ];

}

 

در کدبالا ACFبه متد behavior وصل شده است.تنها خصوصيتي که مشخص ميکندکه ACFبايد اعمال شود اکشن هاي about و contact هستند.تمام Actionهاي ديگر به access control دسترسي ندارند.قوانين خصوصيت،Access rulesراليست ميکنند.

تمام مهمانهابه about action دسترسي دارند.وتمام کاربر هاي مشخص شده به اکشن هاي access و contact دسترسي دارند.

به آدرس http://localhost:8080/index.php?r=site/about برويد.صفحه را خواهيد ديد اما اگر به آدرس http://localhost:8080/index.php?r=site/contact برويد ،به صفحه ورود هدايت خواهيد شد زيرا فقط کاربران تصديق شده به contact action اجازه دسترسي دارند:

Access rule  ها انتخاب هاي زيادي را پشتيباني ميکنند:

  • Allow—مشخص ميکند که يک دستور “allow” يا “deny” است.
  • Actions—مشخص ميکندکه کدام action بااين دستور مرتبط است.
  • Controllers— مشخص ميکندکه کدام کنترلر بااين دستور مرتبط است.
  • Roles— مشخص ميکندکه کدام Role بااين دستور مرتبط است دوRole شناسايي ميشود.

?    “?”—کاربر مهمان.

?    “@”—کاربر مشخص شده •    Ips— مشخص ميکندکه کدام آدرس آي پي  بااين دستور مرتبط است.

  • Verbs— مشخص ميکندکه کدام متد(POST, GET, PUT, etc) بااين دستور مرتبط است.
  • matchCallback— يک تابع قابل فراخواني PHPمشخص ميکند که چک کند اين دستوربايد اجراشوديانه.
  • denyCallback— يک تابع قابل فراخواني PHPمشخص ميکند که چک کند چه زماني اين دستور نبايد اجراشود.

Passwords

گام اول—Yiiمتدهاي دستي را براي کار باپسورد فراهم کرده است:

public function actionAuth() {

   $password = "asd%#G3";

   //generates password hasg

   $hash = Yii::$app->getSecurity()->generatePasswordHash($password);

   var_dump($hash);

   //validates password hash

   if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {

      echo "correct password";

   } else {

      echo "incorrect password";

   }

   //generate a token

   $key = Yii::$app->getSecurity()->generateRandomString();

   var_dump($key);

     //encrypt data with a secret key

   $encryptedData = Yii::$app->getSecurity()->encryptByPassword("mydata", $key);

   var_dump($encryptedData);

   //decrypt data with a secret key

   $data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $key);

   var_dump($data);

   //hash data with a secret key

   $data = Yii::$app->getSecurity()->hashData("mygenuinedata", $key);

   var_dump($data);

   //validate data with a secret key

   $data = Yii::$app->getSecurity()->validateData($data, $key);

   var_dump($data);

}

گام دوم—به آدرس http://localhost:8080/index.php?r=site/auth برويد اين خروجي را خواهيد ديد:

مدیریت خطا در Yii

Yii دارای یک مدیریت خطا است که موارد زیر را انجام میدهد:

  • تمام خطاهای غیر مهم PHP را بهexception های قابل استفاده تبدیل میکند.
  • تمام خطاها را در قالب یک call stack باجزئیات کامل نمایش میدهد.
  • استفاده از controller action را برای نمایش خطاها پشتیبانی میکند.

برای غیر فعال کردن error handler باید ثابت YII_ENABLE_ERROR_HANDLER را برای مقدارfalseدرentry script تعریف کنید.مدیریت کننده خطا در یک کامپوننت برنامه ثبت شده است.

گام اول—میتوانید ان را به این شکل پیکربندی کنید:

return [

   'components' => [

      'errorHandler' => [

         'maxSourceLines' => 10,

      ],

   ],

];

پیکربندی بالا تعدادخط های سورس کدهارابه 10 میرساند.مدیریت کننده خطا تمام خطاهای غیر مهمPHPرا بهexception های  قابل استفاده تبدیل میکند.

گام دوم—یک تابع به نام actionShowError() به SiteController اضافه کنید:

public function actionShowError() {

   try {

      5/0;

   } catch (ErrorException $e) {

      Yii::warning("Ooops...division by zero.");

   }

   // execution continues...

}

گام سوم—به آدرس http://localhost:8080/index.php?r=site/show-errorبروید یک پیام هشدار خواهید دید:

نمایش درخواست نادرست یک کاربر

اگربخواهید کاربری که درخواستش درست نبوده رانشان دهید،بایداز yii\web\NotFoundHttpException استفاده کنید:

گام اول—تابع actionShowError()  را ویرایش کنید.

public function actionShowError() {

   throw new NotFoundHttpException("Something unexpected happened");

}

 

گام پنجم—به آدرس http://localhost:8080/index.php?r=site/show-errorبروید این خطارا خواهید دید:

زمانیکه ثابت YII_DEBUG درست باشد مدیرخطا،داده ها را دریک call stack باجزئیات کامل نشا ن میدهد.زمانی که درست نباشد فقط پیغام خطانمایش داده میشود بطور پیش فرض مدیر خطا خطاراباviewهای زیر نمایش میدهد:

 

  • @yii/views/errorHandler/exception.php—-برای زمانی استفاده میشود که خطاها باید با call stack نمایش داده شوند.
  • @yii/views/errorHandler/error.php—-زمانی استفاده میشود که خطاها باید بدون ا call stack نمایش داده شوند.

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

گام ششم—کامپوننت برنامه errorHandler را در فایل config/web.php ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this

               //is required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         //other components...

            'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

پیکر بندی بالامعلوم میکند که یک خطانیازبه استفاده از call stack ندارد،عمل site/error اجراخواهد شد.

گام هفتم—متد actions()  را از SiteController ویرایش کنید:

public function actions() {

   return [

      'error' => [

         'class' => 'yii\web\ErrorAction',

      ],

   ];

}

کدبالامعلوم میکند که یک خطا اتفاق افتاده است و error view رندرخواهد شد.

گام هشتم—یک فایل به نام error.php در پوشه views/site  بسازید:

<?php

   /* @var $this yii\web\View */

   /* @var $name string */

   /* @var $message string */

   /* @var $exception Exception */

   use yii\helpers\Html;

   $this->title = $name;

?>

<div class = "site-error">

   <h2>customized error</h2>

   <h1><?= Html::encode($this->title) ?></h1>

   <div class = "alert alert-danger">

      <?= nl2br(Html::encode($message)) ?>

   </div>

   <p>

      The above error occurred while the Web server was processing your request.

   </p>

   <p>

      Please contact us if you think this is a server error. Thank you.

   </p>

</div>

گام نهم—- به آدرس http://localhost:8080/index.php?r=site/show-errorبروید این خطای سفارشی شده را خواهید دید:

ساخت ماژول_کنترلر _ افزونه در Yii

گام اول—برای ساخت یک ماژول رابط کاربری module generation  را باز کرده و فرم راکامل کنید:

گام دوم— برروی کلید های “Preview”و “Generate”کلیک کنید.

گام سوم—نیاز به فعال کردن ماژول داریم پس کامپوننت modules را در فایل config/web.php ویرایش کنید:

'modules' => [

   'admin' => [

      'class' => 'app\modules\admin\Module',

   ],

],

 

گام چهارم—برای چک کردن اینکه ماژول کارمیکند،به آدرس زیر بروید:

http://localhost:8080/index.php?r=admin/default/index

ساخت کنترلر

بریم تا یک کنترلر بسازیم:

گام اول—برای ساخت کنترلر با Action های گوناگون ،رابط کاربریcontroller generator رابازکنید وفرم آن را کامل کنید:

گام دوم—برروی کلید های “Preview”و “Generate”کلیک کنید فایل باindex وworld actions در پوشه کنترلر ساخته خواهد شد:

<?php

   namespace app\controllers;

   class CustomController extends \yii\web\Controller {

      public function actionHello() {

         return $this->render('hello');

      }

      public function actionIndex() {

         return $this->render('index');

      }

      public function actionWorld() {

         return $this->render('world');

      }

   }

?>

ساخت فرم

گام اول—برای ساخت یک فایلview از مدل موجود،رابط کاربری form generation راباز کرده و فرم راکامل کنید:

سپس برروی کلید های “Preview”و “Generate”کلیک کنید فایل viewباقابلیت شخصی سازی در پوشه view ساخته خواهد شد.

گام دوم—برای نمایش آن،یک متد جدید به  اضافه کنید:

public function actionView() {

$model = new MyUser();

return $this->render('/customview', [

'model' => $model,

]);

}

گام سوم—برای دیدن فایل view ایجاد شده ،آدرس زیر را باز کنید

http://localhost:8080/index.php?r=custom/view

ساخت افزونه

بگذارید یک افزونه ساده که پیام “Hello world” را نشان میدهد،ایجادکنیم.این افزونه با صندوقPackagist توزیع خواهد شد.

 

گام اول—یک پوشه به نامhello-world در در حافظه خود به جز پوشه Yiiایجاد کنید.داخل آن پوشه یک فایل باکدزیر به نامcomposer.json ایجاد کنید.

{

    "name": "tutorialspoint/hello-world",

    "authors": [

        {

            "name": "tutorialspoint"

        }

    ],

    "require": {},

    "autoload": {

        "psr-0": {

            "HelloWorld": "src/"

        }

    }

}

 

ما تعیین کردیم که از استانداردPSR-0 وتمام افزونه هایش در پوشه  SRCرا دارد.

گام دوم—این پوشه را ایجاد کنید: hello-world/src/HelloWorld.

گام سوم—داخل پوشهHelloWorld یک فایل به نامSayHello.php باکد زیر بسازید:

<?php

   namespace HelloWorld;

   class SayHello {

      public static function world() {

         return 'Hello World, Composer!';

      }

   }

?>

 

مایک کلاسSayHello باتابع استاتیک تعریف کنید،که پیامhello مان را بر میگرداند.

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

داخل پوشه hello-world این ها را اجراکنید:

  • git init
  • git add
  • git commit -m “initial commit”
  • git remote add origin <YOUR_NEWLY_CREATED_REPOSITORY>
  • git push -u origin master

ما افزونه خودرا به به سایتgithub ارسال کردیم.اکنون به آدرسhttps://packagist.org برویدوارد شوید و کلید Submitراکلیک کنید.

یک صفحه رامیبینید که باید صندوق githubخودرا برای انتشار وارد کنید.

گام پنجم—برروی کلید“check” کلیک کنید وافزونه را منتشر کنید.

گام ششم—به اپلیکیشن پایه بروید و افزونه را به فایلcomposer.json. اضافه کنید.

{

   "name": "yiisoft/yii2-app-basic",

   "description": "Yii 2 Basic Project Template",

   "keywords": ["yii2", "framework", "basic", "project template"],

   "homepage": "http://www.yiiframework.com/",

   "type": "project",

   "license": "BSD-3-Clause",

   "support": {

      "issues": "https://github.com/yiisoft/yii2/issues?state=open",

      "forum": "http://www.yiiframework.com/forum/",

      "wiki": "http://www.yiiframework.com/wiki/",

      "irc": "irc://irc.freenode.net/yii",

      "source": "https://github.com/yiisoft/yii2"

   },

   "minimum-stability": "dev",

   "prefer-stable" : true,

   "require": {

      "php": ">=5.4.0",

      "yiisoft/yii2": ">=2.0.5",

      "yiisoft/yii2-bootstrap": "*",

      "yiisoft/yii2-swiftmailer": "*",

      "kartik-v/yii2-widget-datetimepicker": "*",

      "tutorialspoint/hello-world": "*"

   },

   "require-dev": {

      "yiisoft/yii2-codeception": "*",

      "yiisoft/yii2-debug": "*",

      "yiisoft/yii2-gii": "*",

      "yiisoft/yii2-faker": "*"

   },

   "config": {

      "process-timeout": 1800

   },

   "scripts": {

      "post-create-project-cmd": [

         "yii\\composer\\Installer::postCreateProject"

      ]

   },

   "extra": {

      "yii\\composer\\Installer::postCreateProject": {

         "setPermission": [

            {

               "runtime": "0777",

               "web/assets": "0777",

               "yii": "0755"

            }

         ],

         "generateCookieValidationKey": [

            "config/web.php"

         ]

      },

      "asset-installer-paths": {

         "npm-asset-library": "vendor/npm",

         "bower-asset-library": "vendor/bower"

      }

   }

}

گام هفتم—داخل پوشه اصلی پروژه composer update رابرای نصب یا آپدیت وابسته ها اجراکنید.

گام هشتم—افزونه ما باید نصب شود،برای استفاده از آن About view راازمتدactionAbout  ازSiteController را ویرایش کنید.

<?php

   /* @var $this yii\web\View */

   use yii\helpers\Html;

   $this->title = 'About';

   $this->params['breadcrumbs'][] = $this->title;

   $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,

      meta, tags']);

   $this->registerMetaTag(['name' => 'description', 'content' => 'This is the

      description of this page!'], 'description');

?>

<div class = "site-about">

   <h1><?= Html::encode($this->title) ?></h1>

   <p>

      This is the About page. You may modify the following file to customize its content:

   </p>

   <h1><?= HelloWorld\SayHello::world();  ?></h1>

</div>

گام نهم—به آدرس http://localhost:8080/index.php?r=site/about بروید وپیام افزونه را خواهید دید.

Fragment caching

Fragment caching به شما در کش کردن یک قسمت از سایت کمک میکند.

گام اول—یک تابع جدید به نام actionFragmentCaching()  به  SiteControllerاضافه کنید:

public function actionFragmentCaching() {

   $user = new MyUser();

   $user->name = "cached user name";

   $user->email = "cacheduseremail@gmail.com";

   $user->save();

   $models = MyUser::find()->all();

   return $this->render('cachedview', ['models' => $models]);

}

در کد بالا ما یک کاربر جدید ایجاد کردیم و فایل cachedview رانمایش دادیم.

گام دوم—اکنون یک فایل جدید به نام cachedview.php  در پوشه views/site ایجاد کنید:

<?php if ($this->beginCache('cachedview')) { ?>

   <?php foreach ($models as $model): ?>

      <?= $model->id; ?>

      <?= $model->name; ?>

      <?= $model->email; ?>

      <br/>

   <?php endforeach; ?>

<?php $this->endCache(); } ?>

<?php echo "Count:", \app\models\MyUser::find()->count(); ?>

 

ما یک تولید کننده محتوا بین متدهای beginCache() و endCache()قراردادیم.اگرمحتوا در کش پیداشد،متد beginCache() آن را رندر واجرا میکند.

 

گام سوم—به آدرس http://localhost:8080/index.php?r=site/fragment-caching بروید وصفحه را رفرش کنید این را خواهید دید .

توجه داشته باشید که محتوا بین متدهای beginCache()  و endCache()  کش شده است.در دیتابیس ما 13 کاربر داریم ولی فقط 12 تا از آنها نمایش داده میشود.

Page Caching

Page caching کش کردن محتوارا از تمام صفحه فراهم میکند Page cachingبا yii  \filter\PageCache پشتیبانی میشود.

گام اول—تابع behaviors() در SiteController را به این شکل ویرایش کنید:

public function behaviors() {

   return [

      'access' => [

         'class' => AccessControl::className(),

         'only' => ['logout'],

         'rules' => [

            [

               'actions' => ['logout'],

               'allow' => true,

               'roles' => ['@'],

            ],

         ],

      ],

      'verbs' => [

         'class' => VerbFilter::className(),

         'actions' => [

            'logout' => ['post'],

         ],

      ],

      [

         'class' => 'yii\filters\PageCache',

         'only' => ['index'],

         'duration' => 60

      ],

   ];

}

کد بالا صفحهIndex را برای 60ثانیه کش میکند.

گام دوم—به آدرس http://localhost:8080/index.php?r=site/indexبروید سپس پیغام پیکر بندی ازفایلview را ویرایش کنید.اگر صفحه را دوباره لود کنید،همه تغییرات را نخواهید دید زیرا صفحه کش شده است یک دقیقه صبر کنید  دوباره صفحه را لود کنید.

HTTP Caching

برنامه های وب همچنین میتوانند از کش کلاینت استفاده کنند.برای استفاده از آن باید فیلتر yii \filter\HttpCache را برای controller actionsویرایش کنید.

آخرین تغییر header از یک برچسب  استفاده میکند برای نشان دادن اینکه صفحه ویرایش شده.

گام اول—برای فعال کردن ارسال headerویرایش شده خصوصیت yii \filter\HttpCache::$lastModified  را پیکر بندی کنید:

public function behaviors() {

   return [

      [

         'class' => 'yii\filters\HttpCache',

         'only' => ['index'],

         'lastModified' => function ($action, $params) {

            $q = new \yii\db\Query();

            return $q->from('news')->max('created_at');

         },

      ],

   ];

}

در کدبالا ما HTTP caching را فقط برای صفحهindex فعال کردیم.زمانی که مرورگر آن صفحه را برای بار اول باز میکند،صفحه در سرور تولید میشود وبه مرورگر ارسال میشود.بار دوم اگر چیز جدیدی ایجاد نشده باشد،سرور صفحه را دوباره تولید نخواهد کرد.

Etag header یک # رابرای نشان دادن محتوای صغحه فراهم میکند.اگر صفحه تغییر کند،# نیز تغییر خواهد کرد.

گام دوم—برای فعال کردن ارسال Etag header خصوصیت yii \filters\HttpCache::$etagSeed را ویرایش کنید:

public function behaviors() {

   return [

      [

         'class' => 'yii\filters\HttpCache',

         'only' => ['index'],

         'etagSeed' => function ($action, $params) {

            $user = $this->findModel(\Yii::$app->request->get('id'));

            return serialize([$user->name, $user->email]);

         },

      ],

   ];

}

در کدبالا ما HTTP caching را فقط برای index action فعال کردیم.که باید Etag HTTP header رابرمبنای نام وایمیل کاربر تولید کند.زمانیکه مرورگر صفحه را برای بار اول باز میکند، صفحه در سرور تولید میشود وبه مرورگر ارسال میشود.بار دوم اگر چیز جدیدی ایجاد نشده باشد،سرور صفحه را دوباره تولید نخواهد کرد.

امتحان کردن در Yii

زمانی که یک کلاس PHP را مینویسیم،ما مرحله به مرحله آن را دیباگ میکنیم یا از دستورات die, echo برای تست آن استفاده میکینم.اگر یک برنامه تحت وب را توسعه می دهید،یک داده برای تست اینکه ببینیم صفحه هماانطور که انتظار داریم کار میکند یانه بفرستید.این پروسه تست وآزمایش اتوماتیک انجام خواهدشد.

تست خودکار به ما در تست پروژه های بزرگ کمک میکند مثل:

  • برنامه های بزرگ وپیچیده
  • برنامه هایی که بطور ثابت رشد میکنند
  • برنامه هایی که ارزش زیادی دارد

اگر پروژه تان پیچیده نیست تست خودکار مناسب نیست

آماده سازی برای تست

گام اول—فریم ورکCodeception رابادستور زیر نصب کنید:

<?php

   namespace app\controllers;

   use yii\rest\ActiveController;

   class UserController extends ActiveController {

      public $modelClass = 'app\models\MyUser';

      public function actions() {

         $actions = parent::actions();

         // disable the "delete" and "create" actions

         unset($actions['delete'], $actions['create']);

         return $actions;

      }

   }

?>

گام دوم—دستور زیر را اجرا کنید:

composer global status

خروجی “Changed current directory to <directory>” است.شما باید ‘<directory>/vendor/bin’ را به مسیر متغیر خود اضافه کنید.در این مورد،دستور زیر را اجرا کنید:

export PATH = $PATH:~/.composer/vendor/bin

گام سوم—یک دیتابیس جدید به نام’yii2_basic_tests’ ایجاد کنید.

گام چهارم—داخل پوشهtests دستور زیر را اجراکنید.

codeception/bin/yii migrate

پیکربندی دیتابیس میتواند در فایلtests/codeception/config/config.php پیداشود.

گام پنجم—رشته Test را بادستورزیر ایجاد کنید:

codecept build

Fixtures

هدف اصلی طراحی Fixtureتنظیم محیطی برای شرایط ناشناخته ای که تست شما در یک راه  مورد انتظار رخ میدهد،است.Yiiیک fixture رابرای فریم ورک فراهم کرده است.هدف کلیدی فریم ورک fixture ثابت کردن اشیا است.که یک جنبه خاص از محیط تست را نشان میدهد.شی ثابت یک مثال از کلاس yii\test\Fixture class است.

برای تعریف یک fixture باید یک کلاس جدید ایجاد کنید وآن را از yii\test\Fixture یا yii\test\ActiveFixture گسترش دهید.Formerبرای هدف عمومی fixtureهاست درحالی که دومی بطور ویژه برای کاربا دیتابیس وActiveRecord طراحی شده است.

واحد تست ها (Unit tests)

Unit test ها به شما در تست تابع های منحصر به فرد کمک میکنند.برای مثال  model functions یا component class

گام اول—یک fixtureجدید به نام ExampleFixture.php در پوشه tests/codeception/fixtures ایجاد کنید:

<?php

   namespace app\tests\codeception\fixtures;

   use yii\test\ActiveFixture;

   class ExampleFixture extends ActiveFixture {

      public $modelClass = ‘app⊨’MyUser';

   }

?>

گام دوم—سپس یک فایل تست به نام ExampleTest.php درپوشه tests/codeception/unit/models بسازید:

<?php

   namespace tests\codeception\unit\models;

   use app\models\MyUser;

   use yii\codeception\TestCase;

   class ExampleTest extends TestCase {

      public function testCreateMyUser() {

         $m = new MyUser();

         $m->name = "myuser";

         $m->email = "myser@email.com";

         $this->assertTrue($m->save());

      }

      public function testUpdateMyUser() {

         $m = new MyUser();

         $m->name = "myuser2";

         $m->email = "myser2@email.com";

         $this->assertTrue($m->save());

         $this->assertEquals("myuser2", $m->name);

      }

      public function testDeleteMyUser() {

         $m = MyUser::findOne(['name' => 'myuser2']);

         $this->assertNotNull($m);

         MyUser::deleteAll(['name' => $m->name]);

         $m = MyUser::findOne(['name' => 'myuser2']);

         $this->assertNull($m);

      }

   }

?>

در کد بالا ما سه تست تعریف کردیم:

  • testCreateMyUser,
  • testUpdateMyUser, and
  • testDeleteMyUser مایک کاربر جدید ایجاد کردیم،نامش را آپدیت کنید،وسعی کنید حذفش کنید.ما مدل MyUser را در دیتابیس yii2_basic_tests مدیریت کردیم.که یک کپی از دیتابیس اصلی ماست.

گام سوم—برای شروع تست ها،به پوشه tests بروید ودستور زیر را اجراکنید:

codecept run unit models/ExampleTest

باید از تمام تست ها بگذرد وشما تصویر زیر را خوهید دید:

تست های تابعی

تست های تابعی به شما در موارد زیر کمک میکند:

  • تست برنامه باشبیه ساز مرورگر
  • اطمینان از اینکه تابع کار میکند یانه
  • ارتباط با دیتابیس
  • ثبت داده در اسکریپت های سرور

 

داخل پوشه Testsدستور زیر را اجراکنید:

generate:cept functional AboutPageCept

دستور بالا فایل AboutPageCept.php رادر پوشه tests/codeception/functional میسازد.در این تست تابعی ما مطمئن میشویم که صفحه about وجود دارد.

گام اول—فایل AboutPageCept.php را ویرایش کنید:

<?php

   $I = new FunctionalTester($scenario);

   $I->wantTo('perform actions and see result');

   $I->amOnPage('site/about');

   $I->see('about');

   $I->dontSee('apple');

?>

در کدبالا ماصفحه about راچک کردیم.باید کلمه ‘about’ راروی صفحه ببینیم.

گام دوم—دستور زیر را برای تست اجراکنید:

run functional AboutPageCept

این خروجی را خواهید دید:

 

فیلد ها در Yii

با مقداردهی متدهای fields() وextraFields() شما میتوانید معرفی کنید که کدام داده میتواند در یک پاسخ قراگیرد. تفاوت بین این دو متد در این است که former مجموعه پیش فرض فیلد هارا نشان میدهد. و باید زمانیکه Latter فیلدهای اضافی را معرفی کند، انکلود شود. و همچنین باید در پاسخ انکلود شود اگر کاربر نهایی با پارامتر Expand درخواست کند.

گام اول—مدل MyUser را به این شکل ویرایش کنید:

<?php

   namespace app\models;

   use app\components\UppercaseBehavior;

   use Yii;

   /**

   * This is the model class for table "user".

   *@property integer $id

   * @property string $name

   * @property string $email

   */

   class MyUser extends \yii\db\ActiveRecord {

      public function fields() {

         return [

            'id',

            'name',

            //PHP callback

            'datetime' => function($model) {

               return date("d:m:Y H:i:s");

            }

         ];

      }

      /**

      * @inheritdoc

      */

      public static function tableName() {

         return 'user';

      }

      /**

      * @inheritdoc

      */

      public function rules() {

         return [

            [['name', 'email'], 'string', 'max' => 255]

         ];

      }

      /**

      * @inheritdoc

      */

      public function attributeLabels() {

         return [

            'id' => 'ID',

            'name' => 'Name',

            'email' => 'Email',

         ];

      }

   }

?>

 

علاوه برفیلدهای پیش فرض: ID و Name ،ما یک فیلد سفارشی به نام datetime اضافه کردیم.

گام دوم—در Postman آدرس http://localhost:8080/users را باز کنید.

گام سوم—اکنون مدل MyUser را به این شکل ویرایش کنید:

<?php

   namespace app\models;

   use app\components\UppercaseBehavior;

   use Yii;

   /**

   * This is the model class for table "user".

   *

   * @property integer $id

   * @property string $name

   * @property string $email

   */

   class MyUser extends \yii\db\ActiveRecord {

      public function fields() {

         return [

            'id',

            'name',

         ];

      }

      public function extraFields() {

         return ['email'];

      }

      /**

      * @inheritdoc

      */

      public static function tableName() {

         return 'user';

      }

      /**

      * @inheritdoc

      */

      public function rules() {

         return [

            [['name', 'email'], 'string', 'max' => 255]

         ];

      }

      /**

      * @inheritdoc

      */

      public function attributeLabels() {

         return [

            'id' => 'ID',

            'name' => 'Name',

            'email' => 'Email',

         ];

      }

   }

?>

 

توجه داشته باشید که فیلدEmail با متد extraFields() برگردانده شده است.

گام چهارم—برای گرفتن داده بااین فیلد آدرس http://localhost:8080/users?expand=email را باز کنید.

  شخصی سازی Actionها

کلاس yii\rest\ActiveController Actionهای زیر رافراهم میکند:

  • Index—-صفحات منابع را لیست میکند
  • View—–جزئیات یک منبع خاص را بر میگرداند
  • Create—-یک منبع جدبد میسازد
  • Update—–منبع موجودرا آپدیت میکند
  • Delete—–یک منبع خاص را حذف میکند
  • Options—-متدهای HTTP پشتیبانی شده را برمیگرداند

تمام اعمال بالا در متد actions تعریف شده اند.

برای غیر فعال سازی عملیات “delete” و “create” باید UserController را به این شکل ویرایش کنید:

<?php

   namespace app\controllers;

   use yii\rest\ActiveController;

   class UserController extends ActiveController {

      public $modelClass = 'app\models\MyUser';

      public function actions() {

         $actions = parent::actions();

         // disable the "delete" and "create" actions

         unset($actions['delete'], $actions['create']);

         return $actions;

      }

   }

?>

مدیریت خطاها (Handling Errors)

زمانی که یک درخواست RESTful API انجام میدهید،اگر خطایی وجودداشته باشد یا کاری ناخواسته برای سروراتفاق بیفتد،شمابه سادگی یک exception رابه آن میفرستید.

Yii REST از حالت های زیر استفاده میکند:

  • 200—OK
  • 201—یک منبع بطور موفقیت آمیز در Response برای درخواست Postایجاد شده است.مکان Header دارای آدرس که به منبع جدید اشاره میکند است
  • 204—درخواست باموفقیت مدیریت شده وپاسخ دارای محتوایی نیست
  • 304—منبع ویرایش نشده است
  • 400—درخواست اشتباه
  • 401—اعتبار سنجی موفق نبود
  • 403—کاربر شناخته شده اجازه دسترسی به API endpoint خاص را ندارد
  • 404—منبع وجودندارد
  • 405—اجازه استفاده از متد وجودندارد
  • 415—نوع رسانه غیر قابل پشتیبانی
  • 422—اعتبار سنجی داده ناموفق بود
  • 429— درخواست های بسیار زیاد
  • 500— ارور داخلی سرور

RESTful APIs in Action

API ها

کلاس کنترلری که از کلاس yii\rest\ActivrController گسترش می یابد، اعمال عمومیRESTful را انجام می دهد.ما خصوصیت $modelClass را تعیین میکنیم تا کنترلر بداند  ازکدام مدل برای دستکاری داده استفاده کند:

گام اول—یک فایل به نامUserController.php داخل پوشهcontrollers ایجاد کنید:

<?php

   namespace app\controllers;

   use yii\rest\ActiveController;

   class UserController extends ActiveController {

      public $modelClass = 'app\models\MyUser';

   }

?>

بعداز آن نیاز به تنظیم کامپوننتurlManager داریم.تا داده های کاربر بتواند با لغات HTTP دستیابی و دستکاری شود.برای اینکه دسترسی داده در JSON اتفاق بیفتد.ماباید خصوصیتparsers رااز کامپوننت برنامهrequest پیگربندی کنیم.

گام دوم—فایلconfig/web.php رابه این شکل ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this is

               //required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'levels' => ['error', 'warning'],

               ],

            ],

         ],

         'urlManager' => [

            'enablePrettyUrl' => true,

            'enableStrictParsing' => true,

            'showScriptName' => false,

            'rules' => [

               ['class' => 'yii\rest\UrlRule', 'controller' => 'user'],

            ],

         ],

         'request' => [

            'parsers' => [

               'application/json' => 'yii\web\JsonParser',

            ]

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

بامقدار کمی تلاش مایکRESTful API برای دسترسی به داده ها ایجاد کردیم APIs شامل موارد زیر است:

  • GET /users—تمام کاربران را صفحه به صفحه لیست میکند.
  • HEAD /users —بررسی اجمالی از اطلاعات لیست کاربران را نمایش می دهد.
  • POST /users —-یک کاربر جدید ایجاد میکند.
  • GET /users/20— جزئیات کاربر شماره 20 را نشان میدهد.
  • HEAD /users/20—یک بررسی اجمالی از اطلاعات کاربر 20 را نمایش می دهد.
  • PATCH /users/ 20 and PUT /users/20—کاربر 20 را بروزرسانی میکند.
  • DELETE /users/20—کاربر 20 را حذف میکند.
  • OPTIONS /users—لغات پشتیبانی شده در مورد نقاط پایانی کاربران را نمایش میدهد.
  • OPTIONS /users/20——لغات پشتیبانی شده در مورد نقاط پایانی کاربربیستم را نمایش میدهد توجه:Yiiبطور خودکار نام کنترلر راجمع میکند.

گام سوم—اکنون Postman را باز کنید آدرس http://localhost:8080/users درآن وارد کنید وکلید“Send”. را بزنید.این خروجی را خواهید دید:

گام چهارم—برای ایجاد یک کاربر جدید نوع درخواست رابه POST تغییر دهید،دوپارامترbody اضافه کنید. Name وemail وارسال کنید:

گام پنجم—شما میتوانید از پارامترfields برا یتعیین اینکه کدام فیلد باید در نتیجه نمایش داده شود.برای مثال،آدرسhttp://localhost:8080/users?fields=id فقط IDو Name را بر میگرداند همانطور که در اسکرین شات می بینید:

 

مهاجرت دیتابیس در Yii

در زمان  توسعه يک اپليکيشن database-driven ،ساختار ديتابيس با کد سورس در گير ميشود.Yii ويژگي database migration  را که به شما در نگهداري تغييرات ديتابيس کمک ميکند.

Yii فرمان هايmigration زيررا فراهم کرده است:

  • ساخت يک migrations جديد
  • برگرداندنmigrations
  • اعمالmigrations
  • اعمال دوبارهmigrations
  • نمايش اطلاعات و تاريخچهmigrations

ساخت يکmigration

بگذاريد يک database migration جديد بسازيم:

گام اول—داخل پوشه اصلي پروژه،پوشه console window را باز کنيد واجراکنيد:

./yii migrate/create add_news_table

فرمان بالا يک فايلmigration داخل پوشهmigrations ايجاد ميکند.

اين فايل شامل کدهاي زير است:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160113_102634_add_news_table extends Migration {

      public function up() {

      }

      public function down() {

         echo "m160113_102634_add_news_table cannot be reverted.\n";

         return false;

      }

      /*

      // Use safeUp/safeDown to run migration code within a transaction

      public function safeUp() {

      }

      public function safeDown() {

      }

      */

   }

?>

هرDB migrations يک کلاسPHPاست که کلاسyii\db\Migration راگسترش ميدهد.نام کلاس در قالب زير ايجاد ميشود:

m<YYMMDD_HHMMSS>_<Name>

<YYMMDD_HMMSS> تاريخ و زماني است که migration درآن اجراشده و <Name> آرگوماني است که در فرمان console فراهم کرديد.

متد up() زماني که ديتابيس خودرا ارتقا ميدهيد،فراخواني ميشود درحالي که متد down() زمانيکه آن را پايين مي آوريد فراخواني ميشود.

گام دوم—براي اضافه کردن يک جدول به ديتابيس فايل migration را به اين شکل ويرايش کنيد:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160113_102634_add_news_table extends Migration {

      public function up() {

         $this->createTable("news", [

            "id" => Schema::TYPE_PK,

            "title" => Schema::TYPE_STRING,

            "content" => Schema::TYPE_TEXT,

         ]);

      }

      public function down() {

         $this->dropTable('news');

      }

      /*

      // Use safeUp/safeDown to run migration code within a transaction

      public function safeUp() {

      }

      public function safeDown() {

      }

      */

   }

?>

در کدبالا ما يک جدول به نام news در متد up() ايجاد کرديم وآن را با متد down() در جدول قرارداديم:

جدول news ازسه فيلد به نامهاي id, title, content تشکيل شده است زمانيکه يک جدول يا ستون ايجاد ميکينيم بايد از قالب هاي خلاصه اي که migrations به آن وابسته است استفاده کنيم.براي مثال: MySQL, TYPE_PK will be converted into int(11) NOT NUL AUTO_INCREMETN PRIMARY KEY.

گام سوم—براي ارتقا ديتابيس اين فرمان را اجراکنيد:

./yii migrate

دستوربالا تمام migration هايي که هنوز اعمال نشده اند راليست ميکند،اگر آن ها را اعمال کنيد در تمام کلاس هاي safeUp() ياup() هاي migration جديد اعمال ميشود گام چهارم—براي اعمال سه migration موجود دستور زير را اجرا کنيد:

./yii migrate 3

گام پنجم—شما همچنين ميتوانيد يک migration به خصوص را در ديتابيسي که مهاجرت ميکند معرفي کنيد.

استفاده از timestamp براي مشخص کردنmigration

yii migrate/to 160202_195501

استفاده از يک رشته که با متدstrtotime() تجزيه شده

yii migrate/to “2016-01-01 19:55:01”

استفاده از نام کامل

yii migrate/to m160202_195501_create_news_table

استفاده ازUNIX timestamp

yii migrate/to 1393964718

گام ششم—براي ارجاع دادن يکmigration براي اجرا(اجراي متدهاي down() or safeDown()  )

./yii migrate/down

گام هفتم—براي ارجاع پنج migration اعمال شده اخير بايد دستور زيررا اجراکنيد:

./yii migrate/down 5

گام هشتم—براي دوباره انجام دادن migration ها

./yii migrate/redo

براي ليست کردن migration  هاي اعمال شده از اين دستورات استفاده کنيد:

  • yii migrate/new—-10 migration جديد را نشان ميدهد.
  • yii migrate/new 3—3 migration جديد را نشان ميدهد.
  • yii migrate/new all—تمام migration هاي جديد را نشان ميدهد.
  • yii migrate/history— تمام 10 migration هاي اعمال شده را نشان ميدهد.
  • yii migrate/history 20— تمام 20 migration هاي اعمال شده را نشان ميدهد.
  • yii migrate/history all— تمام migration هاي اعمال شده را نشان ميدهد.

گاهي اوقات نياز به اضافه يا حذف کردن يک ستون از جدول خاص داريم.شما ميتوانيد از متدهاي addColumn() و dropColumn() استفاده کنيد.

گام اول—جديدترين فايل  migration   ايجاد شده را به اين شکل ويرايش کنيد:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160113_110909_add_category_to_news extends Migration {

      public function up() {

         $this->addColumn('news', 'category', $this->integer());

      }

      public function down() {

         $this->dropColumn('news', 'category');

      }

   }

?>

 

اکنون دستور ./yii migrate رااجرا کنيد،ستون بايد به جدول news اضافه شود.برعکس اگر دستور ./yii migrate/down 1 را اجراکنيد،ستون بايد حذف شود.

زماني که DB migrations را انجام ميدهيد اين مهم است که مطمين شويد که migration موفق شده يا شکست خورده است.

RESTful APIs در yii

Yii ویژگی های پراستفاده زیر را برای پیاده سازیRESTful APIs را فراهم میکند:

  • نمونه سازی سریع
  • ترتیب سفارشی اشیا
  • فرمت پاسخ(پشتیبانی لز JSON وXMLبطور پیش فرض)
  • فرمت جمع کردن داده و اعتبار سنجی خطاها
  • مسیر یابی کارآمد
  • پشتیبانی برایHATEOAS
  • پشتیبانی داخلی از لغاتOPTIONS وHEAD
  • کش داده و کش HTTP
  • احراز هویت ودادن اجازه
  • محدودیت امتیاز

برای نمایشRESTful در action به داده نیاز داریم.

آماده سازی دیتابیس

گام اول یک دیتابیس بسازید.دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

 

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

 

<?php

   return [

      'class' => 'yii\db\Connection',

      'dsn' => 'mysql:host = localhost;dbname = helloworld',

      'username' => 'vladimir',

      'password' => '12345',

      'charset' => 'utf8',

   ];

?>

 

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160106_163154_test_table extends Migration {

      public function safeUp() {

         $this->createTable("user", [

            "id" => Schema::TYPE_PK,

            "name" => Schema::TYPE_STRING,

            "email" => Schema::TYPE_STRING,

         ]);

         $this->batchInsert("user", ["name", "email"], [

            ["User1", "user1@gmail.com"],

            ["User2", "user2@gmail.com"],

            ["User3", "user3@gmail.com"],

            ["User4", "user4@gmail.com"],

            ["User5", "user5@gmail.com"],

            ["User6", "user6@gmail.com"],

            ["User7", "user7@gmail.com"],

            ["User8", "user8@gmail.com"],

            ["User9", "user9@gmail.com"],

            ["User10", "user10@gmail.com"],

            ["User11", "user11@gmail.com"],

         ]);

      }

      public function safeDown() {

         $this->dropTable('user');

      }

   }

?>

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

متد

مدلMyUser در پوشه models ظاهر میشود.

نصب Postman

Postman یک ابزار دستی است برای زمانیکه یک سرویس RESTful را توسعه میدهیم.که یک رابط کاربری پراستفاده برای ساخت درخواست ها فراهم میکند شما میتوانید این ابزار را درسایت

https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en پیداکنید.

برای نصب آن کلید “Add to Chrome” را فشار دهید.

مضمون yii

Themingدر yii به شما در جایگزینی مجموعه ای از view ها با یکی دیگر بدون نیاز به ویرایش فایلview اصلی کمک میکند.شما باید خصوصیت theme را از کامپوننت برنامه برای استفاده theming را تنظیم کنید.

شما همچنین باید خصوصیات زیر را تعریف کنید:

  • yii\base\Theme::$basePath—پوشه اصلی CSS, JS, images وغیره را نشان میدهد.
  • yii\base\Theme::$baseUrl—آدرس اصلی منابع theme شده را مشخص میکند.
  • yii\base\Theme::$pathMap—-قوانین جایگزینی را نشان میدهد.

برای مثال، اگر $this->render(‘create’) را در UserController فراخوانی کنید،فایل view،@app/views/user/create.php شروع به رندر شدن خواهد کرد.بااین اوصاف اگر theming را در پیکربندی برنامه زیر فعال کنید،فایلview: @app/themes/basic/user/create.php به جای آن رندر خواهد شد.

گام اول—فایلconfig/web.php رابه این شکل ویرایش کنید

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this

               //is required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'levels' => ['error', 'warning'],

               ],

            ],

         ],

         'view' => [

            'theme' => [

               'basePath' => '@app/themes/basic',

               'baseUrl' => '@web/themes/basic',

               'pathMap' => [

                  '@app/views' => '@app/themes/basic',

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

ما کامپوننت viewبرنامه را اضافه کردیم.

گام دوم—اکنون پوشه web/themes/basic وthemes/basic/site را ایجاد کنید.داخل پوشه themes/basic/site یک فایل به نامabout.php با کدزیر ایجاد کنید:

<?php

   /* @var $this yii\web\View */

   use yii\helpers\Html;

   $this->title = 'About';

   $this->params['breadcrumbs'][] = $this->title;

   $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing,

      views, meta, tags']);

   $this->registerMetaTag(['name' => 'description', 'content' => 'This is the

      description of this page!'], 'description');

?>

<div class = "site-about">

   <h1><?= Html::encode($this->title) ?></h1>

   <p style = "color: red;">

      This is the About page. You may modify the following file to customize its content:

   </p>

</div>

 

گام سوم—اکنون،به آدرس http://localhost:8080/index.php?r=site/about بروید فایل themes/basic/site/about.php به جای views/site/about.phpرندر خواهد شد.

گام چهارم—در ماژول theme ،خصوصیت yii\base\Theme::$pathMap را به این شکل ویرایش کنید:

'pathMap' => [

   '@app/views' => '@app/themes/basic',

   '@app/modules' => '@app/themes/basic/modules',

],

 

گام پنجم—در ویجت های theme ، خصوصیت yii\base\Theme::$pathMap را به این شکل ویرایش کنید:

'pathMap' => [

   '@app/views' => '@app/themes/basic',

   '@app/widgets' => '@app/themes/basic/widgets', // <-- !!!

],

 

بعضی اوقات نیاز به تعریف یک تم ساده که شامل یک ظاهر ساده و اپلیکیشن ساده است،برای دستیابی به این باید از تم inheritance استفاده کنید.

گام ششم—کامپوننت view را ازبرنامه به این شکل ویرایش کنید:

'view' => [

   'theme' => [

      'basePath' => '@app/themes/basic',

      'baseUrl' => '@web/themes/basic',

      'pathMap' => [

         '@app/views' => [

            '@app/themes/christmas',

            '@app/themes/basic',

         ],

      ]

   ],

],

 

در پیکربندی بالا،فایلview : @app/views/site/index.php قالب بندی تم خواهد شد.یافایل @app/themes/christmas/site/index.php یافایل @app/themes/basic/site/index.php.به اینکه فایل وجودداشته باشد یانه،بستگی دارد.اگر هر دوفایل موجودباشد،فایل اولی استفاده خواهد شد.

گام هفتم—یک پوشه به نام themes/christmas/site بسازید.

گام هشتم—اکنون،داخل پوشه themes/christmas/site یک فایل به نام about.php باکدزیر بسازید:

<?php

   /* @var $this yii\web\View */

   use yii\helpers\Html;

   $this->title = 'About';

   $this->params['breadcrumbs'][] = $this->title;

   $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing,

      views, meta, tags']);

   $this->registerMetaTag(['name' => 'description', 'content' => 'This is the

      description of this page!'], 'description');

?>

<div class = "site-about">

   <h2>Christmas theme</h2>

   <img src = "http://pngimg.com/upload/fir_tree_PNG2514.png" alt = ""/>

   <p style = "color: red;">

      This is the About page. You may modify the following file to customize its content:

   </p>

</div>

 

گام نهم—اگر به آدرس http://localhost:8080/index.php?r=site/about بروید صفحه about با استفاده ازتم Christmas آپدیت شده است.

 

سازنده Query

Query builder هابه شما در ساخت Query های SQL در برنامه نویسی کمک میکند.  Query builder در نوشتن کدهای مرتبط و قابل خواندن به شما کمک میکند.

برای استفاده از Query builder باید این مراحل زیر را طی کنید:

  • یک شی yii\db\Query بسازید.
  • یک متد کوئری اجرا کنید.

برای ساخت یک شی yii\db\Query باید توابع مختلف query builder را برای قسمت های مختلف SQL query فرا خوانی کنید.

گام اول—برای نشان دادن مقدار استفاده  از query builder،متد actionTestDb را به این شکل ویرایش کنید:

public function actionTestDb() {

   //generates "SELECT id, name, email FROM user WHERE name = 'User10';"

   $user = (new \yii\db\Query())

      ->select(['id', 'name', 'email'])

      ->from('user')

      ->where(['name' => 'User10'])

      ->one();

   var_dump($user);

}

گام دوم—به آدرس http://localhost:8080/index.php?r=site/test-dbبروید خروجی زیر را خواهید دید:

  تابع Where()

تابع where() ،قسمت WHERE (شرط) را معرفی میکند.برای تعیین کردن شرط WHERE میتوانید از قالب های زیر استفاده کنید:

  • string format − ‘name = User10’
  • hash format − [‘name’ => ‘User10′, ’email => user10@gmail.com’]• operator format − [‘like’, ‘name’, ‘User’]

مثالی از فرمت رشته

public function actionTestDb() {

   $user = (new \yii\db\Query())

      ->select(['id', 'name', 'email'])

      ->from('user')

      ->where('name = :name', [':name' => 'User11'])

      ->one();

   var_dump($user);

}

 

خروجی:

مثالی از فرمت Hash

public function actionTestDb() {

   $user = (new \yii\db\Query())

      ->select(['id', 'name', 'email'])

      ->from('user')

      ->where([

         'name' => 'User5',

         'email' => 'user5@gmail.com'

      ])

      ->one();

   var_dump($user);

}

 

خروجی:

فرمت Operator به شما در معرفی شرط های دلخواه در قالب زیر کمک میکند [operator, operand1, operand2]

Operator میتواند:

  • and − [‘and’, ‘id = 1’, ‘id = 2’] will generate id = 1 AND id = 2
  • between − [‘between’, ‘id’, 1, 15]یک آی دی بین 1و15 ایجاد میکند.
  • not between—مثل between بااین تفاوت که این عدد بین این شرط نباشد.
  • in − [‘in’, ‘id’, [5,10,15]]—یک آی دی ازبین (5,10,15) انتخاب میکند.
  • like − [‘like’, ‘name’, ‘user’]—یک نلم مثل ‘%user%’ تولید میکند.
  • exists—یک عملوند که مثالی از کلاس yii\db\Query را می خواهد.
  • <, <=, >, >=, یا هر عملوند دیگر: [‘<‘, ‘id’, 10] یک آی دی کوچکتر از10 خواهد ساخت.

 

مثالی از قالب Operator (عملگر)

public function actionTestDb() {

   $users = (new \yii\db\Query())

      ->select(['id', 'name', 'email'])

      ->from('user')

      ->where(['between', 'id', 5, 7])

      ->all();

   var_dump($users);

}

خروجی:

 

  تابع orderBy()

تابع orderBy()به قسمت ORDER BY ،SQLاشاره میکند.

مثال

public function actionTestDb() {

   $users = (new \yii\db\Query())

      ->select(['id', 'name', 'email'])

      ->from('user')

      ->orderBy('name DESC')

      ->all();

   var_dump($users);

}

 

خروجی:

تابع groupBy()

تابع groupBy() به قسمت GROUP BY اشاره میکند و متد having() به قسمت having ازSQL

مثال

public function actionTestDb() {

   $users = (new \yii\db\Query())

      ->select(['id', 'name', 'email'])

      ->from('user')

      ->groupBy('name')

      ->having('id < 5')

      ->all();

   var_dump($users);

}

 

خروجی:

متدهای limit() و offset()به قسمت LIMIT و OFFSET  ازSQLاشاره میکند.

مثال:

public function actionTestDb() {

   $users = (new \yii\db\Query())

      ->select(['id', 'name', 'email'])

      ->from('user')

      ->limit(5)

      ->offset(5)

      ->all();

   var_dump($users);

}

 

خروجی:

کلاس yii\db\Query مجموعه زیادی از متد هایی برای اهداف مختلف را فراهم میکند.

all()—یک آرایه از ردیف های name-value برمیگرداند.

one()—ردیف اول را برمیگرداند.

column()–ستون اول را برمیگرداند.

scalar()—یک مقدار عددی از ردیف اول وستون اول نتیجه را برمیگرداند.

exists()—یک مقداررا برمیگرداندکه نشان میدهد کوئری دارای نتیجه است یانه.

count()—نتیجه شمارش کوئری را برمیگرداند.

other aggregation query methods—مثل sum($q), average($q), max($q), min($q)

پارامتر $q میتواند یک نام ستون یا یک اصطلاح دیتابیس باشد.

دسترسی به دیتابیس در Yii

Yii Dao(Database Access Object) یک API برای دسترسی به دیتابیس فراهم میکند.همچنین اساس متد های دسترسی به دیتابیس active record و query builder است.

YII DAOدیتابیس های زیررا پشتیبانی میکند:

  • MySQL
  • MSSQL
  • SQLite
  • MariaDB
  • PostgreSQL
  • ORACLE
  • CUBRID

ساخت یک کانکشن دیتابیس

گام اول—برای ساخت یک کانکشن دیتابیس باید یک شی از کلاس yii\db\Connection ایجاد کنید:

$mydb = new yii\db\Connection([

   'dsn' => 'mysql:host=localhost;dbname=mydb',

   'username' => 'username',

   'password' => 'password',

   'charset' => 'utf8',

]);

 

یک تمرین ساده پیکربندی یک کانکشن دیتابیس داخل کامپوننت های برنامه است،برای مثال داخل قالب پایه برنامه پیکر بندی کانکشن دیتابیس داخل فایل config/db.php قرارگرفته است:

<?php

   return [

      'class' => 'yii\db\Connection',

      'dsn' => 'mysql:host = localhost;dbname = helloworld',

      'username' => 'vladimir',

      'password' => '123574896',

      'charset' => 'utf8',

   ];

?>

 

گام دوم—برای دسترسی به کانکشن دیتابیس باید از عبارت زیر استفاده کنید:

Yii::$app->db

برای پیکربندی یک کانکشن دیتابیس باید DSN (Data Source Name) آن را بامتد dsn مشخص کنید.قالب DSN برای دیتابیس های مختلف،متفاوت است:

  • MySQL, MariaDB − mysql:host = localhost;dbname = mydb
  • PostgreSQL − pgsql:host = localhost;port = 5432;dbname = mydb
  • SQLite − sqlite:/path/to/db/file
  • MS SQL Server (via sqlsrv driver) − sqlsrv:Server = localhost;Database = mydb
  • MS SQL Server (via mssql driver) − mssql:host = localhost;dbname = mydb
  • MS SQL Server (via dblib driver) − dblib:host = localhost;dbname = mydb
  • CUBRID − cubrid:dbname = mydb;host = localhost;port = 33000
  • Oracle − oci:dbname = //localhost:1521/mydb

برای نمایش پرس وجوی دیتابیس در action به داده نیاز داریم.

 

آماده سازی دیتابیس

گام اول یک دیتابیس بسازید.دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

 

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

 

<?php

   return [

      'class' => 'yii\db\Connection',

      'dsn' => 'mysql:host = localhost;dbname = helloworld',

      'username' => 'vladimir',

      'password' => '12345',

      'charset' => 'utf8',

   ];

?>

 

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160106_163154_test_table extends Migration {

      public function safeUp() {

         $this->createTable("user", [

            "id" => Schema::TYPE_PK,

            "name" => Schema::TYPE_STRING,

            "email" => Schema::TYPE_STRING,

         ]);

         $this->batchInsert("user", ["name", "email"], [

            ["User1", "user1@gmail.com"],

            ["User2", "user2@gmail.com"],

            ["User3", "user3@gmail.com"],

            ["User4", "user4@gmail.com"],

            ["User5", "user5@gmail.com"],

            ["User6", "user6@gmail.com"],

            ["User7", "user7@gmail.com"],

            ["User8", "user8@gmail.com"],

            ["User9", "user9@gmail.com"],

            ["User10", "user10@gmail.com"],

            ["User11", "user11@gmail.com"],

         ]);

      }

      public function safeDown() {

         $this->dropTable('user');

      }

   }

?>

 

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

 

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

مدلMyUser در پوشه models ظاهر میشود.

Behavior ها در yii

Behavior ها اشیایی از کلاس yii \base\Behavior هستند که متد ها و خصوصیت هایش را به کامپوننتی که به آن وصل است اضافه میکندBehavior ها همچنین میتوانند به رویدادهایی که باکامپوننت اجرا شده،پاسخ بدهند.

گام اول—برای تعریف یک behavior کلاس yii \base\Behavior را گسترش دهید:

namespace app\components;

use yii\base\Behavior;

class MyBehavior extends Behavior {

   private $_prop1;

   public function getProp1() {

      return $this->_prop1;

   }

   public function setProp1($value) {

      $this->_prop1 = $value;

   }

   public function myFunction() {

      // ...

   }

}

کد بالا behavior را با خصوصیت (prop1) ومتدرا باخصوصیت (myFunction). تعریف میکند زمانیکه این behavior به یک کامپوننت وصل میشود،کامپوننت همچنین دارای این متد و خصوصیت خواهد شد.

برای دسترسی به کامپوننتی که behavior به آن وصل شده، باید از خصوصیت yii\base\Behavior::$owner استفاده کنید.

گام دوم—اگر بخواهید که behavior به رویدادهای کامپوننت پاسخ دهد،باید متد yii\base\Behavior::events() را مقداردهی کنید:

namespace app\components;

use yii\db\ActiveRecord;

use yii\base\Behavior;

class MyBehavior extends Behavior {

   public function events() {

      return [

         ActiveRecord::EVENT_AFTER_VALIDATE => 'afterValidate',

      ];

   }

   public function afterValidate($event) {

      // ...

   }

}

 

گام سوم—برای وصل کردن یک behavior باید متد behaviors() را از کلاس component مقداردهی کنید:

namespace app\models;

use yii\db\ActiveRecord;

use app\components\MyBehavior;

class MyUser extends ActiveRecord {

   public function behaviors() {

      return [

         // anonymous behavior, behavior class name only

         MyBehavior::className(),

         // named behavior, behavior class name only

         'myBehavior2' => MyBehavior::className(),

         // anonymous behavior, configuration array

         [

            'class' => MyBehavior::className(),

            'prop1' => 'value1',

            'prop2' => 'value2',

            'prop3' => 'value3',

         ],

         // named behavior, configuration array

         'myBehavior4' => [

            'class' => MyBehavior::className(),

            'prop1' => 'value1'

         ]

      ];

   }

}

 

گام چهارم—برای قطع ارتباط یک behavior ،متد yii\base\Component::detachBehavior() را فراخوانی کنید:

$component->detachBehavior('myBehavior');

 

برای نمایش behavior ها دریک action به داده نیاز داریم.

آماده سازی دیتابیس

گام اول یک دیتابیس بسازید.دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

 

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

<?php

   return [

      'class' => 'yii\db\Connection',

      'dsn' => 'mysql:host = localhost;dbname = helloworld',

      'username' => 'vladimir',

      'password' => '12345',

      'charset' => 'utf8',

   ];

?>

 

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160106_163154_test_table extends Migration {

      public function safeUp() {

         $this->createTable("user", [

            "id" => Schema::TYPE_PK,

            "name" => Schema::TYPE_STRING,

            "email" => Schema::TYPE_STRING,

         ]);

         $this->batchInsert("user", ["name", "email"], [

            ["User1", "user1@gmail.com"],

            ["User2", "user2@gmail.com"],

            ["User3", "user3@gmail.com"],

            ["User4", "user4@gmail.com"],

            ["User5", "user5@gmail.com"],

            ["User6", "user6@gmail.com"],

            ["User7", "user7@gmail.com"],

            ["User8", "user8@gmail.com"],

            ["User9", "user9@gmail.com"],

            ["User10", "user10@gmail.com"],

            ["User11", "user11@gmail.com"],

         ]);

      }

      public function safeDown() {

         $this->dropTable('user');

      }

   }

?>

 

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

 

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

متد

 

رویدادها در yii

شما میتوانید از رویدادهابرای اضافه کردن کد سفارشی به مکان های اجرااستفاده کنید.همچنین میتوانید کدهای سفارشی را به یک رویداد وصل کنید،و زمانی که رویداد اجرا شد کد اجرا میشود.برای مثال یک شیlogger میتواندرویدادuserRegistered را زمانی که یک کاربر جدید در سایتتان ثبت نام میکند،اجرا کند.اگر یک کلاس نیاز به اجرای رویداد را داشته باشد  باید آن را از کلاس yii\base\Component گسترش دهید.

 

event handler یک مخاطب PHP است شما میتوانید ازcallback های زیر استفاده کنید:

  • یک تابع عمومیPHP بعنوان یک رشته
  • یک تابع ناشناخته
  • یک آرایه از نام کلاس ویک متد بعنوان یک رشته .برای مثال [‘ClassName’, ‘methodName’]
  • یک آرایه از یک شی و یک متد بعنوان رشته ،برای مثال[$obj, ‘methodName’]

گام اول—برای اضافه کردن یکhandler به یک رویداد باید متدyii\base\Component::on() را فراخوانی کنید:

$obj = new Obj;

// this handler is a global function

$obj->on(Obj::EVENT_HELLO, 'function_name');

// this handler is an object method

$obj->on(Obj::EVENT_HELLO, [$object, 'methodName']);

// this handler is a static class method

$obj->on(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);

// this handler is an anonymous function

$obj->on(Obj::EVENT_HELLO, function ($event) {

   // event handling logic

});

شما میتوانید یک یا چند handlers به رویدادخود اضافه کنید. Handlers های اضافه شده با رویداد اجرا خواهندشد.

گام دوم—برای جلوگیری از فراخوانی handler ها باید خصوصیتyii\base\Event::$handled رابه true تنظیم کنید:

$obj = new Obj;

// this handler is a global function

$obj->on(Obj::EVENT_HELLO, 'function_name');

// this handler is an object method

$obj->on(Obj::EVENT_HELLO, [$object, 'methodName']);

// this handler is a static class method

$obj->on(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);

// this handler is an anonymous function

$obj->on(Obj::EVENT_HELLO, function ($event) {

   // event handling logic

});

شما میتوانید یک یاچندhandlers رابه رویداداضافه کنید. Handler های اضافه شده برای وصل شدن به  Eventفراخوانی میشوند.

گام دوم— برای جلوگیری از فراخوانی handler ها باید خصوصیتyii\base\Event::$handled رابه true تنظیم کنید:

$obj->on(Obj::EVENT_HELLO, function ($event) {

   $event->handled = true;

});

 

گام سوم—برای اضافه کردن handler در آغاز یک صف  باید متد yii\base\Component::on(), رابرای پارامتر چهارم بامقدار falseتنظیم کنید:

$obj->on(Obj::EVENT_HELLO, function ($event) {

   // ...

}, $data, false);

گام چهارم—برای اجرای یک event باید متد yii\base\Component::trigger() را فراخوانی کنید:

namespace app\components;

use yii\base\Component;

use yii\base\Event;

class Obj extends Component {

   const EVENT_HELLO = 'hello';

   public function triggerEvent() {

      $this->trigger(self::EVENT_HELLO);

   }

}

گام پنجم—برای جداکردن یک handler از یک رویداد باید متد yii\base\Component::off() را فراخوانی کنید:

$obj = new Obj;

// this handler is a global function

$obj->off(Obj::EVENT_HELLO, 'function_name');

// this handler is an object method

$obj->off(Obj::EVENT_HELLO, [$object, 'methodName']);

// this handler is a static class method

$obj->off(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);

// this handler is an anonymous function

$obj->off(Obj::EVENT_HELLO, function ($event) {

   // event handling logic

});

آموزش ویجت Gridview در فریم ورک yii

ویجت GridView در برنامه نویسی فریم ورک yii یک داده را از یک data provider می گیرد و داده را درقالب یک جدول بر میگرداند. هر ردیفی از جدول یک آیتم داده را نشان میدهد، و ستون یک صفت از آن ایتم.

گام اول— datawidget view را به این شکل ویرایش کنید:

<?php

   use yii\grid\GridView;

   echo GridView::widget([

      'dataProvider' => $dataProvider,

   ]);

?>

 

گام دوم–به آدرس http://localhost:8080/index.php?r=site/data-widget بروید. یک استفاده ساده از DataGrid را نشان میدهد:

آموزش رایگان ویجت Gridview در فریم ورک yii

ستون های ویجت DataGrid در قالب کلاس yii\grid\Column پیکر بندی شده است که یک صفت مدل را نمایش می دهدو میتواند فیلتر و ذخیره شود.

 

گام سوم— برای اضافه کردن یک ستون سفارشی به grid, فایل datawidget view را به این ویرایش کنید:

<?php

   yii\grid\GridView;

   echo GridView::widget([

      'dataProvider' => $dataProvider,

      'columns' => [

         'id',

         [

            'class' => 'yii\grid\DataColumn', // can be omitted, as it is the default

            'label' => 'Name and email',

            'value' => function ($data) {

               return $data->name . " writes from " . $data->email;

            },

         ],

      ],

   ]);

?>

 

گام چهارم—به آدرس http://localhost:8080/index.php?r=site/data-widget بروید خروجی را به این شکل خواهید دید:

آموزش رایگان ویجت Gridview در فریم ورک yii

ستون های Grid میتوانند با استفاده از کلاس های column مختلف شخصی سازی شوند،مثل

yii\grid\SerialColumn, yii\grid\ActionColumn, yii\grid\CheckboxColumn

گام پنجم—به آدرس http://localhost:8080/index.php?r=site/data-widget بروید تصویر زیرراخواهید دید.

آموزش رایگان ویجت Gridview در فریم ورک

فراهم کننده های داده در Yii

yii مجموعه ای از کلاس هایdata provider رافراهم میکندکه صفحه بندی و مرتب سازی را در یک فایل جمع میکند.یک data provider ،yii\data\DataProviderInterface راپیاده سازی میکند.

همچنین دستیابی به. داده هایی که ذخیره وصفحه بندی شده را پشتیبانی میکند. Data providers ها معمولا با داده های ویجت ها کار میکنند.

Yiiشامل گزینه ها زیر است:

  • ActiveDataProvider—که ازyii\db\ActiveQueryیاyii\db\Query برای ساخت پرس وجو از دیتابیس استفاده میکند.
  • SqlDataProvider—دستورات SQL را اجرا میکند و داده های برگشتی را به شکل آرایه بر میگرداند.
  • ArrayDataProvider—یک آرایه بزرگ را میگیرد و قسمتی از آن را بر میگرداند.

شما میتوانید حرکات مرتب سازی و صفحه بندی را از data-provider بوسیله پیکربندی خصوصیات pagination وsort تعریف کنید. Data widget ها مثلyii\grid\GridView یک خصوصیت به نام dataProvider دارد که شیprovider رامیگیرد وداده را در صفحه نمایش میدهد.

آماده سازی دیتابیس

گام اول— یک دیتابیس بسازید.دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

<?php

return [

'class' => 'yii\db\Connection',

'dsn' => 'mysql:host = localhost;dbname = helloworld',

'username' => 'vladimir',

'password' => '12345',

'charset' => 'utf8',

];

?>

 

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرمان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند. مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

use yii\db\Schema;

use yii\db\Migration;

class m160106_163154_test_table extends Migration {

public function safeUp() {

$this->createTable("user", [

"id" => Schema::TYPE_PK,

"name" => Schema::TYPE_STRING,

"email" => Schema::TYPE_STRING,

]);

$this->batchInsert("user", ["name", "email"], [

["User1", "user1@gmail.com"],

["User2", "user2@gmail.com"],

["User3", "user3@gmail.com"],

["User4", "user4@gmail.com"],

["User5", "user5@gmail.com"],

["User6", "user6@gmail.com"],

["User7", "user7@gmail.com"],

["User8", "user8@gmail.com"],

["User9", "user9@gmail.com"],

["User10", "user10@gmail.com"],

["User11", "user11@gmail.com"],

]);

}

public function safeDown() {

$this->dropTable('user');

}

}

?>

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

متد

مدلMyUser در پوشه models ظاهر میشود.

Active Data Provider

گام اول—یک تابع به نام actionDataProvider داخل  پوشه SiteController ایجاد کنید:

public function actionDataProvider(){

$query = MyUser::find();

$provider = new ActiveDataProvider([

'query' => $query,

'pagination' => [

'pageSize' => 2,

],

]);

// returns an array of users objects

$users = $provider->getModels();

var_dump($users);

}

 

در کدبالا،مایک شی ازکلاس ActiveDataProvider تعریف میکنیم.وکاربر ها را از صفحه اول نشان میدهیم.کلاس yii\data\ActiveDataProvider از کامپوننت برنامه DB بعنوان کانکشن DB استفاده میکند.

گام دوم— به آدرس http://localhost:8080/index.php?r=site/dataprovider بروید.خروجی زیر را خواهید دید:

SQL Data Provider

کلاس yii\data\SqlDataProvider بادستورات خام SQLکار میکند.

گام اول—متد actionDataProvider رابه این شکل ویرایش کنید:

public function actionDataProvider() {

$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM user')->queryScalar();

$provider = new SqlDataProvider([

'sql' => 'SELECT * FROM user',

'totalCount' => $count,

'pagination' => [

'pageSize' => 5,

],

'sort' => [

'attributes' => [

'id',

'name',

'email',

],

],

]);

// returns an array of data rows

$users = $provider->getModels();

var_dump($users);

}

گام دوم— به آدرس http://localhost:8080/index.php?r=site/dataprovider بروید.خروجی زیر را خواهید دید:

Array Data Provider

کلاسyii\data\ArrayDataProvider بهترین کلاس برای کاربا آرایه های بزرگ است.همچنین عناصر این آرایه میتوانند نتایج query شیDAO یاActive Record باشند.

گام اول— متد actionDataProvider را به این شکل ویرایش کنید:

public function actionDataProvider() {

$data = MyUser::find()->asArray()->all();

$provider = new ArrayDataProvider([

'allModels' => $data,

'pagination' => [

'pageSize' => 3,

],

'sort' => [

'attributes' => ['id', 'name'],

],

]);

// get the rows in the currently requested page

$users = $provider->getModels();

var_dump($users);

}

 

گام دوم— به آدرس http://localhost:8080/index.php?r=site/dataprovider بروید.خروجی زیر را خواهید دید:

نکته:برخلاف SQL Data Provider و Active Data Provider آرایه Data Provider تمام داده هارا در حافظه بارگزاری میکند پس کاربرد کمتری دارد.

داده های ویجت در Yii

Yii مجموعه ای از ویجت ها را برای نمایش داده ها فراهم میکند.شما میتوانید از ویجتDetailView برای نمایش یک رکورد استفاده کنید.ویجتListView مثل Grid View میتواند برای نمایش یک جدول از رکورد هابا خصوصیاتی مثل filtering,sorting,pagination استفاده شود.

آماده سازی دیتابیس

گام اول یک دیتابیس بسازید.دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

<?php

return [

'class' => 'yii\db\Connection',

'dsn' => 'mysql:host = localhost;dbname = helloworld',

'username' => 'vladimir',

      'password' => '12345',

      'charset' => 'utf8',

   ];

?>

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160106_163154_test_table extends Migration {

      public function safeUp() {

         $this->createTable("user", [

            "id" => Schema::TYPE_PK,

            "name" => Schema::TYPE_STRING,

            "email" => Schema::TYPE_STRING,

         ]);

         $this->batchInsert("user", ["name", "email"], [

            ["User1", "user1@gmail.com"],

            ["User2", "user2@gmail.com"],

            ["User3", "user3@gmail.com"],

            ["User4", "user4@gmail.com"],

            ["User5", "user5@gmail.com"],

            ["User6", "user6@gmail.com"],

            ["User7", "user7@gmail.com"],

            ["User8", "user8@gmail.com"],

            ["User9", "user9@gmail.com"],

            ["User10", "user10@gmail.com"],

            ["User11", "user11@gmail.com"],

         ]);

      }

      public function safeDown() {

         $this->dropTable('user');

      }

   }

?>

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

متد

مدلMyUser در پوشه models ظاهر میشود.

ویجت DetailView

ویجت DetailView داده های یک مدل را نمایش میدهد.خصوصیت $attributes مشخص میکند که کدام صفت مدل باید نمایش داده شود.

گام اول—متد actionDataWidget را به SiteController اضافه کنید:

public function actionDataWidget() {

   $model = MyUser::find()->one();

   return $this->render('datawidget', [

      'model' => $model

   ]);

}

در کد بالا، مدل اول MyUser را پیداکنید وبه datawidget view بفرستید.

گام دوم—یک فایل به نام datawidget.php داخل پوشه views/site ایجاد کنید:

<?php

   use yii\widgets\DetailView;

   echo DetailView::widget([

      'model' => $model,

      'attributes' => [

         'id',

         //formatted as html

         'name:html',

         [

            'label' => 'e-mail',

            'value' => $model->email,

         ],

      ],

   ]);

?>

گام سوم—حالا به آدرسh http://localhost:8080/index.php?r=site/data-widgetبروید.یک استفاده ساده و معمولی را از ویجت DetailView خواهید دید:

مرتب سازی در Yii

زمان نمایش تعداد زیادی داده ، ما اغلب نیاز به مرتب سازی داده داریم.yiiازyii\data\Sort object برای نشان دادن طرح مرتب سازی استفاده میکند.

برا ی نمایش مرتب سازی در action به داده نیاز داریم.

آماده سازی دیتابیس

گام اول یک دیتابیس بسازید. دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

<?php

return [

'class' => 'yii\db\Connection',

'dsn' => 'mysql:host = localhost;dbname = helloworld',

'username' => 'vladimir',

'password' => '12345',

'charset' => 'utf8',

];

?>

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

use yii\db\Schema;

use yii\db\Migration;

class m160106_163154_test_table extends Migration {

public function safeUp() {

$this->createTable("user", [

"id" => Schema::TYPE_PK,

"name" => Schema::TYPE_STRING,

"email" => Schema::TYPE_STRING,

]);

$this->batchInsert("user", ["name", "email"], [

["User1", "user1@gmail.com"],

["User2", "user2@gmail.com"],

["User3", "user3@gmail.com"],

["User4", "user4@gmail.com"],

["User5", "user5@gmail.com"],

["User6", "user6@gmail.com"],

["User7", "user7@gmail.com"],

["User8", "user8@gmail.com"],

["User9", "user9@gmail.com"],

["User10", "user10@gmail.com"],

["User11", "user11@gmail.com"],

]);

}

public function safeDown() {

$this->dropTable('user');

}

}

?>

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

متد مدلMyUser در پوشه models ظاهر میشود.

مرتب سازی در Action

گام اول— یک متد actionSorting را به SiteController اضافه کنید:

public function actionSorting() {

//declaring the sort object

$sort = new Sort([

'attributes' => ['id', 'name', 'email'],

]);

//retrieving all users

$models = MyUser::find()

->orderBy($sort->orders)

->all();

return $this->render('sorting', [

'models' => $models,

'sort' => $sort,

]);

}

گام دوم– یک فایلviewبه نام sorting inside داخل پوشهviews/site ایجاد کنید:

<?php

// display links leading to sort actions

echo $sort->link('id') . ' | ' . $sort->link('name') . ' | ' . $sort->link('email');

?><br/>

<?php foreach ($models as $model): ?>

<?= $model->id; ?>

<?= $model->name; ?>

<?= $model->email; ?>

<br/>

<?php endforeach; ?>

گام سوم— حالا به آدرس http://localhost:8080/index.php?r=site/sortingبروید.می توانید فیلدهای(id, name, email) را بصورت مرتب در تصویر زیر ببینید:

مسیر یابی آدرس در Yii

برای تغییر مسیر پیش فرض برنامه باید خصوصیت defaultRoute را پیکربندی کنید.

گام اول–فایلconfig/web.php رابه این شکل ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'defaultRoute' => 'site/contact',

      'components' => [

         //other code

?>

گام دوم—به آدرسhttp://localhost:8080/index.php بروید صفحه پیش فرض contact را خواهید دید:

برای گذاشتن برنامه تان در حالت نگهداری موقت باید خصوصیت yii\web\Application::$catchAll را پیکربندی کنید.

گام سوم—تابع زیر را به SiteController اضافه کنید:

public function actionMaintenance() {

   echo "<h1>Maintenance</h1>";

}

گام چهارم—سپس فایلconfig/web.php را به این شکل ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'catchAll' => ['site/maintenance'],

      'components' => [

         //OTHER CODE

گام پنجم—اکنون هر آدرسی را در برنامه خود تایپ کنید این راخواهیددید.

ساخت آدرس

برای ساخت انواع آدرس مختلف بایداز متد کمک کننده yii\helpers\Url::to() کنید.مثال زیر فرض میکند که فرمت آدرس پیش فرض استفاده شده.

گام اول—متد actionRoutes()actionRoutes() را به SiteController اضافه کنید:

public function actionRoutes() {

   return $this->render('routes');

}

این متد به سادگی routes view را رندر میکند.

گام دوم—-داخل پوشه views/site یک فایل به نام routes.php باکد زیر بسازید:

<?php

   use yii\helpers\Url;

?>

<h4>

   <b>Url::to(['post/index']):</b>

   <?php

      // creates a URL to a route: /index.php?r = post/index

      echo Url::to(['post/index']);

   ?>

</h4>

<h4>

   <b>Url::to(['post/view', 'id' => 100]):</b>

   <?php

      // creates a URL to a route with parameters: /index.php?r = post/view&id=100

      echo Url::to(['post/view', 'id' => 100]);

   ?>

</h4>

<h4>

   <b>Url::to(['post/view', 'id' => 100, '#' => 'content']):</b>

   <?php

      // creates an anchored URL: /index.php?r = post/view&id=100#content

      echo Url::to(['post/view', 'id' => 100, '#' => 'content']);

   ?>

</h4>

<h4>

   <b>Url::to(['post/index'], true):</b>

   <?php

      // creates an absolute URL: http://www.example.com/index.php?r=post/index

      echo Url::to(['post/index'], true);

   ?>

</h4>

<h4>

   <b>Url::to(['post/index'], 'https'):</b>

   <?php

      // creates an absolute URL using the https scheme: https://www.example.com/index.php?r=post/index

      echo Url::to(['post/index'], 'https');

   ?>

</h4>

گام سوم—به آدرسhttp://localhost:8080/index.php?r=site/routes بروید بعضی استفاده ها را ازتایع to() می بینید.

مسیر موردنظر به متدyii\helpers\Url::to() که به قانون های زیر مربوط است:

  • اگر مسیر خالی باشد،مسیر جاری درخواست شده استفاده خواهد شد.
  • اگر مسیر هیچ”/” مدیریتی نداشته باشد،بعنوان یک مسیر مربوط به ماژول جاری در نظر گرفته میشود.
  • اگر مسیر هیچ”/” نداشته باشد،بعنوان یک action ID از کنترلر جاری در نظر گرفته میشود.

کلاس کمکی yii\helpers\Url همچنین متدهای پراستفاده زیادی فراهم میکند.

گام چهارم—routes View را با کد زیر ویرایش کنید:

<?php

   use yii\helpers\Url;

?>

<h4>

   <b>Url::home():</b>

   <?php

      // home page URL: /index.php?r=site/index

      echo Url::home();

   ?>

</h4>

<h4>

   <b>Url::base():</b>

   <?php

      // the base URL, useful if the application is deployed in a sub-folder of the Web root

      echo Url::base();

   ?>

</h4>

<h4>

   <b>Url::canonical():</b>

   <?php

      // the canonical URL of the currently requested URL

      // see https://en.wikipedia.org/wiki/Canonical_link_element

      echo Url::canonical();

   ?>

</h4>

<h4>

   <b>Url::previous():</b>

   <?php

      // remember the currently requested URL and retrieve it back in later requests

      Url::remember();

      echo Url::previous();

   ?>

</h4>

گام پنجم—اگر به آدرس http://localhost:8080/index.php?r=site/routes بروید، این را خواهید دید:

قوانین و فرمت آدرس ها در Yii

قوانین آدرس ها

یک قانون آدرس مثالی ازyii\web\UrlRule است.کامپوننت مدیریت آدرس  ازقوانین تعیین شده در خصوصیت Rulesاستفاده میکند زمانیکه آدرس مناسب فعال است.

برای تبدیل یک درخواست مدیر آدرس،قوانین را برای مقداردهی می گیرد وبرای قانون اول جستجو میکند.

گام اول—کامپوننت urlManager در فایل config/web.php را ویرایش کنید.

'urlManager' => [

   'showScriptName' => false,

   'enablePrettyUrl' => true,

   'rules' => [

      'about' => 'site/about',

   ]

],

گام دوم—به آدرسhttp://localhost:8080/about  بروید این را خواهید دید:

یک آدرس میتوانید با پارامتر های query به این شکل همراه شود:

<ParamName:RegExp>, where

 

  • ParamName—نام پارامتر
  • RegExp—یک عبارت معمولی برای مطابقت با قوانین پارامترها ماقوانین ادرس زیر را تعریف کردیم.
[

'articles/<year:\d{4}>/<category>' => 'article/index',

'articles' => 'article/index',

'article/<id:\d+>' => 'article/view',

]

زمانیکه قوانین برای تبدیل استفاده می شود:

  • /index.php/articles is parsed into the article/index
  • /index.php/articles/2014/php is parsed into the article/index
  • /index.php/article/100 is parsed into the article/view
  • /index.php/articles/php is parsed into articles/phpزمانیکه برای ساخت آدرس استفاده میشود
  • Url::to([‘article/index’]) creates /index.php/articles
  • Url::to([‘article/index’, ‘year’ => 2014, ‘category’ => ‘php’]) creates /index.php/articles/2014/php
  • Url::to([‘article/view’, ‘id’ => 100]) creates /index.php/article/100
  • Url::to([‘article/view’, ‘id’ => 100, ‘source’ => ‘ad’]) creates /index.php/article/100?source=ad
  • Url::to([‘article/index’, ‘category’ => ‘php’]) creates /index.php/article/index?category=php برای اضافه کردن یک پسوند به آدرس،باید خصوصیت yii\web\UrlManager::$suffix را پیکربندی کنید

گام سوم—urlComponent را در فایلconfig/web.php ویرایش کنید:

'urlManager' => [

   'showScriptName' => false,

   'enablePrettyUrl' => true,

   'enableStrictParsing' => true,

   'suffix' => '.html'

],

گام چهارم—به این آدرس برویدhttp://localhost:8080/site/contact.html،این را در صفحه نمایش خود خواهید دید،به پسوندhtml توجه کنید.

فرمت های آدرس

زمانی که یک برنامه آدرس را پردازش می کند آدرس را به یک مسیر تبدیل میکند،سپس برای مدیریت درخواست این مسیر برای معرفی controller action مطابق استفاده میشود.این پروسه routing نامیده میشود.

برعکس آن URL creation نامیده میشود.برنامه مدیریت آدرس مسُول routing وURL creation است که دو متد را فراهم میکند:

• parseRequest()—یک درخواست را به مسیر تبدیل میکند.
• createUrl()—یک آدرس از مسیر داده شده میسازد.

برنامه وکامپوننت مدیریت آدرس دوفرمت را پشتیبانی میکند.
فرمت پیش فرض از یک پارامتر query (r)برای پاسخ به مسیر استفاده میکند برای مثال ادرس/index.php?r=news/view&id=5 مسیر news/view وپارامتر5 id query رانشان میدهد.
یک فرمت آدرس مناسب ازیک مسیر بزرگ با نام اسکریپت استفاده میکند.برای مثال در مثال قبلی فرمت مناسب باید /index.php/news/view/5 باشد.برای استفاده ازاین فرمت باید قوانین آدرس را تنظیم کنید.
برای فعال کردن فرمت آدرس مناسب ومخفی کردن نام اسکریپت ورودی این مراحل را طی کنید.

گام اول—فایلconfig/web.php را به این شکل ویرایش کنید:

<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) -
//this is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
'showScriptName' => false,
'enablePrettyUrl' => true
],
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>

مافرمتpretty URL را فعال کردیم ونام اسکریپت ورودی را غیرفعال کردیم.

گام دوم—اکنون اگر به آدرسhttp://localhost:8080/site/about در مرورگرتان بروید pretty URL را در action خواهید دید..


توجه داشته باشد که دیگرآدرسhttp://localhost:8080/index.php?r=site/about وجودندارد.

فرم هایHTML Yii

زمانی که یک فرم برپایه یک مدل است، راه معمول برای ساخت این فرم در yii بوسیله کلاسyii \widgets\ActiveForm است.در بیشتر مواقع، یک فرم یک مدل مطابق دارد که برای اعتبار سنجی داده به کار می رود.اگر مدل داده را از دیتابیس می خواند،پس مدل باید از کلاس ActiveRecord بدست آید.اگر مدل داده های دلخواه را میگیرد،باید از کلاس yii \base\Model بدست آید.

ثبت فرم در yii

گام اول داخل پوشه models ، یک فایل به نام RegistrationForm.php باکد زیر بسازید:

<?php

   namespace app\models;

   use Yii;

   use yii\base\Model;

   class RegistrationForm extends Model {

      public $username;

      public $password;

      public $email;

      public $subscriptions;

      public $photos;

      /**

      * @return array customized attribute labels

      */

      public function attributeLabels() {

         return [

            'username' => 'Username',

            'password' => 'Password',

            'email' => 'Email',

            'subscriptions' => 'Subscriptions',

            'photos' => 'Photos',

         ];

      }

   }

?>

مایک مدل برای فرم ثبت مان با پنج خصوصیت

(username, password, email, subscriptions, and photos)تعریف کردیم.

گام دوم—برای نشان دادن این فرم متدactionRegistration را به SiteController اضافه کنید.

public function actionRegistration() {

   $mRegistration = new RegistrationForm();

   return $this->render('registration', ['model' => $mRegistration]);

}

ما یک شی از RegistrationForm ساختیم و آن را به registration view فرستادیم.الان وقت ساخت یک view است.

گام سوم—داخل پوشه views/site ،یک فایل به نامregistration.php با کدهای زیر بسازید:

<?php

   use yii\bootstrap\ActiveForm;

   use yii\bootstrap\Html;

?>

<div class = "row">

   <div class = "col-lg-5">

      <?php $form = ActiveForm::begin(['id' => 'registration-form']); ?>

      <?= $form->field($model, 'username') ?>

      <?= $form->field($model, 'password')->passwordInput() ?>

      <?= $form->field($model, 'email')->input('email') ?>

      <?= $form->field($model, 'photos[]')>fileInput(['multiple'=>'multiple']) ?>

      <?= $form->field($model, 'subscriptions[]')->checkboxList(['a' => 'Item A',

         'b' => 'Item B', 'c' => 'Item C']) ?>

      <div class = "form-group">

         <?= Html::submitButton('Submit', ['class' => 'btn btn-primary',

            'name' => 'registration-button']) ?>

      </div>

      <?php ActiveForm::end(); ?>

   </div>

</div>

ما این را مشاهده خواهیم کرد.

تابعActiveForm::begin() شروع فرم را نشانه گذاری میکند.تمام کدهای بین توابعActiveForm::begin() وActiveForm::end() داخل تگ Form قرارخواهد گرفت.

برای ساخت یک فیلد در فرم باید متد ActiveForm::field() را فراخوانی کنید.که تمام تگ های ورودی و برچسب ها را ایجاد میکند. نام های ورودی بطور خودکار تعیین می شوند.

برا ی مثال خصوصیت password،RegistrationForm خواهد بود. اگر خصوصیتی بخواهید که یک آرایه را می گیرد،باید به نام خصوصیت اضافه کنید.

گام چهارم—حالا اکر به آدرس http://localhost:8080/index.php?r=site/registration بروید فرم مان را خواهید دید:

اعتبار سنجی در Yii

شما نباید به داده هایی که کاربر میفرستد اعتماد کنید.برای تایید اعتبار یک مدل از ورودی های کاربر باید متد yii\base\Model::validate() را فراخوانی کنید.که یک مقدارBoolean را اگر اعتبار سنجی موفق بود می فرستد.اگر خطاداشت،باید آنها را از خصوصیت yii\base\Model::$errors yii\base\Model::$errors بگیرید.

استفاده از قوانین

برای کارکردن تابعvalidate() باید متد yii\base\Model::rules() را مقداردهی کنید.

گام اول—متد rules() یک آرایه را در قالب زیر برمی گرداند:

[

   // required, specifies which attributes should be validated

   ['attr1', 'attr2', ...],

   // required, specifies the type a rule.

   'type_of_rule',

   // optional, defines in which scenario(s) this rule should be applied

   'on' => ['scenario1', 'scenario2', ...],

   // optional, defines additional configurations

   'property' => 'value', ...

]

برای هرrule باید حداقل معرفی کنید که کدام صفت rule یا کدام نوع از rule اعمال می شود.

قوانین اصلی اعتبارسنجی boolean, captcha, compare, date, default, double, each, email, exist, file, filter, image, ip, in, integer, match, number, required, safe, string, trim, unique, url. هستند.

گام دوم—یک مدل جدید در پوشه models ایجاد کنید.

<?php

   namespace app\models;

   use Yii;

   use yii\base\Model;

   class RegistrationForm extends Model {

      public $username;

      public $password;

      public $email;

      public $country;

      public $city;

      public $phone;

      public function rules() {

         return [

            // the username, password, email, country, city, and phone attributes are

            //required

            [['username' ,'password', 'email', 'country', 'city', 'phone'], 'required'],

            // the email attribute should be a valid email address

            ['email', 'email'],

         ];

      }

   }

?>

ما یک مدل برای فرم ثبت مان تعریف کردیم.این مدل پنج خصوصیت به نام

(username, password, email, country, city, phone)دارد.همه این ها نیاز هستند و خصوصیت email باید دارای یک ایمیل معتبر باشد.

گام سوم—متد actionRegistration رابه محل SiteController اضافه کنید و یک مدل به نام RegistrationForm بسازید وبه view بفرستید.

<?php

   use yii\bootstrap\ActiveForm;

   use yii\bootstrap\Html;

?>

<div class = "row">

   <div class = "col-lg-5">

      <?php $form = ActiveForm::begin(['id' => 'registration-form']); ?>

         <?= $form->field($model, 'username') ?>

         <?= $form->field($model, 'password')->passwordInput() ?>

         <?= $form->field($model, 'email')->input('email') ?>

         <?= $form->field($model, 'country') ?>

         <?= $form->field($model, 'city') ?>

         <?= $form->field($model, 'phone') ?>

         <div class = "form-group">

            <?= Html::submitButton('Submit', ['class' => 'btn btn-primary',

               'name' => 'registration-button']) ?>

         </div>

      <?php ActiveForm::end(); ?>

   </div>

</div>

ما ازویجت ActiveForm برای نمایش فرم ثبت مان استفاده میکینم.

گام پنجم—اگر به آدرس http://localhost:8080/index.php?r=site/registration برویدوروی کلید ثبت کلیک کنید،قوانین اعتبار سنجی را در عمل خواهید دید:

گام ششم—-برای شخصی سازی یک پیغام خطابرای خصوصیت username متد rules() در فرم ثبت به این شکل ویرایش کنید:

public function rules() {

   return [

      // the username, password, email, country, city, and phone attributes are required

      [['password', 'email', 'country', 'city', 'phone'], 'required'],

      ['username', 'required', 'message' => 'Username is required'],

      // the email attribute should be a valid email address

      ['email', 'email'],

   ];

}

گام هفتم—به هاست محلی خود بروید(http://localhost:8080/index.php?r=site/registration) وروی کلید Submitکلیک کنید می بینید که پیغام خطای خصوصیت username تغییر کرده است.

گام هشتم—برای شخصی سازی پروسه اعتبار سنجی باید متدهای زیر را مقداردهی کنید:

yii\base\Model::beforeValidate(): triggers a

yii\base\Model::EVENT_BEFORE_VALIDATE event.

yii\base\Model::afterValidate(): triggers a

yii\base\Model::EVENT_AFTER_VALIDATE event.

گام نهم—برای حذف فاصله های اطراف خصوصیت country وتبدیل ورودی خالی از خصوصیت city به مقدارخالی باید از متدهای trim و default استفاده کنید.

public function rules() {

   return [

      // the username, password, email, country, city, and phone attributes are required

      [['password', 'email', 'country', 'city', 'phone'], 'required'],

      ['username', 'required', 'message' => 'Username is required'],

      ['country', 'trim'],

      ['city', 'default'],

      // the email attribute should be a valid email address

      ['email', 'email'],

   ];

}

گام دهم—اگر ورودی خالی است میتوانید یک مقدار پیش فرض برایش تنظیم کنید.

اگر خصوصیت city خالی باشد،پس مقدار پیش فرض “Paris” استفاده خواهد شد.

public function rules() {

   return [

      ['city', 'default', 'value' => 'Paris'],

   ];

}

Session ها در Yii

Session ها داده ها را برای صفحات مختلف قابل دسترسی می کنند.یک Session  فایلی روی سرور در یک پوشه موقتی که تمام Sessionهای مختلف ذخیره میشوند ایجاد میکند.داده برای تمام صفحات وب سایت تان در طول استفاده ی یک کاربر ویژه موجود است.

 

زمانیکه یک session اجرا میشود،این مراحل اتفاق می افتد:

  • PHPیک آی دی منحصربه فرد برای آن session خاص ایجاد میکند.
  • Cookieروی مرورگر ارسال میشود یعنی طرف کلاینت است.
  • سروریک فایل در پوشه موقتی که تمام session هاومتغیرها ذخیره میشوند ایجاد میکند.
  • زمانیکه سرورمیخواهد مقداری را از متغیر sessionبازیابی کند،PHPبطور خودکارآی دی منحصر بفرد session رااز PHPSESSID می گیرد.کوکی در پوشه موقتی اش برای فایل مورد نیاز جستجو میکند.

 

برای اجرای یک session باید تابع session_start() را فراخوانی کنید.تمام متغیرهای session در متغیر عمومی $_SESSION ذخیره میشود.شما همچنین میتوانید از تابع isset() برای چک کردن متغیر تنظیم شده ،استفاده کنید:

<?php

   session_start();

   if( isset( $_SESSION['number'] ) ) {

      $_SESSION['number'] += 1;

   }else {

      $_SESSION['number'] = 1;

   }

   $msg = "This page was visited ".  $_SESSION['number'];

   $msg .= "in this session.";

   echo $msg;

?>

برای ازبین بردن یک session باید تابع session_destroy() را فراخوانی کنید.برای ازبین بردن یک متغیر session نیز تابع unset() را فراخوانی کنید

<?php

   unset($_SESSION['number']);

   session_destroy();

?>

استفاده از sessionهادرyii:

Sessionها به داده ها اجازه ادامه دادن در بین دستورات کاربر را می دهد.درPHP شما میتوانید به آنها از طریق متغیرSession دسترسی پیداکنید.در Yiiشما میتوانید به Sessionها از طریق کامپوننت برنامه Session دسترسی پیداکنید.

گام اول—متد actionOpenAndCloseSession را به SiteController اضافه کنید:

public function actionOpenAndCloseSession() {

   $session = Yii::$app->session;

   // open a session

   $session->open();

   // check if a session is already opened

   if ($session->isActive) echo "session is active";

   // close a session

   $session->close();

   // destroys all data registered to a session

   $session->destroy();

}

درکدبالا،ماکامپوننت session را گرفتیم.یک sessionرا بازکنید ببینید که فعال است یانه. Sessionراببندید و ان را ازبین ببرید.

گام دوم—به آدرس http://localhost:8080/index.php?r=site/open-and-close-session بروید این را خواهید دید:

برای دسترسی به متغیر های session از متد های set() و get() استفاده کنید.

گام سوم—یک متد به نام actionAccessSession به SiteController اضافه کنید.

public function actionAccessSession() {

   $session = Yii::$app->session;

   // set a session variable

   $session->set('language', 'ru-RU');

   // get a session variable

   $language = $session->get('language');

   var_dump($language);

   // remove a session variable

   $session->remove('language');

   // check if a session variable exists

   if (!$session->has('language')) echo "language is not set";

   $session['captcha'] = [

      'value' => 'aSBS23',

      'lifetime' => 7200,

   ];

   var_dump($session['captcha']);

}

گام چهارم—به آدرس http://localhost:8080/index.php?r=site/access-session بروید این تصویر را خواهید دید:

خصوصیات در Yii

متغیر های کلاسmember درPHP ،properties هم نامیده میشوند.آنها حالت شی کلاس را نشان میدهند.yiiیک کلاس به نام yii\base\Object رامعرفی میکند.و معرفی خصوصیات را با متدهای getter وsetter پشتیبانی میکند.

متدgetter باکلمهget شروع میشود.یک متدsetter باکلمهset شروع میشود.شما میتوانید از خصوصیت هایی که بامتهای getters وsetters مثل کلاس متغیر های member تعریف شده اند،استفاده کنید.

زمانی که یک property خوانده میشود،متدgetter فراخوانی میشود.زمانیکه property نسبت داده میشود،متدsetter خوانده میشود.یکproperty که باgetter معرفی میشودفقط خواندنی است البته اگرsetter معرفی نشده باشد.

گام اول—یک فایل به نام Taxi.php داخل پوشه components ایجاد کنید:

<?php

   namespace app\components;

   use yii\base\Object;

   class Taxi extends Object {

      private $_phone;

      public function getPhone() {

         return $this->_phone;

      }

      public function setPhone($value) {

         $this->_phone = trim($value);

      }

   }

?>

در کد بالا،ماکلاس Taxi راکه ازطریق شی کلاس بدست می آید، تعریف کردیم.زمانی که ما یکgetter (getPhone()) ویکsetter (setPhone()) را تنظیم کردیم.

گام دوم—اکنون یک متدactionProperties رابه SiteController اضافه کنید:

public function actionProperties() {

   $object = new Taxi();

   // equivalent to $phone = $object->getPhone();

   $phone = $object->phone;

   var_dump($phone);

   // equivalent to $object->setLabel('abc');

   $object->phone = '79005448877';

   var_dump($object);

}

در تابع بالا مایک شی به نامTaxi ایجادکردیم،وبا متدgette به خصوصیت phone دسترسی پیداکردیم.وهمچنین خصوصیتphone را باsetter تنظیم کردیم.

گام سوم—به آدرسhttp://localhost:8080/index.php?r=site/properties بروید. خروجی زیر را خواهید دید:

کوکی ها در Yii

کوکی ها متن های ساده ای اند که بر روی کامپیوتر کلاینت ذخیره میشود. شما میتوانید از آنها برای اهداف ردیابی استفاده کنید.

سه مرحله برای کاربر برگردانده شده وجود دارد:

  • سرور مجموعه ای از cookie ها را به کلاینت ارسال می کند. برای مثال ID یا TOKEN
  • مرورگر ان را ذخیره میکند.
  • بعد از ان مرورگر یک درخواست را به وب سرور میفرستد، همچنین آن کوکی ها را ارسال میکند، پس سرور میتواند از ان اطلاعات برای شناسایی کاربر استفاده کند.

cookie ها معمولا مجموعه ای در سربرگ های HTTP است.همانطور که در کد زیر می بینید:

HTTP/1.1 200 OK

Date: Fri, 05 Feb 2015 21:03:38 GMT

Server: Apache/1.3.9 (UNIX) PHP/4.0b3

Set-Cookie: name = myname; expires = Monday, 06-Feb-16 22:03:38 GMT;

path = /; domain = tutorialspoint.com

Connection: close

Content-Type: text/html\

PHPتابع setcookie () را برای تنظیم کوکی ها فراهم میکند:

setcookie(name, value, expire, path, domain, security);

  • name—نام کوکی را تنظیم میکند و در متغیر محیطی به نام HTTP_COOKIE_VARS ذخیره میکند.
  • Value—مقدار متغیر را تنظیم میکند.
  • Expiry—یک زمان برحسب ثانبه از سال 1970 رامعرفی میکند. بعد از این زمان کوکی غیرقابل دسترس خواهد شد.
  • Path— برای پوشه ها معلوم میکندکه کدام cookie معتبر است.
  • Domain—میتواند برای تعریف نام دامین در دامین های بزرگ استفاده شود.تمام کوکی ها فقط برای هاست و دامین هایی معتبر است که آنهارا ساخته اند.
  • Security—اگر تنظیم باشد به این معنیست که کوکی باید فقط با HTTPS ارسال شود همچنین زمانی که بامقدار”0” تنظیم باشد کوکی میتواند با HTTP معمولی ارسال شود.

برای دسترسی به کوکی ها در PHP باید از متغیر های $_COOKIE یا $HTTP_COOKIE_VARS استفاده کنید:

<?php

echo $_COOKIE["token"]. "<br />";

/* is equivalent to */

echo $HTTP_COOKIE_VARS["token"]. "<br />";

echo $_COOKIE["id"] . "<br />";

/* is equivalent to */

echo $HTTP_COOKIE_VARS["id"] . "<br />";

?>

برای حذف یک کوکی باید کوکی را با تاریخی که گذشته است،مقداردهی کنید:

<?php

setcookie( "token", "", time()- 60, "/","", 0);

setcookie( "id", "", time()- 60, "/","", 0);

?>

ساخت رویداد در Yii

در این قسمت یک Eventرا در yii ایجاد میکنیم.برای نشان دادن eventدر action ها به داده نیاز داریم.

آماده سازی دیتابیس

گام اول یک دیتابیس بسازید.دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

<?php

   return [

      'class' => 'yii\db\Connection',

      'dsn' => 'mysql:host = localhost;dbname = helloworld',

      'username' => 'vladimir',

      'password' => '12345',

      'charset' => 'utf8',

   ];

?>

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160106_163154_test_table extends Migration {

      public function safeUp() {

         $this->createTable("user", [

            "id" => Schema::TYPE_PK,

            "name" => Schema::TYPE_STRING,

            "email" => Schema::TYPE_STRING,

         ]);

         $this->batchInsert("user", ["name", "email"], [

            ["User1", "user1@gmail.com"],

            ["User2", "user2@gmail.com"],

            ["User3", "user3@gmail.com"],

            ["User4", "user4@gmail.com"],

            ["User5", "user5@gmail.com"],

            ["User6", "user6@gmail.com"],

            ["User7", "user7@gmail.com"],

            ["User8", "user8@gmail.com"],

            ["User9", "user9@gmail.com"],

            ["User10", "user10@gmail.com"],

            ["User11", "user11@gmail.com"],

         ]);

      }

      public function safeDown() {

         $this->dropTable('user');

      }

   }

?>

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

متد

مدلMyUser در پوشه models ظاهر میشود.

ساخت یک رویداد

فرض کنید که میخواهیم یک ایمیل به مدیر ارسال کنیم.هروقتی که یک کاربر در وب سایتمان ثبت نام میکند.

گام اول—فایل models/MyUser.php را به این شکل ویرایش کنید:

<?php

   namespace app\models;

   use Yii;

   /**

   * This is the model class for table "user".

   *

   * @property integer $id

   * @property string $name

   * @property string $email

   */

   class MyUser extends \yii\db\ActiveRecord {

      const EVENT_NEW_USER = 'new-user';

      public function init() {

         // first parameter is the name of the event and second is the handler.

         $this->on(self::EVENT_NEW_USER, [$this, 'sendMailToAdmin']);

      }

      /**

      * @inheritdoc

      */

      public static function tableName() {

         return 'user';

      }

      /**

      * @inheritdoc

      */

      public function rules() {

         return [

            [['name', 'email'], 'string', 'max' => 255]

         ];

      }

      /**

      * @inheritdoc

      */

      public function attributeLabels() {

         return [

            'id' => 'ID',

            'name' => 'Name',

            'email' => 'Email',

         ];

      }

      public function sendMailToAdmin($event) {

         echo 'mail sent to admin using the event';

      }

   }

?>

درکد بالا مایک رویداد به نام “new-user” ایجاد کردیم.سپس در مند init() تابع sendMailToAdmin را به رویداد “new-user” اضافه کردیم الان باید این رویدادرا اجرا کنیم.

گام دوم—یک متد به نام actionTestEvent در SiteController ایجاد کنید:

public function actionTestEvent() {

   $model = new MyUser();

   $model->name = "John";

   $model->email = "john@gmail.com";

   if($model->save()) {

      $model->trigger(MyUser::EVENT_NEW_USER);

   }

}

در کد بالا مایک کاربر را ایجاد کردیم و رویداد “new-user” اجراکردیم.

گام سوم— اکنون به آدرس http://localhost:8080/index.php?r=site/test-event بروید این خروجی را خواهیددید:

ذخیره yii

Caching

Cachingیک راه مناسب برای بهتر کردن کارایی اپلیکیشن شماست.مکانیسمCaching داده های استاتیک را در Cache ذخیره میکندو زمانیکه درخواست شد به آن کش مراجعه میکند.برروی سرور از کش برای ذخیره اطلاعات پایه استفاده میشود،مثل یک لیست از اخبار جدید.اما در کلاینت،ازHTTP caching برای نگهداری بیشتر صفحات اخیر که درکش مرورگر ذخیره شده،  استفاده میشود.

آماده سازی دیتابیس

گام اول یک دیتابیس بسازید.دیتابیس میتواند به دوشکل ساخته شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده.

<?php

   return [

      'class' => 'yii\db\Connection',

      'dsn' => 'mysql:host = localhost;dbname = helloworld',

      'username' => 'vladimir',

      'password' => '12345',

      'charset' => 'utf8',

   ];

?>

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160106_163154_test_table extends Migration {

      public function safeUp() {

         $this->createTable("user", [

            "id" => Schema::TYPE_PK,

            "name" => Schema::TYPE_STRING,

            "email" => Schema::TYPE_STRING,

         ]);

         $this->batchInsert("user", ["name", "email"], [

            ["User1", "user1@gmail.com"],

            ["User2", "user2@gmail.com"],

            ["User3", "user3@gmail.com"],

            ["User4", "user4@gmail.com"],

            ["User5", "user5@gmail.com"],

            ["User6", "user6@gmail.com"],

            ["User7", "user7@gmail.com"],

            ["User8", "user8@gmail.com"],

            ["User9", "user9@gmail.com"],

            ["User10", "user10@gmail.com"],

            ["User11", "user11@gmail.com"],

         ]);

      }

      public function safeDown() {

         $this->dropTable('user');

      }

   }

?>

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.

برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنیدhttp://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

متد

مدلMyUser در پوشه models ظاهر میشود

Data caching

Data caching به شما در ذخیره متغیر های PHP درکش وبازیابی آن برای آینده کمک میکند.

Data caching به کامپوننت های cache وابسته است.که معمولا بعنوان یک کامپوننت برنامه ثبت شده است.باید متد Yii::$app → cache را فراخوانی کنید.همچنین میتوانید کامپوننت های کش زیادی ثبت کنید.

Yiiذخیره سازهای cacheزیررا پشتیبانی میکند.

yii\caching\DbCache—-از یک جدول دیتابیس برای داده های گرفته شده استفاده میکند.باید یک جدول که در yii\caching\DbCache::$cacheTable مشخص شده ،ایجاد کنید.

yii\caching\ApcCache—-از  افزونه PHP APC استفاده میکند.

yii\caching\FileCache —-از فایلها برای ذخیره داده کش شده استفاده میکند.

yii\caching\DummyCache—یک جا نگهدار کش رابرای زمانیکه هیچ کش واقعی وجودندارد تولید میکند.هدف این کامپوننتت ساده کردن کدهایی که برا ی چک کردن کش استفاده میکنند،است.

yii\caching\MemCache—از مکانیسم افزونهmemcache استفاده میکند.

yii\caching\WinCache—-ازافزونه Wincacheاستفاده میکند.

yii\redis\Cache—-یک کامپوننت کش برمبنای دیتابیسRedis ایجاد میکند.

yii\caching\XCache—از افزونه XCache استفاده میکند.

تمام کامپوننت های کش APIهای زیر راپشتیبانی میکنند.

  • get()—یک مقدار داده را از کل با کلید خاصی بازیابی میکند.اگر پیدانشد،مقدارFalseرا برمیگرداند .
  • add()—یک مقدارداده را با کلید شناسایی شده در کش ذخیره میکند البته اگر ازقبل نباشد .
  • set()—یک داده را باکلید تعریف شده اش در کش ذخیره میکند.
  • multiGet()—داده های چندتایی را از کش باکلید های خاص برمیگرداند.
  • multiAdd()—داده های چندتایی را در کش ذخیره میکند.هزمانی که آیتم با کبید شناسایی میشود.اگر یک کلید ازقبل موجود باشد،داده درنظر گرفته نمیشود.
  • multiSet()—داده های چندتایی را در کش ذخیره میکند البته هروقت که آیتم با یک کلید شناسایی شده باشد.
  • exists()—اگر کلید خاص در کش پیداشود یک مقدار برمیگرداند.
  • flush()—تمام مقادیر داده را از کش پاک میکند.
  • delete()—یک داده با کلید معرفی شده از کش پاک میشود.

یک مقدار داده ذخیره شده در کش برای همیشه باقی میماند مگر اینکه حذف شود.برای تغییر این وضعیت میتوانید یک پارامتر انقضا رازمانی که متد set() فراخوانی میشود ،تنظیم کنیم.

وابسته ها

  • yii\caching\DbDependency—این وابسته هم اگر جواب queryتغییر کند، عوض میشود.
  • yii\caching\ChainedDependency — این وابسته هم اگر تمام وابسته تغییر کند، عوض میشود.
  • yii\caching\FileDependency——- این وابسته اگر تاریخ ویرایش فایل تغییر کند تغییر کند، عوض میشود.
  • yii\caching\ExpressionDependency—– این وابسته اگر نتیجه یک عبارتPHP تغییر کند تغییر کند، عوض میشود.

اکنون کامپوننت برنامهcacheرا به اپلیکیشن خود اضافه کنید.

گام اول—فایلconfig/web.php  راویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this

               //is required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'levels' => ['error', 'warning'],

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

گام دوم—یک تابع جدبد به نامactionTestCache() به SiteController اضافه کنید:

public function actionTestCache() {

   $cache = Yii::$app->cache;

   // try retrieving $data from cache

   $data = $cache->get("my_cached_data");

   if ($data === false) {

      // $data is not found in cache, calculate it from scratch

      $data = date("d.m.Y H:i:s");

      // store $data in cache so that it can be retrieved next time

      $cache->set("my_cached_data", $data, 30);

   }

   // $data is available here

   var_dump($data);

}

گام سوم—به آدرسhttp://localhost:8080/index.php?r=site/test-cache بروید وخروجی زیر راببینید:

گام چهارم—اگر صفحه را دوباره اجراکنید،متوجه خواهید شد که تاریخ تغییر نکرده است.مقدار تاریخ کش شده است وتا30 ثانبه دیگر منقضی میشود:

کش کردن query

Query caching به شما اجازه کش کردن نتیجه پرس وجوی یک دیتابیس را میدهد. Query caching  به یک کانکشن دیتابیس وکامپوننت cacheنیازدارد.

گام اول—یک متد به نام actionQueryCaching() به اضافهSiteController کنید:

public function actionQueryCaching() {

   $duration = 10;

   $result = MyUser::getDb()->cache(function ($db) {

      return MyUser::find()->count();

   }, $duration);

   var_dump($result);

   $user = new MyUser();

   $user->name = "cached user name";

   $user->email = "cacheduseremail@gmail.com";

   $user->save();

   echo "==========";

   var_dump(MyUser::find()->count());

}

در کد بالا ما query دیتابیس را کش کردیم و یک کاربر جدید ایجاد کردیم وان را نشان دادیم.

گام دوم—به آدرسhttp://localhost:8080/index.php?r=site/query-caching وصفحه را رفرش کنید:

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

شما میتوانید کش را در کنسول باکد های  زیر فراخوانی کنید:

yii cache—کامپوننت های کش موجود رانشان میدهد.

yii cache/flush cache1 cache2 cache3—کامپوننت های کش1 و2و3 را نشان میدهد.

yii cache/flush-all—تمام کامپوننت های کش را نشان میدهد.

گام سوم—داخل پوشه اصلی پروژه این فرمان را اجراکنید: ./yii cache/flush-all.

ثبت وقایع در Yii

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

برای ثبت یک پبام باید این متدهارافراخوانی کنید:

  • Yii::error()—خطای بسیارمهم را ذخیره میکند.
  • Yii::warning()—یک پیغام خطاراذخیره میکند.
  • Yii::info()—یک پیام را بابعضی اطلاعات پراستفاده ذخیره میکند.
  • Yii::trace()—یک پیام را برای ردیابی قطعه ای ازکددرحال اجرا ذخیره میکند.

متدهای بالا پیام هارادر دسته بندی های مختلف ذخیره میکنند.آنها تابع های زیر را به اشتراک میگذارند

function ($message, $category = ‘application’)

where –

پیامی که باید ذخیره شود—$message

$category—دسته بندی پیام

یک راه ساده وراحت برا ی نام گذاری طرح ها استفاده ازثابت__METHOD__ است

Yii::info('this is a log message', __METHOD__);

یکlog target مثالی از کلاسyii\log\Target است.که تمام پیام ها را دسته بندی ها فیلتر میکندو آنهارا به یک فایل خروجی میفرستدمثل:دیتابیس یا ایمیل

گام اول—شما میتوانیدLogهای چندتایی رابه این شکل ثبت کنید:

return [

   // the "log" component is loaded during bootstrapping time

   'bootstrap' => ['log'],

   'components' => [

      'log' => [

         'targets' => [

            [

               'class' => 'yii\log\DbTarget',

               'levels' => ['error', 'warning', 'trace', 'info'],

            ],

            [

               'class' => 'yii\log\EmailTarget',

               'levels' => ['error', 'warning'],

               'categories' => ['yii\db\*'],

               'message' => [

                  'from' => ['log@mydomain.com'],

                  'to' => ['admin@mydomain.com', 'developer@mydomain.com'],

                  'subject' => 'Application errors at mydomain.com',

               ],

            ],

         ],

      ],

   ],

];

درکدبالا،دوهدف ثبت شدند.هدف اول تمام خطاها،هشدارها،نشانه ها وپیغام های اطلاعاتی  را انتخاب ودر دیتابیس ذخیره میکند.

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

Yii ، log targets داخلی زیر را پشتیبانی میکند.

  • yii\log\DbTarget—پیام ها رادردیتابیس ذخیره میکند.
  • yii\log\FileTarget—-پیام هارادر فایل ذخیره میکند.
  • yii\log\EmailTarget—-پیام هارابه یک ایمیل ازپیش تعریف شده ارسال میکند.
  • yii\log\SyslogTarget—پیام هارادرsyslog بافراخوانی تابعsyslog(). ذخیره میکند.

بطور پیش فرض فرمت پیام هابه این شکل است:

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

گام دوم—برای سفارشی کردن این قالب باید خصوصیتyii\log\Target::$prefix  را پیکربندی کنید:

[

   'class' => 'yii\log\FileTarget',

   'prefix' => function ($message) {

      $user = Yii::$app->has('user', true) ? Yii::$app->get('user') :

      'undefined user';

      $userID = $user ? $user->getId(false) : 'anonym';

      return "[$userID]";

   }

]

درکدبالاsnippet یک log target را به پیشوند تمام پیام هایuserID جاری اضافه میکند.

بطور پیش فرض پیام ها شامل مقدارهایی از متغیر های سراسری زیر هستند:

$_GET, $_POST, $_SESSION, $_COOKIE, $_FILES, and $_SERVER

برای ویرایش این قالب باید خصوصیت yii\log\Target::$logVars را بانام متغیرهایی که میخواهید اضافه شود پیکربندی کنید.

تمام پیام ها در یک آرایه بوسیلهlogger object نگهداری میشوند. logger object پیام های ثبت شده را هرزمانیکه آرایه عددی ازپیام هارا برمیگرداند(پیشفرض:1000) به targetها میفرستد.

گام سوم—برای سفارشی کردن این اعداد باید خصوصیت flushInterval را فراخوانی کنید:

return [

   'bootstrap' => ['log'],

   'components' => [

      'log' => [

         'flushInterval' => 50, // default is 1000

         'targets' => [...],

      ],

   ],

];

حتی وقتی که شیlogger پیام هارا به log targets میفرستد.درهمان لحظه خروجی گرفته نمیشود.خروجی زمانیکه log target عدد پیا مرا برمیگرداند گرفته میشود.

گام چهارم— برای سفارشی کردن این اعداد باید خصوصیت exportInterval را فراخوانی کنید:

[

   'class' => 'yii\log\FileTarget',

   'exportInterval' => 50, // default is 1000

]

گام پنجم—-حالا فایل config/web.php را به این شکل ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this

               //is required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'flushInterval' => 1,

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'exportInterval' => 1,

                  'logVars' => []

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

گام ششم—سپس یک تابع به نام actionLog() در SiteController  ایجاد کنید:

public function actionLog() {

   Yii::trace('trace log message');

   Yii::info('info log message');

   Yii::warning('warning log message');

   Yii::error('error log message');

}

در کدبالا ما چهار پیام از بخش های مختلف را به فایل های Log اضافه کردیم.

گام هفتم—به آدرس http://localhost:8080/index.php?r=site/log  بروید پیام مورد نظر داخل پوشه app/runtime/logs directory در فایل app.log ظاهر خواهد شد.

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

برای ثبت یک پبام باید این متدهارافراخوانی کنید:

  • Yii::error()—خطای بسیارمهم را ذخیره میکند.
  • Yii::warning()—یک پیغام خطاراذخیره میکند.
  • Yii::info()—یک پیام را بابعضی اطلاعات پراستفاده ذخیره میکند.
  • Yii::trace()—یک پیام را برای ردیابی قطعه ای ازکددرحال اجرا ذخیره میکند.

متدهای بالا پیام هارادر دسته بندی های مختلف ذخیره میکنند.آنها تابع های زیر را به اشتراک میگذارند:

function ($message, $category = ‘application’)

where –

پیامی که باید ذخیره شود—$message

$category—دسته بندی پیام

یک راه ساده وراحت برا ی نام گذاری طرح ها استفاده ازثابت__METHOD__ است

Yii::info('this is a log message', __METHOD__);

یکlog target مثالی از کلاسyii\log\Target است.که تمام پیام ها را دسته بندی ها فیلتر میکندو آنهارا به یک فایل خروجی میفرستدمثل:دیتابیس یا ایمیل

گام اول—شما میتوانیدLogهای چندتایی رابه این شکل ثبت کنید:

return [

   // the "log" component is loaded during bootstrapping time

   'bootstrap' => ['log'],

   'components' => [

      'log' => [

         'targets' => [

            [

               'class' => 'yii\log\DbTarget',

               'levels' => ['error', 'warning', 'trace', 'info'],

            ],

            [

               'class' => 'yii\log\EmailTarget',

               'levels' => ['error', 'warning'],

               'categories' => ['yii\db\*'],

               'message' => [

                  'from' => ['log@mydomain.com'],

                  'to' => ['admin@mydomain.com', 'developer@mydomain.com'],

                  'subject' => 'Application errors at mydomain.com',

               ],

            ],

         ],

      ],

   ],

];

درکدبالا،دوهدف ثبت شدند.هدف اول تمام خطاها،هشدارها،نشانه ها وپیغام های اطلاعاتی  را انتخاب ودر دیتابیس ذخیره میکند.

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

Yii ، log targets داخلی زیر را پشتیبانی میکند.

  • yii\log\DbTarget—پیام ها رادردیتابیس ذخیره میکند.
  • yii\log\FileTarget—-پیام هارادر فایل ذخیره میکند.
  • yii\log\EmailTarget—-پیام هارابه یک ایمیل ازپیش تعریف شده ارسال میکند.
  • yii\log\SyslogTarget—پیام هارادرsyslog بافراخوانی تابعsyslog(). ذخیره میکند.

بطور پیش فرض فرمت پیام هابه این شکل است:

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

گام دوم—برای سفارشی کردن این قالب باید خصوصیتyii\log\Target::$prefix  را پیکربندی کنید:

[

   'class' => 'yii\log\FileTarget',

   'prefix' => function ($message) {

      $user = Yii::$app->has('user', true) ? Yii::$app->get('user') :

      'undefined user';

      $userID = $user ? $user->getId(false) : 'anonym';

      return "[$userID]";

   }

]

درکدبالاsnippet یک log target را به پیشوند تمام پیام هایuserID جاری اضافه میکند.

بطور پیش فرض پیام ها شامل مقدارهایی از متغیر های سراسری زیر هستند:

$_GET, $_POST, $_SESSION, $_COOKIE, $_FILES, and $_SERVER

برای ویرایش این قالب باید خصوصیت yii\log\Target::$logVars را بانام متغیرهایی که میخواهید اضافه شود پیکربندی کنید.

تمام پیام ها در یک آرایه بوسیلهlogger object نگهداری میشوند. logger object پیام های ثبت شده را هرزمانیکه آرایه عددی ازپیام هارا برمیگرداند(پیشفرض:1000) به targetها میفرستد.

گام سوم—برای سفارشی کردن این اعداد باید خصوصیت flushInterval را فراخوانی کنید:

return [

   'bootstrap' => ['log'],

   'components' => [

      'log' => [

         'flushInterval' => 50, // default is 1000

         'targets' => [...],

      ],

   ],

];

حتی وقتی که شیlogger پیام هارا به log targets میفرستد.درهمان لحظه خروجی گرفته نمیشود.خروجی زمانیکه log target عدد پیا مرا برمیگرداند گرفته میشود.

گام چهارم— برای سفارشی کردن این اعداد باید خصوصیت exportInterval را فراخوانی کنید:

[

   'class' => 'yii\log\FileTarget',

   'exportInterval' => 50, // default is 1000

]

گام پنجم—-حالا فایل config/web.php را به این شکل ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this

               //is required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'flushInterval' => 1,

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'exportInterval' => 1,

                  'logVars' => []

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

گام ششم—سپس یک تابع به نام actionLog() در SiteController  ایجاد کنید:

public function actionLog() {

   Yii::trace('trace log message');

   Yii::info('info log message');

   Yii::warning('warning log message');

   Yii::error('error log message');

}

در کدبالا ما چهار پیام از بخش های مختلف را به فایل های Log اضافه کردیم.

گام هفتم—به آدرس http://localhost:8080/index.php?r=site/log  بروید پیام مورد نظر داخل پوشه app/runtime/logs directory در فایل app.log ظاهر خواهد شد.

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

برای ثبت یک پبام باید این متدهارافراخوانی کنید:

  • Yii::error()—خطای بسیارمهم را ذخیره میکند.
  • Yii::warning()—یک پیغام خطاراذخیره میکند.
  • Yii::info()—یک پیام را بابعضی اطلاعات پراستفاده ذخیره میکند.
  • Yii::trace()—یک پیام را برای ردیابی قطعه ای ازکددرحال اجرا ذخیره میکند.

متدهای بالا پیام هارادر دسته بندی های مختلف ذخیره میکنند.آنها تابع های زیر را به اشتراک میگذارند:

function ($message, $category = ‘application’)

where –

پیامی که باید ذخیره شود—$message

$category—دسته بندی پیام

یک راه ساده وراحت برا ی نام گذاری طرح ها استفاده ازثابت__METHOD__ است

Yii::info('this is a log message', __METHOD__);

یکlog target مثالی از کلاسyii\log\Target است.که تمام پیام ها را دسته بندی ها فیلتر میکندو آنهارا به یک فایل خروجی میفرستدمثل:دیتابیس یا ایمیل

گام اول—شما میتوانیدLogهای چندتایی رابه این شکل ثبت کنید:

return [

   // the "log" component is loaded during bootstrapping time

   'bootstrap' => ['log'],

   'components' => [

      'log' => [

         'targets' => [

            [

               'class' => 'yii\log\DbTarget',

               'levels' => ['error', 'warning', 'trace', 'info'],

            ],

            [

               'class' => 'yii\log\EmailTarget',

               'levels' => ['error', 'warning'],

               'categories' => ['yii\db\*'],

               'message' => [

                  'from' => ['log@mydomain.com'],

                  'to' => ['admin@mydomain.com', 'developer@mydomain.com'],

                  'subject' => 'Application errors at mydomain.com',

               ],

            ],

         ],

      ],

   ],

];

درکدبالا،دوهدف ثبت شدند.هدف اول تمام خطاها،هشدارها،نشانه ها وپیغام های اطلاعاتی  را انتخاب ودر دیتابیس ذخیره میکند.

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

Yii ، log targets داخلی زیر را پشتیبانی میکند.

  • yii\log\DbTarget—پیام ها رادردیتابیس ذخیره میکند.
  • yii\log\FileTarget—-پیام هارادر فایل ذخیره میکند.
  • yii\log\EmailTarget—-پیام هارابه یک ایمیل ازپیش تعریف شده ارسال میکند.
  • yii\log\SyslogTarget—پیام هارادرsyslog بافراخوانی تابعsyslog(). ذخیره میکند.

بطور پیش فرض فرمت پیام هابه این شکل است:

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

گام دوم—برای سفارشی کردن این قالب باید خصوصیتyii\log\Target::$prefix  را پیکربندی کنید:

[

   'class' => 'yii\log\FileTarget',

   'prefix' => function ($message) {

      $user = Yii::$app->has('user', true) ? Yii::$app->get('user') :

      'undefined user';

      $userID = $user ? $user->getId(false) : 'anonym';

      return "[$userID]";

   }

]

درکدبالاsnippet یک log target را به پیشوند تمام پیام هایuserID جاری اضافه میکند.

بطور پیش فرض پیام ها شامل مقدارهایی از متغیر های سراسری زیر هستند:

$_GET, $_POST, $_SESSION, $_COOKIE, $_FILES, and $_SERVER

برای ویرایش این قالب باید خصوصیت yii\log\Target::$logVars را بانام متغیرهایی که میخواهید اضافه شود پیکربندی کنید.

تمام پیام ها در یک آرایه بوسیلهlogger object نگهداری میشوند. logger object پیام های ثبت شده را هرزمانیکه آرایه عددی ازپیام هارا برمیگرداند(پیشفرض:1000) به targetها میفرستد.

گام سوم—برای سفارشی کردن این اعداد باید خصوصیت flushInterval را فراخوانی کنید:

return [

   'bootstrap' => ['log'],

   'components' => [

      'log' => [

         'flushInterval' => 50, // default is 1000

         'targets' => [...],

      ],

   ],

];

حتی وقتی که شیlogger پیام هارا به log targets میفرستد.درهمان لحظه خروجی گرفته نمیشود.خروجی زمانیکه log target عدد پیا مرا برمیگرداند گرفته میشود.

گام چهارم— برای سفارشی کردن این اعداد باید خصوصیت exportInterval را فراخوانی کنید:

[

   'class' => 'yii\log\FileTarget',

   'exportInterval' => 50, // default is 1000

]

گام پنجم—-حالا فایل config/web.php را به این شکل ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this

               //is required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'flushInterval' => 1,

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'exportInterval' => 1,

                  'logVars' => []

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

 

گام ششم—سپس یک تابع به نام actionLog() در SiteController  ایجاد کنید:

public function actionLog() {

   Yii::trace('trace log message');

   Yii::info('info log message');

   Yii::warning('warning log message');

   Yii::error('error log message');

}

در کدبالا ما چهار پیام از بخش های مختلف را به فایل های Log اضافه کردیم.

گام هفتم—به آدرس http://localhost:8080/index.php?r=site/log  بروید پیام مورد نظر داخل پوشه app/runtime/logs directory در فایل app.log ظاهر خواهد شد.

مکان یابی (Localization) در فریم ورک Yii

I18N (Internationalization) پروسه طراحی یک برنامه است که برای زبان های مختلف درست میشود. فریم ورک yii طیف وسیعی از خصوصیات I18N رابه همراه خود دارد.

Locale مجموعه ای از پارامتر هاست که زبان و کشور کاربر را مشخص میکند.برای مثال ،en-US  مخفف English locale  و United Statesاست . Yii دو نوع زبان را پشتیبانی میکند:زبان منبع وزبان هدف. زبان منبع  زبانی است که تمام متون برنامه با آن نوشته شده است.زبان هدف زبانی است که برای نمایش محتوا به کاربران استفاده میشود.

کامپوننت ترجمه پیام ،متن منبع رابه زبان هدف تبدیل  میکند،برای این کار سرویس ترجمه باید متن منبع را جستجو کند.

برای استفاده از سرویس ترجمه باید:

  • متن پیامی که میخواهید ترجمه شود را در متدYii::t() قراردهید.
  • پیام منبع راپیکربندی کنید.
  • پیام مورد نظر را در متن منبع ذخیره کنید.

گام اول—متدYii::t()  به این شکل استفاده میشود:

echo \Yii::t('app', 'This is a message to translate!');

در کدبالا’app’  مخفف دسته بندی پیام است.

گام دوم—حالا،فایل config/web.php  را ویرایش کنید:

<?php

   $params = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this

               //is required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'i18n' => [

            'translations' => [

               'app*' => [

                  'class' => 'yii\i18n\PhpMessageSource',

                  'fileMap' => [

                     'app' => 'app.php'

                  ],

               ],

            ],

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'flushInterval' => 1,

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'exportInterval' => 1,

                  'logVars' => [],

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      // set target language to be Russian

      'language' => 'ru-RU',

      // set source language to be English

      'sourceLanguage' => 'en-US',

      'modules' => [

         'hello' => [

            'class' => 'app\modules\hello\Hello',

         ],

      ],

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

در کد بالا ما زبان منبع و زبان هدف راتعیین کردیم. همچنین یک پیام منبع با yii\i18n\PhpMessageSource ساختیم.

الگوی(app*) تمام پیام های دسته بندی ها را با برنامه ای که باید ترجمه شود با یک پیام منبع ویژه نشان میدهد.در پیکربندی بالا،تمام ترجمه های روسی در فایل /ru-RU/app.php قرارخواهند گرفت.

گام سوم—اکنون،یک پوشه به نام  messages/ru-RU داخل پوشهru-RU بسازید و فایلی به نام app.phpدر آن قراردهید این فایل تمام ترجمه های EN → RU را نگه می دارد.

<?php

   return [

      ‘This is a string to translate!’ => ‘Эта строка для перевода!’

   ];

?>

گام چهارم—یک تابع به نامactionTranslation()  داخلSiteController ایجاد کنید:

public function actionTranslation() {

   echo \Yii::t(‘app’, ‘This is a string to translate!’);

}

گام پنجم—به آدرسhttp://localhost:8080/index.php?r=site/translation بروید این خروجی را خواهید دید:

آموزش 0 تا 100 مکان یابی (Localization) در فریم ورک Yii

پیام به زبان روسی همانطور که تنظیم کرده بودیم ترجمه شد. مامیتوانیم بطور داینامیک زبان برنامه را تغییر دهیم.

 

گام ششم—متد actionTranslation() را ویرایش کنید:

public function actionTranslation() {

   \Yii::$app->language = ‘en-US’;

   echo \Yii::t(‘app’, ‘This is a string to translate!’);

}

اکنون پیام به زبان انگلیسی است:

آموزش 0 تا 100 مکان یابی (Localization) در فریم ورک Yii

گام هفتم—در پیام ترجمه شده شما میتوانید یک یا چند پارامتر اضافه کنید:

public function actionTranslation() {

   $username = 'Vladimir';

   // display a translated message with username being "Vladimir"

   echo \Yii::t('app', 'Hello, {username}!', [

      'username' => $username,

   ]), "<br>";

   $username = 'John';

   // display a translated message with username being "John"

   echo \Yii::t('app', 'Hello, {username}!', [

      'username' => $username,

   ]), "<br>";

   $price = 150;

   $count = 3;

   $subtotal = 450;

   echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);

}

 

خروجی:

آموزش 0 تا 100 مکان یابی (Localization) در فریم ورک Yii

شما میتونید تمام یک اسکریپت را ترجمه کنید.بجای ترجمه تک تک پیام ها.برای مثال اگر زبان ru-RU هدف باشد و بخواهید فایل views/site/index.php را ترجمه کنید،باید viewرا ترجمه کنید ودرپوشه views/site/ru-RU directoryقرار دهید.

گام هشتم—-پوشهviews/site/ru-RU  را ایجاد کنید.سپس در پوشهru-RU  یک فایل به نامindex.php  باکدزیر ایجاد کنید:

<?php

   /* @var $this yii\web\View */

   $this->title = 'My Yii Application';

?>

<div class = "site-index">

   <div class = "jumbotron">

      <h1>Добро пожаловать!</h1>

   </div>

</div>

گام نهم—زبان هدفru-RU است.

پس به آدرس http://localhost:8080/index.php?r=site/indexبروید صفحه راباترجمه روسی خواهید دید:

آموزش 0 تا 100 مکان یابی (Localization) در فریم ورک Yii

صفحه بندی در Yii

وقتی شما داده های زیادی برای نمایش در یک صفحه دارید، باید آن را در صفحات چندتایی نمایش دهید.این روش صفحه بندی(pagination)نامیده میشود.

برای نمایش صفحه بندی درaction به داده نیاز داریم.

آماده سازی دیتابیس

گام اول—یک دیتابیس جدید بسازید،دیتابیس میتواند به دو روش آماده شود:

در ترمینال لینوکس دستورmysql -u root –p را اجراکنید.

یک  دیتابیس با کدCREATE DATABASE بسازید.

گام دوم—کانکشن  دیتابیس را در فایلconfig/db.php پیکربندی کنید.پیکربندی زیر برای داده هایی است که اخیرادر سیستم استفاده شده:

<?php

   return [

      'class' => 'yii\db\Connection',

      'dsn' => 'mysql:host = localhost;dbname = helloworld',

      'username' => 'vladimir',

      'password' => '12345',

      'charset' => 'utf8',

   ];

?>

گام سوم—داخل پوشه اصلی این را اجراکنید (./yii migrate/create test_table).این فرماان یک مهاجرت دیتابیس برای  مدیریت پایگاه داده ایجاد میکند.مهاجرت فایل باید در پوشهmigrations ودرپوشه اصلی پروژه ظاهر شود.

گام چهارم—فایل migration (m160106_163154_test_table.php in this case)رابه این شکل ویرایش کنید:

<?php

   use yii\db\Schema;

   use yii\db\Migration;

   class m160106_163154_test_table extends Migration {

      public function safeUp() {

         $this->createTable("user", [

            "id" => Schema::TYPE_PK,

            "name" => Schema::TYPE_STRING,

            "email" => Schema::TYPE_STRING,

         ]);

         $this->batchInsert("user", ["name", "email"], [

            ["User1", "user1@gmail.com"],

            ["User2", "user2@gmail.com"],

            ["User3", "user3@gmail.com"],

            ["User4", "user4@gmail.com"],

            ["User5", "user5@gmail.com"],

            ["User6", "user6@gmail.com"],

            ["User7", "user7@gmail.com"],

            ["User8", "user8@gmail.com"],

            ["User9", "user9@gmail.com"],

            ["User10", "user10@gmail.com"],

            ["User11", "user11@gmail.com"],

         ]);

      }

      public function safeDown() {

         $this->dropTable('user');

      }

   }

?>

مهاجرت بالا یک جدول به نامuser با این فیلد ها میسازد: id, name, and email همچنین یوزر ها نمایشی کمی را اضافه میکند.

گام پنجم—داخل پوشه اصلی پروژه دستور./yii migrate را برای اعمال کوچ به دیتابیس اجرا کنید.

گام ششم—اکنون مانیاز به ایجاد یک مدل برای جدولuser داریم.برای سادگی کار مااز GIIکه یک ابزار برای تولید کد است،استفاده میکنیم.این آدرس را در مرورگر باز کنید http://localhost:8080/index.php?r=gii سپس روی کلید “Start” کلیک کنید ونام جدول وکلاس مدل را وارد کنید وبعد روی کلید “Preview” کلیک و بالاخره روی کلید“Generate” کلیک کنید.

مدلMyUser در پوشه models ظاهر میشود.

صفحه بندی درAction ها

گام اول—یک متد actionPagination را به SiteController اضافه کنید:

public function actionPagination() {

   //preparing the query

   $query = MyUser::find();

   // get the total number of users

   $count = $query->count();

   //creating the pagination object

   $pagination = new Pagination(['totalCount' => $count, 'defaultPageSize' => 10]);

   //limit the query using the pagination and retrieve the users

   $models = $query->offset($pagination->offset)

      ->limit($pagination->limit)

      ->all();

   return $this->render('pagination', [

      'models' => $models,

      'pagination' => $pagination,

   ]);

}

گام دوم—یک فایلviewبه نام pagination.php داخل پوشهviews/site ایجاد کنید:

<?php

   use yii\widgets\LinkPager;

?>

<?php foreach ($models as $model): ?>

   <?= $model->id; ?>

   <?= $model->name; ?>

   <?= $model->email; ?>

   <br/>

<?php endforeach; ?>

<?php

   // display pagination

   echo LinkPager::widget([

      'pagination' => $pagination,

   ]);

?>

حالا به آدرسhttp://localhost:8080/index.php?r=site/pagination بروید.ویجت pagination را خواهید دید:

قالب بندی در Yii

برای نمایش داده در یک فرمت قابل خواندن،میتوانید لز کامپوننت formatter اپلیکیشن استفاده کنید.

گام اول—متدactionFormatter را بهSiteController اضافه کنید.

public function actionFormatter(){

   return $this->render('formatter');

}

درکد بالا،ماformatter view را رندر یا اجراکردیم.

گام دوم—اکنون یک فایلviewبه نامformatter.php داخل پوشهviews/site ایجاد کنید:

<?php

   $formatter = \Yii::$app->formatter;

   // output: January 1, 2016

   echo $formatter->asDate('2016-01-01', 'long'),"<br>";

   // output: 51.50%

   echo $formatter->asPercent(0.515, 2),"<br>";

   // output: <a href = "mailto:test@test.com">test@test.com</a>

   echo $formatter->asEmail('test@test.com'),"<br>";

   // output: Yes

   echo $formatter->asBoolean(true),"<br>";

   // output: (Not set)

   echo $formatter->asDate(null),"<br>";

?>

گام سوم—به آدرس http://localhost:8080/index.php?r=site/formatter بروید،خروجی را به این شکل خواهید دید:

کامپوننت formatter فرمت های زیر را که مربوط به تاریخ وساعت است پشتیبانی میکند:

Output format    Example

date    January 01, 2016

time    16:06

datetime    January 01, 2016 16:06

timestamp    1512609983

relativeTime    1 hour ago

duration    5 minutes

گام چهارم—formatter view را به این شکل ویرایش کنید:

<?php

   $formatter = \Yii::$app->formatter;

   echo $formatter->asDate(date('Y-m-d'), 'long'),"<br>";

   echo $formatter->asTime(date("Y-m-d")),"<br>";

   echo $formatter->asDatetime(date("Y-m-d")),"<br>";

   echo $formatter->asTimestamp(date("Y-m-d")),"<br>";

   echo $formatter->asRelativeTime(date("Y-m-d")),"<br>";

?>

گام پنجم— به آدرس http://localhost:8080/index.php?r=site/formatter بروید،خروجی را به این شکل خواهید دید:

فرمت های تاریخ

چهار فرمت میانبر تاریخ وجوددارد: short, medium, long, and full

گام اول— formatter view رابه این شکل ویرایش کنید:

<?php

   $formatter = \Yii::$app->formatter;

   echo $formatter->asDate(date('Y-m-d'), 'short'),"<br>";

   echo $formatter->asDate(date('Y-m-d'), 'medium'),"<br>";

   echo $formatter->asDate(date('Y-m-d'), 'long'),"<br>";

   echo $formatter->asDate(date('Y-m-d'), 'full'),"<br>";

?>

گام دوم—- به آدرس http://localhost:8080/index.php?r=site/formatter بروید،خروجی را به این شکل خواهید دید:

فرمت های اعداد

کامپوننت formatter فرمت های زیر را که مربوط به اعداد است پشتیبانی میکند:

Output format    Example

integer    51

decimal    105.51

percent    51%

scientific    1.050000E+2

currency    $105

size    105 bytes

shortSize    105 B

گام اول— formatter view رابه این شکل ویرایش کنید:

<?php

   $formatter = \Yii::$app->formatter;

   echo Yii::$app->formatter->asInteger(105),"<br>";

   echo Yii::$app->formatter->asDecimal(105.41),"<br>";

   echo Yii::$app->formatter->asPercent(0.51),"<br>";

   echo Yii::$app->formatter->asScientific(105),"<br>";

   echo Yii::$app->formatter->asCurrency(105, "$"),"<br>";

   echo Yii::$app->formatter->asSize(105),"<br>";

   echo Yii::$app->formatter->asShortSize(105),"<br>";

?>

گام دوم— به آدرس http://localhost:8080/index.php?r=site/formatter بروید،خروجی را به این شکل خواهید دید:

فرمت های دیگر

Yiiهمچنین فرمت های زیررا پشتیبانی میکند.

Text—مقدار آن HTML-encoded است.

Raw—مقدار خروجی بعنوان”is” می آید.

Paragraphs—مقدار آن بعنوان متن های HTML که داخل تگ”p” قرار دارد.

Ntext—مقدار آن بعنوان یک متن HTML ساده که خط های جدیدش به line breaks تبدیل میشود.

Html— مقدار آن با استفاده از HtmlPurifier برای جلوگیری از حملات XSS پالایش میشود.

Image—مقدار آن بعنوان یک تگ image قالب بندی میشود.

Boolean—مقدار آن بعنوان یک متغیر Boolean قالب بندی میشود.

url— مقدار آن بعنوان یک لینک قالب بندی میشود.

Email— مقدار آن بعنوان یک لینک mailto قالب بندی میشود.

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

مثال زیر چگونگی فرمت تاریخ برای مکان های مختلف را نشان می دهد:

<?php

   Yii::$app->formatter->locale = 'ru-RU';

   echo Yii::$app->formatter->asDate('2016-01-01'); // output: 1 января 2016 г.

   Yii::$app->formatter->locale = 'de-DE';

   // output: 1. Januar 2016

   echo Yii::$app->formatter->asDate('2016-01-01');

   Yii::$app->formatter->locale = 'en-US';

   // output: January 1, 2016

   echo Yii::$app->formatter->asDate('2016-01-01');

?>

استفاده از کنترلر ها

کنترلرها در اپلیکیشن های تحت وب  باید از طریق پوشهyii\web\Controller یاکلاس های زیرمجموعه گسترش داده شود.

درConsole application باید ازپوشهyii\console\Controller یاکلاس های زیرمجموعه اش گسترش یابد.

بگذارید برای مثال یک کنترلر در پوشهcontrollers بسازیم.

گام اول—داخل پوشهcontrollers یک فایل بانام ExampleController.php با کد زیر بسازید:

<?php

   namespace app\controllers;

   use yii\web\Controller;

   class ExampleController extends Controller {

      public function actionIndex() {

         $message = "index action of the ExampleController";

         return $this->render("example",[

            'message' => $message

         ]);

      }

   }

?>

گام دوم—یک view برای مثال در پوشهviews/example بسازید داخل آن پوشه یک فایل به نامexample.php باکد زیر بسازید:

<?php

   echo $message;

?>

هربرنامه ای یک کنترلر پیش فرض دارد.در برنامه های تحت وب سایت همان کنترلر است ودر console applicationshکنترلر پیش فرضHelpاست.بنابراین زمانی که آدرس http://localhost:8080/index.php بازشود،کنترلر سایت درخواست رامدیریت میکند.همچنین میتوانید کنترلر پیش فرض رادر پیکربندی برنامه تغیییر دهید.

این کد رادرنظر بگیرید:

'default Route' => 'main'

گام سوم–کدزیررادر فایلconfig/web.php اضافه کنید:

<?php

   $paramS = require(__DIR__ . '/params.php');

   $config = [

      'id' => 'basic',

      'basePath' => dirname(__DIR__),

      'bootstrap' => ['log'],

      'components' => [

         'request' => [

            // !!! insert a secret key in the following (if it is empty) - this is

               //required by cookie validation

            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',

         ],

         'cache' => [

            'class' => 'yii\caching\FileCache',

         ],

         'user' => [

            'identityClass' => 'app\models\User',

            'enableAutoLogin' => true,

         ],

         'errorHandler' => [

            'errorAction' => 'site/error',

         ],

         'mailer' => [

            'class' => 'yii\swiftmailer\Mailer',

            // send all mails to a file by default. You have to set

            // 'useFileTransport' to false and configure a transport

            // for the mailer to send real emails.

            'useFileTransport' => true,

         ],

         'log' => [

            'traceLevel' => YII_DEBUG ? 3 : 0,

            'targets' => [

               [

                  'class' => 'yii\log\FileTarget',

                  'levels' => ['error', 'warning'],

               ],

            ],

         ],

         'db' => require(__DIR__ . '/db.php'),

      ],

      //changing the default controller

      'defaultRoute' => 'example',

      'params' => $params,

   ];

   if (YII_ENV_DEV) {

      // configuration adjustments for 'dev' environment

      $config['bootstrap'][] = 'debug';

      $config['modules']['debug'] = [

         'class' => 'yii\debug\Module',

      ];

      $config['bootstrap'][] = 'gii';

      $config['modules']['gii'] = [

         'class' => 'yii\gii\Module',

      ];

   }

   return $config;

?>

گام چهارم—این آدرس رادر مرورگر خودوارد کنیدhttp://localhost:8080/index.php ،می بینید که controler پیش فرضExample controllerاست.

نکته—آی دی کنترلرباید شامل حروف کوچک انگلیسی،عدد،/،خط فاصله وزیرخط باشد.

برای تبدیلController IDبه نام Controller class باید کارهای زیر را انجام دهید:

  • حرف اول تمام کلمه ها راگرفته وبا خط فاصله ازهم جدا کرده و به حروف بزرگ تبدیل کنید.
  • خط فاصله هارا پاک کنید.
  • علامت(/)رابا(\)جایگزین کنید.
  • پسوندControllerرااضافه کنید.
  • فضای نام کنترلر را اضفه کنید.

مثالها:

صفحه در پوشهapp\controllers\PageController دخیره میشود.

مقاله درapp\controllers\PostArticleController دخیره میشود.

مقاله کاربر درapp\controllers\user\PostArticleController دخیره میشود.

مقاله کاربر وبلاگ درapp\controllers\userBlogs\PostArticleController ذخیره می شود.

درخواست های HTTP

درخواست هایی که با شی yii\web\Request نشان داده میشوند،که اطلاعاتی درباره سربرگ های HTTP

پارامتر های درخواست،کوکی هاوغیره را فراهم میکند.

متدget() وpost() پارمتر های درخواست را از کامپوننت requestبرمیگردانند.

مثالها

$req = Yii::$app->request;

/*

* $get = $_GET;

*/

$get = $req->get();

/*

* if(isset($_GET['id'])) {

*     $id = $_GET['id'];

* } else {

*     $id = null;

* }

*/

$id = $req->get('id');

/*

* if(isset($_GET['id'])) {

*     $id = $_GET['id'];

* } else {

*     $id = 1;

* }

*/

$id = $req->get('id', 1);

/*

* $post = $_POST;

*/

$post = $req->post();

/*

* if(isset($_POST['name'])) {

*     $name = $_POST['name'];

* } else {

*     $name = null;

* }

*/

$name = $req->post('name');

/*

* if(isset($_POST['name'])) {

*     $name = $_POST['name'];

* } else {

*     $name = '';

* }

*/

$name = $req->post('name', '');

گام اول—یک تابعactionTestGet رابهSiteController از قالب پایه برنامه اضافه کنید:

public function actionTestGet() {

var_dump(Yii::$app->request->get());

}

گام دوم—اکنون به آدرسhttp://localhost:8080/index.php?r=site/testget&id=1&name=tutorialspoint&message=welcome بروید این تصویر راخواهید دید.

برای دستیابی پارامتر های متدهای دیگر(PATCH, DELETE, etc) ازاین متداستفاده کنیدyii\web\Request::getBodyParam()

برای گرفتن متدHTTP از درخواست جاری،ازاین خصوصیت استفاده کنیدYii::$app→request→method

گام سوم—تابع actionTestGet با کد زیر ویرایش کنید.

public function actionTestGet() {

$req = Yii::$app->request;

if ($req->isAjax) {

echo "the request is AJAX";

}

if ($req->isGet) {

echo "the request is GET";

}

if ($req->isPost) {

echo "the request is POST";

}

if ($req->isPut) {

echo "the request is PUT";

}

}

گام چهارم—به این آدرس برویدhttp://localhost:8080/index.php?r=site/test-get این تصویر راخواهید دید:

کامپوننت Requestخصوصیات زیادی را برای بررسی آدرس های درخواست شده فراهم میکند.

گام پنجم—تابعactionTestGet را به این شکل ویرایش کنید.

public function actionTestGet() {

//the URL without the host

var_dump(Yii::$app->request->url);

//the whole URL including the host path

var_dump(Yii::$app->request->absoluteUrl);

//the host of the URL

var_dump(Yii::$app->request->hostInfo);

//the part after the entry script and before the question mark

var_dump(Yii::$app->request->pathInfo);

//the part after the question mark

var_dump(Yii::$app->request->queryString);

//the part after the host and before the entry script

var_dump(Yii::$app->request->baseUrl);

//the URL without path info and query string

var_dump(Yii::$app->request->scriptUrl);

//the host name in the URL

var_dump(Yii::$app->request->serverName);

//the port used by the web server

var_dump(Yii::$app->request->serverPort);

}

گام ششم—به این آدرس برویدhttp://localhost:8080/index.php?r=site/testget&id=1&name=tutorialspoint&message=welcome این را خواهید دید:

گام هفتم—برای گرفتن اطلاعات سربرگ باید از این خصوصیت استفاده کنیدyii\web\Request::$headers وتابع actionTestGet را به این شکل ویرایش کنید:

public function actionTestGet() {

var_dump(Yii::$app->request->headers);

}

گام هشتم— به آدرسhttp://localhost:8080/index.php?r=site/testget&id=1&name=tutorialspoint&message=welcome بروید خروجی به این شکل خواهد بود:

برای گرفتن آدرس هاست وآی پی از دستگاه مشتری از خصوصیاتuserHost وuserIP استفاده کنید.

گام نهم—تابعactionTestGet رابه این شکل ویرایش کنید:

public function actionTestGet() {

var_dump(Yii::$app->request->userHost);

var_dump(Yii::$app->request->userIP);

}

گام دهم—به آدرسhttp://localhost:8080/index.php?r=site/test-get بروید این راخواهید دید:

اگر در حال حاضر فرصت مطالعه این مقاله را ندارید، می توانید فایل PDF آن را دریافت کنید

related blogs

مقالات مرتبط

همیشه در کنار شما هستیم

برای توسعه کسب و کارتان ، تا انتها در کنار شما هستیم . بدون نگرانی به فکر پیشرفت باشید.

همیشه در کنار شما هستیم

برای توسعه کسب و کارتان ، تا انتها در کنار شما هستیم . بدون نگرانی به فکر پیشرفت باشید.

آکادمی ایراکد

مشاوره رایگان

Comments

دیدگاه ها و سوالات شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

فرم ثبت سفارش

Registration Form