2011-12-21 9 views
1

私がしたいことは次のとおりです。ビューを持つページにフォームをレンダリングしたい。このビューには「ノート」(= CT注)のリストがあります。フォームに記入すると、メモが保存され、フォームが消去され、新しいメモがリストに追加されます。すべてページの更新なし。drupal ajaxフォーム

Iは、モジュールnew_noteを作成し、この関数をaddes:

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

Iメモリストの上にレンダリングされる表示スイートブロックフィールド、この機能を使用します。ここまでは順調ですね。

唯一の問題は、フォームを送信すると、ajaxが呼び出されず、通常の送信が行われることです。

誰でも私を助けることができます

@編集。

私がコードを変更し、アヤックスを働かせたことを示すcliveが提案された後。

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

+0

申し訳ありませんが間違ったバージョンを更新しました – Nealv

答えて

5

Drupalがフォームを作成する適切な方法を回避してAJAX前処理が実行されない可能性があります。あなたはdrupal_get_form()を見ている場合は、あなたが何をする必要があるかであるターンがdrupal_build_form()を呼び出すには、あなたがそれを見ることができます(関数は、Drupalの中にフォームを準備するために、かなり排他的に使用):

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

私が変更しました要素がsubmitからbuttonに変更されています。なぜなら、いくつかのAjax処理を実行したい場合は、#executes_submit_callbackを削除し、#limit_validation_errorsを追加してフォームを停止させます(これは、#validatedを設定して、 TRUEが間違っている可能性があります)。

希望すると、テストされていませんが、開始するのに適しているはずです。

+0

うーん、私は得る:未定義のインデックス:drupal_retrieve_form()内のnode_add – Nealv

+0

ああ、申し訳ありません、申し訳ありません、 'module_load_include(' inc '、' node '、' node.pages ');あなたが元の機能で行ったのと同じように、また、AJAXコールバックからフォーム要素を返すか、[AJAX関数](http://api.drupal.org/api/drupal/includes--ajax.inc/group/ajax)を使ってビルドしたajaxコマンドを返す必要があります。 – Clive

+0

ノードの検証と保存を手伝ってもらえますか? – Nealv