MVC وإكمال المتحكم الأول
بسم الله الرحمن الرحيم،
السلام عليكم،
سنقوم اليوم بإكمال مابدأناه:
وسنقوم بإكمال قسم controllers … حيث سنكمل lists_controller.
ملاحظة: أرفقت لكم الملفات المطلوبة لأن إضافة تلوين النص بدأت تشوه الكودات ولا أعرف لمَ.
الملفات: الكوادت المستخدمة في الدرس.
قبل كل شيء ملاحظة مهمة جداً: قم بتغيير اسم الجدول lists في قاعدة البيانات إلى groups وأيضاً غير اسم lists_controller إلى groups_controller وغير المعلومات بداخله لتصبح:
<?php class GroupsController extends AppController { var $name = "Groups"; } ?>
لماذا؟ لأني نسيت أن كلمة list كلمة محجوزة في لغة PHP لذلك لايصح أن نسمي أسماء المتحولات بكلمات اللغة المحجوزة كما تعرفون.
الأن سنضيف سطراً واحداً ليصبح المتحكم:
<?php class GroupsController extends AppController { var $name = "Groups"; var $scaffold; } ?>
ماذا حدث الأن:
أول سطرين تم شرحهم أما السطر الثالث وهو:
var $scaffold;
فهو يخبر الكيك بأن يستعمل الثقالة راجع النقطة السادسة في هذا المتحكم (controller) وسنجرب الخرج فوراً عبر طلب العنوان:
http://localhost/mhmat/groups
بالتأكيد لايوجد محتويات في الجدول لأننا لم نقم بإضافة شيء بعد!
جربوا الأن إضافة قائمة جديدة عن طريق الضغط على الرابط الموجود في أسفل الجدول بلون أحمر (New Group) وبعد إضافة قائمة جديدة يمكنكم تحريرها أو حذفها، كل هذا بأمر واحد!!! لاتفرحوا كثيراً فالرافعة لاتستخدم في التطبيقات ولكن فقط في التجارب لأنه لايمكن تقييدها أو التحكم بها أي لايمكن التحكم بمن يحق له الحذف أو الإضافة أو … هي فقط لعرض البيانات بطريقة سريعة.
سنقوم بحذف سطر الرافعة كي نكتب توابعنا الخاصة، احذفوا السطر الآن. سنكتب تابع index الذي يعرض جميع القوائم:
<?php class GroupsController extends AppController { var $name = "Groups"; function index() { $this->set("groups", $this->Group->find("all")); } } ?>
هو عبارة عن سطر واحد حيث نقوم في هذا السطر بجلب جميع القوائم في جدول القوائم عن طريق الجملة:
$this->Group->find("all")
ونمررها كوسيط في تابع set الذي يأخذ وسيطين، الوسيط الأول هو اسم المتحول ولكن بدون $ والوسيط الثاني هي قيمة المتحول، أي بعبارة آخرى هو:
$this->set("groups", $this->Group->find("all"));
مافائدة هذا التابع ولماذا لم نقم بإسناد المتحول بالطريقة الاعتيادية باستخدام معامل (=)! هذا التابع فائدته أنه يقوم بحفظ المتحول لاستخدامه في طبقة العرض (view) فلو اسندنا في الطريقة العادية (=) سيضيع المتحول عندما نخرج من الصفحة إلا إذا كان global ونحن لانريده global لذلك أضافوا هذا التابع الذي سترونه بكثرة وهو لتمرير متحول إلى طبقة العرض. وتذكروا أن هذا المتحول هو دائماً مصفوفة فحتى لو جلبنا قيمة واحدة من قاعدة البيانت تأتي على شكل مصفوفة. تذكروا هذا لأننا سنتعامل مع مصفوفة في طبقة العرض.
الأن سنقوم بإضافة تابع (دالة) لإضافة قائمة مهام جديدة … سنسمي التابع add
function add() { if(!empty($this->data)) { if($this->Group->save($this->data)) { $this->Session->setFlash("تم حفظ القائمة"); $this->redirect(array("action" => "index")); } else { $this->Session->setFlash("لم يتم الحفظ، حاول ثانية"); } } else { $this->Session->setFlash("أضف قائمة جديدة"); } }
في شرح سريع لتابع الإضافة الذي كتبناه:
الشرط الرئيسي: يفحص إن كنت ترسل بيانات للكيك أم لا؟ إن كنت ترسل فسيحاول أن يحفظها. وإن لم تكن فسيظهر لك فورم مربع إضافة القائمة.
الشرط الثانوي يفحص في حال حفظ المعلومات فيخبرنا بأنه تم حفظ المعلومات (تذكر أن الكيك يحفظ المعلومات لوحده لاداعي لإنشاء query على قاعدة البيانتا وفتح socket في كل مرة وووو)
داخل جملة هذا الشرط الثانوي (أي في حال تحقق) يوجد سطرين السطر الأول هو تخزين جملة تخبر المستخدم بما تم عمله وهو أنه تم حفظ القائمة وهذه الجملة تخزن داخل السيشن.
أما عند عدم تحقق الشرط الثاني أي عند وجود بيانات لكن الكيك لم يستطع أن يحفظها، إعادة توجيه إلى مكان نحدده نحن. والذي الآن هو مربع Form الإضافة.
الأن علينا أن نقوم بتحضير الجزئين الآخرين وهما Model و View لهذا التابع add … سنقوم أولاً بتحضير Model حيث سنقوم بإنشاء ملف جديد داخل مجلد models اسمه group.php.
ملاحظة: اسم ملف model هو نفس اسم الجدول لكن بالمفرد واللاحقة هي PHP. وتذكروا أن الموديلات ستوضع في مجلد models تحت مجلد app.
سنقوم بكتابة مايلي داخل هذا الملف:
<?php class Group extends AppModel { var $name = 'Group'; } ?>
لاحظوا مايلي:
- اسم الصنف هو نفس اسم الملف وهو اسم الجدول بالمفرد.
- سطر $name وضعناه لنفس السبب الذي ذكرناه في متحكم group، بسب التوافقية مع PHP4 فقط.
هذا يكفي لكي يعرف الكيك أن هذا الملف مرتبط بجدول اسمه groups وهكذا سيقوم بجلب كافة المعلومات منه.
الأن سنتوجه إلى مجلد views طبقة العرض حيث انتهينا من طبقة المتحكمات وطبقة الموديلات وسنقوم بإنشاء مجلد باسم groups على خلاف مافعلنا في المتحكم و model حيث أنشأنا ملف فقط … سنسمي المجلد groups كما ذكرت.
وبعد هذا مباشرة سنتوجه إلى مجلد layouts الموجود تحت مجلد views وسنقوم بإنشاء الملف التالي:
default.ctp
ماهذا!!
مجلد layouts هو مجلد للقوالب وفي مشروعنا الصغير يوجد لدينا قالب واحد وهو الافتراضي default ولاحقته هي ctp (أظن أنها اختصار لـ Cake Template Page) … ونقوم بكتابة التالي داخله:
<html> <body> <h2>مهمات</h2> <?php echo $content_for_layout ?> </body> </html>
لاحظ أن عبارة $content_for_layout سنقوم بعد قليل بالرجوع إليها والتكلم عن فائدتها …
نعود إلى مجلد groups داخل مجلد views الذي أنشأناه قبل قليل ننشىء ملف index.ctp الذي يستعمله تابع أو حدث index لعرض نتائجه التي وصلتنا في متحول groups هل تذكرونه؟ وسنكتب داخل الملف:
<?php foreach ($groups as $group): ?> <b><?php echo $group['Group']['groupname']; ?></b> | <?php echo $group['Group']['created']; ?> <br /> <?php endforeach; ?>
أولاً استعملنا حلقة foreach لكي ندور على المصفوفة $groups بواسطة متحول هو $group لاحظوا أن متحول $groups في طبقة المتحكم كتبناه بدون $ أما هنا فنكتبه مع $ قبله كما تعودنا في PHP.
بعد ذلك قمنا بعرض اسم القائمة وتاريخ إنشائها تذكروا أن تاريخ إنشائها يقوم الكيك لوحده بكتابته فقط قم بتسمية الحقل بـ created في الجدول داخل قاعدة البيانات.
الأن سنقوم بإنشاء ملف add.ctp داخل مجلد groups داخل مجلد views، ونكتب داخله:
<?php echo $form->create('Group'); ?> <fieldset> <legend>أضف قائمة جديدة</legend> <?php echo $form->input('groupname', array('label' => 'إسم القائمة')); ?> </fieldset> <?php echo $form->end('أضف'); ?>
شرح بسيط:
$form->create هي من ميزات الكيك الرائعة والتي تسمى automagic حيث يختصر عليك كتابة وسوم HTML عن طريق (helper) أو المساعد المسمى form حيث طلبنا منه أن ينشىء فورم جديد اسمه Group حيث تم تمرير الاسم كوسيط وهكذا سيفهم الكيك لوحده الباقي وسيقوم بتمرير البيانات إلى تابع أو حدث add الذي كتبناه قبل قليل.
الآن سنطلب العنوان التالي:
http://localhost/mhmat/groups/add
ونضيف اللائحة وسيعاد توجيه الصفحة إلى صفحة index …
وهنا نأتي إلى سؤال مهم وهو كيف يفسر الكيك العناوين؟
شاهدوا العنوان التالي:
http://localhost/{Application}/{Controller}/{Action}/{Parameter 1}/{Parameter 2, etc.}
حيث:
{Application} هو المجلد الموجود فيه تطبيق الكيك وفي تطبيقنا هو mhmat
{Controller} المتحكم الذي نطلبه وفي المثال السابق طلبنا المتحكم groups
{Action} الحدث المطلوب وفي مثالنا add
{Parameter 1} الباراميتر أو الوسيط الأول وفي مثالنا لايوجد وسطاء لتابع add
{Parameter 2} الوسيط الثاني وهكذا كلما وضعت / وبعدها قيمة ما تكون وسيط آخر
نعود الآن إلى عبارة:
<?php echo $content_for_layout ?>
سيتم استبدالها بالعرض المناسب أو دعنا نقل بال view المناسبة للحدث فمثلاً قمنا بطلب حدث add فسيقوم هذا الحدث باستدعاء ال view أو العرض المناسب وهو add.ctp
هذا كل شيء لليوم وبالمناسبة درس اليوم هو أساس الكيك فمن تابعه وطبقه فوراً فسيصبح طريقه سهلاً إن شاء الله لأن درس اليوم لخص مفهوم MVC وطريقة الكيك في تنفيذها.

















