در مطلب قبلی پیش زمینه ای در مورد ایجاد محتوای فایل های نما که همگی دارای پسوند blade.php هستند صحبت کردیم. در ابن مطلب می خواهیم در مورد ایحاد لایه ها (Layouts) در لاراول صحبت کنیم. هر لایه در لاراول بخشی از قالب را در خود نگه می دارد که می خواهیم از این بخش ها در سر تا سر دیگر فایل های نما استفاده کنیم. به عبارت ساده تر هر فایل لایه بخشی از قالب را در خود نگه می دارد که این بخش را می خواهیم در فایل های دیگر به صورت مکرر و تکراری استفاده کنیم.

به طور مثال نوار ناوبری (Navigation Bar) بخشی است که در تمامی صفحه ها باید نمایش داده شود. پس می توانیم یک فایل جداگانه برای کدهای آن در نظر بگیریم و سپس این فایل را در دیگر فایل ها ضمیمه (یا Include) کنیم. هر فایل لایه دقیقا همان فایل نما است و به این معنی است که حاوی تگ های اچ تی ام ال و کدهای پی اچ پی هستند و  پسوند آنها نیز blade.php است. معمولا در زیر دایرکتوری resources/view یک زیر دایرکتوری به نام layouts ایجاد می کنند و تمامی فایل های مربوط به هر یک از لایه ها را درون آن قرار می دهند.

ایجاد لایه اصلی توسط Blade

نخستین گام ایجاد لایه اصلی برنامه است که معمولا آنرا app.blade.php می نامیم ولی شما می توانید هر نام دیگری را انتخاب کنید. برای شروع ابتدا زیر دایرکتوری layouts را ایجاد کنید و سپس درون آن فایل app.blade.php را ایجاد کنید. سپس قطعه کدهای زیر را درون فایل app.blade.php کپی کنید.

همانطور که می بینید این فایل نیز همانند دیگر فایل های نما شامل تگ های اچ تی ام ال و کدهای پی اچ پی است ولی تفاوت در این است که می خواهیم از آن در دیگر فایل ها استفاده کنیم و به این معنی است که اگر این فایل در دیگر فایل ها ضمیمه شود، خود به خود تمامی کدهای آن درون آن فایل ضمیمه می شوند. در خطوط ۵ و ۶ یک فایل CSS و یک فونت گوگل به درون فایل app.blade.php نوشته شده اند.

اصلی ترین بخش های فایل app.blade.php خط هایی هستند که دو عبارت ()yield@  استفاده شده اند. در مفاهیم برنامه نویسی پی اچ پی yield همانند دستور return در توابع است به این معنی که خروجی را برگشت می دهد ولی تفاوت آن با دستور return در این است return بلافاصله خروجی را برگشت و درون حافظه قرار می دهد ولی yield هر زمان که لازم باشد خروجی را برگشت می دهد.

بنابراین کاربرد ()yield@ نمایش محتوای یک بخش از لایه ای است که تعریف کرده ایم. به طور مثال در خط ۷ و درون تگ title ابتدا رشته App Name را نوشته ایم و سپس عبارت ()yield@ را تعریف کرده ایم. درون عبارت ()yield@ نام یک بخش (Section) وجود دارد که در اینجا نام آن title است. پس در واقع بخشی به نام title درون فایل app.blade.php تعیین کردیم که می خواهیم به صورت سفارشی در دیگر فایل ها آنرا برای تعیین عنوان صفحه استفاده کنیم.

به طور مثال اگر فایل app.blade.php را درون فایل welcome.blade.php ضمیمیه کنیم، پس می توانیم مقدار Home Page را به عنوان بخش title در نظر بگریم و می توانیم برای صفحه درباره ما مقدار About Page را برای بخش title در نظر بگیریم. در خط ۱۱ مجدد یک بخش به نام content را توسط عبارت ()yield@ تعیین کرده ایم که در اصل شامل تمامی تگ هایی است که باید در میان بدنه اچ تی ام ال یا میان تگ body قرار گیرند.

پس از تعیین بخش محتوا دو خط زیر را قرار دادیم که در واقع می خواهیم درانتهای بخش content در تمامی صفحه ها، این دو خط زیر به صورت دائمی نوشته شوند.

توسعه قالب های لاراول با عبارت extend@

پس از ایجاد دو بخش title و content در کد بالا باید آنها را درون فایل های دیگر استفاده کنیم. توجه کنید توسط عبارت ()yield@ یک بخش را تعریف می کنیم که محتوای این بخش در فایل های دیگر توسط عبارت section@ تعیین می شود. توجه کنید دلیل استفاده از عبارت ()yield@ در این است که می خواهیم بخشی را درون فایل لایه تعیین کنیم که این بخش در هر فایل محتوایی مجزا از بخش دیگر دارد.

در خط ۱ از کد بالا توسط عبارت ()extend@ فایل app.blade.php را که به عنوان لایه ایجاده کرده بودیم را از زیر دایرکتوری layouts به درون فایل welcome.blade.php ضمیمه کرده ایم. توجه کنید چون فایل app.blade.php در زیر دایرکتوری درون مسیر resources/views قرار دارد، پس به صورت ‘layouts.app’ آنرا درون عبارت ()extend@ صدا زده ایم.

