2011-12-21 56 views
1

我想要做的是:我想渲染一個頁面上的窗體與視圖。這個視圖有一個「註釋」(= CT注)列表。當你填寫表格時,記錄被存儲,表格被清除,新的記錄被添加到列表中。全部沒有頁面刷新。drupal ajax表格

我創建模塊new_note,並就將此此功能:

function new_note_form($nodeid = NULL) { 
     ctools_include('ajax'); 
     // drupal_add_js(drupal_get_path('module', 'custom_forms') . '/js/note_form.js'); 
     //dpm($nodeid); 
     module_load_include('inc', 'node', 'node.pages'); 
     $form = node_add('note'); 
     $form['field_note_reference']['und']['#value'] = '2'; 
     $form['field_note_reference']['und']['#validated'] = 'TRUE'; 
     $form['field_note_reference']['#attributes']['class'][] = "hidden"; 
     $form['submit'] = array(
      '#type' => 'submit', 
      '#value' => 'Submit', 
      '#executes_submit_callback' => FALSE, 
      '#ajax' => array(
       'callback' => 'ajax_note', 
       'wrapper' => 'status', 
      ), 
     ); 
    $output= drupal_render($form); 
     dpm($form); 
     print $output; 
    } 

function ajax_note(&$form, &$form_state) { 
    return 'test'; 
} 

我在顯示套件塊字段,它在音符列表上方呈現使用此功能。到現在爲止還挺好。

唯一的問題是,當我提交表單,阿賈克斯不叫,和正常提交完成。

有人能幫我嗎

@編輯。

克萊夫建議是什麼後,我改變了代碼,並得到了阿賈克斯的工作。

function new_notes_form($nodeid = NULL) { 
    global $user; 

    $node = (object) array(
       'uid' => $user->uid, 
       'name' => (isset($user->name) ? $user->name : ''), 
       'type' => 'note', 
       'language' => LANGUAGE_NONE, 
    ); 
    $form_state = array(); 
    $form_state['build_info']['args'] = array($node); 
    form_load_include($form_state, 'inc', 'node', 'node.pages'); 
    $form = drupal_build_form('note_node_form', $form_state); 
    $form['field_note_reference']['und']['#value'] = '2'; 
    $form['field_note_reference']['#attributes']['class'][] = "hidden"; 
    $form['submit'] = array(
     '#type' => 'button', 
     '#value' => 'Submit', 
     '#limit_validation_errors' => array(), 
     '#ajax' => array(
      'callback' => 'ajax_note_replace', 
      'wrapper' => 'status', 
     ), 
    ); 
    return $form; 
} 

function ajax_note_replace(&$form, &$form_state) { 
    dpm("test"); 
    dpm($form); 
    $output = '<h1>' . t('Hello World') . '</h1>'; 
    // $node = node_load('6'); 
    // $output .= drupal_render(node_view($node, $style = 'teaser', $options = array())); 

    ctools_include('ajax'); 
    $commands = array(); 
    $commands[] = ajax_command_prepend(".view-content", $output); 
    print ajax_render($commands); // this function exits. 
    exit; 
} 

@Clive,你能幫我解決嗎?我想在回調中保存節點(如果有效?)。在ajax回調中,我的node-id爲null,因爲它尚未存儲?我如何驗證並保存節點,否則將無效的表單項設置爲正常紅色。

+0

你可以發佈'advanced_form_callback()'的代碼嗎? – Clive 2011-12-21 14:58:35

+0

對不起了錯誤的版本,更新它 – Nealv 2011-12-21 15:15:13

回答

5

這很可能是因爲你迴避Drupal的適當方法可以創建表格,以便在AJAX預處理將不會被執行。如果你看一下drupal_get_form()(功能使用非常專門準備在Drupal一種形式),你會看到它依次調用drupal_build_form()這是你需要做什麼:

function new_note_form($form, &$form_state, $nodeid = NULL) { 
    $form_state['build_info']['args'] = array('note'); 
    $form = drupal_build_form('node_add', $form_state); 

    $form['submit'] = array(
    '#type' => 'button', 
    '#value' => 'Submit', 
    '#limit_validation_errors' => array(), 
    '#ajax' => array(
     'callback' => 'advanced_form_callback', 
     'wrapper' => 'status', 
    ), 
); 

    return $form; 
} 

echo render(drupal_get_form('new_note_form')); 

我已經改變了元素從submitbuttonbutton,因爲我發現它在你想要做一些AJAX處理的時候工作得好多了,刪除了#executes_submit_callback,並且加入了#limit_validation_errors這會阻止表單在其他方面的驗證(我想這就是你想要設置#validatedTRUE但我可能是錯的)。

希望幫助,這是未經測試,但應該給你一個良好的開端。

+0

嗯,我得到:未定義指數:node_add在drupal_retrieve_form() – Nealv 2011-12-21 15:19:27

+0

是啊對不起,加上'module_load_include(「增量」,「節點」,「node.pages」);在'頂級,就像你在原始功能中做的那樣。此外,您應該從AJAX回調或使用[AJAX函數](http://api.drupal.org/api/drupal/includes--ajax.inc/group/ajax)構建的ajax命令返回表單元素, – Clive 2011-12-21 15:25:04

+0

你能幫我驗證並保存節點嗎? – Nealv 2011-12-21 16:54:11