مشاوره رایگان
دریافت لینک های دانلود دریافت پستی درب منزل مبلغ کل: تومان
جهت دریافت کد تخفیف به کانال تلگرام مراجعه و یا با پشتیبان آنلاین هماهنگ نمایید

Layout یا طرح ها در فریمورک Yii


Layout ها بخش های مشترک view های چندگانه را نشان می دهند، به عنوان مثال،page  و header و footer. به طور پیش فرض،  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  را بر می گرداند. متدهای زیر باعث راه اندازی event هایی در جریان روند رندر می شوند تا اسکریپت ها و تگ های register شده را در مکان هایی دیگر، اضافه کنند -

 

head() - باید در قسمت head  فراخوانی شود. این تابع، یک حفره یا سوراخ (placeholder) ایجاد می کند که با HTML ثبت شده در مکان head جایگزین می شود.

 

beginBody() - باید در ابتدای بخش body فراخوانی شود. این تابع، رویداد EVENT_BEGIN_BODY را راه اندازی می کند که یک حفره یا سوراخ (placeholder) ایجاد می کند که با HTML ثبت شده در مکان شروع body جایگزین می شود.

 

endBody() - باید در انتهای بخش body فراخوانی شود. با فراخوانی این تابع، رویداد EVENT_END_BODY فعال می شود. با فعال شدن این تابع یک حفره یا سوراخ (placeholder) ایجاد می شود که با HTML ثبت شده در پایان body جایگزین می شود.

 

beginPage() - باید در آغاز layout فراخوانی شود. با فراخوانی این تابع، رویداد EVENT_BEGIN_PAGE فعال می شود.

 

endPage() - باید در پایان layout فراخوانی شود. با فراخوانی این تابع، رویداد EVENT_END_PAGE فعال می شود.

ایجاد یک layout

مرحله 1 - داخل دایرکتوری 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() ?>

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

مرحله 2 - برای اعمال این طرح به SiteController، property با نام $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 */
   }
?>

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

مرحله 4 - برای ثبت meta tag های مختلف، می توانید yii\web\View::registerMetaTag() را در یک نمایه content view فراخوانی کنید.

مرحله 5 – ویو ‘About’ در 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>

طبق کد بالا ما دو تگ متا ثبت کردیم– keywords و description.

 

مرحله 6 - حالا به آدرس http://localhost:8080/index.php?r=site/about بروید، متا تگ هایی را در بخش head پیدا خواهید کرد، همانطور که در تصویر زیر نشان داده شده است.

view ها چندین رویدادهای زیر را فعال می کنند:

EVENT_BEGIN_BODY – در layoutها با فراخوانی yii\web\View::beginBody()  فعال می شود.

 

EVENT_END_BODY - در layoutها با فراخوانی yii\web\View::endBody() فعال می شود.

 

EVENT_BEGIN_PAGE - در layoutها با فراخوانی yii\web\View::beginPage() فعال می شود.

 

EVENT_END_PAGE - در layoutها با فراخوانی yii\web\View::endPage() فعال می شود.

EVENT_BEFORE_RENDER - در ابتدای رندر یک فایل، در یک کنترلر اجرا می شود.

 

EVENT_AFTER_RENDER - پس از رندر کردن یک فایل اجرا می شود.

 

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

مرحله 7 - برای نمایش تاریخ و زمان فعلی دراکشن 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 (هدر، پاورقی، منوها و غیره) استفاده کنید.

از widgetها استفاده کنید.

view ها باید -

حاوی کدهای HTML ساده ای، برای پردازش و رندر داده ها باشند

request ها را پردازش نکنند.

Property های مدل را تغییر ندهند.

Query های پایگاه داده را اجرا نکنند.

فصلِ: 14 , تعداد قسمت ها: 188 , سطح: صفر تا صد

این فصل در یک نگاه:

سلام . پیشنهاد میکنم حتما دموی دوره رو مشاهده کنید درباره فریم ورک Yii: در پاسخ به سوالات : آیا این فریم ورک سریع است؟ آیا این یک فریم ورک امن است؟ آیا این یک فریم ورک حرفه ای است؟ آیا ا…
فصلِ: 8 , تعداد قسمت ها: 77 , سطح: صفر تا صد

این فصل در یک نگاه:

  پیشنهاد میکنیم دمو دوره رو حتما مشاهده کنید با سلام خدمت دوستان عزیز . ابتدا عرض کنم که این دوره برای دوستانی آماده شده که میخوان وب اپلیکیشن های مدرنی رو طراحی بکنن و وارد بازار کار ط…

تولید شده توسط کلیک سایت

پشتیبانی آنلاین
آماده پاسخگویی هستیم
انتخاب تصویر جهت ارسال:
در حال ضبط صدا

(جهت توقف و یا لغو ضبط از دکمه های زیر استفاده کنید)

توقف و ارسال :
لغو ضبط
در حال حاضر تمامی کارشناسان آفلاین هستند. همواره می توانید با شماره تلگرام / واتساپ 09010005000 به صورت آنلاین با ما در ارتباط باشید. جهت ورود به واتساپ کلیک کنید
0 پیام جدید
پشتیبان در حال تایپ ...
ارسال تصویر ضبط صدا
0 کارشناسان آنلاین می باشند
این گفت و گو توسط پشتیبان به اتمام رسید