نمط MVC المستخدم في أطر العمل المختلفة أو ما يسمى بـ Frameworks له عدة وظائف لخدمة إطار العمل والبرنامج بالكامل وقد طرحت موضوع سابق عنه ، كيف يعمل هذا النمط أو النظام في تقنية الـ PHP ؟ سأعطيك مثال على طريقته في العمل وهو عن طريق إنشاء نظام نشر تدوينات بسيط بإستخدام نمط أو نظام MVC وبدونه أيضاً ، هذا الدرس يبين لك طريقة عمله فقط (أقصد الفكرة الرئيسية وليس درس عملي بالكامل) ولا يشرح طريقة إنشاء برنامج متكامل بنمط أو نظام mvc .

الطريقة الأساسية أو التقليدية في إستيراد أو إسترجاع سلسلة تدوينات تكون عن طريق كتابة كود PHP موصول بقاعدة البيانات لإسترجاع المتغيرات من القاعدة وعمل حقلة تكرار بإستخدام الدالة while لكتابة نتائج الإتصال مع وجود ومستعرض البيانات وهو قالب HTML جاهز مثلاً ، هذا مثال على إسترجاع بيانات بدون إستخدام نمط MVC :

< ?php
include("config.php");
$result = mysql_query("SELECT * FROM blog_posts ORDER BY post_date DESC");
?>

< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

< ? while ($row = mysql_fetch_object($result)) { ?>
<div id="box">
<div id="post-<? echo $row->post_id; ?>">
<h2>< ? echo $row->post_title ?></h2>
< ? echo $row->post_body ?>
<small style="display: block;"> < ? echo $row-&gt;post_date ?></small></div>
</div>
< ? } ?>

قمنا بالإتصال بقاعدة البيانات في أول التطبيق ، وعمل تحديد لصفوف التدوينات من الجدول blog_posts ، الكود البرمجي الأساسي هو كودPHP المبين لديك الذي يبين الإتصال بقاعدة البيانات ويسترجع صفوف الجدول blog_posts ، ومستعرض البيانات هو كود HTML الذي يعطيك النتائج في الأخير.

المشكلة في كتابتنا لهذا الكود أنه يعتمد على طريقة تجعلك في كل مرة تغير الكود البرمجي الأساسي ، مثلاً إذا أردت تغيير إسم الجدول في القاعدة ستغير إسم الجدول في الإستعلام ليس فقط في ملف واحد بل في عدة ملفات أو عدة مرات تغير فيها إسم الجدول كل مرة إذا حصل خطأ أو غيرت إسم الجدول ، هذه الطريقة تتعبك بعض المرات وغير عملية.

نمط MVC سيطبق هذا الأمر ، هناك تغيير رئيسي لحل المشكلة وهو نقل الكود الذي سيسترجع المقالات من قاعدة البيانات والموجود في كود HTML السابق إلى ملف أو مكان خارجي قابل للتغيير في أي وقت ( إما أن يكون ضمن دالة function أو الكلاس class) ، وتقوم بإستدعاء التدوينات مرة أخرى بدون تكرار العملية كاملة وعدم دمجها بالكامل مع كود HTML ، ومع نقل كود الإتصال بقاعدة البيانات إلى ملفه الأصلي أو الملف المناسب له config.php مثلاً.

لو قلنا أن نمط MVC يتكون من ثلاثة أجزاء وهي Mobel و View و Controller ولدينا قالب بإسم post_single.tpl لعرض التدوينات ، سأضع لك مخطط عن كيفية عمل نمط MVC في برنامج التدوينات البسيط وسيكون طريقة عمله بهذه الطريقة:

سيتم توضيح ما قمت بكتابته في الصورة ، في نمط MVC ستسخدم ثلاثة ملفات عملية ، سنبدأها أولاً بالجزء الأول من العملية وهو Model عن طريق هذا الملف ( إسم الملف functions.php مثلاً):

<? php

function get_posts () {
$result = mysql_query("SELECT * FROM blog_posts ORDER BY post_date DESC");
$posts = array();
while ($row=mysql_fetch_object($result)) {
$posts[] = $row;
}
return $posts;
}
?>

أنشأنا دالة get_posts لقراءة التدوينات من قاعدة البيانات وإستخراج التدوينات من القاعدة عن طريق الدالة mysql_fetch_object وكتابة مصفوفة post وتساوي المتغير row الذي نستخرج عن طريقه البيانات من القاعدة غالباً ، وبعدها الجزء Controller ويمكن أن نضعه في ملف بإسم index.php مثلاً:

< ? php

include("../config.php");
include("model.php");

$posts = get_posts();

include('posts.tpl');
// or use display_template('posts.tpl');

?>

قمنا بإستدعاء ملف model.php ثم كتبنا المتغير posts على أنه يساوي الدالة get_posts وأستدعينا القالب posts.tpl ، الجزء View وسيكون مستعرض البيانات أو التدوينات ونسميه posts.tpl مثلاً:

< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

< ? foreach($posts as $row) { ?>
<div id="box">
<div id="post-<? echo $row->post_id; ?>">
<h2>< ? echo $row-&gt;post_title ?></h2>
< ? echo $row->post_body ?>
<small style="display: block;"> < ? echo $row->post_date ?></small></div>
</div>
< ? } ?>

تلاحظ أننا قمنا بإستدعاء البيانات من القاعدة مباشرةً عن طريق الدالة foreach ولم نقوم بإستدعاء شيء آخر ، يمكن أن تضيف أكواد أخرى متعلقة بالبيانات التي نريد أن نستخرجها ولكن فصل الأوامر والملفات عن بعضها.

أعتقد الفكرة وضحت أكثر في فهمك لنمط MVC ولكن هذا مثال بسيط جداً يمكنك تطوير الفكرة أكثر من هذه الفكرة مثلاً طريقة حذف أو تعديل أو إضافة تدوينة ، تعدد الصفحات ، إستخدام الكلاسات، … وغيرها ، وهذا أسهل من طريقة السابقة وهي دمج كود PHP مع HTML وتتعبك كثيراً!

أعذروني إن كان هناك أخطاء في الدرس بالنسبة للأكواد التي كتبتها فهناك أخطاء بسيطة بسبب محرر الووردبريس لم أستطيع حلها تماماً ، تحميل المثال في الدرس