# زبان های اسکریپتی > PHP > Laravel Framework >  دسته و زیر دسته ها و طریقه نمایش محصولات هر دسته

## rahahost

سلام خدمت دوستان 

در مورد دسته ها و زیر دسته ای هر دسته سوالی بپرسم که انشالله مثله سوالهای  قبلیم بی جواب نمونه !


میخوام برای دسته های محصولاتم زیر دسته تعریف کنم که هر زیر دسته هم  برای خودش زیر دسته هایی داره ( محدودیتی نداره و این ممکنه تا ۱۰ مرحله  زیر دسته داشته باشه )
 و اما سوال :

چطوری میتونم دسته ها و زیر دسته هارو به شکل درختی مرتب کنم ؟

 دقیقا مثله وردپرس ( در بخش دسته ها اگر دقت کنید)  ، اگر هم ندیدید ، ترتیب چینش دسته ها به شکل زیر هست :

 خودرو
_ پراید
_سمند
__ سمند ال اکس
__ سمند طرح جدید
____ سمند طرح جدید با ایربک
____ سمند طرح جدید بدون ایربک
__ سمند ملی
____سمند ملی تیب ۱
____ سمند ملی تیپ ۲



 در هر مرحله از زیر دسته ها ( زیر دسته ای که عضو دسته ی دیگه هست ) یک  علامت آندرلاین ( _ ) قرار داره که مشخص کننده دسته و زیر دسته های اون هست  .
 سوال دوم : گفتیم هر دسته ، زیر دسته هایی داره !
اگر فرضا ما بخوایم محصولات دسته ” سمند ملی”  رو نمایش بدیم ، باید  محصولاتی که در زیر مجموعه ی اون هم هست به نمایش در بیاد مگر اینکه بخوایم  محدود کنیم که فقط محصولات زیر دسته “سمند ملی تیپ ۲″ نمایش داده بشه .
 برای این مورد هم اگر راهنماییم کنید ممنون میشم .
 لطفا این مورد رو برام همراه با نمونه مثال بزنید تا بتونم مشکل رو حل کنم

----------


## rahahost

فکر نکنم جوابی از این سوال بگیرم ( مثله سوالات دیگه ! )

کسی هست بتونه کمک کنه که این پکیج رو چطوری میشه استفاده کرد : 
https://github.com/lazychaser/laravel-nestedset

----------


## MRmoon

منظورتون نصبشه؟ اگه آره که کافیه یه خط دستور بنویسین (تو ترمینال، cmd یا ...)

----------


## rahahost

> منظورتون نصبشه؟ اگه آره که کافیه یه خط دستور بنویسین (تو ترمینال، cmd یا ...)



ممنون از جوابتون اما نه ، منظورم نصبش نیست ، طریقه استفاده از این پکیج هست .

پکیج دیگه ای هم پیدا کردم که فکر کنم این بهتر باشه :
https://github.com/etrepat/baum

یه سری نمونه ها نوشته که من نمیفهمم چطور باید ازش استفاده کرد 
من دسته و زیر دسته رو تونستم با این دستور ذخیره کنم : 

$root = Category::create(['name' => 'Root category']);



کلا میشه این پکیج رو برام توضیح بدید که چطور میتونم محصولاتی که تو هر دسته هست رو نمایش بدم و اگه اون دسته ، زیر دسته داشت ، محصولات زیر دسته هاشم نمایش بدم ؟
ممنونم .

----------


## rahahost

تا به حال با این پکیج کار کردین ؟ 
https://github.com/etrepat/baum

میدونید چطور میتونم خروجی مرتب شده بر اساس دسته و زیر دسته ( درختی ) بگیرم ازش ؟
مثله وردپرس :



```

<ul class="task-list">
    <li>Electronics

        <ul class="task-list">
            <li>TV &amp; Home Theater</li>
            <li>Tablets &amp; E-Readers</li>
            <li>Computers

                <ul class="task-list">
                    <li>Laptops

                        <ul class="task-list">
                            <li>PC Laptops</li>
                            <li>Macbooks (Air/Pro)</li>
                        </ul>
                    </li>
                    <li>Desktops</li>
                    <li>Monitors</li>
                </ul>
            </li>
            <li>Cell Phones</li>
        </ul>
    </li>
    <li>Health Fitness &amp; Beaty</li>
    <li>Small Appliances</li>
    <li>Major Appliances</li>
</ul>
```

