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 های پایگاه داده را اجرا نکنند.
این فصل در یک نگاه:
…
سلام . پیشنهاد میکنم حتما دموی دوره رو مشاهده کنید درباره فریم ورک Yii: در پاسخ به سوالات : آیا این فریم ورک سریع است؟ آیا این یک فریم ورک امن است؟ آیا این یک فریم ورک حرفه ای است؟ آیا ا…این فصل در یک نگاه:
…
پیشنهاد میکنیم دمو دوره رو حتما مشاهده کنید با سلام خدمت دوستان عزیز . ابتدا عرض کنم که این دوره برای دوستانی آماده شده که میخوان وب اپلیکیشن های مدرنی رو طراحی بکنن و وارد بازار کار ط…