السلام عليكم
عودا أحمد للدورة
مدونة ممتازة ومفيدة جدا، وجزاك الله خيرا
آثرت أن أشكرك قبل أن أجرب الخطوات، وسأوافيك بالأخبار بعد الانتهاء من القيام بالخطوات.
شكرا
السلام عليكم
لقد قمت بالخطوات فعلا
وكل شىء على مايرام
غير أني عندما جربت الإضافة بالنظام الأول scaffold وجدت أنني لابد أن أجعل الـ id يزيد تلقائيا auto increment.
ولكن باقي الأمور أظنها تبدو جيدة.
نعم أخي الكريم ويبدو أني نسيت أن أذكر هذا في تصميم قاعدة البيانات، ما رأيك لحد الآن بالكيك؟ رغم أن هذه التدوينة غير منظمة جيداً أي الأفكار غير مرتبة جيداً
السلام عليكم و رحمة الله وبركاته.
جميل جدا مثل هذه الدورات. و أسأل الله أن يعينك أخي خالد على ما فيه الخير في الدنيا و الأخرة.
قمت بإعداد الكاك و لكن بعد أن قمت بتغيير إسم الجدول إلى groups ظهرت لي الرسالة التالية عند محاولة فتح الصفحة
http://localhost/cake/groups
Error: Database table groupss for model Groups was not found.
مع العلم أن إسم الجدول هو groups و ليس groupss.
وعليكم السلام ورحمة الله وبركاته وتسلم أخي الكريم هذا أقل مايمكن … بالنسبة للخطأ فليس من الضروري أن يكون الجدول اسمه خاطىْ، تأكد من اسم المتحكم جيداً ومن اسم الموديل GroupModel الموديل مفرد وليست جمع
كلامك رائع ولكن الكيك فيه عطل مزعج حقاً! أصمم له جدولاً في قواعد البيانات ولا يأخذه! إلا بعد مسح ملفات tmp.
.
وتعرف كيفية الإزعاج عند الدخول إلى كل مجلد لتمسح ملفاته!
سأبحث عن طريقة لتعطيل الكاش والtmp. إلى حين رفعها على النت
بالمناسبة هو سبب هذا الخطأ:
Error: Database table groupss for model Groups was not found.
مع العلم أن إسم الجدول هو groups و ليس groupss.
ولم يصحح إلا بعد حذف الملفات المؤقتة!
السلام عليكم <– ربما تحتاج لمسح تعليقاتي لكثرتها.
أفضل وضع كود index.ctp مثل هذا كي نفصل بين التدوينات
أما كود المتحكم فسيكون هكذا، كي لا يظهر خطأ “لم يتم حفظ القائمة” ونحن لم نفعل شيئاً أصلا، فقط نريد الإضافة:
set('groups', $this->Group->find('all'));
}
function add() {
if(!empty($this->data)) {
if($this->Group->save($this->data)) {
$this->Session->setFlash("تم حفظ القائمة");
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash("لم يتم الحفظ، حاول ثانية");
}
} else {
$this->Session->setFlash("أضف قائمة جديدة");
}
}
}
?>
أخي عمر طالما يوجد سطر في ملف core.php داخل مجلد config:
Configure::write(‘Cache.disable’, true);
فقط أزل التعليق عليه ودعه يعمل
بالنسبة للكود الذي أرسلته في آخر تعليق فياحبذا لو ترسله لي على بريدي الإلكتروني كملف نصي لأن بعض أجزائه مفقودة
رمضان كريم للجميع وكل عام وانتم بخير
اخي الفاضل لقد وصلت لمدونتك الرائعه عن طريق google
وقد اعجبت باسلوب طرحك فضلا عن تفاعل الاعضاء
ولكن واجهتني مشكلة حيث ارغب ان اكون معكم في دورة الكيك ولكن لم استطع تحديد نقطه البداية اقصد الموضوع الاول
لذا اقترح عليك اخي ترقيم المواضيع المتعلقة بدورة الكيك ابتداءا من الرقم واحد وهكذا
وتقبل خالص تحياتي
إن شاء الله سأفعل ذلك لكن المدونة الآن تمر بحالة “إعادة هيكلية كاملة”
[...] MVC وإكمال المتحكم الأول [...]
[...] تحميل وتثبيت الكيك، بدأنا بأول متحكم وهو groups، وبعد ذلك أكملنا به وتناقشنا بمفهوم [...]
انا عندي مشكله انا عملت الجاول ولما بدخل عليها من المتصفح
http://localhost/cake/groups بيطلعلي رساله خطأ
The requested URL /cake/groups was not found on this server.
ما اسم مجلد المشروع الذي تعملين عليه؟ هل هو cake؟ أم اسميته باسم آخر
اسم قاعده البيانات info وسميت المجلد info ايضا وحاولت ثانيا
http://localhost/info مع العنوان ده بيظهر لي ان تم الاتصال بقاعهد البيانات بنجاح
عند اضافه الجدول http://localhost/info/groups يظهر لي
The requested URL /info/groups was not found on this server.
شكرا جدا علي الرد لاني هتجنن
يجب أن تضيفي باقي الطبقات:
Controller and Views
انا ضفت الController وModels بس لسا في مشكله وعلي فكره انا معدلتش الmor_rewrite بس فعلا مش بيعرض اي حاجه عن الجدول
يبدو بالفعل أنه خطأ mod_rewrite هل اطلعت على:
http://book.cakephp.org/view/37/Apache-and-mod_rewrite-and-htaccess
اشتغل بالفعل معي لما ظبطت mod_rewrite ومتشكره ليك جدا مستر خالد والي الامام ان شاء الله
السلام عليكم ورحمة الله وبركاته
جزاك الله كل خير اخوي خالد فعلا دورة ممتازة وجهد تشكر عليه كل الشكر ..
طبقت الدرس واشتغل مهاي تمام التمام ولاكن من خلال مافهمتك بهذه الدورة لطريقة عمل الكيك فهل من الأصح ان تكتب جملة (مهمات) الموجودة في default.ctp بداخل ملف index.ctp بالمثال السابق ؟
لان default.ctp يعرض محتويات الصفحة الرئيسية بينما الجزء الخاص بالمهمات هو في index.ctp
مجرد تساؤل لإثراء الموضوع ولمعرفة مقدار استيعابي لهذا الجزء من الدورة ..
وجزاك الله خير
لما بكتب http://localhost:8080/cake/groups
بيقولى Not Found
The requested URL /cake/groups was not found on this server.
Apache/2.2.4 (Win32) PHP/5.2.3 Server at localhost Port 8080
من فضلك عايز الحل
ساويت صفحة index.ctip داخل مجلد views/groups ؟
لقد سميت قاعدة المعطيات taskaty
وربطت الكيك مع قاعدة المعطيات
وطلبت العنوان التالي :
http://localhost/taskaty/groups
فظهر لي الخطأ التالي
Parse error: syntax error, unexpected T_CLASS in C:\apache2triad\htdocs\taskaty\app\controllers\groups_controller.php on line 2
ماهو محتوى ملف groups_controller.php؟