مدونة الويب 2.0

  • الرئيسية
  • تعريف بالمدونة
  • المصادر
  • تواصل معي
  • أخبار المدونة
  • أفكار
  • استبيان
  • برمجة
  • تصميم
  • تطوير
  • كتب
  • مدونات عربية
  • مهمات
  • مواقع

MVC وإكمال المتحكم الأول

6, سبتمبر 2008 التصنيف: تطوير

بسم الله الرحمن الرحيم،

السلام عليكم،

سنقوم اليوم بإكمال مابدأناه:

وسنقوم بإكمال قسم 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 وطريقة الكيك في تنفيذها.

شارك هذه التدوينة:
إضافة 'MVC وإكمال المتحكم الأول' إلى Del.icio.usإضافة 'MVC وإكمال المتحكم الأول' إلى diggإضافة 'MVC وإكمال المتحكم الأول' إلى Technoratiإضافة 'MVC وإكمال المتحكم الأول' إلى Stumble Uponإضافة 'MVC وإكمال المتحكم الأول' إلى Google Bookmarksإضافة 'MVC وإكمال المتحكم الأول' إلى FaceBookإضافة 'MVC وإكمال المتحكم الأول' إلى MySpaceإضافة 'MVC وإكمال المتحكم الأول' إلى Twitterإضافة 'MVC وإكمال المتحكم الأول' إلى FriendFeed
الوسوم: تدوينات رمضان, تعلم الكيك وتطوير المواقع بالبيت
أرسل هذه التدوينة لصديق أرسل هذه التدوينة لصديق
طباعة هذه التدوينة طباعة هذه التدوينة

    إقرأ أيضاً:

    • تنويه. للمشتركين بدورة الكيك
    • سؤال وجواب عن الكيك
    • الجدول الثاني tasks
    • ماهي JSON؟
    • استبيان الأسبوع الرابع

