مدونة الويب 2.0

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

الجدول الثاني tasks

October 3, 2008 - الجمعة 04 شوال 1429 التصنيف: تطوير

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

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

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

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

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

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

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

الآن سنكرر بعض الخطوات التي شاهدناها في التدوينة السابقة، وهي إنشاء الطبقات الثلاثة للمهمات (Model, Controller, View)، في البداية سنقوم بإنشاء Model، سندخل إلى مجلد models وننشأ الملف: task.php وبالتأكيد نذكر بأن اسم الموديل هو نفس اسم الجدول في قاعدة البيانات ولكن بالمفرد (اسم الجدول هنا هو tasks فاسم الملف يكون task.php).

وكالعادة نقوم بكتابة الكليشه المعهودة:

<?php
class Task extends AppModel {
	var $name = 'Task';
}
?>

وسنضيف عليه التالي ليصبح:

<?php
class Task extends AppModel {
	var $name = 'Task';
	var $belongsTo = array(
		'Group' => array(
			'classname' => 'Group'
		)
	);
}
?>

سنتوقف وقفة قصيرة لنشاهد ماحدث، سأشرح قليلاً عن أنواع العلاقات بين الجداول في قواعد البيانات وهي ثلاث:

  1. one-to-one: من اسمها علاقة رأس لرأس كما تسمى وكمثال عليها المستخدم و IP فلكل مستخدم IP واحد وله فقط.
  2. one-to-many: علاقة رأس لأطراف، وكمثال عليها مشروعنا الحالي فلكل قائمة مهام عدة مهام تندرج تحتها، وهذه العلاقة تقريباً هي أكثر العلاقات شيوعاً فالأمثلة عليها كثيرة في واقعنا لذلك يكثر استخدامها.
  3. many-to-many: علاقة معقدة ومثال عليها الطالب، فالطالب لديه عدد من المواد وكل مادة فيها عدد من الطلاب.

الآن عرفنا بأن مشروعنا بتطلب علاقة رأس لأطراف ولكي نخبر الكيك عنها استخدمنا متحول belongsTo المحجوز لهذه العلاقة بالذات (رأس لأطراف) وهو عبارة عن مصفوفة نكتب فيها اسم الموديل التي نريد الارتباط معها. وبالتأكيد من اسم المتحول نلاحظ بأن الرأس هو موديل القوائم (يتبع لـ Group) والأطراف هي المهمات.

انتهينا الآن من موديل المهمات، لاحظتم كم هي سهلة! فقط وضعنا نوع العلاقة ولكن يجب أيضاً أن نضع العلاقة في الموديل الآخرى وهي موديل Gruop، حرر ملف group.php داخل مجلد models ليصبح:

<?php
class Group extends AppModel {
	var $name = 'Group';
	var $hasMany = array(
		'Task' => array(
			'classname' => 'Task'
		)
	);
}
?>

لاحظ متحول hasmany الذي يدل الكيك على أن القائمة تتبع لها العديد من المهمات وهذا كل شيء، الكيك سيقوم بالباقي … لا عبارات where أو join أبداً كل هذا العمل التكراري سنتركه للكيك.

الآن سنقوم بإنشاء ملف المتحكم الخاص بالمهمات، ادخل إلى مجلد controllers وأنشأ الملف tasks_controller.php لاحظ أنه نفس اسم الجدول ولكن أضفنا بعده الشحطة (_) وكلمة controller وفعلنا المثل بالمتحكم السابق. حرر الملف واكتب داخله الكليشه المعهودة أيضاً:

<?php
class TasksController extends AppController {
	var $name = 'Tasks';
}
?>

وبعد ذلك أضف التابع (الدالة) التالية:

<?php
class TasksController extends AppController {
	var $name = 'Tasks';

	function index() {
		$this->set('tasks', $this->Task->find('all'));
	}
}
?>

