ساخت منو و زیر منو با اطلاعات داینامیک دیتابیس با PHP

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

ابتدا می بایست دیتابیس منو را با فیلدهای زیر ساخت :

id | title | link | parent

با دستور زیر می توانید جدول را بسازید .

منوی فرزند یا زیر منوی هر منو در قسمت parent آیدی پدر یا منوی مادر را خواهد داشت ، به عبارتی دیگر منوی مادر در parent  عدد صفر خواهد داشت و زیر منوی این مادر در قسمت parent خود آیدی مادر را دارا می باشد ، به این صورت می توان جایگاه هر منویی را شناخت .

فرض کنید تعدادی رکورد بصورت زیر ساخته شده اند و در دیتابیس قرار گرفته اند  :

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

تابع تولید کننده ی منو را بصورت زیر می نویسیم :

function display_children($parent, $level) {
$result = mysql_query("SELECT a.id, a.label, a.link, Deriv1.Count FROM `menu` a LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" . $parent);
echo "<ul>";
while ($row = mysql_fetch_assoc($result)) {
if ($row['Count'] > 0) {
echo "<li><a href='" . $row['link'] . "'>" . $row['label'] . "</a>";
display_children($row['id'], $level + 1);
echo "</li>";
} elseif ($row['Count']==0) {
echo "<li><a href='" . $row['link'] . "'>" . $row['label'] . "</a></li>";
} else;
}
echo "</ul>";
}

این تابع اطلاعات را از دیتابیس menu دریافت کرده و برای هر منویی تکرار می شود به این صورت که اگر منو دارای مادر باشد ، دوباره از خود تابع استفاده کرده تا اطلاعات مادر را بصورت سلسله  مراتبی پیدا کند و در نهایتا در تگ های لیست این اطلاعات را چاپ می کند .

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

استفاده تابع در خود تابع باعث ایجاد یک حلقه با  تعداد دفعات نامعلوم می شود که تنها وقتی به منوهای اصلی با مادر صفر می رسند این حلقه متوقف می شود . با این روش می توان به تمامی زیر منوهایی که تعداد  و Level آنها را نمی دانیم دست پیدا کنیم .

توجه داشته باشید در صورتی که این تابع را در یک کلاس معرفی می کنید تابع را در بین خود تابع درست فراخوانی کنید (با this) تا خطا ایجاد نشود  .

 

آپدیت :  دانلود سورس  

 

 

 


23 پاسخ به “ساخت منو و زیر منو با اطلاعات داینامیک دیتابیس با PHP”

  1. سید داوود فامرینی گفت:

    سلام شما که زحمت کشیدی خب فایل پروژه رو هم به حالت فشرده می زاشتی برای دانلود خوب می شد. مثل نمونه های خارجی که همشون در آخر پروژه رو زیپ شده گذاشتن برای دانلود.

    بازم ممنون از آموزشهای خوبت

  2. rezvan گفت:

    سلام
    اين منو را مي شود افقي و فارسي کرد؟

    • ببینید اینجا فقط برنامه نویسی ایجاد کد اچ تی ام ال از دیتابیس گفته شده ، شما باید با CSS استایل افقی یا هر حالتی که میخواهید را به آن بدهید . در گوگل جستجو کنید Css menu

  3. علیرضا گفت:

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

  4. بابک گفت:

    با سلام
    این موضوع که شما آموزش دادی بسیار کاربردی بود اما از آن مهمتر اینه که شما بتونی منو رو بصورت پویا مدیریت کنی یعنی لینک مورد تظر هر کدام از این لینک ها هوشمند به صفحه خاصی اشاره کنه که ما با کد سویچ ساختیم یا هر راهی که به ذهن شما میرسه تا یک منو هم زیبا و هم با کارایی بالا داشته باشیم

    • دوست عزیز دقایقا موضوع همینه ، منو با استفاده از اطلاعات دیتابیس بصورت اتوماتیک ساخته میشه و کافیه اطلاعات هر ردیف دیتابیس اعم از نام یا لینک یا منوی مادر تغییر کنه و اینور منو هم تغییر میکنه بدون تغییر در کد . (دومین عکس که نشان دهنده ی جدول دیتابیس هست رو مشاهده کنید )اصلا ویژگی بارز این منو اینه که دینامیک هستش وگرنه استاتیکش که اصلا برنامه نویسی نیست .

  5. amir گفت:

    آقا واقعا دستت درد نکنه
    خیلی عالی بود
    ممنون

  6. فاطمه گفت:

    سلام
    من از یه کد مشابه همین برای ساخت منوهام استفاده کردم درست کار میکنه ولی حالا که میخوام بهش استایل بدم و افقیش کنم و یه کم ظاهرش مناسب شه، هر کار میکنم روش اعمال نمیشه و یا ناقص اعمال میشه! مثلا آخری افقیش کرد ولی زیرمنوها رو نشون نمیده!!
    جدا خسته شدم انواع استایل ها و جی کوئری ها و … که برای ظاهر منو هستن رو از اینترنت گرفتم استفاده کردم، درست اعمال نمیشه. حتی spry menu خود دریم ویوور رو هم امتحان کردم نشد که نشد!
    باور کنید تمام پروژم الان لنگ همین منو ـه
    خواهش میکنم بگید چیکار کنم؟؟؟؟؟؟؟؟؟؟؟

  7. معراج گفت:

    با سلام
    مطلب عالی بود و تشکر میکنم .
    ولی نمیشه یه فایل استایلم براش قرار بدید حتی همین لینک اخری که دادی دیدم و فایل استایل چک کردم ولی مشکل داره و درست نمیشه .

    شرمنده خواهش میکنم یک فایل استایل براش بذارید .

    بازم ممنونم

  8. معراج گفت:

    بالاخره درستش کردم ولی اگر پروژه هارو کامل قرار بدین خیلی بهتره .
    متاسفانه تو هر سایت ایرانی میرم میبینم پروزه هارو نیمه کاره قرار میدن .

    سایت مفید دارید که واقعا خوشم اومد .

    باز هم از شما ممنونم خیلی مطلب مفیدی بود امیدوارم همیشه موفق باشید .

  9. سلام . ممنون از آموزش بسیار مناسبتون. دوست عزیز یک سوال و اون اینکه زمانی که از عبارات فارسی تو دیتابیس استفاده می کنیم ، تمامی مقادیر رو یونیکد شده نمایش میده.چرا؟

  10. بسیار عالی و مفید. ممنون از شما

  11. مرتضی گفت:

    سلام مهندس خسته نباشید

    من با توابع داخلی Mysql آشنایی ندارم .

    آیا منبعی هست که بتونم این جور توابع مثل Deriv1 که اینجا استفاده کردید رو یاد بگیرم و یا مثال هایی در این باب باشه که بتونم کار کنم باهاشون و رو این مسائل مسلط بشم ؟

  12. آرش گفت:

    سلام مهندس
    میدونم که این مطلب شما برای گذشته می باشد
    ولی اگر امکانش هست لطفاً لینک سورس را اصلاح بفرمایید

  13. عطیه گفت:

    منظور از driv1.count چیست؟
    driv1 متغیره؟

  14. Amir گفت:

    لینگ خراب شده ! لطفا برسی کنید ممنون

  15. mahgole گفت:

    سلام ممنون از سایتتون

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

  16. ایمان گفت:

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

  17. xxxx گفت:

    سلام.

    لینک خراب هست…

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *