PDA

View Full Version : سوال: روش ساخت منو های کشوی از اصلاعات دیتابیس



<body>
دوشنبه 10 فروردین 1388, 01:32 صبح
سلام دوستان عزیز
میشه لطفی و این مشکل من رو حل بفرمایید.

من دو دسته در دیتا بیس دارم گروه و مطالب داخل هر گروه

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

مثال

[کامپیوتر]
|
--- [نرم افزار]
| |
| {شاپ}
| {کت}
|
---[سخت افزار]

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

واقعا ممنون میشم اگه کمکی کنید:لبخندساده:


یا حق

hamid67fathi
دوشنبه 10 فروردین 1388, 09:13 صبح
سلام
شما بايد از 2 تا حلقه تو در تو استفاده کنيد .
حلقه اول برای خواندن عناوين و
حلقه دوم وری خواندن مطالب آنها.

<body>
دوشنبه 10 فروردین 1388, 09:28 صبح
ممنون
دوست عزیز میشه بیشتر توضیح بدین شرمنده :چشمک:

hamid67fathi
دوشنبه 10 فروردین 1388, 11:46 صبح
اين كد ها رو جايگزين كنيد احتمالا نتيجه مورد نظر حاصل ميشه

$result = mysql_query("SELECT * FROM cat order BY id ASC");
while($r=mysql_fetch_array($result))
{
$cn=$r["name"];
$ci=$r["id"];
echo "<li>$cn</li>";

$result2 = mysql_query("SELECT * FROM pro WHERE cat LIKE $ci order BY id ASC");
while($r2=mysql_fetch_array($result2))
{
$pn=$r2["name"];
$pi=$r2["id"];
echo "<ul>$pn</ul>";
}
}

<body>
دوشنبه 10 فروردین 1388, 13:00 عصر
جواب نمیده شرمنده من یادم رفت این رو بگم که به صورت echo نمیتونم نتیجه بگیرم چون همه اطلاعات در متغییر نمایش داده میشه و اگه از echo استفاده کنم همه چی بهم میریزه :افسرده:


<?php

$result = mysql_query("SELECT * FROM cat order BY id ASC");
while($r=mysql_fetch_array($result))
{
$cn=$r["name"];
$ci=$r["id"];
$cl = "$cl <li><a href='#'>$cn</a>";

$result2 = mysql_query("SELECT * FROM pro WHERE cat LIKE $ci order BY id ASC");
while($r2=mysql_fetch_array($result2))
{
$pn=$r2["name"];
$pi=$r2["id"];
$cl = "$cl <li><a href='#'>$cn</a>
<ul style='position: absolute; right: 199px; top: 0px' align='right'><li><a title='x1' href='#1'>$pn</a></li></ul></li>";
}
}
$menu = "<ul>$cl</ul>";

?>

<body>
سه شنبه 11 فروردین 1388, 09:21 صبح
دوستان پیشنهادی ندارید ؟

hamid67fathi
سه شنبه 11 فروردین 1388, 09:55 صبح
اصولاً نبايد مشکلی داشته باشه !
در جمع کردن رشته اصلی به صورت زير عمل کن شايد جواب داد :

$c1 = $c1. "رشته جديد ";

<body>
سه شنبه 11 فروردین 1388, 10:23 صبح
آقا من روش قبلی شما رو به این صورت اجرا کردم ولی مشکلی که هست اینه مثلا اگه چند مطلب در یک شاخه دارم فقط یکی از آنها را نشان میده . :متفکر: واسه چی

echo "<div class='menu-pos' dir='rtl' style='width: 100%; text-align: right'>
<ul id='navmenu' style='padding: 0 0 0 0'>
<li><a href='#'>test</a>
<ul>";
$result = mysql_query("SELECT * FROM cat order BY id ASC");
while($r=mysql_fetch_array($result))
{
$cn=$r["name"];
$ci=$r["id"];
echo "<li><a href='#'>$cn</a>";

$result2 = mysql_query("SELECT * FROM pro WHERE cat LIKE $ci order BY id ASC");
while($r2=mysql_fetch_array($result2))
{
$pn=$r2["name"];
$pi=$r2["id"];
echo "<ul style='position: absolute; right: 199px; top: 0px' align='right'><li><a title='x1' href='#1'>$pn</a></li></ul>";
}
}
echo "</li></ul></li></div>";

hamid67fathi
سه شنبه 11 فروردین 1388, 11:05 صبح
cat بايد از نوع اينتيجر بايد باشه که ميدونيد و بهتره بجای like از = استفاده کنيد.
ولی بازم نبايد مشکلی باشه !!
بهتره همه چيز رو از اول مرور کنيد اگه حل نشد بهتره جدول رو برام بفرستيد .

