PDA

View Full Version : حرفه ای: نمایش موضوع و زیر موضوع



maysam.m
چهارشنبه 06 مرداد 1389, 16:35 عصر
با سلام

یه سوالیه که نتونستم جوابی براش پیدا کنم و از شما دوستان میخوام که کمک کنید.

ستونهای جدول ساخت موضوع ما بدین گونه است:
id, name, des, parent_id

و فرضا من این موضوع و زیرموضوع ها را دارم:


-France id=1
-Iran id=2
-Asia id=3
-Europe id=4
-Turky id=5
-Germany id=6


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

مشکل اینه که ما میخواهیم هر موضوع والد را همراه با فرزندانش به ترتیب نشان بدهیم به این صورت:


-Asia (id=3,Parent category)

-Iran (id=2,Child category)
-Turkey (id=5,Child category)

-Europe (id=4,Parent category)

-France (id=1,Child category)
-Germany (id=6,Child category)




برای پیاده سازی چنین کاری باید چه کار کرد؟ (این کار در وردپرس به خوبی پیاده سازی شده است ولی من چیزی از کدهاش نفهمیدم)

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

iner30
چهارشنبه 06 مرداد 1389, 19:13 عصر
سلام دوست عزیز

شما برای این کار اول میای یه کوئری میسازی و فیلدهایی رو که parent_id=0 بود رو انتخاب میکنی ، تو حلقه این کوئری یک کوئری دیگه ایجاد میکنی و فیلدهایی رو که parent_id اونها برابر id نتیجه کوئری اول بودن رو انتخاب میکنی

این طوری میتونی اونارو دسته بندی کنی
اگه متوجه نشدی بگو کد بذارم

maysam.m
چهارشنبه 06 مرداد 1389, 20:40 عصر
سلام دوست عزیز

شما برای این کار اول میای یه کوئری میسازی و فیلدهایی رو که parent_id=0 بود رو انتخاب میکنی ، تو حلقه این کوئری یک کوئری دیگه ایجاد میکنی و فیلدهایی رو که parent_id اونها برابر id نتیجه کوئری اول بودن رو انتخاب میکنی

این طوری میتونی اونارو دسته بندی کنی
اگه متوجه نشدی بگو کد بذارم

سلام
سپاس فراوان بابت راهنمایی.
منظورتون متوجه شدم ولی نتونستم کدش کنم. ممنون میشم کد بگذارید.

با سپاس

SAMAN_PHP
پنج شنبه 07 مرداد 1389, 00:02 صبح
maysam.m جان
شما اول دوتا جدول درست کن یکی برای parent ویکی برای Child حالا وقتی میخوای Child جدید اضافه کنی id parentرو بهش بده برای نمایش هم از کد زیر استفاده کن.


$result = mysql_query("SELECT * FROM parent ");
while($r=mysql_fetch_array($result))
{
$parent_name=$r['name'];
$parent_id=$r['id'];

echo $parent_name.'<br>';

$result2 = mysql_query("SELECT * FROM Child WHERE parent_id LIKE '$parent_id'");
while($r2=mysql_fetch_array($result2))
{
echo $r2['name'].'<br>';
}

}

iner30
پنج شنبه 07 مرداد 1389, 08:16 صبح
SAMAN این دوست ما گفت یه جدول داره میخواد از اون بدست بیاره، وگرنه اگه به دوتا جدول بود فکر کنم با join هم بشه بدست اورد


$q_shakhe=mysql_query("select * from fgroup where parent_id='0'");
while($n_shakhe=mysql_fetch_array($q_shakhe)){
$id=$n_shakhe['id'];
$name=$n_shakhe['name'];
$q_zirshakhe=mysql_query("select * from fgroup where id='$id'");
while($n_zirshakhe=mysql_fetch_array($q_zirshakhe) ){
$name_z=$n_zirshakhe['name'];
}
}

