PDA

View Full Version : مبتدی: ذخیره شماره منوی مادر در دیتابیس؟؟؟



7asemoon
چهارشنبه 20 خرداد 1394, 11:14 صبح
من یک صفحه ایجاد کردم برای منو های سایت که اون ها رو صورت آبشاری نمایش میده
جدولم دارای این سطرهاست
id
menu
link
parent_id

حالا میخام زمانی که کاربر هیچکدام رو در کد پایین انتخاب کرد عدد صفر در parent_id ذخیره بشه و زمانی که یکی از menu ها رو انتخاب کرد شماره id اون منو در parent_id ذخیره بشه


<select name="sidebar">
<option value="0">هیچکدام</option>
<?php
$sql = "SELECT * FROM `$tbl_category` ORDER BY `id` DESC";
$result = $connect->query($sql);
while($rows = $result->fetch(PDO::FETCH_ASSOC)){
?>
<option value="<?=$rows['id'];?>"><?=$rows["menu"];?></option>
<?php
}
?>

</select>

7asemoon
چهارشنبه 20 خرداد 1394, 11:15 صبح
لطفا راهنمایی کنید

fatima-php
چهارشنبه 20 خرداد 1394, 11:28 صبح
اگه از قیدها استفاده کردین، نمیتونید 0 رو ذخیره کنید چون رکوردی با id صفر ندارین. بجاش فیلد رو Nullable کنید و اگه هیچکدام (مقدار صفر) انتخاب شده بود، برای parent_id مقدار NULL (بدون کوتیشن) ثبت کنید. اینطوری میتونین درصورت تمایل قید ON DELETE رو هم روی SET NULL تنظیم کنید تا اگه یه دسته بندی حذف شد، فرزندانش به ریشه منتقل بشن (بجای حذف). البته این مورد بستگی به نیاز و سناریوی شما داره و میتونید اگه به کارتون نمیاد، همون CASCADE رو بگذارین تا با حذف یک دسته بندی، فرزندانش هم حذف بشن.

7asemoon
چهارشنبه 20 خرداد 1394, 11:46 صبح
اگه از قیدها استفاده کردین، نمیتونید 0 رو ذخیره کنید چون رکوردی با id صفر ندارین. بجاش فیلد رو Nullable کنید و اگه هیچکدام (مقدار صفر) انتخاب شده بود، برای parent_id مقدار NULL (بدون کوتیشن) ثبت کنید. اینطوری میتونین درصورت تمایل قید ON DELETE رو هم روی SET NULL تنظیم کنید تا اگه یه دسته بندی حذف شد، فرزندانش به ریشه منتقل بشن (بجای حذف). البته این مورد بستگی به نیاز و سناریوی شما داره و میتونید اگه به کارتون نمیاد، همون CASCADE رو بگذارین تا با حذف یک دسته بندی، فرزندانش هم حذف بشن.

من دقیقا متوجه منظورتون نشدم
اگه ممکنه رویه کد توضیح بدین. تحلیلش رو خودم میدونم ولی نمیدونم چطور باید انجام بدم
این نکته رو هم در نظر بگیرید که parent_id به صورت پیش فرض صفر هست

7asemoon
چهارشنبه 20 خرداد 1394, 12:06 عصر
در حال حاضر اگر هیچکدام انتخاب سود با توجه به اینکه پیش فرض parent_id صفر هست هیچ مشکلی نداره ولی من میخام اگر کاربر روی گزینه ای غیر از هیچ کدام کلیک کرد شماره id چیزی که انتخاب کرده در parent_id ذخیره بشه

مثال:


id

menu

parent_id




1

امریکا

0




2

ایران

0




3

تهران

2




4

اصفهان

2





در این قسمت اسامی منو نمایش میشه
<option value="<?=$rows['id'];?>"><?=$rows["menu"];?></option>

حالا اگر عنوان جدید تحت تبریز نوشته شد و ایران انتخاب شد parent_id باید 2 ذخیره شود

ممنون میشم اگر کسی بگه چه کدی باید قرار بدم

Unique
چهارشنبه 20 خرداد 1394, 13:22 عصر
خوب یک combo میگذارین و مواردی که parent_id توشون ۰ هست را لیست میکنید و یک input هم برای نام ، وقتی فرم را ارسال میکنید مقدار combo انتخابی را برای praent_id و input را هم برای نام قرار میدین ! قبل از اینکه مقادیر با parent_id برابر صفر را توی combo بریزین یک مقدار برای اونهایی که قرار هست توی ریشه باشن هم میگذارین اینطوری :


