代码之家  ›  专栏  ›  技术社区  ›  dkinzer

如何让Drupal将AHAH行为添加到通过AHAH返回的表单元素中?

  •  2
  • dkinzer  · 技术社区  · 14 年前

    所以我要做的是:

        $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',),
        );
    

    2action函数返回并用新元素替换上面的元素:

    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);
    
    }
    

    AJAX 启用。

    我需要做什么来生成新返回的元素 AHAH

    1 回复  |  直到 14 年前
        1
  •  2
  •   dkinzer    14 年前

    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',
        ),
        );
      }
    

    2action函数检查窗体的值,并返回元素的切换值:

    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);
    
    }
    

    三。客户端的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这对我很有用:)