وصلت إلى مرحلة متقدمة أو شبه متقدمة في إيجاد حل برمجي للفكرتين ( التصنيفات ، الوسوم ) ،الحل يعتمد على وجود جدول مستقل يقوم بالربط بين التصنيفات أو الوسوم بالمواضيع المندرجة تحته .
لنفرض أن إسم الجدول r ، فإنه تركيبه سكون :
id : رقم العلاقة ( الرابطة )
post : رقم الموضوع ( المقال ، الخبر ، التدوينة ، ... )
item : رقم العنصر المرتبط به
بالنسبة لرقم الموضوع فانه يدل على رقمه في جدول المواضيع ، اما رقم العنصر فانه يدل على رقمه في جدول العناصر .
في البداية قمت بوضع جدول مستقل للتصنيفات وجدول مستقل آخر للوسوم ، لكن بما ان تركيب الجدولين متشابه او بالاحرى متساوي فقمت بدمجهما في جدول واحد باسم items ، تركيب الجدول سيكون :
id : رقم العنصر
name : إسم العنصر
type : نوع العنصر ، واما يكون تصنيفاً أو يكون وسماً ، وهو ذو قيمة رقمية ( 1 : قسم ، 2 : وسم ) ، طبعاً الحقل من النوع enum .
الان نأتي إلى كيفية الربط ، العملية في تعقيد نوعاً ما ، خصوصاً أنه لا توجد لدي خبرة في استعلامات الدمج join ، واعتقد انه لو كانت لدي معرفة بسيطه به لكانت المسألة أسهل .
نعود لطريقة الربط .. عند إضافة موضوع جديد فإننا سنقوم بتحديد أرقام التصنيفات التي يتم تصنيف الموضوع تحتها بالطريقة :
كود PHP:
$categorys = array(1, 3, 5);
طبعاً سيكون علينا إضافة الموضوع أولا ومن ثم إستخراج الـ id الخاص به عن طريق الدالة mysql_insert_id() ومن ثم نقوم بإستخدام الدالة foreach لاضافة ارقام التصنيفات و الموضوع المرتبطه به .
كود PHP:
$post_id = 5;
$categorys = array(1, 3, 5);
foreach ($categorys as $category_id) {
mysql_query("insert into r ( post, item ) values ( $post_id, $category_id )");
}
طبعاً سكون علينا أن تأكد من عدم تكرار التصنيفات في المصفوفة والا سيتم تصنيف الموضوع تحت نفس التصنيف اكثر من مرة ، سنستخدم الـ check boxes لذلك .
كود PHP:
<input type="checkbox" name="categorys[]" value="1" />
<input type="checkbox" name="categorys[]" value="3" />
<input type="checkbox" name="categorys[]" value="5" />
بالنسبة للـ tags فالمسألة أكثر تعقيدأً لأنها تدخل على الشكل :
كود:
swalif, php, developer
سألخص الطريقة على شكل نقاط :
- نقوم بفصل الـ tags بواسطة الدالة explode وبدلالة الفاصلة ( سنقوم بتحويل الفاصلة العربية أو " ، " إلى فاصلة " , " حتى يتم توحيد الفواصل ) .
- نرى ان كان الوسم موجوداً من قبل ، اذا كان موجوداً نستخرج الـ id الخاص به ، اما اذا لم يكن موجوداً فاننا نضيفه ونستخرج الـ id الخاص به .
- نتأكد من أن الوسم غير مربوط بهذه التدوينة من قبل لمنع تكرار الوسوم لنفس التدوينة ( هنا توجد مشكلة ، الآن سنقوم بالاستعلام عن رقم الـ item وهو من الممكن ان يكون وسماً أو تصنيفاً ، ونحن نريده أن يكون وسماً ) .
- نربط الوسم بالتدوينة .
كود PHP:
insert into r ( post, item ) values ( $post_id, $tag_id );
لازلنا في بداية هذه المسألة ، نحن هنا في طريقة الربط والاضافة فقط ، بقي لدينا الاستعلام والحذف والتعديل ، مثلاً لو أردنا أن نستعلم عن tag معين كيف سيكون الاستعلام ؟ ونفس الشيء بالنسبة للـ category ، عند حذف تصنيف كيف سيتم تحديث جدول الـ posts لجعل المواضيع التي كانت منصفة تحت التصنيف الذي تم حذفه بدون تصنيف ؟ اي تحمل القيمة صفر .
عموماً المسألة لسيت بالبسيطة ، سأضع لكم في المرفقات التطبيق الذي قمت بعمله وهو ليس بمكتمل لكن لتروه وتعطونا ملاحظاتكم وافكاركم .
أخي العزيز أشرف : لو تكرمت بالتفصيل في فكرة الأرشفة ، وأقصد بالتفصيل : التركيب العام للقاعدة ، نماذج من الاستعلامات .. ، شكراً لك .