Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 37

Discussione: Menù Recursivo....

  1. #1

    Menù Recursivo....

    Di solito entro in questo forum per aiutare qualcuno ora sono io che ho bisogno di aiuto prima che sclero

    Allora ho una pagina header con all'interno:

    Codice PHP:
    <?php
    $recuperoMenu 
    $contenuto->ListaMenu();
    $contenuto->stampaMenu($recuperoMenu 0);
    ?>
    Fin qui nulla di eccezionale non faccio altro che chiamare la classe contenuto è richiamare prima la funzione ListaMenu e poi la funzione stampaMenu

    nella classe ho questo:

    Codice PHP:
    <?php
      
    class Contenuto
      
    {
         ..... 
    costruttori ecc...

        public function 
    ListaMenu()
          {
              global 
    $database$system;
              
    $query $database->query("SELECT *"
              
    "\n FROM menu " 
              
    "\n WHERE attivo = '1'"
              
    "\n ORDER BY parent_id, posizione");

              while (
    $row $db->fetch($query)) {
                  
    $listaMenu[$row['id']] = array(
                        
    'id' => $row['id'],
                        
    'nome'.$system->lingua=> $row['nome'.$system->lingua], 
                        
    'parent_id' => $row['parent_id'],
                        
    'page_id' => $row['page_id'],
                        
    'mod_id' => $row['mod_id'],
                        
    'tipo_contenuto' => $row['tipo_contenuto'],
                        
    'link' => $row['link'],
                        
    'pagina_principale' => $row['pagina_principale'],
                        
    'attivo ' => $row['active'],
                        
    'target' => $row['attivo '],
                        
    'icona' => $row['icona'],
                        
    'seo' => $row['seo'],
                  );
                  
              }
              return 
    $menulist;
          }
               public function 
    stampaMenu($array$parent_id 0)
          {
                   global 
    $system;
                         
    ///qui devo inserire la funzione recursiva delle pagine....
         

              
    }


          }
    La prima funzione mi ritrovo e le query le stampa correttamente... adesso il mio problema e il seguente devo strutturare con una funzione recursiva il seguente menù


    Codice PHP:
     <ul class="menu">
         <
    li class="active">
                [
    url="#"]<span>Home</span>[/url]
                   <
    div><ul>
                    [*]
    [
    url="./index2.html"]<span>Pagina 1</span>[/url]
     <
    div><ul>[*][url="#"]<span>Pagina 10</span>[/url][/list]</div>

                    [*][
    url="./index3.html"]<span>Pagina 2</span>[/url]
                    [*][
    url="./index4.html"]<span>Pagina 3</span>[/url]
                    [*][
    url="./index5.html"]<span>Pagina 4</span>[/url]
                    [*][
    url="./index6.html"]<span>Pagina 5</span>[/url]
                    [/list]</
    div>
                
                 [*][
    url="#"]<span>Pagina7 </span>[/url]
            [*][
    url="#"]<span>Pagina 8</span>[/url][/list] 
    Come posso fare a sviluppare questa pagina in modo recursivo sto seriamente impazzendo....
    Dimenticavo senza utilizzo di jquery mi serve in puro php e css....
    Grazie
    Marko

  2. #2
    Rieccomi,
    credo di aver risolto il mio problema o quasi
    ho solo un problema di stampa errato ma non capisco dove ho sbagliato ho incollato di seguito la classe la struttura del database il risultato finale del print.. è il risultato come dovrebbe essere...
    mi aiutateeeeeeeeeee
    Classe php
    Codice PHP:
    <?php

    class MenuBuilder {

        var 
    $conn;
        var 
    $db;
        var 
    $items = array();
        var 
    $html = array();

        function 
    MenuBuilder() {
            global 
    $db$core;
            
    // var_dump($db);
            
    $this->conn mysql_connect($this->db['server'], $this->db['user'], $this->db['pass']);
            
    mysql_select_db($this->db['database'], $this->conn);
        }

        function 
    get_menu_items() {
            global 
    $db$core;
            
    $sql "SELECT id, parent_id, page_id, page_slug, mod_id, name$core->dblang, slug, content_type, link, target, icon, position, home_page, active FROM menus WHERE menus.active = 1 ORDER BY parent_id, position";
            return 
    $db->fetch_assoc_all($sql);
        }

        function 
    get_menu_html($root_id 0) {
            global 
    $db$core$content;
            
    $this->html = array();
            
    $this->items $this->get_menu_items();

            foreach (
    $this->items as $item)
                
    $children[$item['parent_id']][] = $item;

            
    $loop = !empty($children[$root_id]);

           
            
    $parent $root_id;
            
    $parent_stack = array();
            
    //
            
    $this->html[] = '<ul class="menu">';

            while (
    $loop && ( ( $option each($children[$parent]) ) || ( $parent $root_id ) )) {  
                if (
    $option === false) {
                    
    $parent array_pop($parent_stack);
         
                    
    $this->html[] = str_repeat("\t", ( count($parent_stack) + ) * 2) . '[/list]';
                    
    $this->html[] = str_repeat("\t", ( count($parent_stack) + ) * 1) . '';
                } elseif (!empty(
    $children[$option['value']['id']])) {

                    
    $tab str_repeat("\t", ( count($parent_stack) + ) * 1);

     
                    
    $this->html[] = sprintf(
                            
    '%1$s[*][url="%2$s"]%3$s[/url]'$tab
                            
    $option['value']['slug'], //
                            
    $option['value']['name_en']
                    );
                    
    $this->html[] = $tab "\t" '<ul class="submenu">';

                    
    array_push($parent_stack$option['value']['parent_id']);
                    
    $parent $option['value']['id'];
                }
                else
                    
    $url = ($core->seo == 1) ? $core->site_url '/' sanitize($option['value']['page_slug'], 50) . '.html' $url $core->site_url '/content.php?pagename=' sanitize($option['value']['page_slug'], 50);
                
    $this->html[] = sprintf(
                        
    '%1$s[*][url="%2$s"]%3$s[/url]'str_repeat("\t", ( count($parent_stack) + ) * 1), // %1$s = tabulation
                        
    $url
                        
    $option['value']['name_en']  
                );
            }

            
    $this->html[] = '[/list]';

            return 
    implode("\r\n"$this->html);
        }

    }

    $menu = new MenuBuilder();
    echo 
    '<pre>' htmlentities($menu->get_menu_html()) . '</pŕe>';
    ?>
    struttura sql
    Codice PHP:
    CREATE TABLE IF NOT EXISTS `menus` (
      `
    idint(11NOT NULL AUTO_INCREMENT,
      `
    parent_idint(11unsigned NOT NULL DEFAULT '0',
      `
    page_idint(11NOT NULL DEFAULT '0',
      `
    page_slugvarchar(50NOT NULL,
      `
    mod_idint(6NOT NULL DEFAULT '0',
      `
    name_envarchar(100NOT NULL,
      `
    slugvarchar(100NOT NULL,
      `
    content_typevarchar(20NOT NULL,
      `
    linkvarchar(255) DEFAULT NULL,
      `
    targetenum('_self','_blank'NOT NULL DEFAULT '_blank',
      `
    iconvarchar(50) DEFAULT NULL,
      `
    positionint(11NOT NULL DEFAULT '0',
      `
    home_pagetinyint(1NOT NULL DEFAULT '0',
      `
    activetinyint(1NOT NULL DEFAULT '0',
      
    PRIMARY KEY (`id`),
      
    KEY `content_id` (`active`),
      
    KEY `parent_id` (`parent_id`)
    ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=25 ;

    INSERT INTO `menus` (`id`, `parent_id`, `page_id`, `page_slug`, `mod_id`, `name_en`, `slug`, `content_type`, `link`, `target`, `icon`, `position`, `home_page`, `active`) VALUES
    (201'Home'0'Home''Home''page'NULL''''111),
    (
    3015'Product'0'Product''Product''page'NULL''''601),
    (
    708'Company'0'Company''Company''page'NULL''''201),
    (
    23316'Team'0'Team''Team''page'NULL''''701),
    (
    20717'Careers'0'Careers''Careers''page'NULL''''401),
    (
    21715'About-us'0'About us''About-us''page'NULL''''301),
    (
    242018'Testimonial'0'Testimonial''Testimonial''page'NULL''''501); 
    risultato della classe
    Codice PHP:
    <ul class="menu">
        [*][
    url="#"]Home[/url]
        [*][
    url="Company"]Company[/url]
            <
    ul class="submenu">
                [*][
    url="#"]Company[/url]
                [*][
    url="#"]About us[/url]
                [*][
    url="Careers"]Careers[/url]
                    <
    ul class="submenu">
                        [*][
    url="#"]Careers[/url]
                        [*][
    url="#"]Testimonial[/url]
                    [/list]
                
            [/list]
        
        [*][
    url="Product"]Product[/url]
            <
    ul class="submenu">
                [*][
    url="#"]Product[/url]
                [*][
    url="#"]Team[/url]
            [/list]
        [/list] 
    Risultato che dovrebbe uscire...
    Codice PHP:
    <ul class="menu">
        [*][
    url="#"]Home[/url]
        [*][
    url="Company"]Company[/url]
            <
    ul class="submenu">
            [*][
    url="#"]About us[/url]
                [*][
    url="Careers"]Careers[/url]
                    <
    ul class="submenu">
                        [*][
    url="#"]Testimonial[/url]
                    [/list]
                
            [/list]
        
        [*][
    url="Product"]Product[/url]
            <
    ul class="submenu">
                [*][
    url="#"]Team[/url]
            [/list]
        [/list] 
    Dove sbaglio ((

  3. #3

  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    eccomi .... cacchio ... cacchio che bordello...

    fossi in ter partirei da 0 ...

    1- la struttura da dove estrai i dati .
    2- le procedure (divide et impera!)


    quindi la tabella dove estri e' ricorsiva ?

  5. #5
    Originariamente inviato da Virus_101
    eccomi .... cacchio ... cacchio che bordello...

    fossi in ter partirei da 0 ...

    1- la struttura da dove estrai i dati .
    2- le procedure (divide et impera!)


    quindi la tabella dove estri e' ricorsiva ?
    Non usa nulla di recursivo se non il loop ... il problema e solo che mi stampa i dati doppi...

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    allora se ti servono procedure ricorsive e' peche' ahi dati in formato alberale che vanno stampati o gestiti ...

    ad esempio un xml etc....

    i dati del menu da dove arrivano ?

  7. #7
    Allora la classe sopra postata non fa altro che recuperare i dati da sql
    codice:
     $sql = "SELECT id, parent_id, page_id, page_slug, mod_id, name$core->dblang, slug, content_type, link, target, icon, position, home_page, active FROM menus WHERE menus.active = 1 ORDER BY parent_id, position";
    Una volta recuperati faccio i loop.. e recupero quello che mi serve ma nn capisco xche mi stampi due volte i valori e me li metta inserisca come submenu

    se guardi ho postato tutto il codice
    classe
    sql
    inserimento
    risposta della classe
    risposta come mi serve

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    troppo coice da controllare ... ci metto troppo.

    cmq si hai una tabella ricorsiva. id_parent lo testimonia

    allora la procedura

    codice:
    - se ho dati 
    
    - carica tutti i dati con id_parent vuoto a 0 o quello che sia (come identifichi il ftto che una riga e' appunto radice.
    
    - scorri iterativamente tutte le righe 
       - apri il tag
       - carica tutte le righe con id_parent == id
       - avvia ricorsione passando i dati estratti
       - concatena risultato
       - chiudi il tag
    Ad ogni ricorsione puoi passare a che livello sei arrivato incrementandolo di 1 ad ogni chiamata cosi' potrai gestire tale dato.

  9. #9
    Ma infatti e recursiva la tabella non la procedura della classe... :|

    ma come hai descritto in realtà è quello che ho fatto
    non capisco perchè mi inserisce stringhe sbagliate
    sto sclerando da oggi alle 11
    se hai tempo di controllare ti dico grazie mi sono bloccato su sto passaggio maledetto..

  10. #10
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    umpf .... non vedo la chiamata ricorsiva a me pare una funzione iterativa...
    non ricorsiva...

    tu carichi tutti i menu poi esegui una distinzione tra parent e children senza sperare i dati dalla struttura pincvipale.
    dovresti fare 2 buffers 1 con i parent e 1 con i children.
    Inoltre questa procedura si ferma al secondo livello di profondità in quanto non presenti le chiamate a se' stessa.

    crea 2 nuovi metodo ... cosi' per testare

    1- toHtml()
    2- getMenu( $data , $level )

    il metodo toHtml()
    - carica i dati where id_parent==0
    - converte il ris in array e passa l'array a getMenu( $roots , 0 ) ;

    ol metodo getMenu($data,$level)
    SE DATA != ARRAY() ==> CASO BASE => return "" ;

    apre ul

    scorre l'array $data

    per ogni riga : esegue query di estrazione figli (come dicevo sopra where parent_id==$id)

    converte le righe in array e richiama getMenu( $figli , ++$level )

    concatena risultato

    chiudi ul

    ritorna stringa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.