<?php $rows = $db->query("select id,menu from table where parent_id = 0"); ?>
<select name='parent_id'>
<option value='0'>ریشه</option>
<?php
foreach($rows as $row)
echo "<option value='{$row[id]}'>{$row[menu]}</option>";
?>
</select>
<input name='menu' type='text' />

7asemoon
چهارشنبه 20 خرداد 1394, 15:11 عصر
خوب یک combo میگذارین و مواردی که parent_id توشون ۰ هست را لیست میکنید و یک input هم برای نام ، وقتی فرم را ارسال میکنید مقدار combo انتخابی را برای praent_id و input را هم برای نام قرار میدین ! قبل از اینکه مقادیر با parent_id برابر صفر را توی combo بریزین یک مقدار برای اونهایی که قرار هست توی ریشه باشن هم میگذارین اینطوری :


<?php $rows = $db->query("select id,menu from table where parent_id = 0"); ?>
<select name='parent_id'>
<option value='0'>ریشه</option>
<?php
foreach($rows as $row)
echo "<option value='{$row[id]}'>{$row[menu]}</option>";
?>
</select>
<input name='menu' type='text' />

خیلی ممنون درست شد

7asemoon
چهارشنبه 20 خرداد 1394, 15:17 عصر
حالا اگر بخام قابلیتش رو افزایش بدم و مثل سیستم وردپرس فرزند هم بتونه پدر یکی دیگه باشه باید چکار کنم؟

fatima-php
چهارشنبه 20 خرداد 1394, 15:21 عصر
خوب کافیه تمام دسته بندی ها رو توی کامبو باکس لود کنید.

