بعد از آشنایی به عملکرد بخش کنترولر از مدل MVC ، در این بخش قصد داریم تا کنترولر را برای یک نمونه از بانک اطلاعاتی پیاده سازی کرده و روش نوشتن کلاس کنترولر و توابع آنرا تآموزش دهیم.
پیاده سازی کنترولر در چارچوب MVC
قبل از اینکه وارد کدنویسی کنترلر شوید باید بدانید که در هر تابع کنترولر به طور معمول کارهای زیر انجام می شود:
- بدست آوردن داده های فرستاده شده توسط کاربر همراه درخواست مثل شناسه دانشجو یا اطلاعات مربوط به دانشجوی جدید یا ..
- فراخوانی یک تابع از مدل برای درج داده ها یا خواند داده ها در/از بانک اطلاعاتی
- تعیین فایل View – توضیح اینکه هر کدام از صفحاتی که کاربر می بیند به صورت یک فایل جداگانه در پوشه View ایجاد شده اند که همه آنها دارای پسوند tpl هستند. مثلاً فایل tpl برای نمایش لیست دانشجویان، add.tpl برای نمایش فرم افزودن دانشجو و ….
- تعریف یک مجموعه از متغیرها برای ارسال اطلاعات به بخش View – هر نوع اطلاعاتی که باید در بخش view نمایش داده شده باید داخل یک متغیر قرار گیرد. و در پیاده سازی view باید با این متغیرها کار کنیم. ما در این دوره آموزشی برای طراحی واسط کاربر و view از کتابخانه ای بنام اسمارتی (Smarty) استفاده می کنیم.
در زیرپوشه کنترولر فایلی بنام controller.php وجود دارد که حاوی کلاس controller است، در این مرحله به جزئیات پیاده سازی آن کاری نداشته باشید در آموزش های بعدی آنرا بررسی خواهیم کرد.
برای پیاده سازی کنترولر هر جدول ، داخل فایل کنترولرآن یک کلاس ایجاد می کنیم که از کلاس controller ارث بری دارد و دارای توابعی برای هر کدام از درخواست های کاربران است.( تاکید می کنیم آنچه باید در پیاده سازی کلاس کنترولر درنظر گرفته شود، صرفاً درخواست ها کاربران است).
به عنوان نمونه فایل stud_controller.php برای جدول دانشجویان با توجه به درخواست هایی که در بالا آمده است می تواند بصورت زیر باشد:
<?php
class stud_controller extends controller
{
public function index()
{
$rows = $this->_model->getRows();
$this->_setView("index");
$this->_view->set('rows', $rows);
$this->_view->set('title', 'Students');
return $this->_view->output();
}
//.............
public function delete($sid=0)
{
$id=intval($sid);
$this->_model->delete($sid);
return $this->index();
}
public function add()
{
$this->_setView("add");
$this->_view->set('title', "Add Student");
return $this->_view->output();
}
public function edit($sid=0)
{
$sid = intval($sid);
$row = $this->_model->getRowById($sid);
$this->_setView("edit");
$this->_view->set('title', "Edit Student");
$this->_view->set('row', $row );
return $this->_view->output();
}
//............
public function save()
{
$sid =$_POST['sid'];
$name =$_POST['name'];
$avgr =$_POST['avgr'];
$fid =$_POST['fid'];
if($sid==0)
$this->_model->insert($name , $avgr , $fid );
else $this->_model->update($name , $avgr , $fid , $sid ); return $this->index();
}}?>
این کلاس فرزند کلاس controller بحساب امده و از آن ارث بری دارد:
class stud_controller extends controller { … }
دیده می شود که برای هر کدام از درخواست های کاربر، یک تابع نوشته شده است. تابع index که برای پاسخگویی به درخواست نمایش لیست دانشجویان نوشته شده است :
public function index()
{
$rows = $this->_model->getRows();
$this->_setView("index");
$this->_view->set('rows', $rows);
$this->_view->set('title', 'Students');
return $this->_view->output();
}
ابتدا تابع getRows از بخش مدل فراخوانی شده و آرایه ای شامل لیست دانشجویان بدست آمده است، سپس با فراخوانی تابع _setViewاز کلاس پدر، نام فایل View ( صفحه برای نمایش لیست دانشجویان) تعیین شده و در ادامه با دو بارفراخوانی تابع setاز view، متغیرهای بنام های titleبرای ارسال عنوان صفحه و rows برای ارسال اطلاعات دانشجویان به بخش View ایجاد شده است.
و در پایان با فراخوانی تابع outputاز کلاس view، فایل الگو از View نمایش داده شده است.
برای درخواست حذف دانشجو تابع زیر را داریم:
public function delete($sid=0)
{
$id=intval($sid);
$this->_model->delete($sid);
return $this->index();
}
این تابع دارای یک پارامتر اختیاری بنام $sid است که شناسه دانشجو را وارد می کندو با فراخوانی تابع delete از بخش مدل، دانشجو حذف شده و در پایان هم تابع index از همین کنترولر فراخوانی شده است.
برای درخواست فرم دانشجوی جدید تابع زیر پیاده سازی شده است:
public function add()
{
$this->_setView("add");
$this->_view->set('title', "Add Student");
return $this->_view->output();
}
در این تابع ابتدا فایل view بنام add تعیین شده و متغیر title برای نگهداری عنوان صفحه مقداردهی شده و در پایان فایل ویو نمایش داده شده است.
برای درخواست ویرایش دانشجو تابع زیر پیاده سازی شده است:
public function edit($sid=0)
{
$sid = intval($sid);
$row = $this->_model->getRowById($sid);
$this->_setView("edit");
$this->_view->set('title', "Edit Student");
$this->_view->set('row', $row );
return $this->_view->output();
}
این تابع شناسه دانشجو را بعنوان پارامتر دریافت می کند و با فراخوانی تابع getRowById از مدل اطلاعات انرا از بانک اطلاعاتی بدست می آورد. اگر دانشجویی با این شناسه وجود نداشت خطا نمایش می دهد و گرنه صفحه edit را برای view تعیین می کند، متغیر title را با عنوان صفحه و متغیر row را با مشخصات دانشجو پر می کند و فایل view را نمایش می دهد.
برای ذخیره کردن اطلاعات فرم اضافه کردن و ویرایش دانشجو از یک تابع مشترک بصورت زیر استفاده شده است:
public function save()
{
$sid =$_POST['sid'];
$name =$_POST['name'];
$avgr =$_POST['avgr'];
$fid =$_POST['fid'];
if($sid==0)
$this->_model->insert($name , $avgr , $fid );
else $this->_model->update($name , $avgr , $fid , $sid ); return $this->index();
}
در این تابع ابتدا اطلاعات دانشجو از فرم بدست آمده است و سپس بر اساس مقدار $sid یا تابع insert و یا تابع edit از بخش مدل فراخوانی شده اند.
طبیعی است که اگر فرم اضافه کردن را فرستاده باشیم شناسه دانشجو وجود ندارد و اگر فرم ویرایش دانشجو را فرستاده باشیم ، شناسه دانشجو مقدار دارد ، پس براحتی می توان این دو وضعیت را از هم تشخیص داد.
دانلود نمونه پروژه MVC با کمک PHP – قسمت کنترولر پیاده سازی شده
[purchase_link id=”1565″ text=”دانلود بسته آموزش تصویری MVC با PHP” style=”button” color=”white”]
در بخش های بعدی روش طراحی و پیاده سازی بخش View از چارچوب MVC را آموزش خواهیم داد.