و برای نمایش محصولات هر دسته بطوری که محصولات زیر دسته هاشم نمایش بده رو به چه شکل باید کدم رو بنویسم ؟

----------


## rahahost

اضافه کردن دسته و زیر دسته درون این پکیج فوق العاده آسونه اما متاسفانه خروجی گرفتن ازشو نفهمیدم !

مثلا اگه به این شکل بنویسم : 



$root = Productcategory::all();

    var_dump($root->name);



این الان فقط یک خروجی میده :



array(5) {
  [13]=>
  string(10) "ماشین"
  [14]=>
  string(11) " سایپا"
  [16]=>
  string(12) "  پراید"
  [17]=>
  string(14) "  زانتیا"
  [15]=>
  string(22) " ایران خودرو"
}


نمیدونم چطوری خروجی با تک ul  و li  بگیرم !
مورد دیگه هم محصولات یک دسته و محصولات زیر دسته ها ( کل دسته هایی که در زیر مجموعه این دسته هست ) رو نمایش بدم !

----------


## rezakho

اول یک رابطه یک به چند به خود جدول دسته بندی ها بزنید مثلکد زیر

public function childs()
    {
        return  $this->hasMany('Category','parentId');
    }



بعد یک متد استاتیک برای پیمایش درخت مورد نظر می نویسیم، روش کار هم توی پیمایش درخت ها سرچ کنید پیدا می کنید، این متد 3 تا ورودی می گیره، اولی مدل ریشه هست، دومی سطح هست برای نمایش همون _ ابتدا نام شاخه ها و سومی کاراکتر مورد استفاده مثلا - یا _
خروجی متد هم تگ های option برای استفاده در تگ select هست

    public static function getNestedForCombo($cat, $level, $delimiter)
    {
        if(count($cat->childs) > 0)
        {
            $str = '';

            $str .= '<option style="color:red">' . str_repeat($delimiter, $level) . $cat->name . '</option>';

            $level++;

            foreach($cat->childs as $child)
            {
                $str .= static::getNestedForCombo($child, $level, $delimiter);
            }

            return $str;
        }

        return '<option>' . str_repeat($delimiter, $level) . $cat->name . '</option>';
    }


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

$cat = Category::find(123);

$optionTags = Category::getNestedForCombo($cat, 0, '_');

$html = '<select>' . $optionTags . '</select>';

----------


## rahahost

ممنون رضا جان ، لطفت کم نشه از لاراولیا ;)

این مشکل کاملا حل شده ولی یه ایرادی که داره اینه که اگه بخوام همه سته ها و زیر دسته هارو نمایش بدم ، خطا میده ، منظورم با این کوئری هست : 



$cat = Productgroup::all();


واسه این راهه حلی داره ؟

و یه مورد مهمتر اینکه اگه بخوام بصورت ul  و li های تودر تو همین کارو انجام بدم ، راهه حلی هست ؟

مورد آخر هم اینکه : چطوری میشه خروجی رو صفحه بندی کرد ؟ مثلا اگر یک دسته 500 تا زیر دسته داشته باشه ( فرضا ) خیلی زشت و بد شکل در میاد و حتما باید صفحه بندی داشته باشیم

سعیمو کردم اما متاسفانه نشد !

----------


## rezakho

نباید خطا بده، چه خطایی میده حالا؟

برای li و ul هم یه کپی از اون متد بگیر و تگ های option  رو با li عوض کن

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

----------


## rahahost

> نباید خطا بده، چه خطایی میده حالا؟
> 
> برای li و ul هم یه کپی از اون متد بگیر و تگ های option  رو با li عوض کن
> 
> اگر تعداد دسته ها و زیر دسته ها زیاد باشه، روش های دیگه ای باید استفاده کنی و اینا جواب گو نیست، مثلا از treeview استفاده کنی یا از autocomplete یا ...




این خطارو میده : 
     Undefined property: Illuminate\Database\Eloquent\Collection::$childs  
در صورتی که آی دی رو مستقیم میدم ، مشکلی پیش نمیاد !

