2010-09-01 23 views
2

所以這裏就是我想要做的事:如何讓Drupal將AHAH行爲添加到通過AHAH返回的表單元素?

1.創建並呈現以下表單元素:

$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.動作函數返回,並用替代上面的元素新元件:

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.結果,舊的按鈕由上面的一個代替,但是新按鈕不是AJAX啓用。

我需要做什麼才能使新的返回元素AHAH準備好?

回答

2

那麼,我無法準確地確定如何使文件做到上述。但我確實想到了一個解決方法(在我的情況下,涉及在客戶端提交元素對象的兩個不同值之間切換,以便AHAH行爲不會丟失)。在服務器端我只檢查的不同的值,並根據結果採取行動:

1.定義用不同的值依賴於條件

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.動作功能的元件檢查該形式是什麼樣的價值,併爲元素返回觸發值:

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中的JavaScript本功能在客戶端離子改變元素的值,但對象保持其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.這對我的作品:)

隨意添加上述如果解決方案你可以弄清楚。