تابع index داخله سطر وحيد يقوم بجلب كل المهمات (سنتخلى عنه في نهاية المشروع لأننا لانود أن نعرض لكل مستخدم المهمات كلها، أي مهماته ومهمات باقي المستخدمين لكننا سنستخدمها في الوقت الحالي للتأكد من عملنا.

هذا السطر يأخذ وسيطين، الوسيط الأول اسم المصفوفة التي سيتم تخزين البيانات التي ستجلب فيها والتي (المصفوفة) بدورها سنقوم بعرضها في view ولذلك لم نستخدم الإسناد العادي (var = val) لأن هذا التابع (set) يقوم بنقل المصفوفة إلى العرض (view) بيمنا الإسناد العادي تذهب قيمة متحوله عندما نخرج من الملف، والوسيط الثاني هو البيانات التي نريد جلبها وفي حالتنا نريد جلب (find) كل البيانات (all) من موديل (Task)، هل فهمتموها؟ أظن انها سهلة بهذا التفصيل.

انتهينا من طبقة المتحكم وبقي لنا طبقة العرض، بدون أن تكملوا القراءة هل تعرفون كم ملف نحتاجه للعرض؟

سنحتاج لملف واحد في طبقة العرض لأننا كتبنا تابعاً واحداً (index) في المتحكم، فالقاعدة هي لكل تابع في المتحكم ملف في العرض، طبعاً لهذه القاعدة شواذ لن نتعرض لها الآن.

توجه لمجلد views وأنشأ مجلداً باسم tasks ومن ثم أنشأ ملفاً اسمه index.ctp، وضع به التالي:

<div id="tasks">
	<div class="title">المهمات</div>
	<?php if(empty($tasks)): ?>
		<p class="notasks">لايوجد لديك مهام بعد!</p>
	<?php else: ?>
		<ul class="taskslist">
			<?php foreach ($tasks as $task): ?>
				<li>
					<?php echo $$task['Task']['title']; ?>
				</li>
			<?php endforeach; ?>
		</ul>
	<?php endif; ?>
</div>

وضعنا في البداية جملة شرطية (if) لفحص مصفوفة tasks (التي جاءتنا من المتحكم وبالتحديد من الوسيط الأول في تابع set)، فإذا كانت فارغة (أي لايوجد مهام في جدول المهمات) فسنعرض رسالة بأنه لايوجد مهمات بعد، وإذا لم تكن فارغة فسنقوم بالدوران على قيمها باستخدام (foreach) التي تريحنا أكثر من (for)، والـ foreach باختصار تأخذ متحولين الأول هو المصفوفة والثاني متحول فارغ تقوم بتعبئته في كل دورة بعنصر من عناصر المصفوفة. وداخل الحلقة قمنا بطباعة اسم المهمة وبالتأكيد يمكنكم طباعة بقية الحقول لكن سنقوم بذلك في آخر المشروع (ذكروني إن نسيت :) ).

لحد الآن أظن أننا انتهينا من تدوينة اليوم ولكن هل لاحظتم شيئاً ناقصاً؟ نعم أين تابع إضافة مهمة. لدينا تابع وملف لعرض المهمات لكن لم نضف مهمة ونعرضها بعد. وحتى التدوينة القادمة انتظروا هذا ومن يود التعلم فعلاً فلبقم بها لوحده اعتماداً على معلومات التدوينة السابقة حيث وضعنا تابع لإضافة قائمة، ويبقى الجزء الصعب وهو إضافة المهمة وتحديد القائمة التي تنتمي لها :D أعتقد أنكم ستحلوها بالطريقة البسيطة أي بدون تحديد قائمة.

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

    إقرأ أيضاً:

    • سؤال وجواب عن الكيك
    • تنويه. للمشتركين بدورة الكيك
    • MVC وإكمال المتحكم الأول
    • بنية الكيك وأول controller
    • تحميل وتثبيت الكيك

