PDA

View Full Version : layout ها چه زمانی اجرا میشوند ؟



beh3000
شنبه 01 آذر 1393, 10:19 صبح
سلام

میخواستم بدونم ساختار Yii در اجرای layout هایی که مینویسیم به چه شکلیه ؟ ابتدای اجرای اکشن کنترلر یا پس از اجرای کنترلر و در ابتدای ویو ؟؟؟ یه اکشن نوشتم برای مثال این رو نگاه کنید

کدوم درسته 1 یا 2 ؟


public function actionIndex()
{


// layout inja ejra mishe ? 1

#sql and ...
.
.
.

// layout inja ejra mishe ? 2

$this->render('page',array('var'=>$variable));

}

MMSHFE
شنبه 01 آذر 1393, 23:54 عصر
شما وقتی render رو صدا میزنید، این کارها انجام میشه:
1- آرایه ای که بعنوان پارامتر دوم نوشتین با دستور extract تبدیل به متغیرهای عادی میشه که اسم متغیرها اندیس آرایه و مقدارشون مقدار اندیس مربوطه است.
2- دستور ob_start اجرا میشه.
3- فایل ویو require میشه و هرچی خروجی تولید میکنه توی بافر خروجی قرار میگیره.
4- محتوای تولید شده با دستور ob_get_clean گرفته شده و توی متغیر content$ ذخیره میشه و بافر خروجی غیرفعال میشه.
5- فایل layout انتخاب شده require میشه و خروجی رو تولید میکنه و طبیعتاً متغیر content$ که محتوای ویو رو داره در مکانی که شما echo کردین قرار میگیره.
6- خروجی تولید شده به کلاینت ارسال میشه.

اگه باز هم سؤال یا ابهامی بود در خدمتم.

beh3000
یک شنبه 02 آذر 1393, 09:57 صبح
با این اوصاف یعنی اینکه کاربر وقتی یک صفحه از سایت رو صدا میزنه اول کل اکشن باید اجرا بشه بعد خروجی برای کاربر نمایش داده میشه ...

به نظرتون بهتر نبود که layout در ابتدای اکشن اجرا میشد و در خروجی نمایش داده میشد ؟ یعنی اینکه وقتی بازدید کننده سایت یک صفحه رو صدا بزنه اول layout رو میبینه مثلا ( عنوان صفحه منوها و ... ) بعد اکشن اجرا بشه ( داده های لازم جمع آوری بشه ) و در آخر محتوای صفحه نمایش داده بشه ... در این حالت کاربر به محض اینکه یک لینک رو کلیک کرد یه چیزی در خروجی میبینه ... این بهتر نیست ؟؟

MMSHFE
یک شنبه 02 آذر 1393, 09:59 صبح
بله دقیقاً. وقتی صفحه خطا داره بهتره نصف صفحه هم نمایش داده نشه و همون اول پیام خطا بیاد.

beh3000
یک شنبه 02 آذر 1393, 10:11 صبح
بعد این روش رو میشه به این طریق پیاده سازی کرد ؟ اون layout ها رو میایم تبدیل میکنیم به صفحات معمولی مثلا برای کنترلر site میایم توی فولدر سایت یک صفحه به نام layout درست میکنیم و به این شکل در اکشن ازشون استفاده میکنیم ...


public function actionIndex()
{
$this->renderpartial('layout');

$sql = 'query' ...
.
.
.

$this->renderpartial('index');
}

MMSHFE
یک شنبه 02 آذر 1393, 10:17 صبح
خوب چه کاریه که صفحه نصفه و نیمه نشون کاربر بدین؟ زشته برای سایت شما. ضمناً layout مثل هدر و فوتر نیست که جداگانه نمایش بدین. content وسطشه.

beh3000
یک شنبه 02 آذر 1393, 10:26 صبح
layout رو که گفتم تبدیل میکنیم به صفحه معمولی content وسطش نیست ... ولی بگذریم ... خودتون راه حل ندارین که با این ترتیب اجرا بشه ؟

1 . اجرای layout
2 . اجرای محتویات اکشن
3 . نمایش محتوا ( content )

MMSHFE
یک شنبه 02 آذر 1393, 10:28 صبح
میتونید عادی (بدون ساختار layout) عمل کنید:

public function actionIndex()
{
$this->renderPartial('/layouts/header');
$this->renderPartial('index');
$this->renderPartial('/layouts/footer');
}

beh3000
یک شنبه 02 آذر 1393, 10:32 صبح
منم همین رو گفته بودم که استاد ! حالا طرز بیان من یخورده ابتدایی تر بود ... بازم مرسی که یک روش بهینه تر یاد گرفتم