PHP और mysql के माध्यम से मेनू के असीमित स्तर को कैसे बनाया जाए




menu (6)

इसके लिए आपको रिकर्सिव फ़ंक्शन का उपयोग करना होगा। तकनीकी तौर पर, ऐसा करने के कुछ तरीके हैं, लेकिन पुनर्कथन वास्तव में सबसे अच्छा विकल्प है

यहां बताया गया है कि यह कैसे काम करेगा:

function drawMenu ($listOfItems) {
    echo "<ul>";
    foreach ($listOfItems as $item) {
        echo "<li>" . $item->name;
        if ($item->hasChildren()) {
            drawMenu($item->getChildren()); // here is the recursion
        }
        echo "</li>";
    }
    echo "</ul>";
}

$item की संपत्तियां और विधियां सिर्फ उदाहरण हैं, और मैं इन्हें आपको लागू करने के लिए इसे लागू करने के लिए छोड़ दूँगा, लेकिन मुझे लगता है कि यह संदेश पूरे भर में आता है।

खैर, मेरे मेनू का मेन्यू बनाने के लिए मैं इस तरह से एक डीबी संरचना का उपयोग करता हूं

  2  Services                  0
  3  Photo Gallery             0
  4  Home                      0
  5  Feedback                  0
  6  FAQs                      0
  7  News & Events             0
  8  Testimonials              0
 81  FACN                      0
 83  Organisation Structure   81
 84  Constitution             81
 85  Council                  81
 86  IFAWPCA                  81
 87  Services                 81
 88  Publications             81

मौजूदा सबमेनू के लिए एक अन्य उपमेनू प्रदान करने के लिए मैं अपने माता पिता के आईडी को मूल फ़ील्ड के मान के रूप में निर्दिष्ट करता हूं। माता पिता 0 का मतलब शीर्ष मेनू है

अब एक अन्य सबमेनू में सबमेनू बनाते समय समस्या नहीं है

अब यह तरीका है कि मैं शीर्ष मेनू के लिए सबमेनू ले आता हूं

<ul class="topmenu">
    <? $list = $obj -> childmenu($parentid); 
        //this list contains the array of submenu under $parendid
        foreach($list as $menu) {
            extract($menu);
            echo '<li><a href="#">'.$name.'</a></li>';
        }
    ?>
</ul>

मैं क्या करना चाहता हूं

मैं यह जानना चाहता हूं कि कोई नया मेनू दूसरे बाल मेनू है या नहीं

और मैं जब तक यह उपलब्ध हर बच्चे मेनू को खोजता है, तब तक जांच करना जारी रखना चाहता हूं

और मैं इस तरह अपने विशेष सूची आइटम के अंदर अपने बाल मेनू प्रदर्शित करना चाहता हूँ

<ul>       
       <li><a href="#">Home</a>
        <ul class="submenu">
           ........ <!-- Its sub menu -->
           </ul>
       </li>
</ul>

मैं एक पुनरावर्ती समारोह का उपयोग करेगा

मैं जानता हूँ कि यह आपके कोड की तरह बिल्कुल नहीं है, लेकिन मुझे लगता है कि यदि आप पुनरावर्तन को समझते हैं तो आप सामान्य अवधारणा प्राप्त कर सकते हैं। अगर आपको रिकर्सन समझ में नहीं आता है http://en.wikipedia.org/wiki/Recursion_(computer_science)

$list = new List();

function print_menu($list) {

    echo '<ul>';
    foreach($list as $item) {
        echo '<li><a href="#">' . $item->name . '</a>';
        if($item->has_child) {
            print_menu($item);
        }
        echo '</li>';
    }
    echo '</ul>';
}

वैकल्पिक पाठ http://i.imagehost.org/0934/product_hier.jpg http://pastie.org/969286

drop table if exists product;

create table product
(
prod_id smallint unsigned not null auto_increment primary key,
name varchar(255) not null,
parent_id smallint unsigned null,
key (parent_id)
)engine = innodb;


insert into product (name, parent_id) values
('Products',null), 
   ('Systems & Bundles',1), 
   ('Components',1), 
      ('Processors',3), 
      ('Motherboards',3), 
        ('AMD',5), 
        ('Intel',5), 
           ('Intel LGA1366',7);


delimiter ;

drop procedure if exists product_hier;

delimiter #

create procedure product_hier
(
in p_prod_id smallint unsigned
)
begin

