قمت سابقاً بعمل مثل هذا التطبيق في عمل مطلوب مني ..
من المؤكد أنك ستعتمد كثيراً على الجافا سكربت نظراً لان طريقة كل نوع مختلفة عن النوع الآخر
ابتداءاً باسهلهم text و مرورا ب radio و checkbox و select ..
قمت بإتّباع هذه الفكرة..
1- أقوم بعمل مصفوفة تعريف لكل عنصر مُحتمل في ال forms و اعطيه id معين مثال ..
كود PHP:
$types = array( 1=> "text", 2=>"select");
وهذه ستكون في ملف ثابت يتم استدعائه عند اضافة صنف جديد من اللوحة او عند العرض في الموقع.
2- في لوحة التحكم سيكون هناك قائمة select بكافة الانواع التي تم عمل مصفوفة بها $types وكل نوع له value = id
3- الآن ستقوم بشغل الجافا سكربت بحيث سنقوم بتنفيذ function بعد اختيار النوع من القائمة select الخاصة في الانواع كالتالي:
كود HTML:
<select name="attributes_types" onchange="generate_attributes(this.value)">
<option value="1">text</option>
<option value="2">select</option>
</select>
و هذه ال function generate_attributes() ستقوم على اساسها بتحديد النوع وتقوم انشاء forms بطريقة ديناميكية اما عن طريق document.write او document.creatObject
وهذا اصعب مافي جزء الجافا سكربت وهذا اكثر ما عانيت فيه حين عمل التطبيق الذي قمت بعمله
لكن لاحظ ان اي عنصر ستقوم بانشاءه بطريقة ديناميكية يجب ان يكون ال name الخاص به هو مصفوفة في الجافا سكربت لاننا عند الاضافة سنقوم بعمل serialize لكل العناصر واضافتها بحقل واحد
اي لنفترض ان ال function generate_attributes ستنشأ لنا عنصر text او عنصر select مثلاً ستقوم بعمل ال name الخاص به بحيث يكون على الشكل ..
<select name="attribute[1][]"></select>
<input type="text" name="attribute[2][]">
حيث أن 1 و 2 لا تعني الترتيب لكنها تعني ال id الخاص بهذا العنصر لكن الترتيب سيقوم ال html بترتيبهم ابتداءا من الصفر الى ان ينتهي من عد عدد نفس النوع من ال attribute لانك قمت بعمل ال name على شكل مصفوفة
اي في النهاية سنحصل على سبيل المثال :
- عدد 3 من النوع text المعرف ب (attribute[1])
- عدد 2 من النوع select المعرف ب (attribute[2])
بحيث ان 1 و 2 سيتم تحديدها كما قمت بتحديدها تماما في المتغير $types في اول الفكرة.
انتهينا من عمل النماذج تبقى الاضافة والعرض ..
عند الاضافة ستقوم بعمل serialize للمتغير :
كود PHP:
$_POST['attribute']
والذي سيجمع كل عناصر ال form في مصفوفة واحدة ذات بُعدين (البعد الاول لتعريف النوع - البُعد الثاني لجعل هذا العنصر uniqe لتستطيع استدعائه بعد ذلك
ثم تقوم باضافته بحقل واحد في قاعدة البيانات من نوع text
انتهي دور الاضافة سناتي للعرض ..
1- سنقوم باستدعاء الحقل text ونقوم بعمل unserialize له
سينتج لنا مصفوفة ذات بعدين على هذا الشكل ..
كود PHP:
array(1=>array(0=>"اسم البيان الذي تريد وضعه", 1=>"اسم البيان الذي تريد وضعه") ,
2=>array(0=>"اسم البيان الذي تريد وضعه", 1=>"اسم البيان الذي تريد وضعه") ,
)
ستقوم بفلترة المصفوفة عن طريق ال keys اي ان ال key الرئيسي سيكون لنوع ال attribute و ال key الداخلي للمصفوفة الداخلية هو الرقم الفريد لهذا ال attribute.
وستقوم بعرضهم داخل حلقة باستخدام foreach مثلا بحيث يكونوا على هذا الشكل ..
كود HTML:
<select name="attribute[1][2]"></select>
<input type="text" name="attribute[2][5]">
و تعتمد في الاضافة على ال serialize في الجدول الخاص بعمليات الاضافة.
و هكذا تكون اتممت المهمة .. لقد قمت بكتابة فكرة عامة مع امثلة بسيطة .. لكن اعتقد ان كل المصاعب ستواجهك في عمل حقول ال form بطريقة ديناميكية بالجافا سكربت ..
يمكن تخطي هذه الطريقة بطريقة ليست جيدة لكنها تمشي الحال ..
بحيث ستقوم بعمل صفحة قبل صفحة اختيار فورم جديد بحيث تاخذ من المستخدم نوع وعدد العناصر التي يريدها ..
- 3 عناصر textarea
- 4 عناصر radio
- 7 عناصر select
و عند تنفيذ الفورم تقوم بعمل لوب على طلبات المستخدم وتقوم بعمل الفورم الجديد بهذه الطريقة بدون اللجوء للجافا سكربت ولا انشاء عناصر الفورم بطريقة ديناميكية.
اتمنى ان تفيدك هذه الفكرة.