25 تعليق في “MVC وإكمال المتحكم الأول”

  1. أبوبكر: 7, سبتمبر 2008 في 11:09 ص

    السلام عليكم
    عودا أحمد للدورة
    مدونة ممتازة ومفيدة جدا، وجزاك الله خيرا
    آثرت أن أشكرك قبل أن أجرب الخطوات، وسأوافيك بالأخبار بعد الانتهاء من القيام بالخطوات.
    شكرا


  2. أبوبكر: 7, سبتمبر 2008 في 1:32 م

    السلام عليكم
    لقد قمت بالخطوات فعلا
    وكل شىء على مايرام
    غير أني عندما جربت الإضافة بالنظام الأول scaffold وجدت أنني لابد أن أجعل الـ id يزيد تلقائيا auto increment.
    ولكن باقي الأمور أظنها تبدو جيدة.


  3. خالد: 7, سبتمبر 2008 في 1:55 م

    نعم أخي الكريم ويبدو أني نسيت أن أذكر هذا في تصميم قاعدة البيانات، ما رأيك لحد الآن بالكيك؟ رغم أن هذه التدوينة غير منظمة جيداً أي الأفكار غير مرتبة جيداً


  4. عبد الولي: 7, سبتمبر 2008 في 7:24 م

    السلام عليكم و رحمة الله وبركاته.
    جميل جدا مثل هذه الدورات. و أسأل الله أن يعينك أخي خالد على ما فيه الخير في الدنيا و الأخرة.

    قمت بإعداد الكاك و لكن بعد أن قمت بتغيير إسم الجدول إلى groups ظهرت لي الرسالة التالية عند محاولة فتح الصفحة
    http://localhost/cake/groups
    Error: Database table groupss for model Groups was not found.
    مع العلم أن إسم الجدول هو groups و ليس groupss.


  5. خالد: 7, سبتمبر 2008 في 7:43 م

    وعليكم السلام ورحمة الله وبركاته وتسلم أخي الكريم هذا أقل مايمكن … بالنسبة للخطأ فليس من الضروري أن يكون الجدول اسمه خاطىْ، تأكد من اسم المتحكم جيداً ومن اسم الموديل GroupModel الموديل مفرد وليست جمع


  6. عمر الدليمي: 8, سبتمبر 2008 في 6:24 ص

    كلامك رائع ولكن الكيك فيه عطل مزعج حقاً! أصمم له جدولاً في قواعد البيانات ولا يأخذه! إلا بعد مسح ملفات tmp.
    وتعرف كيفية الإزعاج عند الدخول إلى كل مجلد لتمسح ملفاته!
    سأبحث عن طريقة لتعطيل الكاش والtmp. إلى حين رفعها على النت :) .


  7. عمر الدليمي: 8, سبتمبر 2008 في 6:24 ص

    بالمناسبة هو سبب هذا الخطأ:
    Error: Database table groupss for model Groups was not found.
    مع العلم أن إسم الجدول هو groups و ليس groupss.

    ولم يصحح إلا بعد حذف الملفات المؤقتة!


  8. عمر الدليمي: 8, سبتمبر 2008 في 6:56 ص

    السلام عليكم <– ربما تحتاج لمسح تعليقاتي لكثرتها.
    أفضل وضع كود 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("أضف قائمة جديدة");
    }
    }
    }
    ?>


  9. خالد: 8, سبتمبر 2008 في 12:51 م

    أخي عمر طالما يوجد سطر في ملف core.php داخل مجلد config:
    Configure::write(‘Cache.disable’, true);

    فقط أزل التعليق عليه ودعه يعمل ;-)

    بالنسبة للكود الذي أرسلته في آخر تعليق فياحبذا لو ترسله لي على بريدي الإلكتروني كملف نصي لأن بعض أجزائه مفقودة


  10. naish: 11, سبتمبر 2008 في 6:24 ص

    رمضان كريم للجميع وكل عام وانتم بخير

    اخي الفاضل لقد وصلت لمدونتك الرائعه عن طريق google

    وقد اعجبت باسلوب طرحك فضلا عن تفاعل الاعضاء

    ولكن واجهتني مشكلة حيث ارغب ان اكون معكم في دورة الكيك ولكن لم استطع تحديد نقطه البداية اقصد الموضوع الاول

    لذا اقترح عليك اخي ترقيم المواضيع المتعلقة بدورة الكيك ابتداءا من الرقم واحد وهكذا

    وتقبل خالص تحياتي


  11. خالد: 11, سبتمبر 2008 في 11:27 ص

    إن شاء الله سأفعل ذلك لكن المدونة الآن تمر بحالة “إعادة هيكلية كاملة”


  12. تعلم الكيك وتطوير المواقع بالبيت | مدونة الويب 2.0: 3, أكتوبر 2008 في 5:47 ص

    [...] MVC وإكمال المتحكم الأول [...]


  13. الجدول الثاني tasks | مدونة الويب 2.0: 3, أكتوبر 2008 في 5:57 ص

    [...] تحميل وتثبيت الكيك، بدأنا بأول متحكم وهو groups، وبعد ذلك أكملنا به وتناقشنا بمفهوم [...]


  14. مي: 6, أبريل 2009 في 1:17 ص

    انا عندي مشكله انا عملت الجاول ولما بدخل عليها من المتصفح
    http://localhost/cake/groups بيطلعلي رساله خطأ
    The requested URL /cake/groups was not found on this server.


  15. خالد: 6, أبريل 2009 في 4:57 ص

    ما اسم مجلد المشروع الذي تعملين عليه؟ هل هو cake؟ أم اسميته باسم آخر


  16. مي: 6, أبريل 2009 في 8:25 م

    اسم قاعده البيانات info وسميت المجلد info ايضا وحاولت ثانيا
    http://localhost/info مع العنوان ده بيظهر لي ان تم الاتصال بقاعهد البيانات بنجاح
    عند اضافه الجدول http://localhost/info/groups يظهر لي
    The requested URL /info/groups was not found on this server.
    شكرا جدا علي الرد لاني هتجنن


  17. خالد: 6, أبريل 2009 في 10:42 م

    يجب أن تضيفي باقي الطبقات:
    Controller and Views


  18. مي: 7, أبريل 2009 في 12:30 ص

    انا ضفت الController وModels بس لسا في مشكله وعلي فكره انا معدلتش الmor_rewrite بس فعلا مش بيعرض اي حاجه عن الجدول


  19. خالد: 7, أبريل 2009 في 3:26 م

    يبدو بالفعل أنه خطأ mod_rewrite هل اطلعت على:
    http://book.cakephp.org/view/37/Apache-and-mod_rewrite-and-htaccess


  20. مي: 7, أبريل 2009 في 8:44 م

    اشتغل بالفعل معي لما ظبطت mod_rewrite ومتشكره ليك جدا مستر خالد والي الامام ان شاء الله


  21. مؤيد المحمدي: 18, يونيو 2009 في 8:05 م

    السلام عليكم ورحمة الله وبركاته

    جزاك الله كل خير اخوي خالد فعلا دورة ممتازة وجهد تشكر عليه كل الشكر ..

    طبقت الدرس واشتغل مهاي تمام التمام ولاكن من خلال مافهمتك بهذه الدورة لطريقة عمل الكيك فهل من الأصح ان تكتب جملة (مهمات) الموجودة في default.ctp بداخل ملف index.ctp بالمثال السابق ؟

    لان default.ctp يعرض محتويات الصفحة الرئيسية بينما الجزء الخاص بالمهمات هو في index.ctp

    مجرد تساؤل لإثراء الموضوع ولمعرفة مقدار استيعابي لهذا الجزء من الدورة ..

    وجزاك الله خير


  22. shaban: 15, يوليو 2009 في 11:08 ص

    لما بكتب 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

    من فضلك عايز الحل


  23. خالد: 15, يوليو 2009 في 12:08 م

    ساويت صفحة index.ctip داخل مجلد views/groups ؟


  24. سمر: 2, نوفمبر 2009 في 1:11 م

    لقد سميت قاعدة المعطيات 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


  25. خالد: 2, نوفمبر 2009 في 6:59 م

    ماهو محتوى ملف groups_controller.php؟


