2010-03-04 5 views
0

Comment créer une balise select/option html à partir des données find ('threaded') dans CakePHP? trouver la fonction() résultats de retour comme celui-ci:Comment créer une balise select/options à partir de find ('threaded') dans CakePHP

Array 

( [0] => array ( [Forum] => array ( [id] => 1 [nom] => Forum

  ) 

     [children] => Array 
      (
       [0] => Array 
        (
         [Forum] => Array 
          (
           [id] => 3 
           [name] => Programowanie 
           [parent_id] => 1 
          ) 
        ) 

       [1] => Array 
        (
         [Thread] => Array 
          (
           [id] => 11 
           [name] => Nowe forumowisko 
           [parent_id] => 1 
          ) 
        ) 
      ) 
    ) 

[1] => Array 
    (
     [Forum] => Array 
      (
       [id] => 4 
       [name] => Nauka 
       [parent_id] => 0 
      ) 

     [children] => Array 
      (
      ) 
    ) 
) 

Comment?

Répondre

0

Que sont les "enfants"? on dirait que votre arbre est donné naissance à travers un-à-plusieurs relations

Il n'est pas nécessaire d'utiliser le comportement Arbre pour utiliser cette méthode - mais tous les résultats souhaités doivent pouvoir être trouvés dans une seule requête.

1

Voici ce qui a fonctionné pour moi.

Assurez-vous de remplacer:

  • {SELECT_ID} avec la valeur de la liste déroulante
  • {SELECT_LABEL} avec ce qui est affiché comme option
  • {MODEL_NAME} avec votre nom de modèle
 
/** 
* Returns an indented html select based on children depth 
* 
* @param array $data_array - Array of data passed in from cake's find('threaded') feature 
* @param array $list - Used internally, contains array to be returned 
* @param int $counter - Used Internally, counter for depth 
* @return array 
*/ 
public function drop_down_from_threaded($data_array, &$list = array(), $counter = 0) 
{ 
    if (! is_array($data_array)) 
     return array(); 

    foreach ($data_array AS $data) 
    { 
     $list[$data[{SELECT_ID}]] = str_repeat('  ', $counter).$data[{SELECT_LABEL}]; 
     if (! empty($data['children'])) 
     { 
      $this->drop_down_from_threaded($data['children'], $list, $counter + 1); 
     } 
    } 
    return $list; 
} 

/** 
* Get the data from the find('threaded') and pass it to our new function 
*/ 

$results = $this->{MODEL_NAME}->find('threaded'); 
$results = $this->drop_down_from_threaded($results); 

Cela peut ne pas fonctionner à 100% pour tout le monde, ça marche pour moi, mais il faut aider à vous donner quelque chose pour commencer.

2

grâce DSkinner, très instructif .. i ont modifié pour être plus générique:

/** 
* Returns an indented html select based on children depth 
* 
* @param array $data_array - Array of data passed in from cake's find('threaded') feature 
* @param array $model - the model name 
* @param array $key - the key field on the model 
* @param array $value - the value field on the model 
* @param array $list - Used internally, contains array to be returned 
* @param int $counter - Used Internally, counter for depth 
* @return array 
*/ 
public function threaded_to_list($data_array, $model=null, $key='id', $value='name', 
&$list = array(), $counter = 0, $separator='__') 
{ 
    if (! is_array($data_array)) 
     return array(); 

    foreach ($data_array AS $data) 
    { 
     $list[$data[$model][$key]] = str_repeat($separator, $counter).$data[$model][$value]; 
     if (! empty($data['children'])) 
     { 
      $this->threaded_to_list($data['children'], $model, $key, $value, $list, $counter + 1); 
     } 
    } 
    return $list; 
} 
4

il y a une accumulation de méthode pour arbre comme les résultats à effectuer dans une liste pour sélectionner les balises d'options:

$this->Model->generateTreeList($conditions, null, null, ' - ', $recursive); 

au lieu d'utiliser find (thread)

qui est si vous attaché le comportement Arbre à ce (que vous devriez probablement puisque c'est évidemment un arbre comme modèle). Mais si vous voulez conserver votre méthode find (threaded), vous devez la transformer manuellement par méthode récursive.

Questions connexes