خروجی ul و li میتونم بگیرم ازش ولی محدود هستش و فقط یه خروجی li دارم که زیر مجموعه نداره 

واسه treeview که گفتی ، نمونه داری که بتونم تو لاارول ازش استفاده کنم ؟

من یه کد پیدا کردم اما نتونستم ازش استفاده کنم درون لاراول :

http://stackoverflow.com/questions/1...ild-navigation


خروجی میخوام مثله لینک بالا باشه که زیر دسته هارو درون ul و li  بصورت زیر مجموعه های نامحدود  نمایش بده .

----------


## rezakho

آهان !!!
خوب جان برادر، خروجی متد all آرایه هست، شما باید یک مدل رو به اون متد getNestedForCombo بدی نه آرایه ای از مدل ها !
اگر هدفت داشتن همه سردسته ها توی خروجی هست، کار دیگه ای بکن، بیا یک دسته بندی درست کن به نام ریشه، همه سردسته ها رو بگذار زیر مجموعه اش و اونوقت این ریشه رو واکشی کن و بده به getNestedForCombo

----------


## rezakho

در ضمن 
این getNestedForCombo همین متد توی لینک بالاست، کاری که گفتم رو انجام بده درست میشه

----------


## rahahost

ممنون رضا جان .

درسته ، یه آرایه میده و منم با foreach خواستم تک تک آی دی هارو تست کنم که نشد ( این زیاد مهم نیست ) .
روشی که گفتی ( یه دسته اصلی داشته باشم ) رو به فکرم رسیده بود ولی گفتم شاید راهه حله بهتری هم داره !


واسه خروجی یک مرحله ای مشکلی ندارم ( منظورم یک ul  و li های درونش هست ) چون کدی که دادی کاملا واضحه ;)


مسئله مهم دسته و زیر دسته های بی نهایت هست ( ul  و li های تودرتو ) که تا به اینجا نتونستم حلش کنم .

----------


## rezakho

متدی که بهتون دادم، به صورت بازگشتی تمام زیر دسته ها رو پیمایش میکنه، مشکل جای دیگه هست، متد درسته
یا کد رو دستکاری کردید، و یا اینکه رابطه داده های داخل جدولت صحیح نیست

----------


## rahahost

> متدی که بهتون دادم، به صورت بازگشتی تمام زیر دسته ها رو پیمایش میکنه، مشکل جای دیگه هست، متد درسته
> یا کد رو دستکاری کردید، و یا اینکه رابطه داده های داخل جدولت صحیح نیست


ممنونم رضا جان :x

یه راهنمایی هم بکنی برای قسمت آخر سوالم ، کارم کلا راه میافته :
مسئله مهم دسته و زیر دسته های بی نهایت هست ( ul  و li های تودرتو ) که تا به اینجا نتونستم حلش کنم .

----------


## rezakho

سلام
برای نمایش به صورت ul  و li هم از این متد استفاده کن

public static function getNestedForList($cat)
{
    if(count($cat->childs) > 0)
    {
        $str = '';
  
        $str .= '<li>' . $cat->name .'<ul>';
 
        foreach($cat->childs as $child)
        {
            $str .= static::getNestedForList($child);
        }

        $str .= '</ul></li>';
 
        return $str;
    }
 
    return '<li>' . $cat->name . '</li>';
}


و به این شکل هم استفاده کن

'<ul>' . Category::getNestedForList(Category::find(2)) . '</ul>'


به جای عدد 2 هم آی دی ریشه دسته بندی رو بده

----------


## rahahost

خوده خودشهحاج رضای گل ، دمت گرم :x

در مورد صفحه بندی هم که پرسیده بودم ، منظورم اینه : 

اگر ما درون جدول دسته ها ، 200 تا دسته داشته باشیم و بخوایم درون مدیریت دسته  ( پنل مدیریت ) اونها رو نمایش بدیم ، صفحه خیلی طولانی میشه و الکی کش میاد !
میشه کاری کرد که 10 تا دسته رو نمایش بده و شماره بندی صفحهات داشته باشه ؟ مثلا صفحه دوم از رکورد 10 تا 20 و همینطور تا آخر ؟

یه عکس هم ضمیمه کردم که منظورمو میرسونه :

1419708204131.jpg

----------

