ساخت منو ul چند لایه با php

meysamz

Member
سلام
من در اس کیو ال جدولی با چنین مشخصاتی تعریف کردم:
PHP:
CREATE TABLE IF NOT EXISTS `menulinks` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(55) collate latin1_general_ci NOT NULL,
  `link` varchar(180) character set latin1 NOT NULL,
  `pedar_id` int(11) NOT NULL default '0',
  `tartib` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=2 ;

حالا در ادمین طوری نوشتم که بشود یک منوی بی نهایت لایه درست کرد که پدر هر رکورد از pedar_id مشخص میشه.
حالا وقتی می خواهیم یک منوی UL برای محیط کاربری بسازم در بخش چند لایه کردن به مشکل می خورم.

می خواهم یک همچین چیزی دربیاد که اگر بی نهایت لایه بود بهمین شکل رندر بشه:

HTML:
<ul>
<li><a class="tnavlink" href="cats-49.html"><span>ارتباط</span></a>
        <ul class="sublevel">
        <li><a href="cats-200.html">گوشي موبايل</a></li> 
        </ul>
</li>
<li><a class="tnavlink" href="cats-48.html"><span>صنعت</span></a></li>
</ul>
 

Domanjiri

Well-Known Member
سلام

باید از روش بازگشتی ( recursive ) استفاده کنی.

بعنوان نمونه: تصاویر پیوستی رو دریاب! کد زیر، اون درخت رو از اون جدول می سازه:
PHP:
$nodeList = array();
$tree     = array();

// خوندن اطلاعات از جدول و قرار دادن اونها در یک آرایه چن سطحی ( و نه چند بُعدی )
$query = mysql_query("SELECT id, title, parent FROM test ORDER BY parent");

while($row = mysql_fetch_assoc($query)){
    $nodeList[$row['id']] = array_merge($row, array('children' => array()));
}
mysql_free_result($query);

foreach ($nodeList as $nodeId => &$node) {
    if (!$node['parent'] || !array_key_exists($node['parent'], $nodeList)) {
        $tree[] = &$node;
    } else {
        $nodeList[$node['parent']]['children'][] = &$node;
    }
}
unset($node);
unset($nodeList);

// تابع بازگشتی برای چاپ درخت
function recursion(array $array)
{
    echo '<ul>';
    foreach ($array as $key => $value)
    {
        if (isset($value['title'])) echo "<li>{$value['title']}</li>";
        if (!empty($value['children']) && is_array($value['children']))
        {
                echo recursion($value['children']);
        }
    }
    echo '</ul>';
}


recursion($tree);


البته روش دیگه ای هم هست که در هنگام خوندن اطلاعات از دیتابیس از تابع بازگشتی استفاده می کنن، در این مورد می تونید گوگل کنید.

موفق باشی
 

پیوست ها

  • tree_out.PNG
    tree_out.PNG
    3.3 کیلوبایت · بازدیدها: 37
  • tree_table.PNG
    tree_table.PNG
    10.2 کیلوبایت · بازدیدها: 36
آخرین ویرایش:

meysamz

Member
ممنون Domanjiri
مشکلم تقریبا حل شد، کد بسیار کارآمدی بود.
البته در موردی که گفتید در گوگل سرچ کنم، خیلی سرچ کرده بودم اما مورد خوبی پیدا نکرده بودم.
علازقم اینکه توانستم با کد شما مشکل منو چند لایه را حل کنم اما یک مشکل دیگر وجود دارد.

هر UL لیست ها را با LI نشان می دهد.
حالا هر LI که زیر مجموعه داشته باشد یک UL داخلش رندر می شود.
اما مشکل اینکه در این کد LI قبل از UL بسته میشه در صورتیکه وقتی یک UL زیر مجموعه وجود دارد تگ آخری </li< باید بعد از </ul بیاید.

مثال فعلی و غلط

HTML:
<ul>
<li>لایه اول</li>
<ul>
<li>لایه دوم</li>
</ul>
<li>لایه اول بدون زیر مجموعه</li>
</ul>


مثال مورد نیاز و صحیح تر