فرض کنید خط های ۳ تا انتهای کد بالا را ننویسد، در این صورت کاربرد ()extend@ چیست؟ هدف از عبارت ()extend@ ضمیمه کردن محتوای یک فایل لایه به درون فایل دیگر است. به عبارت دقیق تر اگر به محتوای فایل app.blade.php در نخستین قطعه کد نگاه کنید می بینید که تنها تگ های پایه صفحه های html به همراه تگ های link و script است که به ترتیب کدهای CSS و Javascript را به تمامی فایل ها ضمیمه می کنند.

بنابراین همانطور که از نام عبارت ()extend@ مشخص است، کاربرد آن توسعه دادن صفحه هایی است که پایه آنها توسط فایل app.blade.php تهیه شده است و هر بخش از محتوا توسط یک عبارت ()yield@ درون فایل app.blade.php مشخص شده است که حال باید از عبارت دیگری در فایل های نما دیگر (مانند welcome.blade.php) استفاده کنیم تا محتوای هر بخش را متناسب با نیاز های همان صفحه نمایش دهیم. برای تعیین کردن محتوای هر بخش باید از عبارت section@ استفاده کنیم.

تعیین محتوای بخش های تعریف شده توسط عبارت section@

از عبارت section@ برای تعیین محتوای یک بخش تعریف شده توسط عبارت ()yield@ استفاده می شود. به طور مثال پیش از این بخشی به نام title تعریف کرده بودیم و همانطور که در کد بالا می بینید توسط دستور زیر مقدار Home Page را برای آن در صفحه welcome.blade.php تنظیم کرده ایم.

همچنین در دستورهای زیر بخش content را در صفحه welcome.blade.php مقدار دهی کرده ایم. در مطلب پیشین توضیح مثالی را توضیح دادیم که یک آرایه با سه زیر آرایه از نوع آرایه انجمنی که هر کدام دارای دو کلید به نام های name و age هستند را از طریق تابع ()compact به فایل نما ارسال کرده بودیم.

در خطوط ۶ تا ۸ از کد بالا ابتدا تگ های h3 و p تعریف می شوند و سپس درون آکولادهای باز و بسته تاریخ فعلی توسط تابع ()date با الگوی d/m/y نشان داده می شود که قاعدتا d برای day و m برای month و y برای year به میلادی است.

در کد بالا ابتدا در خط ۹ و توسط عبارت شرطی if@ و تابع ()empty بررسی شده که آیا متغیر userList$ خالی است یا نه؟ اگر خالی نباشد پس یک لیست غیر مرتب توسط تگ ul ایجاد می شود. هر یک از عنصرهای درون متغیر آرایه ای userList$ توسط تگ های li درون ul نشان داده می شوند. به عبارت دیگر به تعداد تکرار حلقه عبارت foreach@ یک تگ li چاپ می شود که شامل جفت مقدارهای کلیدهای name و age است. توجه کنید هر یک از عنصرهای درون متغیر userList$ در واقع یک آرایه انجمنی هستند پس از طریق نام کلید آنها، یعنی کلیدهای name و age به مقادیر هر عنصر دسترسی پیدا می کنیم. در نهایت دستور درون عبارت else@ زمانی نشان داده می شود که متغیر userList$ خالی باشد.

۱ – از جفت آکولادهای باز و بسته {{}} برای نمایش یک تک مقدار استفاده می شود ولی می توانید یک یا چندین تابع را به صورت تو در تو در میان {{}} فراخوانی کنید.

۲ – اگر بخواهید در فایل لایه اصلی (در اینجا app.blade.php) یک بخش تعریف کنید باید از عبارت ()@yield استفاده کنید. این عبارات یک رشته را به عنوان نام بخش دریافت می کند.

۳ – اگر بخواهید در یک فایل نما که مربوط به یک مسیر (Route) می شود (مثلا فایل welcome.blade.php برای مسیر ربشه یا مسیر / ) یک فایل لایه اصلی و پایه را فراخوانی کنید، پس باید از عبارت ()extend@ استفاده کنید. این نام یک رشته را به عنوان نام فایل دریافت می کند. به طور مثال اگر فایل در مسیر زیردایرکتوری resources/views/layouts باشد، پس باید به صورت (extend(‘layouts.app@ آنرا در ابتدای فایل ضمیمه کنید.

۴ – درون فایل نما برای تعیین محتوای یک بخش باید از عبارت section@ استفاده کنید. عبارت section@ حتما باید نام یک بخش تعریف شده توسط ()yield@ را دریافت کند. در دستور نخست زیر می بینید که در کنار نام بخش، مقدار لازم برای آن بخش را نیز آورده ایم ولی در دستور دوم می بینید که محتوای بخش میان ذو عبارت section@ و endsection@ آورده شده اند. پس حتما می بایست در حالت دوم زیر عبارت endsection@ را بنویسید.

۵ – درون فایل های نما می توانیم از عبارت شرطی if@ … @else … @endif و یا حتی عبارت if@ … @elseif..@else … @endif استفاده کنیم ولی حتما باید آنهای باید با عبارت endif@ به پایان برسد. همینطور می توانیم از عبارت foreach@ … @endforeach نیز استفاده کنیم. برای آگاهی بیشتر می توانید مطلب عبارت های شرطی و حلقه تکرار در غالب لاراول را بخوانید.

۶ – هر عبارت باید با علامت @ شروع شود. همچنین عبارت ها نیز به بزرگی و کوچکی حروف حساس هستند.