2010-11-05 3 views
0

Ma question principale est:fonction du module Drupal thématisation avec ahah

Est-ce que la fonction theme_hook() est appelée chaque fois que le formulaire est reconstruit par ahah (ahah_helper)?

J'essaie de montrer une boîte de sélection, avec quelques options de filtrage, quand l'utilisateur la change, le tableau ci-dessous change aussi.

Je cela maintenant:

function veiculos_listar_form($form_state) 
{ 
    $form = array(); 
    ahah_helper_register($form, $form_state); 

    //biulds $options 

    $form['listar_veics'] = array(
     '#type' => 'fieldset', 
     '#prefix' => '<div id="listar-veics-wrapper">', 
     '#suffix' => '</div>', 
     '#tree' => TRUE, 
     ); 


    if (!isset($form_state['values']['listar_veics']['filial'])) 
     $form['#filial_veic'] = 1; 
    else 
     $form['#filial_veic'] = $form_state['values']['listar_veics']['filial']; 

    $form['listar_veics']['filial'] = array(
     '#type' => 'select', 
     '#title' => "Listar veículos da filial", 
     '#options' => $filiais, 
     '#default_value' => $form['#filial_veic'], 
     '#ahah' => array(
      'event'  => 'change', 
      'path'  => ahah_helper_path(array('listar_veics')), 
      'wrapper' => 'listar-veics-wrapper', 
      'method' => 'replace', 
      ), 
    ); 


    return $form; 
} 

function veiculos_listar_form_submit($form, &$form_state) 
{ 

} 


function _listar_veiculos_tabela($filial) 
{ 
    //builds $header and $data 

    $table = theme_table($header, $data); 
    return $table; 
} 


function theme_veiculos_listar_form($form) 
{ 
    $output = drupal_render($form); 
    $filial = $form['#filial_veic']; 
    $output .= '<br>' . $filial . '<br>'; 
    $output .= _listar_veiculos_tabela($filial); 
    return $output; 
} 

function veiculos_theme() { 
    return array(
     'veiculos_listar_form' => array(
      'arguments' => array('form' => NULL),), 
    ); 
} 

Dans mon petit monde et innocent, il devrait fonctionner si theme_hook est appelé à chaque événement ahah (changement).

Le problème est, la variable imprimée est toujours la même, comme ce que l'utilisateur choisit n'est pas stocké. Si l'utilisateur sélectionne une option différente, il affiche la nouvelle option, mais la variable $ filial est toujours la même lorsque le thème est imprimé.

Comme ceci:

http://img230.imageshack.us/img230/9646/62144334.jpg

Toute suggestion sur ce que je pouvais faire pour faire ce travail? Je suis en train de développer notre propre module, donc utiliser le module de vues n'est pas une bonne idée.

Merci.

Répondre

1

Vous devriez refaire le code de cette façon. Ahah callback Je n'ai pas écrit, je pense que vous n'auriez pas de problème avec ça. Vérifiez quelques exemples sur drupal.org

function veiculos_listar_form($form_state) 
{ 
    $form = array(); 
    ahah_helper_register($form, $form_state); 

    //biulds $options 

// remove divs because we do not want to reload selector with ahah 
    $form['listar_veics'] = array(
     '#type' => 'fieldset', 
     '#tree' => TRUE, 
    ); 


    if (!isset($form_state['values']['listar_veics']['filial'])) 
     $form['#filial_veic'] = 1; 
    else 
     $form['#filial_veic'] = $form_state['values']['listar_veics']['filial']; 

    // add cover div here, because we will reload table 
    $form['table'] = array(
     '#prefix' => '<div id="listar-veics-wrapper">', 
     '#suffix' => '</div>', 
     '#type' => 'markup', 
     '#value' => _listar_veiculos_tabela($form['#filial_veic']), 
    ); 

    $form['listar_veics']['filial'] = array(
     '#type' => 'select', 
     '#title' => "Listar veículos da filial", 
     '#options' => $filiais, 
     '#default_value' => $form['#filial_veic'], 
     '#ahah' => array(
      'event'  => 'change', 
      'path'  => ahah_helper_path(array('listar_veics')), 
      'wrapper' => 'listar-veics-wrapper', 
      'method' => 'replace', 
      ), 
    ); 


    return $form; 
} 

function veiculos_listar_form_submit($form, &$form_state) 
{ 

} 


function _listar_veiculos_tabela($filial) 
{ 
    //builds $header and $data 

    $table = theme_table($header, $data); 
    return $table; 
} 


function theme_veiculos_listar_form($form) 
{ 
    $output = drupal_render($form); 
    return $output; 
} 

function veiculos_theme() { 
    return array(
     'veiculos_listar_form' => array(
      'arguments' => array('form' => NULL),), 
    ); 
} 
+0

Ceci a presque réussi. Si je fais exactement ce que vous avez dit, la page rend deux sélections. Ce que je devais faire est de mettre ce div sur le fieldset, le retirer de la table, comme avant, et en insérant la table et l'insert dans ce fieldset. Si elle n'était pas définie comme ceci, deux sélections seraient rendues, et la table ne réagirait à aucun des sélections. Maintenant ça va. Je n'ai pas réalisé que l'API des formulaires avait ce type de balisage, son AWESOME. Gona a mis cela comme la bonne réponse, mais il a besoin d'un peu d'édition. Merci: D – hfingler

+0

vous êtes les bienvenus :) –

Questions connexes