كائن الأقسام الفرعية المتعددة
التأريخ: الأحد14/ رجب/1425 الموافق 29/8/2004 مسيحية
العنوان: البرمجة


ليست العبرة عندي المبرمجين بنتيجة البرمجة الظاهرة، بل العبرة بالأداء الذي يُظهر النتيجة، فيمكن إخراج النتيجة بطريقتين أو أكثر تكون إحداهما خفيفة على مترجم PHP وتوابعه، وتكون الأخرى ثقيلة على المترجم وتوابعه.

ومن الأمور التي طُرحت بين المبرمجين العرب قضية الأقسام الفرعية بلا عدد نهائي (قسم داخل قسم، وتحت هذا القسم أقسام وهلم جرا).


وقد حاول عدد من المبرمجين إيجاد حل لهذه الطريقة، بعضهم أظهرها وبعضهم أخفاها.

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

وإليك الدالة التي برمجها الأخ رفيع العتيبي

$this->DoCode('
function listJumpf($listJump,$catid)
{
global $row,$cat_id;
$Jump .= ' ';
$Jump .= "حدد قسم مما يلي";
$Jump .= " -------------------------------- ";
$result= $this->query("select * from rafia_cat where catType='$catid' and subcat='0' order by ordercat ASC");
$li = 1;
while($row=$this->dbarray($result))
{
$Jump .= " $li ) " . $row["title"] . "";
// $li;
$Jump .= $this->sublistJump($listJump,$row['id'],$li);
$Jump .= " -------------------------------- ";
$li++;
}

$Jump .= ' ';
return $Jump;
}
//---------------------------------------------------
// تابعة لدالة السابقة وتضيف التصنيفات الفرعية /
//---------------------------------------------------

function sublistJump(&$listJump,$id,$J)
{
global $row;
$result = $this->query("SELECT * FROM rafia_cat WHERE subcat='$id' ORDER BY ordercat");
if($this->dbnumrows($result)>0)
$li = 1;
while($row=$this->dbarray($result))
{
$Jump .= "$J ) » $li ) " . $row["title"] . "";
$l = $J." ) » ".$li;
$Jump .= $this->sublistJump($listJump,$row['id'],$l);
$li++;
}
return $Jump;
}
','php')

لكن الأخ رفيعا العتيبي أول من يعلم أن هذه الدالة على قوتها تسبب ضغطا لقاعدة البيانات؛ لأن الدالة الأولى تستدعي الأقسام العامة باستعلام واحد، وأما الدالة الثانية فتكرر الاستعلام من قاعدة البيانات على حسب عدد الأقسام الفرعية، فلو كان عندك 10 أقسام عامة تحت كل قسم خمسة أقسام فرعية متتالية فإن مجموع الاستعلامات سيكون وحدا وخمسين استعلاما.

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

بعد هذا استخرجت دالتَيْ الأخ رفيع العتيبي ودرستهما دراسة متأنية، ثم بنيت الكائن.

وهذا الكائن يعرض لك الأقسام العامة بفروعها غير النهائية مهما كان عددها باستعلام واحد من قاعدة البيانات.

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

عندما يتسلم الكائن المصفوفة فإنه يقسمها إلى مصفوفتين : مصفوفة تحتوي على الأقسام العامة، ومصفوفة تحتوي على الأقسام الفرعية.

وفي كل مصفوفة سواء العامة أم الفرعية مصفوفة داخلية تحتوي على ثلاث متغيرات:الرقم التسلسلي للقسم في قاعدة البيانات، واسم القسم، وهل هو عام أو فرعي

ثم يعرض الكائن الأقسام العامة أولا ضمن حلقة تكرار عن طريقة المصفوفة العامة، وفي أثنائها يختبر هل هناك قسم فرعي لهذا القسم العام؟ وذلك عن طريق المصفوفة الثانية الفرعية.

ثم يكرر هذه العملية داخل القسم الفرعي إلى أن يتأكد من عدم وجود قسم فرعي نهائي، ثم يعيد النتيجة.

ثم وضعتُ خيارين:

الأول : إظهار أرقام الأقسام الفرعية

الثاني : إظهار أسماء الأقسام الفرعية

الملف المضغوط يحتوي على ملف الكائن، وعلى ملف قاعدة البيانات، وملف تعليمات

ازرع ملف القاعدة في أي قاعدة تشاء، ثم تأكد من تغيير معلومات الاتصال بالقاعدة.

الكائن :

$this->DoCode('
class JumpListClass {
/* ########################################## اسم الكائن : الأقسام الفرعية المتعددة رقم الإصدار : 1 المبرمج : عبد الرحمن بن ناصر السعيد الموقع : http://www.toarab.ws - http://www.toarab.org البريد الإلكتروني : webmaster@toarab.ws - ababab90@yahoo.com تأريخ البرمجة : يوم الأحد الموافق 14/رجب/1425 هـ ----------------------------------- طريقة الاستعمال: ************* 1) استعلم من قاعدة البيانات عن الرقم التسلسلي، اسم التصنيف، عام أو فرعي، الترتيب $result =mysql_query("SELECT id,title,subcat FROM cat ORDER BY ordercat ASC"); id = الرقم التسلسلي التلقائي title = اسم التصنيف سواء أكان عاما أم فرعيا subcat = التصنيف العام تكون قيمته صفر، وأما التصنيف الفرعي فتكون قيمته الرقم التسلسلي للتصنيف العام id ************* 2) أنشئ مصفوفة بأي اسم، مثلا $Master = array(); ************* 3) اعمل حلقة تكرار لجلب المعلومات كاملة من قاعدة البيانات while ($row = mysql_fetch_array($result)) { // فك متغيرات الحلقة extract($row); //وضع المتغيرات في مصفوفة $Master[] = array ('id'=>$id,'title'=>"".$title."",'subcat'=>$subcat); } ************* 4) أنشئ الكائن بأي اسم، مثلا : $MainAndSub = new JumpListClass; ************* 5) حدد رابط الانتقال للصفحة، عند اختيار أي قسم فإلى أي صفحة ينتقل؟ وما اسم المتغير؟ : $url = $_SERVER['PHP_SELF']."?id="; ************* 6) اطبع الكائن : echo $MainAndSub->DoJumpList($Master,$url,1); هناك خياران : رقم (1) تعني إظهار أرقام الأقسام الفرعية رقم (2) تعني إظهار أسماء الأقسام الفرعية (لا يستحسن اختياره إذا كانت الأقسام الفرعية كثيرة؛ لأنه يشعب الصفحة) يستحسن تحرير الذاكرة للمصفوفة unset($Master); ------------------------------------------------------------------- @Name : JumpListClass @Versoin : 1 @Author : Abdurrhman bin Nasir Assaeed @Web Site : http://www.toarab.ws - http://www.toarab.org @E-mail : webmaster@toarab.ws - ababab90@yahoo.com @Date : 29/08/2004 */ var $Main = array(); var $Sub = array(); var $Url; Var $Type; function DoJumpList ($Master,$Url,$Type=1) { $this->Main = $this->SetMain($Master); $this->Sub = $this->SetSub($Master); $this->Url = $Url; $this->Type = $Type; return $this->Build(); } function SetMain($Master) { $Main= array(); for($i=0;$i"; $Form .= ""; $Form .= ""; $Mn = 1; $size = sizeof($this->Main); for($i=0;$i<$size;$i++) { $Form .= ""; $Form .= $this->SubList($this->Main[$i]['id'],$Mn); if($i<($size-1)) { $Form .= ""; } $Mn++; } $Form .= ""; //Free Memory unset($this->Main); unset($this->Sub); return $Form; } function SubList($id,$Mn,$Sn=""){ $b_id = array(); $b_title = array(); for($i=0;$iSub);$i++) { if($id==$this->Sub[$i]['subcat']) { $b_id[]= $this->Sub[$i]['id']; $b_title[] = $this->Sub[$i]['title']; } } if (empty($b_id)) { return; } else { $Sn=1; } if (count($b_id) > 1 ) { $Form =""; for($i=0;$iUrl.$b_id[$i].""> ".$Mn." ) » ".$Sn." ) ".$b_title[$i].""; $Mn2 = $Mn." ) » ".$this->ListType($Sn,$b_title[$i]); $Form .=$this->SubList($b_id[$i],$Mn2); $Sn++; } } else { $Form = ""; $Mn2 = $Mn." ) » ".$this->ListType($Sn,$b_title[0]); $Form .=$this->SubList($b_id[0],$Mn2,$Sn); } //Free Memory unset($b_id); unset($b_title); return $Form; } function ListType($Sn,$b_title) { if($this->Type>2) $this->Type =1; if($this->Type==1) { return $Sn; } else if($this->Type==2) { return $b_title; } } }// End class ','php')

وأخيرا:

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


الملف

اضغط هنا

لمناقشة الموضوع في المنتدى








هذه المقالة مكتوبة في موقع الشنكبوتية
http://www.toarab.ws

الرابط لهذه المقالة :
http://www.toarab.ws/modules.php?name=News&file=article&sid=38