شاركنا برأيك؟

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

  • الأكثر قراءة
  • الأحدث
  • الأرشيف
  • تعلم الكيك وتطوير المواقع بالبيت
  • تنظيم الوقت البرمجي
  • أفكار ومواقع ويب 2 شهيرة
  • مقدمة في CakePHP
  • لماذا غوغل شريرة!
  • الخطوط العربية
  • تصميم قاعدة البيانات
  • هل تريد أن تكسب 1000 دولار؟
  • مواقع عربية بالدروبال
  • موقع الجزيرة الجديد
    1. غوغل، جوجل، كوكل أو قوقل!
    2. دروبال تعلمه بالعربي
    3. تحديثات بالجملة
    4. صفحة 404
    5. مدونة الويب 2.0 في 2010
    6. عن غيوم
    7. وحدة Scrollable Content لدروبال
    8. موقع بدون قاعدة بيانات
    9. دول العالم باللغة العربية
    10. ثيم خفيفة للفايرفوكس
    1. أغسطس 2010
    2. مارس 2010
    3. فبراير 2010
    4. يناير 2010
    5. ديسمبر 2009
    6. سبتمبر 2009
    7. أغسطس 2009
    8. يوليو 2009
    9. يونيو 2009
    10. مايو 2009
    11. مارس 2009
    12. فبراير 2009
    13. يناير 2009
    14. ديسمبر 2008
    15. نوفمبر 2008
    16. أكتوبر 2008
    17. سبتمبر 2008
    18. أغسطس 2008
    19. يوليو 2008
    20. يونيو 2008
    • اشترك بآخر الأخبار RSS

      Feeds Counter

      أو

    • الاستبيان

      هل طورت أو ساعدت بتطوير مشروع مفتوح المصدر؟

      مشاهدة النتيجة

      Loading ... Loading ...
    • أوسمة

      Ajax css IDE jQuery php SEO TinyMCE أخبار المدونة أذكار أطر العمل أفكار إدارة المحتوى إدارة محتوى إضافات استبيان الأجاكس الأمان الاختبارات الآلية الكيك برمجة تحديثات تحميل تدوينات رمضان تصميم تطوير تعريب تعلم الكيك وتطوير المواقع بالبيت تكتيك تنظيم الوقت جوائز حديث دروبال دعاية فايرفوكس فرص عمل كتب مسابقات مهمات مواقع نصائح هندسة برمجيات وورد بريس

    حول المدونة

    • جميع الحقوق محفوظة © 2008-2010 مدونة الويب 2.0.
    • يمكنك نقل المحتويات أو اقتباس أي جزء منها ويفضل ذكر المصدر.
    • من الممكن أن تساعدك خريطة الموقع.

    عروض العمل

    • يمكنك أن تناقشني حول عروض العمل للمدونات أو لمواقع الويب 2.0.
    • أيضاً يمكنك استشارتي في وضع التفاصيل لمدونة أو لفكرة مشروع جديد.
    • سيرتي الذاتية على My Linkedin Profile

    تواصل معي

    • خالد الحوراني مطور ويب 2.0
    • دمشق - سوريا
    • تابع أخباري على My Twitter account
    • أو راسلني فوراً