2010-09-01 22 views
2

Alors, voici ce que je suis en train de faire:Comment obtenir que Drupal ajoute un comportement AHAH à un élément de formulaire renvoyé via AHAH?

1. Je crée et rendre l'élément de formulaire suivant:

$form['rb_download_' . $doc_id] = array(
     '#type' => 'submit', 
     '#name' => 'doc_' . $doc_id, 
     '#prefix' => "<div id='rb_doc_order_{$doc_id}'>", 
     '#suffix' => '</div>', 
     '#value' =>variable_get('rb_order_button', "buyOnline"), 
     '#ahah' => array(
     'event' => 'click', 
     'path' => "rb/case/doc_order_js/$case->nid/$doc_id", 
     'wrapper' => "rb_doc_order_{$doc_id}", 
     'effect' => 'fade',), 
    ); 

2. La fonction retourne d'action et remplace l'élément ci-dessus avec un nouvel élément:

function rb_case_doc_order_js($case, $doc_id) { 

    $button['rb_download_' . $doc_id] = array(

     '#type'   => 'submit', 
     '#name'   => 'doc_' . $doc_id, 
     '#prefix'  => "<div id='rb_doc_order_{$doc_id}'>", 
     '#suffix'  => '</div>', 
     '#value'  => variable_get('rb_order_confirm', "Remove from cart"), 
    //'#attributes' => array('class' => 'ahah-processed'), 
     '#ahah'   => array(

      'event'  => 'click', 
      'path'  => "rb/case/doc_unorder_js/$case->nid/$doc_id", 
      'wrapper' => "rb_doc_order_{$doc_id}", 
      'effect'  => 'fade',), 

); 

    $output .= drupal_render($button); 
    $output .= "<script type='text/javascript'>\n"; 
    $output .= "cart_block_item_count($count);\n"; 
    $output .= "Drupal.ahah;\n"; 
    $output .= "</script>\n"; 

    print drupal_json($output); 

} 

3. les résultats sont que l'ancien bouton est remplacé par celui ci-dessus, mais le le nouveau bouton n'est pas AJAX activé.

Que dois-je faire pour que le nouvel élément retourné AHAH soit prêt?

Répondre

2

Eh bien, je ne pouvais pas comprendre exactement comment faire le fichier faire ce qui précède. Mais j'ai trouvé une solution de contournement (qui consiste dans mon cas à basculer entre deux valeurs différentes de l'objet d'élément submit du côté client afin que son comportement AHAH ne soit pas perdu). Du côté du serveur, je vérifie juste pour les différentes valeurs et d'agir en fonction des résultats:

1. Définir l'élément avec une valeur différente à une condition

if (empty($rb_item) ||($rb_item['node_checkout_nid'] != $node_checkout_nid)) { 
    //if (true) { 
    $form['rb_download_' . $doc_id] = array(
     '#type' => 'submit', 
     '#name' => 'doc_' . $doc_id, 
     '#prefix' => "<div id='rb_doc_download_{$doc_id}'>", 
     '#suffix' => '</div>', 
     '#value' => variable_get('rb_doc_download_button', "buyOnline"), 
     '#ahah' => array(
     'event' => 'click', 
     'path' => "rb/case/doc_download_js/$case->nid/$doc_id", 
     'wrapper' => "rb_doc_download_{$doc_id}", 
     'effect' => 'none', 
     'method' => 'append', 
    ), 
    ); 
    unset($_SESSION['rb_case']['rb_dowload_' . $doc_id]); 
    } 
    else { 
    $form['rb_download_' . $doc_id] = array(
     '#type' => 'submit', 
     '#name' => 'doc_' . $doc_id, 
     '#prefix' => "<div id='rb_doc_download_{$doc_id}'>", 
     '#suffix' => '</div>', 
     '#value' => variable_get('rb_return_button', "Remove from cart"), 
     '#ahah' => array(
     'event' => 'click', 
     'path' => "rb/case/doc_download_js/$case->nid/$doc_id", 
     'wrapper' => "rb_doc_download_{$doc_id}", 
     'effect' => 'none', 
     'method' => 'append', 
    ), 
    ); 
    } 

2. La fonction d'action vérifie quelle valeur est la forme et renvoie une valeur de bascule pour l'élément:

function rb_case_doc_download_js($case, $doc_id) { 

    //Add code that will change how the form elements are rendered here ... 

    //Now get form with possible new values and send toggle value back to the javascript on client side. 

    $form_state = array('storage' => NULL, 'submitted' => FALSE); 
    $form_build_id = $_POST['form_build_id']; 
    $form = form_get_cache($form_build_id, $form_state); 

    $args = $form['#parameters']; 
    $form_id = array_shift($args); 
    $form_state['post'] = $form['#post'] = $_POST; 
    $form['#programmed'] = $form['#redirect'] = FALSE; 

    //Toggle the form element value between <<Add to Cart>> and <<Remove from Cart>> 
    $toggle_on = variable_get('rb_doc_download_button', "buyOnline"); 
    $toggle_off = variable_get('rb_return_button', "Remove from cart"); 
    if ($form['rb_download_' . $doc_id]['#value'] == $toggle_on) { 
    $toggle = $toggle_off; 
    $form['rb_download_' . $doc_id]['#value'] = $toggle; 
    } 
    else { 
    $toggle = $toggle_on; 
    $form['rb_download_' . $doc_id]['#value'] = $toggle; 
    } 

    drupal_process_form($form_id, $form, $form_state); 
    $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id); 

    $output .= "<script type='text/javascript'>\n"; 
    $output .= "cart_block_item_count($count);\n"; 
    $output .= "rb_button_toggle('rb_doc_download_{$doc_id}', '$toggle');\n"; 
    $output .= "</script>\n"; 

    print drupal_json($output); 

} 

3. le fonct JavaScript ion du côté client modifie la valeur de l'élément, mais l'objet conserve son comportement AJAX:

/** 
    * Change the button name 
    */ 
    function rb_button_toggle(target, name) { 
    alert(target); 
    alert(name); 
    if (target && name) { 
     $(':submit', document.getElementById(target)).attr('value', name); 
    } 
    } 

4. Et qui fonctionne pour moi :)

Ne hésitez pas à ajouter la solution ci-dessus si vous pouvez comprendre cela.