zoghal
سه شنبه 11 فروردین 1388, 15:53 عصر
اگر اصول طراحی تیبل تون رو به روش درختی ایجاد کرده باشید.
منظور از درختی این هست که شما یک والد در بالا هست حالا هرچی فرزند بهش اضافه میشه شناسه پدر خودش رو نگه میداره
مثال:

1: منوی اصلی
--2: نرم افزار
----4: گرافیک
----5: آنتی ویروس
--3: سورس کد
----6:سی
----7: پی اچ پی

حالا ساختار تیبل اینطوری میشه



catid : catname : maincatid

insert into table value('1','منوی اصلی','0');
insert into table value('2','نرم افزار','1');
insert into table value('3','سورس کد','1');
insert into table value('4','گرافیک','2');
insert into table value('5','آنتی ویروس','2');
insert into table value('6','سی','3');
insert into table value('7','پی اچ پی','3');



اگر ساختارتون اینگونه باشه(باید باشه فکر نکنم از این راحت تر راهی باشه)

نیاز به یک تابع برگشتی دارید
[
founction tree($root =0,$level = 0)
{
$res = mysql_query("select * from table where maincatid='$root' ");
while ($row = mysql_fetch_object($res )) {
echo $row->$level." -> ".$row->catname."<br>";
tree($row->catid,$level+1);
}
}
[/PHP]

معذرت یک مقدار حول حولکی شد

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

اما روش دیگر بسیار حرفه و بسیار سرعت بالایی داره که میتونی با یک کوئری کل درخت رو داشته باشی

اسم این روش هست hierarchical tree

این هم یک مثال معتبر
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
درضمن در سایت phpclasses.org کلاس های خوبی رو میتونی پیدا کنید

<body>
چهارشنبه 12 فروردین 1388, 11:22 صبح
دوستان از شما ممنونم

ولی مشکل من در دیتابیس یا فراخوانی اطلاعات نیست مشکل من روش صحیح قرار دادن <li> , <ul> , </ul> , </li> در چرخه فراخوان است از آنجایی که میدونید اگه من این کد را به این صورت
<li><a href='#'>$cn</a>استفاده کنم انتهای li من باز مانده و قابل استفاده میباشد و تا اینجا من هیچ مشکلی ندارم مشکل من در بخش زیرگروه آن است که مجبورم به این صورت عمل کنم

<ul style='position: absolute; right: 199px; top: 0px' align='right'><li><a title='x1' href='#1'>$pn</a></li></ul>حال به دلیل استفاده کردن از <li></ul/> در انتهای دستور ، دستور من را میبنده و اجازه نمیده تا اطلاعات بعدی من که به صورت چرخه ای کوچک باید نمایش داده بشه ، بسته میشه و این مشکل پیش میاد که من فقط یکی از مطالب خود را در گروه مربوطه مشاهده میکنم

انشالله که منظور خود را رسانده باشم

بازم از لطفه شما تشکر میکنم :خجالت:

zoghal
چهارشنبه 12 فروردین 1388, 11:44 صبح
من خیلی وقت پیش این رو واسه کاری نوشتم بهینه نیست اما شاید الگو خوبی باشه

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


function ShowSubCatForMenuCat($id = 0)
{
$q = "SELECT
cat_id, cat_subcat, cat_name,cat_sort,cat_filename
FROM
cat
ORDER BY
cat_subcat, cat_sort DESC";

$CatData = array('NameCat' => array(), 'ParentID' => array());
$result = mysql_query($q);

while ($row = mysql_fetch_assoc($result)) {
$CatData['NameCat'][$row['cat_id']] = $row;
$CatData['ParentID'][$row['cat_subcat']][] = $row['cat_id'];
}
if ($id == 0)
ScanCategoryLevelForMenuCat($CatData, $id);
else
ScanCategoryLevelForMenuCat($CatData, $id, 1);

}



و این تابه به همون صورتی که منظورتون هست نمایش میده



function ScanCategoryLevelForMenuCat($Cat, $parentId = 0, $dep = 0)
{
if (isset($Cat['ParentID'][$parentId])) {
foreach ($Cat['ParentID'][$parentId] as $itemId) {
$link = "/category/" . $Cat['NameCat'][$itemId]['cat_filename'] . ".html";
if ($dep == 0)
$link = "#";
?>
<a href="<? echo $link ?>" <? if ($dep == 0)
echo 'onclick="ShowSubCat(this)" ' ?> class="MenuCatL<? echo
$dep + 1 ?>">
<? echo $Cat['NameCat'][$itemId]['cat_name'];
if ($dep != 0)
echo '<span id="CountOfTotalProInCat"> [ ' . TotalProInCat($itemId) . ' ] </span>';
?> </a><br />
<?
// find childitems recursively
if ($dep == 0)
echo "<div id=\"SubCatHide\">";
ScanCategoryLevelForMenuCat($Cat, $itemId, $dep + 1);

if ($dep == 0)
echo "</div>";
}
}
return $html;
}


البته من با div پیاده سازی کردم

<body>
جمعه 14 فروردین 1388, 13:19 عصر
سلام آقا شرمنده من که گرخیجه گرفتم :گیج:
آقا فایلهای ما در ضمیمه قرار داره میشه چک کنی که مشکل ما از چیه

در گروه Test 3 دو بخش به نام های Test 3-1 و Test 3-2 قرار داره که فقط Test 3-1 رو نمایش میده و خبری از Test 3-2 نیست:متفکر:

میشه چک کنید و اشکال من رو رفع کنید .
ممنون

zoghal
جمعه 14 فروردین 1388, 13:37 عصر
این چیزی که شما دادین اصلا مولتی لول یا مولتی کت نیست



1: منوی اصلی
--2: نرم افزار
----4: گرافیک
----5: آنتی ویروس
--3: سورس کد
----6:سی
----7: پی اچ پی

چیزی که شما اتچ گردید به این صورت هست



1: منوی اصلی
2: نرم افزار
3: گرافیک
4: آنتی ویروس
5: سورس کد
6:سی
7: پی اچ پی

<body>
جمعه 14 فروردین 1388, 16:10 عصر
حالا این چیزی که من دادم رفع اشکال نمیشه ؟

zoghal
جمعه 14 فروردین 1388, 16:58 عصر
خوب این که خیلی ساده هست


echo "<ul>"
start loop
echo "<li>.....</li>
end loop
echo "</ul>"

cybercoder
جمعه 14 فروردین 1388, 19:56 عصر
برای نمایش به صورت کشویی می تونید از udm4 هم استفاده کنید که جالبه

<body>
جمعه 14 فروردین 1388, 20:08 عصر
دوست عزیز این اونی نیست که من میخوام
من این روش رو میخوام




1. echo "<ul>"
2. start loop
3. echo "<li>....."
4. echo "<ul><li>.....</li></ul></li>"
5. end loop
6. echo "</ul>"



اگه شما لطف کنید و ضمیمه من رو نصب کنید متوجه منظور من میشید.
تا اونجایی که میدونم در انتهای خط 4 نباید <li></ul></li> اونجا باشند تا تکرار اسکریپت انجام بشه ولی هرجا غییر از اینجا باشه اسکریپت بهم میخوره

<body>
یک شنبه 16 فروردین 1388, 12:02 عصر
دوستان میتونید در این مورد به من کمک کنید ؟

zoghal
یک شنبه 16 فروردین 1388, 13:03 عصر
من یک سوال دارم از شما
سیستم شما به این صورت هست
-منو 1
- - منو2
- - - منو3
- منو4
- -منو 5
- - - منو 6
یا به این صورت هست

منو1
-منو 2
- - - منو 3
- - - - منو 4

<body>
یک شنبه 16 فروردین 1388, 18:04 عصر
من یک سوال دارم از شما
سیستم شما به این صورت هست
-منو 1
- - منو2
- - - منو3
- منو4
- -منو 5
- - - منو 6
یا به این صورت هست

منو1
-منو 2
- - - منو 3
- - - - منو 4

متاسفانه متوجه نشدم

منوی من اینجوریه

·منو1


1.1
1.2
1.3

1.3.1


1.4

1.4.1


1.5

1.5.1
1.5.2



·منو2


2.1
2.2

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

zoghal
یک شنبه 16 فروردین 1388, 22:52 عصر
دوست من نمی تونم بیشتر از این توضیح بدم شما اونچه که ضمیمه کردید رابطه ای با این نداره
واستون نوع طراحی دیتابیس اینگونه منوهای آبشاری رو توزیح دادم گه برگشتید گفتید من مشکلی با .... ندارم

این مثال خودتون رو ببینید

·منو1


1.1
1.2
1.3

1.3.1

میتونم بپرسم تو اون فایل که ضمیمه کردید و در تیبل cat شما ساختار و رابطه منو 1.3 و 1.3.1 رو برقرار کردید؟ مگر غیر از این هست که 1.3.1 زیر مجموعه 1.3 قرار میگیرید. لطفا دقت کنید