HTML:
<ul>
<li>لایه اول
<ul>
<li>لایه دوم</li>
</ul>
</li>
<li>لایه اول بدون زیر مجموعه</li>
</ul>
 

meysamz

Member
کلا اگر کدی و یا روش دیگری بود که میشد کد ها را خیلی راحت تر جایگذری کرد خیلی بهتر بود.
ممنون
 

meysamz

Member
masima
مشگلی تو جدول نیست. در مدیریت منو هم در ادمین مشکلی ندارم.
این کدی هم که دوست عزیزمون Domanjiri دادند خیلی خوب بود و کاملا اجرا شد.
اما مشکلی که داشت در پست قبلی مطرح کردم.
یکم نیاز به انعطاف بیشتری بین کد های HTML و PHP است.
الان خیلی نمیشه کد های HTML را کاستومایز کرد.
 
آخرین ویرایش:

masima

Member
آقای masima
مشگلی تو جدول نیست. در مدیریت منو هم در ادمین مشکلی ندارم.
این کدی هم که دوست عزیزمون Domanjiri دادند خیلی خوب بود و کاملا اجرا شد.
اما مشکلی که داشت در پست قبلی مطرح کردم.
یکم نیاز به انعطاف بیشتری بین کد های HTML و PHP است.
الان خیلی نمیشه کد های HTML را کاستومایز کرد.
آقا ؟ :lol:( اِ وا ! از کی سبیل در آوردیم ؟ )
منظورم با شما نبود ؛ ببخشید !

Domanjiri جان ؛ برای نشون دادن طبقه بندی مثل زیر هم باید از این روش استفاده کرد ؟! :)
MajidOnline Forums > طراحي سايتهاي اينترنتي > برنامه نويسي Server Side > PHP/MySQL > سوالات و پاسخ ها
 
آخرین ویرایش:

meysamz

Member
masima
به این طبقه بندی ها در وب Breadcrump می گویند!
این سئوال درای موضوعی متفاوت با این تاپیک است
برای این موضوع بهتره تو گوگل سرچ کنیر یا یک مبجث جدید ایجاد نمایید.
 

Domanjiri

Well-Known Member
سلام بر همگی
کلا اگر کدی و یا روش دیگری بود که میشد کد ها را خیلی راحت تر جایگذری کرد خیلی بهتر بود.
ممنون
آره خُب، توی اوراکل دستوری وجود داره که با مشخص کردن این رابطه، یک مشخصه با عنوان level رو به همراه هر سطر میفرسته به خروجی، اونجا به راحتی میشه دست برد توی آرایه خروجی. اما mySQL این دستور رو پشتیبانی نمی کنه :cry: و تنها راه همین روش هاست..

ممنون Masoud1365
ولی کد Domanjiri را کمی دستکاری کردم مشکل دومم حل شد.
ممنون از همگی دوستان
خُب داداش من، میذاشتی اینجا تا هم ما استفاده کنیم و هم اگه کسی بعدن به این تاپیک مراجعه کرد ...!

با اجازت من این کار رو انجام میدم، دوستان کد زیر ، خروجی رو بصورتی که آقا میثم می خواست نمایش میده:
PHP:
.........
....
..
function recursion(array $array)
{
    echo '<ul>';
    foreach ($array as $key => $value)
    {
     
        if (!empty($value['children']) && is_array($value['children']))
        { 	
                echo "<li>{$value['title']}";

                echo recursion($value['children']);

                echo "</li>";

        } else {

	echo "<li>{$value['title']}</li>";

         }
    }
    echo '</ul>';
}

موفق باشین
 
آخرین ویرایش:

Domanjiri

Well-Known Member
بعد از دیدن اون کلاس!!

یه کلاس هم انجا هست شاید به کارت بیاد
کد:

http://www.alonon.net/unlimited-subcategory-with-adjacency-list-model/
آقا این دقیقن همون چیزی هست که بهتون بگفتم گوگل کنید، یعنی روش بازگشتی رو توی مرحله ی خوندن دیتابیس اجرا کرده.

توصیه من اینه که از همین روشی که اینجا گفته شد استفاده کنید، منابع کمتری از سرور مصرف میشه و سرعت بالاتری هم داره.

موفق باشین
 

جدیدترین ارسال ها

بالا