- شنبه 29 اردیبهشت 1397 ساعت 03:39
- 3.1.9
- کامل شده
- منقضی شده
توجه: در این بخش، فرض بر این است که فریمورک کدایگنایتر را دانلود کرده و در محیط توسعه خود نصب کردهاید.
اولین چیزی که باید انجام دهید، ساخت یا اختصاص یک کنترلر برای هندل صفحات استاتیک است. یک کنترلر، یک کلاس ساده است که کمک میکند کارهای خاصی انجام شود. کنترلر مانند چسب بخشهای مختلف اپلیکیشن شما (مانند مدل، هلپر، لایبرری، ویو و غیره) را به هم میچسباند.
برای مثال، وقتی URL زیر فراخوانی میشود:
http://example.com/news/latest/10
به سادگی میتوان حدس زد که پشت این URL یک کنترلر با نام "news" وجود دارد که متد "latest" آن فراخوانی میشود. کار این متد دریافت 10 آیتم آخر خبری را دریافت و نمایش آنها در صفحه است. اغلب میبینید که URLها در MVC، دارای پترنهایی به شکل زیر هستند:
http://example.com/[controller-class]/[controller-method]/[arguments]
با پیشرفته شدن اِسکمای URL امکان تغییر این ساختار وجود دارد. اما فعلا، دانستن همین مقدار کافی است.
یک فایل در دایرکتوری application/controllers/Pages.php ایجاد کنید و کد زیر را داخل آن تایپ کنید:
<?php
class Pages extends CI_Controller {
public function view($page = 'home')
{
}
}
یک کلاس با نام Pages ایجاد کردهاید، با یک متد با نام view که یک آرگومنت با نام $page میگیرد. کلاس Pages از کلاس CI_Controller مشتق شده است (system/core/Controller.php). یعنی کلاس pages جدید میتواند به کلیه متدها و پراپرتیهای تعریف شده در کلاس CI_Controller دسترسی داشته باشد.
کنترلر چیزی است که مرکز هر درخواست به وباپلیکیشن شما خواهد بود. در مباحث خیلی فنی در کدایگنایتر، احتمالا به یک سوپر آبجکت اشاره دارد. مانند هر کلاسی در PHP، در داخل کنترلر با استفاده از $this به متدها و پراپرتیهای آن دسترسی دارید. استفاده از $this نحوه لود لایبرریها، ویوها و به طور کلی اجرای کامند در فریمورک را نشان میدهد.
حالا که اولین متد خود را ساختهاید، نوبت به ساخت تمپلتی ساده برای نمایش محتوای صفحات در قالبی مناسب است. دو ویو (تمپلت برای صفحه) خواهیم ساخت که از آنها به عنوان فوتر و هدر صفحه استفاده میکنیم.
هدر را در دایرکتوری application/views/templates/header.php ایجاد کنید و کد زیر را به آن اضافه کنید:
<html>
<head>
<title>CodeIgniter Tutorial</title>
</head>
<body>
هدر شامل کدهای HTML پایه به همراه یک عنوان است که قبل از لود ویو اصلی، میخواهید نمایش داده شود. همچنین یک متغییر خروجی با نام $title داریم که آن را در کنترلر تعریف خواهیم کرد. حالا، یک فوتر در دایرکتوری ایجاد کنید و کد زیر را در آن تایپ کنید:
<em>© 2018</em>
</body>
</html>
افزودن منطق به کنترلر
پیش از این، یک کنترلر با متد view() ساختید. این متد یک پارامتر میپذیرفت، که نام صفحهای بود که قرار است لود شود. تمپلتهای صفحات استاتیک در محلی در دایرکتوی application/views/pages/ خواهند بود.
در دایرکتوری مذکور، دو فایل با نامهای about.php و home.php ایجاد کنید. داخل آن فایلها، متنی - هر چیزی که دوست دارید - تایپ کنید و تغییرات را ذخیره کنید. اگر دوست دارید کمی متفاوت باشید، عبارت "Hello World!" را امتحان کنید.
به منظور لود این صفحات، باید بررسی کنید که آیا صفحات درخواست شده وجود دارند:
public function view($page = 'home')
{
if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php'))
{
// Whoops, we don't have a page for that!
show_404();
}
$data['title'] = ucfirst($page); // Capitalize the first letter
$this->load->view('templates/header', $data);
$this->load->view('pages/'.$page, $data);
$this->load->view('templates/footer', $data);
}
حالا، وقتی صفحه وجود داشته باشد، به همراه فوتر و هدر لود میشود و به کاربر نمایش داده میشود. اگر صفحه وجود نداشته باشد، خطای 404 با “404 Page not found” متن نمایش داده میشود.
اولین خط در متد بررسی میکند که آیا صفحه وجود دارد یا نه. file_exists() یکی از فانکشنهای نیتیو PHP (یعنی جزو فانکشنهای تعریف شده توسط خود پیاچپی) است که برای بررسی وجود فایل در محل مورد انتظار، استفاده میشود. فانکشن show_404() یک فانکشن داخلی کدایگنایتر است که وظیفه رندر صفحه پیش فرض خطا را به عهده دارد.
متغییر $title را در تمپلت header ساختیم تا بتوانیم عنوان صفحات را سفارشیسازی کنیم. این متغییر در متد مقداردهی میشود، اما به جای اینکه این متغییر را مستقیما مقداردهی کنیم، اندیس title از آرایه $data را مقداردهی میکنیم. این اندیس در ویو تبدیل به متغییر مورد نظر ما میشود.
آخرین چیزی که باید انجام دهیم، لود ویوها به همان ترتیبی است که میخواهیم نمایش داده شوند. پارامتر دوم در متد view() برای پاس دادن متغییرها و مقادیرشان به ویو استفاده میشود. هر مقداری در آرایه $data به یک متغییر با نام کلید آن تبدیل میشود. بنابراین مقدار $data['title'] در کنترلر معادل با $title در ویو است.
مسیریابی
حالا کنترلر کار میکند! به آدرس [your-site-url]index.php/pages/view در مرورگرتان بروید تا صفحه مورد نظر را مشاهده کنید. وقتی به آدرس index.php/pages/view/about بروید، صفحه درباره را مشاهده خواهید کرد، البته همراه با فوتر و هدر.
با قوانین مسیریابی سفارشی، امکان مَپ کردن هر URIیی به هر کنترلر و متدی را دارید و از دست قوانین و محدودیتهای پیشفرض مانند http://example.com/[controller-class]/[controller-method]/[arguments] راحت شوید.
مَپ کردن
مَپ کردن (Mapping) در اینجا یعنی ایجاد ارتباط بین یک مسیر و یک کنترلر و متد، یعنی با لود یک آدرس خاص که میتواند ربطی به کنترلر و اکشن آن ندارد، متد مورد نظرمان را فراخوانی کنیم. برای مثال اگر در حالت عادی بخواهیم، صفحات استاتیک را ایجاد کنیم یا باید به روش بالا عمل کنیم و یا برای هر صفحه یک اکشن ایجاد کنیم که گرچه غیرمنطقی است ولی URLهای تمیزتری داریم. به جای اینکار میتوانیم قوانین مسیریابی را طوری تعیین کنیم که با فراخوانی آدرس[your-site-url]/about در مرورگر، متد pages() از کنترلر sites() فراخوانی شود و پارامتر مورد نظر به آن پاس داده شود.بریم انجامش بدیم. فایل حاوی قوانین مسیریابی در application/config/routes.php را باز کنید و دو خط زیر را به آن اضافه کنید. کل کدهای دیگر این فایل که آرایه $route را مقداردهی میکنند را پاک کنید.
$route['default_controller'] = 'pages/view';
$route['(:any)'] = 'pages/view/$1';
کدایگنایتر قوانین مسیریابی را از بالا به پایین میخواند و درخواستها را به اولین قانون منطبق با آن ارجاع میدهد. هر قانون یک عبارت با قاعده (متغییر که در سمت چپ عبارت مقداردهی شده) است که به یک کنترلر و متد جدا شده با اسلش (مقدار سمت راست که یک استرینگ است) مَپ شده است. وقتی یک ریکوئست (درخواست) به سرور داده میشود، کدایگنایتر به دنبال اولین قانون منطبق میگردد، سپس کنترلر و متد مناسب را و احتمالا با آرگومنتهای مورد نیاز متد فراخوانی میکند.
اطلاعات بیشتر درباره مسیریابی را میتوانید در پست مربوط به مسیریابی URI بیابید. (پست مربوطه به مسیریابی بزودی ترجمه خواهد شد و لینک آن در این قسمت قرار داده میشود.)
در اینجا، دومین قانون در آرایه $routes با هر درخواستی مطابقت خواهد داشت، اینکار به استفاده از استرینگ (:any) انجام میشود. و پارامتر به متد view() از کلاس Pages پاس داده میشود.
حالا index.php/about را ببینید. آیا مسیریابی دقیقا منجر به فراخوانی متد view() از کنترلر Pages شده بود؟ عالیه!