تالار گفتمان nCIS.ir

نسخه‌ی کامل: خواندن و نمایش دسته بندیها از بانک با smarty
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
من یه جدول categories دارم که شامل چهار فیلد id,parent_id,name,confirmed هست.
حالا میخوام دسته بندیها رو از داخل این جدول بخونم و توی صفحه نشون بدم .
این کد مربوط به بخش php از اسمارتی هست:
$categories_query=  mysql_query("select * from categories WHERE confirmed=1");
$categories_quantity=mysql_num_rows($categories_query);
$categories=array();
$i=0;
while($categories_fetch=  mysql_fetch_array($categories_query)){
    $categories[$i++]=array(
        'id'=>$categories_fetch['id'],
        'name'=>$categories_fetch['name'],
        'parent_id'=>$categories_fetch['parent_id'],
        
    
    );
}
$smarty->assign("categories",$categories);
$smarty->assign("categories_quantity",$categories_quantity);

وتوی فایل tpl هم کدم به این شکله:
        <div class="collapse navbar-collapse" id="main-nav">
            <ul class="nav navbar-nav">
               
                <li class="active"><a href="#">{$categories[0].name}</a></li>
                 {section name=category start=1 loop=$categories}
                 {if !($categories[category].parent_id)}
                <li><a href="#">{$categories[category].name}</a></li>
               
                {/if}
                    {/section}
            </ul>
        </div>
تا اینجا تونستم دسته بندیهایی که زیردسته بندی ندارن رو نمایش بدم اما نمیدونم چطوری میتونم زیردسته بندیها رو نمایش بدم.
ممنون میشم راهنماییم کنید.
اول شما در PHP دسته بندی خود را بصورت یک درخت بسازید سپس در smarty با استفاده از یک تابع درخت خود را چاپ کنید.

بهینه ترین حالت اش این است که همان موقع ایی که دارین درخت را می سازین همان موقع یک رشته html تولید کنین تا از دوباره خواندن یک درخت جلوگیری کنید.
میشه با مثال، واضح تر توضیح بدید؟ Huh
یک نکته رو بهتره توی همه پروژه هاتون رعایت کنید. برای جلوگیری از مصرف دوبرابر حافظه، بجای mysql_fetch_array از mysql_fetch_assoc استفاده کنید. برای درک تفاوتشون، یکبار خروجی هر دو رو با var_dump نمایش بدین.
(19-03-1394، 09:14 ب.ظ)ADMIN نوشته: [ -> ]یک نکته رو بهتره توی همه پروژه هاتون رعایت کنید. برای جلوگیری از مصرف دوبرابر حافظه، بجای mysql_fetch_array از mysql_fetch_assoc استفاده کنید. برای درک تفاوتشون، یکبار خروجی هر دو رو با var_dump نمایش بدین.

چقدر جالب، mysql_fetch_assoc خیلی حافظه کمتری مصرف میکنه.ممنون از راهنماییتون.
ولی من هنوز جواب سوالم رو نگرفتم! :(
یک مثال ساده میزنم و راه حل را واضح تر می کنم.

شما باید داده های سطری در دیتابیس را به یک آرایه ایی از PHP تبدیل کنید.

مثلا

شناسه : 1
نام : cat1
پدر : 0

شناسه : 2
نام : cat2
پدر : 0

شناسه : 3
نام : cat3
پدر : 1

شناسه : 4
نام : cat4
پدر : 3

خوب اینجا باید ابتدا پدر های اصیل یا ریشه را بدست بیاریم (یعنی اون سطر هایی که مقدار پدر آن ها صفر است)

سپس اون هایی که پدرشان صفر نیست را استخراج می کنیم و بصورت توابع بازگشتی به پدر های آن ها اضافه می کنیم.


مثلا در بالا شناسه 1 و 2 پدر اصیل یا ریشه هستند و به آرایه اضافه می شوند. سپس شناسه های 3 در آرایه جستجو شده و پدر آن یعنی شناسه 1 را میابیم (توابع بازگشتی) و به فرزندان شناسه 1 شناسه 3 افزوده میشه و سپس شناسه 4 را در آرایه جستجو می کنیم و پدر آن شناسه 3 را میابیم و به فرزندان شناسه 3 شناسه 4 را اضافه می کنیم و به همین ترتیب


اینم نمونه مثال

http://www.maheshchari.com/php-nested-ca...sql-query/

http://www.phpclasses.org/package/4947-P...MySQL.html