PDA

View Full Version : سوال: موقعیت منو [PDO]



almas1
دوشنبه 17 فروردین 1394, 04:24 صبح
سلام دوستان


menus table:
menuid
menu_parent_id
menu_iscollection
menu_posi
menu_title
menu_link
menu_ordering

settings table:
setid

settings_menus table (table map with two fields):
setid
menuid

بر طبق مقدار متغیر $setid از جدول ستینگ، کوئری برای گرفتن آی دی منوهایی که متعلق به این ستینگ هستند رو از جدول نقشه انجام میدم.


$SettingsCurrentID = $row['setid'];

/* query for get maps menus for current settings by SettingsCurrentID */
$sql = "SELECT setid,menuid FROM settings_menus WHERE setid = ?";
$stmt = $conn->prepare($sql);
if (!$stmt) {
throw new Exception (implode(' ',$conn->errorInfo()),0);
}
function maps_settings_menus($stmt,$mom){
global $conn;
$res = $stmt->execute(array($mom));
if(!$res) {
throw new Exception( implode(' ',$stmt->errorInfo()),1);
}
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
$nextMom = $row['menuid'];
echo $mom.'->'.$nextMom.'<br />';
}
}
maps_settings_menus($stmt,$SettingsCurrentID);

حالا آی دی منوها رو دارم، البته باید به صورت آرایه درشون بیارم
حالا مجموعه منوها باید بر اساس والد و فرزند از دیتابیس واکشی بشن
Recursive menu:



$menuHtml='';
function createMenu($parentId,$menuposi){
global $menuHtml;
global $nextMom;
global $conn;
$query = $conn->prepare('SELECT * FROM menus WHERE menu_parent_id = ? AND menu_posi = ?');
$query->bindParam(1, $parentId, PDO::PARAM_INT);
$query->bindParam(2, $menuposi, PDO::PARAM_STR);
$query->execute();
#$result = $query->fetch(PDO::FETCH_OBJ);
$rowCount = $query->rowCount();
if ($rowCount == 0) return;
if ($parentId == 0)
$menuHtml.="<ul id=\"menu\">\r\n";
else
$menuHtml.='<ul>';
while($row = $query->fetch(PDO::FETCH_OBJ))
{
$menuHtml.='<li><a href="'.$row->menuid.'">'.$row->menu_title.'</a>';
createMenu($row->menuid);
$menuHtml.='</li>';
}
$menuHtml.='</ul>';
return $menuHtml;
}


اما نمی‌دونم چطور این دو مرحله رو با هم ترکیب کنم
1) گرفتن منوهای تنظیم جاری
2) پرینت مجموعه منوها در موقعیت‌های مختلف بر حسب ترتیبشون
با تشکر

almas1
دوشنبه 17 فروردین 1394, 12:35 عصر
سلام
کسی از دوستان نظری نداره؟

130064

almas1
سه شنبه 18 فروردین 1394, 14:58 عصر
^^^^^^^^^^

id1385
سه شنبه 18 فروردین 1394, 16:57 عصر
یه نمونه رو ببین :

function list_all_categories($print = false) {
$CATEGORIES = '<li><a href="/">خانه</a></li>';
$top_level = array(
'exclude' => '1',
'orderby' => 'id',
'order' => 'asc',
'hide_empty' => 0,
'use_desc_for_title' => 0,
'title_li' => '',
'current_category' => 1,
'hierarchical' => 1,
'show_option_none' => 'بدون دسته بندی',
'pad_counts' => 0,
'optioncount' => 0,
'parent' => 0
);


foreach (get_categories($top_level) as $category) {
$haveChild = have_child($category->term_id, $category->taxonomy);
$cls = ($haveChild ? 'sub' : '');
$arrow = ($haveChild ? '<span class="arrow"></span>' : '');
$end = (!$haveChild ? '</li>' : '');
$sub = ($haveChild ? 'subitem' : '');

$LINK = manageLinks($category->term_id);
$CATEGORIES .= '<li class="' . $cls . '">' . $arrow . '<a href="' . $LINK . '" class="'. $sub.'">' . $category->name . '</a>'.$end;
if ($haveChild) {
$CATEGORIES .= '<ul class="submenu">';
$CATEGORIES .= get_childs($category->term_id);
$CATEGORIES .= '</ul></li>';
}
$CATEGORIES .= '</li>';
}


if ($print) {
echo $CATEGORIES;
} else {
return $CATEGORIES;
}
}


از اینکه چندتا تیبل درست کردی هدفتو متوجه نشدم
ولی بهتره همه رو توی یه تیبل بریزی و اگر نوع خاصی هستن مثل setting و public یا غیره، یه فیلد بزاری مثل iscollection که گذاشتی و مشخص کنی این نوعش چیه

روش کار:
یه سری از منوها toplevel هستن یعنی خودشون والدن و یه سری هم child هستن یعنی زیر مجموعه اون والدها و به نوبه خود می تونن والد هم باشن یعنی زیر مجموعه هایی هم داشته باشن و این تا n ادامه داره

1:
شما تاپ لولها رو اول فیلتر کن و سلکت کن، مثلاً بگو

select * from TBL where parentid = -1 AND isactive= 1 orderby id desc ...

وقتی اینو انجام دادی خروجی یک آرایه بهت میده البته در فایلت یک متغیر تعریف کن به کارت میاد مثل

global $myMenuItems

میدونی که global ها داخل فانکشنها هم دسترسی بهشون داریم مثل:

<?php
global $myMenuItems;


function s(){
global $myMenuItems;
$myMenuItems = "sample";

}


s();


echo $myMenuItems;


2:
حالا با foreach یا while یا for ... تک تک خونه های آرایه رو بخون و بعد از خوندن هرخونه آیدیش دسته چک میکینی فرزند داره یا نه ...

3:
یه فانکشن بنویس با هر اسمی که میخوای برای خوندن فرزندان یک والد که آیدی والد رو بگیری
حالا که آیدی والد رو داری این خودش مثل تاپ لول هستش اینم خودش یک تاپ لول هستش اینو می فرستی به اون متغیر منو مثل

$myMenuItems.= "<li>sample</li>";

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

حالا تو این جستجوها میتونی فیلترهای مختلف رو تنظیم کنی مثلاً یه بار پابلیکها رو سرچ کنی و بعد اگه خواستی یه نوع دیگه رو سرچ کنی و دوتا آرایه رو ترکیب کنی و اکو کنی
و حتی موقعی که داری منوها رو اعم از والد و فرزند رو که داری از دیتابیس میخونی توی اون لوپ، بجای اینکه منوهاتو html بدی به myMenuItems بصورت یه آرایه جدید بدی البته با کلید تا بتونی حتی جایگاهشون رو تنظیم کنی


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


موفق باشید

almas1
چهارشنبه 19 فروردین 1394, 14:08 عصر
ممنون بابت پاسخت
شاید من بد گفتم
تیبل ستینگ نوع خاصی از منو نیست
تیبل ستینگ اشاره به سایت کامل داره، فرض کنید یک سایت‌ساز
بعد هر ستینگی منوهای خودش رو داره که تیبل «منو» و تیبل «نقشه بین سایت‌ها و منوها» هم برای این طراحی شدن.