Unique
چهارشنبه 20 خرداد 1394, 15:27 عصر
حالا اگر بخام قابلیتش رو افزایش بدم و مثل سیستم وردپرس فرزند هم بتونه پدر یکی دیگه باشه باید چکار کنم؟
load کدن همه دسته ها توی Combo جالب نیست و بهتره منو ها را به صورت یک درخت نشون بدی. jstree (http://www.jstree.com/) را برای این کار ویشنهاد میکنم.

7asemoon
چهارشنبه 20 خرداد 1394, 15:29 عصر
خوب کافیه تمام دسته بندی ها رو توی کامبو باکس لود کنید.

میخام دسته ها ب صورت وردپرس نمایش داده بشه

ریشه یک
--فرزند ریشه یک
---فرزند فرزند یک
--فرزند دو
ریشه دو
--فرزند ریشه دو

7asemoon
چهارشنبه 20 خرداد 1394, 15:33 عصر
load کدن همه دسته ها توی Combo جالب نیست و بهتره منو ها را به صورت یک درخت نشون بدی. jstree (http://www.jstree.com/) را برای این کار ویشنهاد میکنم.

پس میتونم بجای combo از همین jstree (http://www.jstree.com/) استفاده کنم؟؟؟
در کد php که تغییری لازم نیست اعمال کنم؟؟

7asemoon
چهارشنبه 20 خرداد 1394, 16:12 عصر
اگر بخام از li برای نمایش لیستم استفاده کنم باید کد php رو چطور تغییر بدم؟

Unique
چهارشنبه 20 خرداد 1394, 20:11 عصر
برای نمایش توی ul li یا استفاده از jstree که اون هم بالاخره باید ul li بشه باید از تابع بازگشتی استفاده کنی. کمی جستجو کن اگه تا شب به نتیجه نرسیدی خودم براتون لینک میگذارم.

7asemoon
چهارشنبه 20 خرداد 1394, 22:40 عصر
برای نمایش توی ul li یا استفاده از jstree که اون هم بالاخره باید ul li بشه باید از تابع بازگشتی استفاده کنی. کمی جستجو کن اگه تا شب به نتیجه نرسیدی خودم براتون لینک میگذارم.

من نتیجه درستی نگرفتم یعنی هرچی پیدا کردم یه بخشی از پروژه بود وقتی کنار هم قرار میگیره با مشکل مواجه میشه و فهمش برام سخت
اگه لطف کنید در قالب کد بگید سپاس گذار میشم

Unique
پنج شنبه 21 خرداد 1394, 00:15 صبح
خوب مشکل شما کلی تر از این حرف ها هست ، توی ساختار درختی با تابع بازگشتی به راحتی میشه ساختار های ul را به وجود آورد. تنها مشکلی که اغلب مه دارن این هست که توی حلقه query میزنن و اصلا نیاز نیست. واقعا الان وقت کدنویسی ، توصیه میکنم با همون combo کارت را راه بندازی تا در اسرع وقت توی همین پست یا خصوصی یک مثال کامل بزنم.

7asemoon
پنج شنبه 21 خرداد 1394, 08:36 صبح
خوب مشکل شما کلی تر از این حرف ها هست ، توی ساختار درختی با تابع بازگشتی به راحتی میشه ساختار های ul را به وجود آورد. تنها مشکلی که اغلب مه دارن این هست که توی حلقه query میزنن و اصلا نیاز نیست. واقعا الان وقت کدنویسی ، توصیه میکنم با همون combo کارت را راه بندازی تا در اسرع وقت توی همین پست یا خصوصی یک مثال کامل بزنم.

ممنون . منتظر میمونم

Unique
پنج شنبه 21 خرداد 1394, 21:30 عصر
اینجا توضیحات و مثال کامل را قرار دادم. (http://www.geekfarsi.com/%DA%86%DA%AF%D9%88%D9%86%DA%AF%DB%8C-%D9%BE%DB%8C%D9%85%D8%A7%DB%8C%D8%B4-%D9%88-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%AF%D8%A7%D8%AF%D9%87%E2%80%8C%D9%87%D8%A7-%D8%A8%D8%A7-%D9%81%D8%B1%D9%85%D8%AA/383)

7asemoon
جمعه 22 خرداد 1394, 00:32 صبح
دست گلت درد نکنه

7asemoon
جمعه 22 خرداد 1394, 09:14 صبح
اینجا توضیحات و مثال کامل را قرار دادم. (http://www.geekfarsi.com/%DA%86%DA%AF%D9%88%D9%86%DA%AF%DB%8C-%D9%BE%DB%8C%D9%85%D8%A7%DB%8C%D8%B4-%D9%88-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%AF%D8%A7%D8%AF%D9%87%E2%80%8C%D9%87%D8%A7-%D8%A8%D8%A7-%D9%81%D8%B1%D9%85%D8%AA/383)

من با توجه به اینکه ساختار جداولم فرق میکرد اسامی رو تغییر دادم و کد زیر رو قرار دادم


$nodes = array();
$parents = array();
$sql = "select * from `$tbl_category`";
$result = $connect->query($sql);
$result->execute();
while($row=$result->fetch(PDO::FETCH_ASSOC)){
$nodes[$row["parent_id"]][$row["id"]] = $row;
$parents[$row["id"]] = array('parent' => $row["parent_id"],'name' => $row["menu"]);
}

function make_list($id,&$list){
global $nodes;
foreach($nodes[$id] as $node){
$list .= "<li>".$node["menu"];
if (isset($nodes[$node["id"]]) && is_array($nodes[$node["id"]])){
$list .= "<ul>";
make_list($node["id"],$list);
$list .= "</ul>";
}
$list .= "</li>";
}
}

ولی با این دو خطا مواجه میشم
Notice: Undefined offset
Warning: Invalid argument supplied for foreach()

7asemoon
جمعه 22 خرداد 1394, 09:16 صبح
البته خطا ها مربوط هست به این خط
foreach($nodes[$id] as $node)

Unique
جمعه 22 خرداد 1394, 11:26 صبح
query شما هیچ نتیجه ای نداشته ، nodes$ خالیه ! نام جدول را مخصوصا متغیر دادین ؟

7asemoon
جمعه 22 خرداد 1394, 15:30 عصر
نام جدول خودم در بانک این بود

Unique
جمعه 22 خرداد 1394, 16:59 عصر
$tbl_category ؟ توی double quote ؟
اتباه میکنی نام جدول را که با $ نمیتونی شروع کنی ! query که برای slect میگیری خالی بر میگردونه ! با phpmyadmin چک کن !

7asemoon
جمعه 22 خرداد 1394, 18:03 عصر
$tbl_category d یک متغیر هست که داخلش جدول مربوطم ریخته شده