Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    $Smarty -> Section Nidificate (in numero variabile)

    Salve a tutti!!! Ho un gratta capo che non riesco a risolvere!!

    Sto utilizzando Smarty e ho un array multidimensionale che contiene la struttura di categorie e sottocategorie del sito a cui sto lavorando .... vi faccio un esempio (var_dump dell'array) ...

    codice:
    array(2) {
      [0]=>
      array(4) {
        ["id"]=>
        string(1) "2"
        ["nome"]=>
        string(17) "Prima Categoria di Test"
        [0]=>
        array(3) {
          ["id"]=>
          string(1) "4"
          ["nome"]=>
          string(32) "Prima Sotto Categoria di Test"
          [0]=>
          array(2) {
            ["id"]=>
            string(1) "5"
            ["nome"]=>
            string(11) "Prima Sotto Sotto Categoria di Test"
          }
        }
        [1]=>
        array(2) {
          ["id"]=>
          string(1) "6"
          ["nome"]=>
          string(13) "Seconda Sotto Categoria di Test"
        }
      }
      [1]=>
      array(2) {
        ["id"]=>
        string(1) "3"
        ["nome"]=>
        string(25) "Seconda Categoria di Test"
      }
    }
    semplificando:

    codice:
    Prima Categoria di Test
    -> Prima Sotto Categoria di Test
         -> Prima Sotto Sotto Categoria di Test
    -> Seconda Sotto Categoria di Test
    Seconda categoria di Test
    il numero degli elementi innestati è variabile, poichè la struttura di categorie è modificabile dal cliente tramite la sua interfaccia di amministrazione ... ora vorrei mostrarle in una tabella ... ho provato con tutto ... section o foreach nidificati .. ma niente ... non riesco .... qualcuno ha un idea??? di seguito in codice usato ...

    poichè il numero è variabile avevo pensato di includere un file esterno, che richiamasse se stesso il numero di volte necessario a mostrare i vari sottolivelli ....

    codice:
    {foreach from=$elementi item=elemento name=i}      
      
    <div>
    {$elemento.nome}
        	{foreach from=$elemento item=elemento_interno}
            	
                 <div> -> {include file="sottocategorie.tpl"}</div>
    
            {/foreach}
    </div>
        
    {foreachelse}
            Nessuna Categoria presente.
    {/foreach}
    e il file sottocategorie.tpl

    codice:
     
    {$elemento_interno.nome}
        	
        	{foreach from=$elemento_interno item=elemento_interno}
            	
                 <div> -> {include file="sottocategorie.tpl"} </div>
    
            {/foreach}

    Ho semplificato il codice mettendo i div invece delle tabelle ... per renderlo più leggibile,ma il succo è lo stesso .... chi mi da una mano????

    Grazie Mike

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    se sai quanti sono i possibili livelli di nidificazione, puoi creare N foreach (uno per ogni livello).

    L'indice dell'array che conserva le categorie figlie dovrà avere un nome che tu conosci, in modo che nel foreach nidificato accederai ad esempio in questo modo:

    codice:
    {foreach item=figli from=$elemento.figli}
    Pur essendo un fanatico di smarty, in questo caso io preferirei generare l'html direttamente da php, perchè se hai un numero di nidificazioni virtualmente infinito, il modo migliore è usare una funzione ricorsiva, che richiama se stessa reperendo i figli dell'id che passi, finchè l'id che passi non ha figli.

    spero di essere riuscito a spiegarmi bene. Ciao

  3. #3
    Credo di aver capito!!!

    io ho questa funzione lato php

    codice:
    function &cicla_cat($id,&$cat_sup) {
    	
    			$sql_cat=mysql_query('SELECT * FROM '.$GLOBALS['db_pref'].'categorie_produzione WHERE categoria_superiore="'.$id.'" ORDER BY categoria_pos;');
    			
    			echo mysql_error();
    			
    			if (mysql_num_rows($sql_cat)>0) {
    						
    					$k=0;
    					while ($fetch_cat=mysql_fetch_assoc($sql_cat)) {
    						$cat_sup[$k]['id']=$fetch_cat['categoria_id'];
    						$cat_sup[$k]['nome']=$fetch_cat['categoria_nome'];
    						
    						cicla_cat($fetch_cat['categoria_id'],$cat_sup[$k]);
    						
    						$k++;
    					}
    				}
    			
    	
    }
    che crea il famoso array di cui sopra .. allora adesso per ogni livello faccio un count dei figli in modo tale che a smarty passo il numero di volte che deve ciclare ... provo e ti faccio sapere

    Grazie mille Mike

  4. #4

    arghhhh

    Non ci sono ancora!!!

    la funzione php che genera l'array ora modificata è questa:

    codice:
    function &cicla_cat($id,&$cat_sup) {
    	
    $sql_cat=mysql_query('SELECT * FROM '.$GLOBALS['db_pref'].'categorie_produzione WHERE categoria_superiore="'.$id.'" ORDER BY categoria_pos;');
    			
    			$num_cat=mysql_num_rows($sql_cat);
    			$cat_sup['numero_figli']=$num_cat;
    			
    			if ($num_cat>0) {
    						
    					$k=0;
    					while ($fetch_cat=mysql_fetch_assoc($sql_cat)) {
    						
    						$cat_sup[$k]['ciclo']=$k;
    						$cat_sup[$k]['id']=$fetch_cat['categoria_id'];
    						$cat_sup[$k]['nome']=$fetch_cat['categoria_nome'];
    						
    						cicla_cat($fetch_cat['categoria_id'],$cat_sup[$k]);
    						
    						$k++;
    					}
    				}
    			
    	
    }
    questa la chiamata alla funzione ....

    codice:
    $elementi=array();
    $elementi['ciclo']=0;
    cicla_cat(0,$elementi);
    nella variabile ciclo di ogni livello c'è l'indice stesso di quel livello ... il primo l'ho inizializzato a 0.

    ora nel codice del tpl ho messo

    codice:
    {foreach item=elemento from=$elementi}   
      
    <div>
    {$elemento.nome}
    		
        	{foreach item=figli from=$elemento.ciclo}
         
                 <div> -> {include file="categorie_produzione/sottocategorie.tpl"}</div>
    
            {/foreach}
    </div>
        
    {foreachelse}
            Nessuna Categoria presente.
    {/foreach}

    e nel sottocategire.tpl

    codice:
    {$figli.nome}
    
        	{foreach item=figli from=$figli.ciclo}
            	
                 <div> -> {include file="categorie_produzione/sottocategorie.tpl"}</div>
    
            {/foreach}
    ma ottengo un ciclo infinito :S .....

    arghhhhh

    dove sbaglio? denkiu

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.