PDA

View Full Version : دسته و زیر دسته ها و طریقه نمایش محصولات هر دسته



rahahost
یک شنبه 16 آذر 1393, 17:45 عصر
سلام خدمت دوستان

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


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

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

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

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



در هر مرحله از زیر دسته ها ( زیر دسته ای که عضو دسته ی دیگه هست ) یک علامت آندرلاین ( _ ) قرار داره که مشخص کننده دسته و زیر دسته های اون هست .
سوال دوم : گفتیم هر دسته ، زیر دسته هایی داره !
اگر فرضا ما بخوایم محصولات دسته ” سمند ملی” رو نمایش بدیم ، باید محصولاتی که در زیر مجموعه ی اون هم هست به نمایش در بیاد مگر اینکه بخوایم محدود کنیم که فقط محصولات زیر دسته “سمند ملی تیپ ۲″ نمایش داده بشه .
برای این مورد هم اگر راهنماییم کنید ممنون میشم .
لطفا این مورد رو برام همراه با نمونه مثال بزنید تا بتونم مشکل رو حل کنم http://php4you.ir/wp-includes/images/smilies/icon_smile.gif

rahahost
دوشنبه 17 آذر 1393, 20:07 عصر
فکر نکنم جوابی از این سوال بگیرم ( مثله سوالات دیگه ! )

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

MRmoon
سه شنبه 18 آذر 1393, 14:25 عصر
منظورتون نصبشه؟ اگه آره که کافیه یه خط دستور بنویسین (تو ترمینال، cmd یا ...)

rahahost
چهارشنبه 19 آذر 1393, 17:15 عصر
منظورتون نصبشه؟ اگه آره که کافیه یه خط دستور بنویسین (تو ترمینال، cmd یا ...)


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

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

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


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



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

rahahost
چهارشنبه 19 آذر 1393, 22:29 عصر
تا به حال با این پکیج کار کردین ؟
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
پنج شنبه 20 آذر 1393, 19:29 عصر
اضافه کردن دسته و زیر دسته درون این پکیج فوق العاده آسونه اما متاسفانه خروجی گرفتن ازشو نفهمیدم !

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




$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
سه شنبه 25 آذر 1393, 22:44 عصر
اول یک رابطه یک به چند به خود جدول دسته بندی ها بزنید مثلکد زیر


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
جمعه 28 آذر 1393, 17:57 عصر
ممنون رضا جان ، لطفت کم نشه از لاراولیا ;)

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




$cat = Productgroup::all();


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

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

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

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

rezakho
جمعه 28 آذر 1393, 23:21 عصر
نباید خطا بده، چه خطایی میده حالا؟

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

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

rahahost
شنبه 29 آذر 1393, 18:28 عصر
نباید خطا بده، چه خطایی میده حالا؟

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

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



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

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

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

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

http://stackoverflow.com/questions/13002327/using-recursion-to-build-navigation


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

rezakho
شنبه 29 آذر 1393, 20:35 عصر
آهان !!!
خوب جان برادر، خروجی متد all آرایه هست، شما باید یک مدل رو به اون متد getNestedForCombo بدی نه آرایه ای از مدل ها !
اگر هدفت داشتن همه سردسته ها توی خروجی هست، کار دیگه ای بکن، بیا یک دسته بندی درست کن به نام ریشه، همه سردسته ها رو بگذار زیر مجموعه اش و اونوقت این ریشه رو واکشی کن و بده به getNestedForCombo

rezakho
شنبه 29 آذر 1393, 20:41 عصر
در ضمن
این getNestedForCombo همین متد توی لینک بالاست، کاری که گفتم رو انجام بده درست میشه

rahahost
یک شنبه 30 آذر 1393, 02:22 صبح
ممنون رضا جان .

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


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


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

rezakho
یک شنبه 30 آذر 1393, 16:45 عصر
متدی که بهتون دادم، به صورت بازگشتی تمام زیر دسته ها رو پیمایش میکنه، مشکل جای دیگه هست، متد درسته
یا کد رو دستکاری کردید، و یا اینکه رابطه داده های داخل جدولت صحیح نیست

rahahost
دوشنبه 01 دی 1393, 00:39 صبح
متدی که بهتون دادم، به صورت بازگشتی تمام زیر دسته ها رو پیمایش میکنه، مشکل جای دیگه هست، متد درسته
یا کد رو دستکاری کردید، و یا اینکه رابطه داده های داخل جدولت صحیح نیست

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

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

rezakho
جمعه 05 دی 1393, 18:07 عصر
سلام
برای نمایش به صورت 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
شنبه 06 دی 1393, 22:13 عصر
خوده خودشهحاج رضای گل ، دمت گرم :x

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

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

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

126959