@@ الجزء الثالث – النموذج The Model @@
--------------------------------------------------
[M] او Model هو جزء من MVC مسئول عن الاستعلام عن البيانات المراد عرضها من قاعدة البيانات او من اى مصدر اخر ثم يقوم بتقديمها للمتحكم Controller ، ويجب علينا ان نحصل على النموذج المناسب للطلب المقدم من المستخدم ولكن هنا سنقوم بطمس الفرق بين النموذج والمتحكم ، حيث يستخدم المتحكم مكتبة اتصال بقاعدة بيانات للاستعلام مباشرة من قاعدة البيانات بدلا من العديد من النماذج المختلفة فلذلك لن نتضمن النماذج فى نظامنا بشكل رسمي واذا استطعت ان تفهم فكرة عمل المتحكم عند شرحة فى الجزء الرابع سيمكنك ( اذا احببت ) القيام باضافة النماذج بنفس الطريقة .
سنقوم هنا باضافة كود الاتصال بقاعدة البيانات لصفحتنا الرئيسية index.php داخل المجلد MVC
يمكنك استخدام مكتبات الاتصال بقواعد البيانات المختلفة ولكن PHP5 ياتي معها مكتبة اتصال بقواعد البيانات قوية وهي [ PDO ] وساقوم باستخدامها هنا نظرا لوجود اتجاه رسمي من مطوري PHP لازالة اى مكتبات اتصال بقواعد البيانات غير PDO مثل [ OCI8 and MySQLi ] من الوضع الافتراضي واحالتهم الى PECL فى PHP6 واعتماد PDO بشكل رسمي كمكتبة الاتصال بقواعد البيانات فى PHP6 ،
قوم باضافة هذا الكود الي index.php اذا كنت ستستخدم PDO واذا لم تريد استخدامها فقم باضافة كود الاتصال الخاص بالمكتبة التى تنوي استخدامها Mysqli ] [ مثلا :
كود PHP:
$db = new PDO('mysql:host=localhost;dbname=demo', '[user]', '[password]');
$registry->set ('db', $db);
فى السطر الاول قمنا بعمل مقبض اتصال بقاعدة بيانات من نوع MySql باستخدام pdo
قم بتغيير demo الى اسم القاعدة و user الى اسم المستخدم و password الى كلمة السر
ثم فى السطر الثاني قمنا بتخزين هذا المقبض فى كائن التسجيل حتي نجعله متغير عام global و يتاح لنا استخدامه فى اى صفحة اخري من السكربت عن طريقة استخراجه من كائن التسجيل كما سبق شرحه .
فبهذه الاضافة البسيطة نكون انهينا جزء النموذج الذي اتفقنا عليه بان لا يكون نماذج مختلفة فى درسنا هذا
وسنبدا باضافة المتحكم Controller واضافة المتحكم هذه تعني اننا بحاجة لكائن المسارات المسئول عن تحميل المتحكم controller المطلوب من خلال المستخدم عن طريق الرابط
@ - كائن المسار Router :
------------------------------ سيقوم هذا الكائن بتحليل الطلب القادم من المستخدم ثم تحميل المتحكم الصحيح للبدء بعرض المطلوب عرضه ، الخطوة الاولي هي عمل الهيكل الاساسي لكائن المسار واضافته فى ملف router.php بمجلد classes السابق انشائه وموجود به registry.php :
كود PHP:
Class Router {
private $registry;
private $path;
function __construct($registry) {
$this->registry = $registry;
}
}
قمنا هنا ببناء هيكل كائن المسار وتحديد 3 خواص
خاصية التسجيل وستحتوي على كائن التسجيل المسبق انشاؤه ، خاصية المسار وستحتوي علىالمسار الكامل للمتحكم ثم نقوم ببناء المشيد الذي ياخذ كائن التسجيل كمعطي ثم يقوم بتعيينه لخاصية التسجيل
قم الان باضافة الكود الاتي الى صفحة index.php للقيام بتحميل كائن المسار
كود PHP:
$router= new Router($registry);
$registry['router'] = $router ;
فى السطر الاول قمنا بعمل نسخة من كائن المسار فى متغير router
ثم قمنا بتسجيل قيمة المتغير router بالمفتاح router فى كائن التسجيل ليكون المتغير router عام ويمكن استخدامه بجميع الصفحات وهو يحوي بداخله نسخة من كائن المسار
لنقوم باضافة الوسائل الاساسية فى كائن المسار ، اول وسيلة هي وسيلة setPath() ، والتي تستخدم لتحديد الدليل ( المجلد ) الذي سيحوي جميع عناصر التحكم controllers وسنقوم الان باضافتها الى ملف router.php داخل الكائن router من الكود الاتي :
كود PHP:
function setPath($path)
{
$path = trim($path, '/\\');
$path .= DS;
if (is_dir($path) == false) {
$perror= 'Invalid controller path '.$path;
die($perror);
}
$this->path = $path;
}
لنرجع الان الى ملف index.php ونقوم باضافة السطر التالى لتحديد مسار مجلد عناصر التحكم controllers
كود PHP:
$router->setPath(site_path.'controllers');
وبهذا نكون قد قمنا بتحديد مسار مجلد عناصر التحكم ، سنكتب الان الوسيلة المسئولة عن تحميل عنصر التحكم المطلوب وهي وسيلة loading() وستقوم بتحليل الطلب القادم من المستخدم
الجزئية الاولي من هذه الوسيلة كالاتي :
كود PHP:
function loading(){
$this->getController($file,$controller,$action);
كما نري فان وسيلة التحميل loading() تستخدم وسيلة اخري وهي getController() للحصول على اسم عنصر التحكم واذا تم طلب تنفيذ دالة داخله والكود الاتي هو وسيلة getController()
كود PHP:
private function getController(&$file, &$controller, &$action) {
$route = (empty($_GET['route'])) ? '' : $_GET['route'];
if (empty($route)) { $route = 'index'; }
$route = trim($route, '/\\');
$parts = explode('/', $route);
$cmd_path = $this->path;
foreach ($parts as $part) {
$fullpath = $cmd_path . $part;
if (is_dir($fullpath)) {
$cmd_path .= $part . DS;
array_shift($parts);
continue;
}
if (is_file($fullpath . '.php')) {
$controller = $part;
array_shift($parts);
break;
}
}
if (empty($controller)) { $controller = 'index'; };
$action = array_shift($parts);
if (empty($action)) { $action = 'index'; }
$file = $cmd_path . $controller . '.php';
}
فى هذه الوسيلة تاخذ اولا قيمة المتغير $route ثم تقوم بتقسيمه الى اجزاء منفصلة باستخدام دالة explode() فاذا كان الطلب ( links/view ) فستقوم بتقسيمه الى مصفوفة array('links','view')
ثم نقوم باستخدام حلقة تكرار foreach لاستخراج القيم من المصفوفة كل على حدي ثم التاكد من كونه مجلد ، فاذا كان مجلد نقوم باضافته الى مسار الملف ثم ننتقل للجزء التالي من المصفوفة مع حذف الجزء الذي يمثل مجلد من المصفوفة باستخدام array_shift وهكذا ، هذا يتيح لنا استخدام مجلدات فرعية داخل المجلد الرئيسي لعناصر التحكم controllers واذا كان الجزء التالي ليس مجلد ولكنه ملف نقوم بتعيين هذا الجزء لمتغير $controller ونحذف عنصر الملف من المصفوفة ثم نخرج من الحلقة لحصولنا على ملف عنصر التحكم المنشود ، بعد الحلقة نتاكد من ايجاد عنصر التحكم فاذا لم يتم ايجادة نقم باستخدام الافتراضي وتعيين القيمة الافتراضية ونطلق عليها هنا index الى $controller ثم نقوم بالحصول على الوسيلة المطلوبة الموجودة داخل عنصر التحكم ، فعنصر التحكم هو كائن يتكون من مجموعة وسائل مختلفة والمتغير action يشير الى الوسيلة المطلوبة من خلال المستخدم واذا لم نجد وسيلة تم تحديدها فنقوم بارجاع الوسيلة الافتراضية index وفى النهاية نقوم بتجميع المسار الكامل لملف عنصر التحكم ( المسار و اسم عنصر التحكم و الامتداد ) ، الان الطلب تم تحليله داخل الوسيلة الحاملة له وهي loading() فتقوم بتحميل عنصر التحكم و تنفيذ الوسيلة المطلوبة ، الكود الاتي يمثل وسيلة loading() كاملة بملف router.php :
كود PHP:
function loading() {
$this->getController($file, $controller, $action);
if (is_readable($file) == false) {
die ('404 File Not Found');
}
include ($file);
$class = 'Controller_' . $controller;
$controller = new $class($this->registry);
if (is_callable(array($controller, $action)) == false) {
die ('404 Action Not Found');
}
$controller->$action();
}
فى السطر الاول نقوم باستدعاء وسيلة الحصول على عنصر التحكم وتم شرحها مسبقا
ثم نتاكد من ملف عنصر التحكم موجود بالفعل فاذا كان موجود نقوم بتضمينه include واذا لم يكن نخرج رسالة خطا ثم نقوم بتعريف الكلاس بسابقة Controller ثم اسم الملف ثم نقوم بعمل نسخة من الكلاس لاستخدامها فى اخراج الوسيلة المطلوبة وبعد ذلك نقوم بالتاكد من ان الوسيلة المطلوبة هي دالة يمكن تفيذها داخل كائن عن طريق ادخالهم على شكل مصفوفة ثم تنفيذها واذا لم تكن نخرج رسالة خطا
والان اكتملت وسيلة التشغيل الاساسية loading() سنقوم باضافة السطر الاتي الى نهاية index.php
كود PHP:
$router->loading ();
سننتقل الان الى عناصر التحكم Controllers
@ ------ نهاية الجزء الثالث ----- @
يتبع .... :deal: