النتائج 1 إلى 5 من 5

الموضوع: طريقتي في الأقسام وفروعها . . موضوع قديم متجدد

  1. #1
    عضو جديد
    تاريخ التسجيل
    Sep 2005
    المشاركات
    14

    طريقتي في الأقسام وفروعها . . موضوع قديم متجدد



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

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

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

    الكلام عن الأقسام المتفرعة بغير تناه يكون على ثلاثة مقامات:

    الأول بنية الجداول في قاعدة البيانات، وهذه قد استقر القول فيها على الاكتفاء بجدول واحد له بنية مشابهة للتالي:
    كود:
    CREATE TABLE `cats` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(50) NOT NULL default '',
      `parent` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1256 AUTO_INCREMENT=9 ;
    وكما نرى فإن الحقول الثلاثة المذكورة هي أهم ما هنالك، ويمكن أن تزيد عليها ما يحتاجه برنامجك كوصف للقسم أو تاريخ إضافة ونحو ذلك.

    الثاني قراءة الأقسام من الجداول وتنظيمها في الذاكرة، وهنا كان أكثر الاختلاف في الخوارزميات التي قرأتها في هذا الموقع الجميل، وفيما يلي الطريقة التي أفضلها:

    الصف (Class) الرئيس هو Cat ويعرف على النحو التالي:
    كود PHP:
    class Cat {
      var 
    $id;
      var 
    $name;
      var 
    $parentid;
      var 
    $children;

      function 
    Cat($i$n$p) {
      }

      function 
    addChild(&$child) {
      }

      function 
    display() {
      }

    ويستخدم هذا الصف من داخل البرنامج على النحو التالي:
    كود PHP:
    if (!isset($catid)) $catid=0;
    $cats = new Cat(0'All categories', -1);
    $catQ = array();
    $sel_stmnt "SELECT id, name, parent FROM $cats_table";
    $resultsmysql_query($sel_stmnt);
    while (
    $record mysql_fetch_row($results)) {
      list(
    $cid$cname$cparent) = $record;
      if (! 
    $cats->addChild($child=new Cat($cid$cname$cparent))) 
        
    array_push($catQ$child);
    }
    while (
    count($catQ)>0)
      if (! 
    $cats->addChild($child=array_shift($catQ)))
        
    array_push($catQ$child); 
    وطبعاً يدور في خلد البعض سؤال ملح وهو: ما ذا يوجد داخل صناديق الدوال المشار إليها أعلاه؟
    والجواب كالتالي:
    دالة البناء:
    كود PHP:
        function Cat($i$n$p) {
          
    $this->id=$i;
          
    $this->name=$n;
          
    $this->parentid=$p;
          
    $this->children = array();
        } 
    دالة الإضافة:
    كود PHP:
      function addChild(&$child) {
        global 
    $catid$childrenbag$parentsbag;
        if (
    $added=($child->parentid==$this->id))
          
    $this->children[$child->id]=$child;
        else foreach (
    $this->children as $cid => $cchild)
                if (
    $added $this->children[$cid]->addChild($child)) break;
        if (
    $added) {
          if (
    $this->id == $catid$childrenbag[] = $child->id;
          if (
    $child->id == $catid$parentsbag[]=$this->id;
        }
        return 
    $added;
      } 
    أود التنبيه إلى أن المتغيرين $parentsbag و $childrenbag ليسا أساسيين في الطريقة المقترحة لكنهما يوفران أداتين مفيدتين جداً يمكن استخدامهما في مواضع أخرى من البرنامج، كما في طريقة العرض الشجرية مثلاً، وعلى العموم، في حال استخدامها يجب التصريح عنهما قبل تعريف الصف.

    المقام الثالث: هو عرض الأقسام، وهو أمر سهل ميسور بعد أن أصبحت الأقسام وتفريعاتها موجودة عندنا مرتبة، فيمكن أن تختار طريقة العرض الشجرية أو طريقة القائمة المنسدلة، أيهما أنسب لك، وذلك باستدعاء:
    كود PHP:
    echo $cats->display(); 
    على سبيل المثال، هذا التعريف لدالة display يعرض الأقسام على شكل تفريع شجري شهير، ويستخدم ثلاثة صور لتمثيل العقد: واحدة لتمييز القسم المختار، وأخرى لتمييز أبناء هذا القسم وإن دنوا، والثالثة لتمييز آبائه وإن علوا، وصوراً أخرى للمسارات والخطوط.
    كود PHP:
      function display() {
        global 
    $catid$catchildren$childrenbag$parentsbag$treestring;
          if (
    $A=($this->id==$catid)) $catchildren =true;
          if ((
    in_array($this->id$parentsbag)) || ($A) || (in_array($this->id$childrenbag))) {
            
    $treestring .= '<table class="treeview" cellpadding="0" cellspacing="0"    ><tr><td><img src="'.(($A)?'c':(($catchildren)?'o':'p')).'folder.gif" alt="" /></td>';
            
    $treestring .= '<td>&nbsp;<span class="linkcat" onClick="loadCat('.($this->id).')">'.($this->name).'</span></td></tr>';
            if (
    count($this->children)>0) {
              foreach (
    $this->children as $key=>$catchild) {
        if ((
    in_array($catchild->id$parentsbag)) || ($catchild->id==$catid) || (in_array($catchild->id$childrenbag))) {
                  
    $treestring .= '<tr><td'.(($key==max(array_keys($this->children))|| ($catchild->id==$catid) || (in_array($catchild->id,$parentsbag)))?'><img src="imgs/tvln':' class="tvnlastnode"><img src="tvnln').'.gif" alt="" /></td><td>';
          
    $catchild->display();
          
    $treestring .= '</td></tr>';
                }
              }
            }
            
    $treestring .= '</table>';
          }
          if (
    $this->id ==0) return $treestring;
        }
      } 
    وهذا أوان الإمساك عن فضول الكلام، ففيما تقدم الكفاية، والمرجو من القراء الكرام المسامحة على ما زاد عن الحد.

    والله تعالى أعلم.

    أخوكم : أحمد







  2. #2


    موضوع جيد ومفيد

    وانا تقريباً استخدم طريقة مشابه وراح اكتبها عشان الجميع يستفيد

    ننشاً هذا الجدول

    كود:
    CREATE TABLE `categories` (
      `catid` int(11) NOT NULL auto_increment,
      `name` varchar(255) NOT NULL default '',
      `description` text NOT NULL,
      `catorder` int(11) NOT NULL default '0',
      `parentcategory` int(11) NOT NULL default '0',
      `status` tinyint(4) NOT NULL default '0',
      PRIMARY KEY  (`catid`),
      KEY `catorder` (`catorder`),
      KEY `parentcategory` (`parentcategory`),
      KEY `status` (`status`),
      FULLTEXT KEY `name` (`name`),
      FULLTEXT KEY `description` (`description`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    صفحة اضافة القسم الرئيسية الفرعي معاً addcategory.php



    كود:
    <form action="addcategory2.php" method="POST" name="form" dir="rtl">
    <div align="center">
    <table style="border: 0px none; font-size: 12px; font-family: Arial; ">
      <tr>
      <td width="144" valign="top" align="right" dir="rtl">
    	<p align="right" dir="rtl">الاسم :</td>
      <td width="242" align="right" dir="rtl">
    	<p align="right" dir="rtl"><input type="text" name="catname" style="width: 150px; margin: 2px; border: 1px solid #4A708B;"></td>
      </tr>
      <tr bgcolor="#A4D3EE">
      <td width="144" valign="top" align="right" dir="rtl">
    	<p align="right" dir="ltr">الوصف :</td>
      <td width="242" align="right" dir="rtl">
    	<p align="right" dir="rtl"><textarea name="catdescription" rows="3" cols="35" style="margin: 2px; border: 1px solid #4A708B;"></textarea></td>
      </tr>
      <tr>
      <td width="144" valign="top" align="right" dir="rtl">
    	<p align="right" dir="rtl">الوضع :</td>
      <td width="242" align="right" dir="rtl">
    	<p align="right" dir="rtl"><select name="catstatus"><option value="1">مفعل</option><option value="0">
    	غير مفعل</option></select></td>
      </tr>
      <tr bgcolor="#A4D3EE">
      <td width="144" valign="top" align="right" dir="rtl">
    	<p align="right" dir="rtl">غير :</td>
      <td width="242" align="right" dir="rtl">
    	<p align="right" dir="rtl"><input type="text" name="catorder" style="width: 50px; margin: 2px; border: 1px solid #4A708B;"></td>
      </tr>
      <tr>
      <td width="144" valign="top" align="right" dir="rtl">
    	<p align="right" dir="rtl">تصنيف فرعي</td>
      <td width="242" align="right" dir="rtl">
    	<p align="right" dir="rtl"><select name="parentcategory"><option value="0">
    	None</option>
    	
    	<?php 
    	include("config.php");
    	$category_result = mysql_query("SELECT name,catid FROM categories WHERE  parentcategory = '0' ORDER BY name");
    	if (mysql_num_rows($category_result)) 
    	{ while($cat_row = mysql_fetch_array($category_result))
    	{ echo "<option value=\"".$cat_row['catid']."\">".$cat_row['name']."</option>"; } }
    	?>
    	  </select></td>
      </tr>
      <tr>
      <td colspan="2" align="center">
    	<p align="right" dir="rtl">
    	<input type="submit" name="submit" value="أضف التصنيف الآن" style="margin: 2px; border: 1px solid #4A708B; background-color: #FFFFFF;"></td>
      </tr>
    </table>
    </div>
    </form>
    صفحة ادخال البيانات addcategory2.php

    كود PHP:
    <?

    include("config.php");

            
    $catname $_POST[catname];
            
    $catdescription $_POST[catdescription];
            
    $catstatus $_POST[catstatus];
            
    $catorder $_POST[catorder];
            
    $parentcategory $_POST[parentcategory];

            if (
    strlen($catname)) {
                    
    // Add category to MySQL database
                    
    $add mysql_query("INSERT INTO categories SET name = '$catname', description = '$catdescription',  status = '$catstatus', catorder = '$catorder', parentcategory = '$parentcategory'");
            }
            
    // Redirect to games page
            
    header ("Location: addcategory.php");
            exit();
    وهنا ملف الاتصال بقاعدة البيانات config.php

    كود PHP:
    <?
    $host
    ="localhost"// Host name 
    $username="root"// Mysql username 
    $password=""// Mysql password 
    $db_name="droos"// Database name 

    // Connect to server and select database.
    mysql_connect("$host""$username""$password")or die("cannot connect"); 
    mysql_select_db("$db_name")or die("cannot select DB");

    ?>
    وتمنياتي للجميع بالتوفيق





    __________________
    +======================+
    شبكة تصميم لتطوير المواقع
    www.tsmim.com
    سكربتات حصرية - وتصاميم مميزة لموقعك
    +======================+

  3. #3
    عضو نشيط جدا
    تاريخ التسجيل
    Feb 2007
    المشاركات
    393


    راائع جدا وطريقتك تغنينا عن الاستعلامات المتعددة
    الحقيقة الطريقة رائعه جدا لكن بنظرة سريعه لفت انتباهي لهذا الكود

    كود PHP:
    while (count($catQ)>0
      if (! 
    $cats->addChild($child=array_shift($catQ))) 
        
    array_push($catQ$child); 
    هل تقصد به عكس المصفوفة ؟ واتوقع انه تكرار غير منتهي :con2:





    __________________
    موقعي الشخصي
    www.Flasher.ws

    جزيرة الفنون
    www.Artsisland.net

  4. #4
    عضو جديد
    تاريخ التسجيل
    Sep 2005
    المشاركات
    14


    أخي الكريم Abosaleh_2003
    أشكر لك مرورك، ولا أزلت أنظر في البرنامج الذي وضعته ههنا.

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






  5. #5
    عضو نشيط جدا
    تاريخ التسجيل
    May 2007
    المشاركات
    309


    عزيزي

    حقيقة اعبتني جدا الفكرة ... بخصوص while اظن من الافضل استخدام for ... راي شخصي

    وبهذا الخصوص ساضع الطريقة التقليدية باستخدام while
    الجدول
    id
    main
    main_id
    title
    كود PHP:
    $section_query mysql_query("SELECT * From section where main='1'");
    while(
    $section_rows mysql_fetch_array($section_query))
    {
    echo 
    $section_rows['title'];
    $forum_query mysql_query("SELECT * From section  where main='0' and main_id='".$section_rows['id']."' ");
    while(
    $forum_rows mysql_fetch_array($forum_query))
    {
      echo 
    $forum_rows['title'];
    }







    __________________
    Bruce - مدونة شديدة التخصص في PHP وتطبيقات الويب





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

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