Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39

    [PHP HTML] Creare una Select annidata con caratteri ascii

    Sto cercando di stampare una <SELECT>, con elementi annidati tramite entità html.

    La funzione HTMLOptions() :


    codice:
    <?
    function HTMLOptions($menu, $sel_id ='', $parentid = 0, $depth = 0) 
    {
        $children=array();
        
        foreach ($menu as $item) if ($item["parentid"] == $parentid)
            $children[]=$item;
        
        foreach ($children as $key => $child)
        { 
            if ($depth > 0)
                $symbol = str_repeat('&nbsp',($depth*7)).(($key == (count($children)-1)) ? '└' : '├').'─&nbsp;';
    
    
            $result .= '<option value="'.$child["id"].'" '.($child["id"]==$sel_id ? 'selected':'').'>'.$symbol.$child["title"].'</option>'."\n";
             
            $result.=HTMLOptions($menu, $sel_id, $child["id"], $depth+1); 
        } 
    
    
        return $result ?  $result : null; 
    }
    ?>

    prende in input un array di questo tipo:


    codice:
    <?
    
    MENU_SELECT[]=['id' => ++$id, 'parentid' => 0, 'title' => 'Pagine',    'url' => '.admin/']; 
        $pid_dep_1=$id;
        $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_1, 'title' => 'Contenuti',    'url' => '.admin/?mode=content'];  
    
    
    $MENU_SELECT[]=['id' => ++$id, 'parentid' => 0, 'title' => 'News',    'url' => '.admin/?plugin=news'];  
    
    
    $MENU_SELECT[]=['id' => ++$id, 'parentid' => 0, 'title' => 'Files',    'url' => '.admin/?plugin=files'];
        $pid_dep_1=$id;
        $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_1, 'title' => 'Ftp',    'url' => '.admin/?plugin=files&mode=ftp'];  
    
    
    $MENU_SELECT[]=['id' => ++$id, 'parentid' => 0, 'title' => 'Video',    'url' => '.admin/?plugin=video'];
        $pid_dep_1=$id;
        $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_1, 'title' => 'Assegna',    'url' => '.admin/?plugin=video&mode=sec'];  
        $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_1, 'title' => 'Ftp',    'url' => '.admin/?plugin=video&mode=ftp'];
            $pid_dep_2=$id;
            $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_2, 'title' => 'Ftp 1',    'url' => '.admin/?plugin=video&mode=ftp&sub=1'];
            $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_2, 'title' => 'Ftp 2',    'url' => '.admin/?plugin=video&mode=ftp&sub=2'];
                $pid_dep_3=$id;
                $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_3, 'title' => 'Sub Ftp 2-1',    'url' => '.admin/?plugin=video&mode=ftp&sub=2-1'];
                $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_3, 'title' => 'Sub Ftp 2-2',    'url' => '.admin/?plugin=video&mode=ftp&sub=2-1'];
            $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_2, 'title' => 'Ftp 3',    'url' => '.admin/?plugin=video&mode=ftp&sub=3'];
        $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_1, 'title' => 'Nuovi',    'url' => '.admin/?plugin=video&mode=nuovi'];
    
    
    
    $MENU_SELECT[]=['id' => ++$id, 'parentid' => 0, 'title' => 'Audio',    'url' => '.admin/?plugin=audio'];
        $pid_dep_1=$id;
        $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_1, 'title' => 'Assegna',    'url' => '.admin/?plugin=audio&mode=sec'];  
        $MENU_SELECT[]=['id' => ++$id, 'parentid' => $pid_dep_1, 'title' => 'Ftp',    'url' => '.admin/?plugin=audio&mode=ftp'];
    
    
    $MENU_SELECT[]=['id' => ++$id, 'parentid' => 0, 'title' => 'Info',        'url' => '.admin/?mode=info'];
    
    ?>

    Quindi, chiamando:

    codice:
    HTMLOptions($MENU_SELECT)
    ;


    Viene stampata la lista delle <option>, con una "treeview" pseudo-annidata, usando dei caratteri ascii per simulare la ramificazione.

    Il problema è questo:
    come potete vedere dall' immagine in allegato, la ramificazione non è perfetta. Mancano, infatti, dei "rami" e si formano dei "buchi".. tipo dalla sezione "Video -> Ftp" alla sezione "Video -> Nuovi" (manca il "collegamento" verticale").

    Spero di essere stato chiaro..
    Purtroppo capisco che non sia facile trovare una soluzione. Sicuramente è risolvibile con un espressione matematica, legata alla variabile $depth ...
    Immagini allegate Immagini allegate

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    puoi provare a far così:

    Codice PHP:
    function HTMLOptions($menu$sel_id =''$parentid 0$depth 0
    {
        
    $children=array();
        
        foreach (
    $menu as $item) if ($item["parentid"] == $parentid)
            
    $children[]=$item;
        
        foreach (
    $children as $key => $child)
        { 
            if (
    $depth 0){
                
    $symbol str_repeat('&nbsp',7);
                for(
    $i=0$i $depth 1$i++ ){
                   
    $symbol .= '|'.str_repeat('&nbsp',7); // mettici il simbolo giusto al posto di |
                
    }
                
    $symbol .= (($key == (count($children)-1)) ? '└' '├').'─&nbsp;';
            }


            
    $result .= '<option value="'.$child["id"].'" '.($child["id"]==$sel_id 'selected':'').'>'.$symbol.$child["title"].'</option>'."\n";
             
            
    $result.=HTMLOptions($menu$sel_id$child["id"], $depth+1); 
        } 


        return 
    $result ?  $result null


  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    Grazie dell' aiuto.. non l'ho provato perchè nel frattempo avevo risolto da solo


    Codice PHP:
    function HTMLOptions($menu$sel_id =''$parentid 0$depth 0
    {
        
    $children=array();
        
        foreach (
    $menu as $item) if ($item["parentid"] == $parentid)
            
    $children[]=$item;
        
        foreach (
    $children as $key => $child)
        { 
                
    $symbol =  (str_repeat('&nbsp;&nbsp;│&nbsp;',$depth)).'&nbsp;&nbsp;'.(($key == (count($children)-1)) ? '└' '├').'─';



            
    $result .= '<option value="'.$child["id"].'" '.($child["id"]==$sel_id 'selected':'').'>'.$symbol.$child["title"].'</option>'."\n";
             
            
    $result.=HTMLOptions($menu$sel_id$child["id"], $depth+1); 
        } 


        return 
    $result ?  $result null


    Solo che su quest' editor mi sa che le "entità" che uso per i simboli ascii, vengono automaticamente visualizzate (invece di visualizzare il codice, tipo "│", "└", "├", "─" ...)

    Cmq funziona abbastanza bene.
    Ovviamente è meglio usare un font monospace, quindi:


    codice:
    font-family:"Courier New";

    Allego snapshot.
    Ciao!
    Immagini allegate Immagini allegate
    Ultima modifica di marmz; 23-06-2016 a 14:38

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    UFFAAAAAAA!

    Abbiamo un altro problema, sia NELLA MIA che NELLA TUA soluzione..
    Ho provato ad aggiungere un paio di elementi all' albero. Adesso ci sono dei RAMI IN PIU' !!

    Allego uno snapshot. Notare il collegamento SUPERFLUO tra "Sub Ftp 2-2" e "Ftp 3"
    Immagini allegate Immagini allegate

  5. #5
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Prova così (anche se non sono sicurissimo):

    Codice PHP:
    function HTMLOptions($menu$sel_id =''$parentid 0$depth 0$v = []) 
    {
        
    $children=array();
        
    $result '';
        foreach (
    $menu as $item) if ($item["parentid"] == $parentid)
            
    $children[]=$item;
        
        foreach (
    $children as $key => $child)
        { 
            
    $symbol '';
            if (
    $depth 0){
                
    $symbol str_repeat('&nbsp',7);
                for(
    $i=0$i $depth -1$i++ ){
                  
                    if(
    $v[$i +2] == 1){
                       
    $symbol .= '│'.str_repeat('&nbsp',7); 
                    }else{
                        
    $symbol .= str_repeat('&nbsp',8); 

                    }
                }

                
    $symbol .= (($key == (count($children)-1)) ? '└' '├').'─&nbsp;';
            }

            
    $result .= '<option value="'.$child["id"].'" '.($child["id"]==$sel_id 'selected':'').'>'.$symbol.$child["title"].'</option>'."\n";
            
    $v[$depth +1] = ($key == count($children) - 1) ? ;
            
            
    $result.=HTMLOptions($menu$sel_id$child["id"], $depth+1$v); 
        } 


        return 
    $result ?  $result null


  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2007
    Messaggi
    39
    Ok.. intanto ti ringrazio per lo sbattimento

    Cmq credo di averlo risolto cosi': passo un array ($parent_last), che contiene la lista dei "genitori del "nodo attuale", dove specifico per ognuno se è l' ultimo della sua linea gerarchica (1) oppure no (0).
    In questo modo posso sapere per quali genitori stampare la "lineetta verticale" ...

    E' probabile che si possa semplificare ulteriormente..


    Codice PHP:
    function HTMLOptions($menu$sel_id =''$parentid 0$depth 0$parent_last=null
    {
        
    $children=array();
        
        foreach (
    $menu as $item) if ($item["parentid"] == $parentid)
            
    $children[]=$item;


        
        foreach (
    $children as $key => $child)
        {     
            if (
    $depth>0)
                foreach (
    $parent_last as $is_last)
                    
    $p_branches.=($is_last '&nbsp;&nbsp;&nbsp;&nbsp;' '&nbsp;&nbsp;│&nbsp;' );


            
    $symbol =  $p_branches.'&nbsp;&nbsp;'.(($key == (count($children)-1)) ? '└' '├').'─';


            
    $result .= '<option value="'.$child["id"].'" '.($child["id"]==$sel_id 'selected':'').'>'.$symbol.$child["title"].'</option>'."\n";
            
    $parent_last_new=$parent_last
            
    $parent_last_new[]=(($key == (count($children)-1)) ? 0);
            
            
    $p_branches='';
            
            
    $result.=HTMLOptions($menu$sel_id$child["id"], $depth+1$parent_last_new);
            
            
        } 


        return 
    $result ?  $result null

    Appena posso testo anche la tua

    Allego snapshot ... sperando che sia l' ultimo ...
    LOL
    Immagini allegate Immagini allegate

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 © 2025 vBulletin Solutions, Inc. All rights reserved.