8 تعليق في “الجدول الثاني tasks”

  1. عمر الدليمي: October 3, 2008 - الجمعة 04 شوال 1429 في 5:45 م

    وأخيراً، الله يبارك فيك لا تتأخر علينا بعد ^^.
    تراني ما عندي مصدر غيرك :) .


  2. عمر الدليمي: October 3, 2008 - الجمعة 04 شوال 1429 في 5:49 م

    هناك نقص:

    توجه لمجلد views وأنشأ مجلداً باسم tasks ومن ثم أنشأ ملفاً اسمه index.ctp، وضع به التالي:

    ماذا نضع؟؟


  3. خالد: October 4, 2008 - السبت 05 شوال 1429 في 12:31 ص

    لامؤاخذة تمت الإضافة وتوقعتك تحل تابع الإضافة؟


  4. إلى الخبازين | مدونة الويب 2.0: October 9, 2008 - الخميس 10 شوال 1429 في 9:32 ص

    [...] خلال التدوينة السابقة في سلسلة الكيك لم أرى أي تفاعل (عدا بعض التفاعل البسيط من الأخ عمر) [...]


  5. عبد الولي: October 12, 2008 - الأحد 13 شوال 1429 في 7:09 م

    السلام عليكم و رحمة الله و بركاته.
    الحمد لله, لقد قمت بما أرشدت إليه أخي خالد.

    كما قمت بإضافة دالة add في صنف TasksController على نفس وتيرة GroupsController. هذا بالنسبة لطبقة التحكم أما في طبقة العرض فكما أشرت تماما في الدروس السابقة أضفت ملف add.ctp و نسخ نفس محتوى نظيرة هذه الدالة بالنسبة لل Group مع تغيير بعض أسماء المتغيرات مثل title…

    بالطبع فالطريقة المثلى المتبعة دائما بالنسبة للمبتدئيين هي (نسخ و لصق).

    بانتظار حل مسألة ربط الجداول مع بعضهم البعض. بحيث كل مهمة تكون تابعة للقائمة التي تنتمي إليها.

    ملاحظة : إعترضتني بعض المشاكل الغير منطقية و تبين أن سببها بيئة العمل Xampp مما اضطرني إلى إعادة تشغيل الحاسوب؟. و إعادة إنجاز بعض المراحل.


  6. خالد: October 12, 2008 - الأحد 13 شوال 1429 في 10:03 م

    ممتاز جداً أخي عبد الولي … بالنسبة للمشاكل انحلت ولا لأ؟


  7. عبد الولي: October 13, 2008 - الاثنين 14 شوال 1429 في 9:39 ص

    نعم لقد إنحلت المشاكل و لله الحمد.


  8. عبدالوهاب عبدالحي العلوي: December 16, 2008 - الثلاثاء 19 ذو الحجة 1429 في 12:11 ص

    والله يا إخوان ترى الموضوع مهم جداً لكن رائع لقد أنتهيت من الأمر المطلوب


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

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

  • الأكثر قراءة
  • الأحدث
  • الأرشيف
  • تعلم الكيك وتطوير المواقع بالبيت
  • أفضل الأدوات لرفع الملفات
  • تنظيم الوقت البرمجي
  • مقدمة في CakePHP
  • أفكار ومواقع ويب 2 شهيرة
  • لماذا غوغل شريرة!
  • الخطوط العربية
  • هل تريد أن تكسب 1000 دولار؟
  • تصميم قاعدة البيانات
  • مواقع عربية بالدروبال
    1. كتب مطلوبة
    2. إصلاح علة أمنية في دروبال 7.3 و 7.4
    3. حل المشكلة أم الترقيع؟
    4. مراجعة كتاب 50 Tips and Tricks for MongoDB Developers
    5. تعريب الوحدات الإضافية
    6. البرامج العربية
    7. تعريب الدروبال 7 – العد التنازلي للنواة
    8. تعريب الدروبال 7 – اليوم الثالث
    9. تعريب الدروبال 7 – اليوم الثاني
    10. تعريب الدروبال 7 – اليوم اﻷول
    11. تعريب الدروبال 7
    1. يونيو 2011
    2. مايو 2011
    3. أبريل 2011
    4. مارس 2011
    5. فبراير 2011
    6. يناير 2011
    7. ديسمبر 2010
    8. نوفمبر 2010
    9. أكتوبر 2010
    10. أغسطس 2010
    11. مارس 2010
    12. فبراير 2010
    13. يناير 2010
    14. ديسمبر 2009
    15. سبتمبر 2009
    16. أغسطس 2009
    17. يوليو 2009
    18. يونيو 2009
    19. مايو 2009
    20. مارس 2009
    21. فبراير 2009
    22. يناير 2009
    23. ديسمبر 2008
    24. نوفمبر 2008
    25. أكتوبر 2008
    26. سبتمبر 2008
    27. أغسطس 2008
    28. يوليو 2008
    29. يونيو 2008
    • اشترك بآخر الأخبار RSS

      Feeds Counter

      أو

    • أشارك بتعريب دروبال 7

    • أراجع كتب Oreilly

      I review for the O'Reilly Blogger Review Program
    • أفضل هدية تقدمها لي

    • تقنية الطماطم

      I Use the Pomodoro Technique
    • عشرون عام لمشروع اللينكس

      I'll be celebrating 20 years of Linux with
The Linux Foundation!
    • وسوم

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

    حول المدونة

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

    عروض العمل

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

    تواصل معي

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

    Switch to our mobile site