declare v_done tinyint unsigned default 0;
declare v_depth smallint unsigned default 0;

create temporary table hier(
 parent_id smallint unsigned, 
 prod_id smallint unsigned, 
 depth smallint unsigned default 0
)engine = memory;

insert into hier select parent_id, prod_id, v_depth from product where prod_id = p_prod_id;

/* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */

create temporary table tmp engine=memory select * from hier;

while not v_done do

    if exists( select 1 from product p inner join hier on p.parent_id = hier.prod_id and hier.depth = v_depth) then

        insert into hier 
            select p.parent_id, p.prod_id,  v_depth + 1 from product p 
            inner join tmp on p.parent_id = tmp.prod_id and tmp.depth = v_depth;

        set v_depth = v_depth + 1;          

        truncate table tmp;
        insert into tmp select * from hier where depth = v_depth;

    else
        set v_done = 1;
    end if;

end while;

select 
 p.prod_id,
 p.name as prod_name,
 b.prod_id as parent_prod_id,
 b.name as parent_prod_name,
 hier.depth
from 
 hier
inner join product p on hier.prod_id = p.prod_id
inner join product b on hier.parent_id = b.prod_id
order by
 hier.depth, hier.prod_id;

drop temporary table if exists hier;
drop temporary table if exists tmp;

end #

delimiter ;


call product_hier(3);

call product_hier(5);

तुम्हारी तरह एक डेटाबेस संरचना के साथ, एक एकल प्रश्न के साथ पूरे HTML मेनू का निर्माण करना संभव है और बिना पुनरावर्ती

हां - मैं दोहराता हूं:

  • एक प्रश्न
  • कोई पुनरावृत्ति नहीं

यह दृष्टिकोण मैं हमेशा अपने आप का उपयोग करता हूं

यहां कोड चिपकाया - पूरी तरह कार्यात्मक:

http://pastebin.com/GAFvSew4

दिलचस्प हिस्सा देखने के लिए पंक्ति 67 पर जाएं ("get_menu_html")

मुख्य लूप लाइन 85 पर शुरू होता है

पांच "अनुकूलन" HTML स्निपेट हैं:

  1. मेनू आवरण खोलने (लाइन 83)
  2. मेनू आवरण समापन (रेखा 122)
  3. बच्चों के खोलने के साथ मेनू आइटम (लाइन 100)
  4. मुलायम समापन के साथ मेनू आइटम (पंक्ति 92)
  5. बिना बच्चे के मेनू आइटम (पंक्ति 113)

(कोड को क्लीनर हो सकता है अगर मुझे टेबुल्यूशन से कोई परेशानी नहीं हुई ।)

एसक्यूएल स्क्रिप्ट के अंत में उपलब्ध नमूना डेटाबेस बनाने और पॉप्युलेट करता है।

आप कोशिश कर सकते हैं और हमें अपने विचारों को बताएं।


http://pastebin.com/ariBn3pE

आपको रिकर्सन का उपयोग करने की आवश्यकता है, लेकिन मेरा दृष्टिकोण अलग है, मैंने प्रत्येक मेनू को अलग-अलग संभाल करने के लिए एक वर्ग बनाया है, फिर परिणाम के लिए पूछताछ किया है और प्रत्येक तत्व के समूह में उनके माता-पिता के अनुसार, प्रत्येक स्तर के अनुसार, और फिर सभी वस्तुओं एक में ... पूर्ण कोड के लिए पेस्टबिन को चेक करें


मैंने इस तरह से पाया, वाई फ़्रेमवर्क के साथ काम करना

$children = array();

foreach($model as $k => $item){
    if(empty($item->cn_id_menu_padre))
        $children[$item->cn_id] = $item->attributes;
    else
        $children[$item->cn_id_menu_padre]['hijos'][] = $item->attributes;
}

foreach($children as $k=>$child){
    if(array_key_exists('hijos',$child))
    {
        echo 'li y dentro ul<br>';
        foreach($child['hijos'] as $hijo){
            echo 'li<br>';
        }
    }
    else
        echo 'li<br>';
}

अगर आपको एक और स्तर की आवश्यकता है, तो आप बच्चों के hijos_de_hijos को दूसरे स्तर पर बना सकते हैं जैसे कि hijos_de_hijos और तुलना करें तो अगर hijos_de_hijos

ओह, ज़ाहिर है, तुलना करने के लिए अगर cn_id_menu_padre खाली है, डेटाबेस में मान null होना चाहिए।





menu