bestirani2
پنج شنبه 07 مرداد 1389, 14:00 عصر
بیا یک فیلد position_parent بگیر و یک فیلد level و فیلد position
حالا با توجه به level پدر و فرزندی رو مشخص میکنیم یعنی
level شماره 2 فرزند یک از level های شماره یک
اما فرزند کدام؟
ما یک فیلد position داشتیم که جایگاه هر موضوع را نسبت به یک موضوع دیگر مشخص میکند که این فیلد باید با position_parent هر فرزند یکی باشد
یعنی اگر ما یک موضوع داریم که level آن یک هست و جایگاه آن 2 هست
ما هر جا موضوعی با level ، دو و position_parent دو داریم، زیر موضوع آن هست
که حال یک view بگیر که position_parent و position دو level متوالی رو به یک نام بگیریم
و هنگام مرتب کرد در مرحله با توجه به این view مرتب میکنیم سپس با توجه به level و در آخر با توجه به position فرزند

اگر نفهمیدی از نو بخون، میفهمی :لبخند:

maysam.m
پنج شنبه 07 مرداد 1389, 14:00 عصر
سلام

واقعا از هر دو بزرگوار SAMAN_PHP (http://barnamenevis.org/forum/member.php?u=153523) و iner30 (http://barnamenevis.org/forum/member.php?u=91411) ممنونم.

maysam.m
پنج شنبه 07 مرداد 1389, 14:13 عصر
بیا یک فیلد position_parent بگیر و یک فیلد level و فیلد position
حالا با توجه به level پدر و فرزندی رو مشخص میکنیم یعنی
level شماره 2 فرزند یک از level های شماره یک
اما فرزند کدام؟
ما یک فیلد position داشتیم که جایگاه هر موضوع را نسبت به یک موضوع دیگر مشخص میکند که این فیلد باید با position_parent هر فرزند یکی باشد
یعنی اگر ما یک موضوع داریم که level آن یک هست و جایگاه آن 2 هست
ما هر جا موضوعی با level ، دو و position_parent دو داریم، زیر موضوع آن هست
که حال یک view بگیر که position_parent و position دو level متوالی رو به یک نام بگیریم
و هنگام مرتب کرد در مرحله با توجه به این view مرتب میکنیم سپس با توجه به level و در آخر با توجه به position فرزند

اگر نفهمیدی از نو بخون، میفهمی :لبخند:

با سلام

من منظور شما را درست متوجه نشدم. لطفا میکنید منظورتون را با کد نشان بدهید؟

در واقع با این کاری که شما میگی میشود فرزندان رده چندم را هم متوجه شد درسته؟
یعنی یک موضوع ممکنه زیر موضوع یک موضوع فرزند باشد و به این ترتیب میشه تعیین کرد که در جایگاهی نسبت به جایگاه والد خود دارد؟

مثلا:

-پدربزرگ

-پدر

-نوه

-نتیجه




در صورتی که بخواهیم به صورت معمولی آن را پیاده سازی کنیم این طوری میشود

-پدربزرگ

-پدر
-نوه
-نتیجه

bestirani2
پنج شنبه 07 مرداد 1389, 14:18 عصر
با سلام

من منظور شما را درست متوجه نشدم. لطفا میکنید منظورتون را با کد نشان بدهید؟

در واقع با این کاری که شما میگی میشود فرزندان رده چندم را هم متوجه شد درسته؟
یعنی یک موضوع ممکنه زیر موضوع یک موضوع فرزند باشد و به این ترتیب میشه تعیین کرد که در جایگاهی نسبت به جایگاه والد خود دارد؟

مثلا:

-پدربزرگ

-پدر

-نوه

-نتیجه







در صورتی که بخواهیم به صورت معمولی آن را پیاده سازی کنیم این طوری میشود

-پدربزرگ

-پدر
-نوه
-نتیجه




درسته تا هر چند تا رنده بخواهیم میتونیم بگیریم
مثل همین فروم
کدام قسمتش رو متوجه نشدید که بیشتر توضیح بدهم؟

maysam.m
پنج شنبه 07 مرداد 1389, 14:27 عصر
درسته تا هر چند تا رنده بخواهیم میتونیم بگیریم
مثل همین فروم
کدام قسمتش رو متوجه نشدید که بیشتر توضیح بدهم؟

در واقع قسمت مهمش یعنی: پیاده سازی و کد زدنش! :لبخند:
ممنون میشم با یک مثال نشان بدی.

bestirani2
پنج شنبه 07 مرداد 1389, 14:39 عصر
در واقع قسمت مهمش یعنی: پیاده سازی و کد زدنش! :لبخند:
ممنون میشم با یک مثال نشان بدی.

من یک کد برای یک مرحله نوشتم که همون رو میتونی برای بقیه بسط بدی


SELECT *
FROM (
SELECT *,
case WHEN level = 1
THEN position
ELSE position_parent
END AS masterposition
FROM table
) AS tmptable
order by masterposition, level, position asc;

البته میتونی tmptable رو بریزی تو یک view که بعداً به راحتی بتونی باهاش کار کنی

SAMAN_PHP
پنج شنبه 07 مرداد 1389, 14:40 عصر
کد iner30 عزیز رو ویرایش کردم



$q_shakhe=mysql_query("select * from fgroup where parent_id='0'");
while($n_shakhe=mysql_fetch_array($q_shakhe))
{
$id=$n_shakhe['id'];
$name=$n_shakhe['name'];

$q_zirshakhe=mysql_query("select * from fgroup where parent_id='$id'");
while($n_zirshakhe=mysql_fetch_array($q_zirshakhe) )
{
$name_z= $n_zirshakhe['name'];
}
}

mohmadd
پنج شنبه 07 مرداد 1389, 17:46 عصر
با دو تا فیلد id و parent میشه یه سیستم درختی درست کرد !!!
حالا این روشی که شما در پیش گرفتید رو اگه میشه توضیح بدید ؟؟

iner30
پنج شنبه 07 مرداد 1389, 18:04 عصر
saman جان کد مشکلی داشت؟
اگه داشت ممنون میشم بگی

mohmadd
پنج شنبه 07 مرداد 1389, 18:30 عصر
یه مثال میزنم ,من این روش رو بلدم
bestiran میشه روش خودت رو بگی ما هم یاد بگیریم ؟
مثل من توضیح بده :لبخند:



id=1,pa=0,iran
id=2,pa=0,turkey
id=3,pa=1,tehran
id=4,pa=1,shiraz
id=5,pa=2,istanbul
id=6,pa=2,ankara
id=7,pa=5,XXX(istanbul)
id=8,pa=6,xxx(ankara)

iran
->tehran
->shiraz
turkey
->istanbul
->XXX(istanbul)
->ankara
->xxx(ankara)

در ضمن دقیقا هدف تاپیک چیه ؟
اینکه یه لیست درختی درست کنیم و اونارو نمایش بدیم ؟ یا امکان حذف و اضافه کردن چیز جدیدی داشته باشه ؟ و بشه لیست درختی رو بخشی از اون رو نشون داد (مثلا بخش ایران)؟

SAMAN_PHP
پنج شنبه 07 مرداد 1389, 18:46 عصر
saman جان کد مشکلی داشت؟
اگه داشت ممنون میشم بگی
مشکل که نه نداشت.فقط توی کوری دوم بجای parent_id شما id نوشته بودین ,که در این صورت تنها parent رو نشون میداد اونم دو بار.

bestirani2
پنج شنبه 07 مرداد 1389, 20:45 عصر
یه مثال میزنم ,من این روش رو بلدم
bestiran میشه روش خودت رو بگی ما هم یاد بگیریم ؟
مثل من توضیح بده :لبخند:



id=1,pa=0,iran
id=2,pa=0,turkey
id=3,pa=1,tehran
id=4,pa=1,shiraz
id=5,pa=2,istanbul
id=6,pa=2,ankara
id=7,pa=5,XXX(istanbul)
id=8,pa=6,xxx(ankara)

iran
->tehran
->shiraz
turkey
->istanbul
->XXX(istanbul)
->ankara
->xxx(ankara) در ضمن دقیقا هدف تاپیک چیه ؟
اینکه یه لیست درختی درست کنیم و اونارو نمایش بدیم ؟ یا امکان حذف و اضافه کردن چیز جدیدی داشته باشه ؟ و بشه لیست درختی رو بخشی از اون رو نشون داد (مثلا بخش ایران)؟

کافیه جدول مورد نظر رو درست کنید و کوئری بالا رو اجرا کنید تا متوجه بشید

maysam.m
پنج شنبه 07 مرداد 1389, 20:50 عصر
من یک کد برای یک مرحله نوشتم که همون رو میتونی برای بقیه بسط بدی


SELECT *
FROM (
SELECT *,
case WHEN level = 1
THEN position
ELSE position_parent
END AS masterposition
FROM table
) AS tmptable
order by masterposition, level, position asc;

البته میتونی tmptable رو بریزی تو یک view که بعداً به راحتی بتونی باهاش کار کنی

من متوجه نشدم که دقیقا این روشی که شما میگی چطور کار میکنه.


یه مثال میزنم ,من این روش رو بلدم
bestiran میشه روش خودت رو بگی ما هم یاد بگیریم ؟
مثل من توضیح بده :لبخند:



id=1,pa=0,iran
id=2,pa=0,turkey
id=3,pa=1,tehran
id=4,pa=1,shiraz
id=5,pa=2,istanbul
id=6,pa=2,ankara
id=7,pa=5,XXX(istanbul)
id=8,pa=6,xxx(ankara)

iran
->tehran
->shiraz
turkey
->istanbul
->XXX(istanbul)
->ankara
->xxx(ankara)

در ضمن دقیقا هدف تاپیک چیه ؟
اینکه یه لیست درختی درست کنیم و اونارو نمایش بدیم ؟ یا امکان حذف و اضافه کردن چیز جدیدی داشته باشه ؟ و بشه لیست درختی رو بخشی از اون رو نشون داد (مثلا بخش ایران)؟

هدف این تاپیک اینه که بشه به راحتی موضوعات را به صورت درختی (به قول شما) نشان داد در واقع بشه موضوعات فرزند را دقیقا زیر موضوع والد به نمایش در آورد.
روشی که دوستان SAMAN_PHP و iner30 عزیز گفتند بسیار روش خوبی برای این کار است. اما اگر بخواهیم موضوعی داشته باشیم که فرزند یک موضوع فرزند باشه فکر نمیکنم این روش جواب بده.

bestirani2
پنج شنبه 07 مرداد 1389, 20:54 عصر
من متوجه نشدم که دقیقا این روشی که شما میگی چطور کار میکنه.

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

mohmadd
پنج شنبه 07 مرداد 1389, 21:09 عصر
کافیه جدول مورد نظر رو درست کنید و کوئری بالا رو اجرا کنید تا متوجه بشید
این روش رو کاملا با حلقه میشه پیاده کرد
با query شما درسته که چیزی نمیشه
یا اینکه اصلا از اول تاپیک قضیه رو دنبال نکردم ...


توضیحاتی که در پست اولم دادم را بخوانید فکر کنم متوجه بشید، اگر نشدید
جدول مربوطه را بسازید و سپس با این کوئری را وارد کنید تا متوجه بشید
شما نمیشه کد مورد نظر رو بنویسید ؟

bestirani2
پنج شنبه 07 مرداد 1389, 21:42 عصر
ما سه تا فیلد داریم position که جایگاه هر موضوع رو نسبت به موضوعات همزاد خودش نشون میده
یک level که والد و فرزند رو مشخص میکنه و position_parent که نشون میده position والدش کجاست
حالا داده های زیر رو در نظر بگیر

موضوع والد 1، مرحله 1، جایگاه 1، جایگاه والد نال
موضوع والد 2، مرحله 1، جایگاه 2، جایگاه والد نال
موضوع فرزند 1، مرحله 2، جایگاه 1، جایگاه والد 2
موضوع فرزند 2، مرحله 2، جایگاه 2، جایگاه والد 2

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

حالا به هر روشی که میدونید توی یک کوئری یک فیلد درست کنید که جایگاه والد و جایگاه والد مربوط به فرزند هر دو در یک ستون قرار بگیرند که این رو میشه به عنوان جایگاه اصلی در نظر گرفت که من آمدم گفتم


case WHEN level = 1
THEN position
ELSE position_parent
END AS masterposition

اگر مرحله 1 باشه که یعنی والد هست، جایگاه اصلی برابر با جایگاه و اگر مرحله به غیر از 1 باشد؛ جایگاه اصلی برابر با جایگاه والد باشه

حالا ما یک ستون داریم که عددی که والد به همراه فرزندانش دارد برابر هست که در این مثال برای سه تای آخری 2 هست

حالا یک کوئری مینویسیم که هر کی مرحله 1 یا 2 هست را اول به تریتب
جایگاه اصلی
دوم به ترتیب مرحله
و سوم به ترتیب جایگاه مرتب کنه که برای مثال بالا ستون زیر وارد میشه

موضوع والد 1، مرحله 1، جایگاه 1، جایگاه والد نال، جایگاه اصلی 1
موضوع والد 2، مرحله 1، جایگاه 2، جایگاه والد نال، جایگاه اصلی 2
موضوع فرزند 1، مرحله 2، جایگاه 1، جایگاه والد 2، جایگاه اصلی 2
موضوع فرزند 2، مرحله 2، جایگاه 2، جایگاه والد 2، جایگاه اصلی 2

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

mohmadd
جمعه 08 مرداد 1389, 02:45 صبح
bestiran دستت درد نکنه روش خوبیه
البته یه سری دستورات mysql میبینم که تا به حال ندیده بودم !(از این بابت تشکر)
چه کتابی برای mysql پیشرفته معرفی میکنی ؟
البته من اون ساختمان درختی که با دو فیلد id,parent معرفی کردم کدش رو یه جایی دیدم !!
منظورم اینه که با دو فیلد هم امکان پذیره که کدش رو فردا مینویسم اینجا میزارم

bestirani2
جمعه 08 مرداد 1389, 07:14 صبح
bestiran دستت درد نکنه روش خوبیه
البته یه سری دستورات mysql میبینم که تا به حال ندیده بودم !(از این بابت تشکر)
چه کتابی برای mysql پیشرفته معرفی میکنی ؟
البته من اون ساختمان درختی که با دو فیلد id,parent معرفی کردم کدش رو یه جایی دیدم !!
منظورم اینه که با دو فیلد هم امکان پذیره که کدش رو فردا مینویسم اینجا میزارم

توی ایران فکر نمیکنم منبع کاملی ازش باشه که به فارسی باشه اگه انگلیسی ات خوبه برو تو سایت خود mysql
این کد امکان این رو میده تا هر چقدر نیاز هست زیر موضوع داشته باشیم که اگه دو فیلد بشه فقط تا یک فرزند میشه داشت

maysam.m
یک شنبه 10 مرداد 1389, 13:09 عصر
يه کلاس موضوع پيدا کردم که چيزهايي که مد نظرم بود را دارا مي باشد و در ضمن اون کارهايي که bestirani2
گفته بود در اين کلاس موجود است!
این کلاس در این تاپیک معرفی شد تا دوستاني که در آينده به اين تاپيک مراجعه مي کنند براشون مفيد باشد.


http://barnamenevis.org/forum/showthread.php?p=1053936