2011-12-21 4 views
1

Что я хочу сделать: я хочу отобразить форму на странице с видом. Этот вид имеет список «заметок» (= CT Note). Когда вы заполняете форму, заметка сохраняется, форма очищается, и новое примечание добавляется в список. Все без обновления страницы.drupal ajax form

создать модуль 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'; 
} 

Я использую эту функцию в блоке области отображения ванной, которая предоставляется над списком заметок. Все идет нормально.

Единственная проблема заключается в том, что, когда я отправляю форму, ajax не вызывается, а нормальная подача выполняется.

Может ли кто-нибудь мне помочь

@ Редактировать.

После того, как предложил клайв, я сменил код и получил работу ajax.

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

@ Посетите, вы можете помочь мне с остальными? Я хочу сохранить узел при обратном вызове (если он действителен?). В обратном вызове ajax мой идентификатор узла равен нулю, потому что он еще не сохранен? как я могу проверить и сохранить узел, иначе установите недопустимые элементы формы как красные.

+0

Можете ли вы разместить код для 'advanced_form_callback()'? – Clive

+0

Извините, у вас была неправильная версия, обновил ее – Nealv

ответ

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

Я изменил элемент от типа submit до button, потому что я нахожу, что он работает намного лучше, если вы хотите выполнить некоторую обработку ajax, удалили #executes_submit_callback и добавили #limit_validation_errors, который остановит форму от проверки по-другому (я думаю, это то, что вы пытались сделать, установив #validated в TRUE, но я могу ошибаться).

Надеюсь, что это поможет, оно не проверено, но должно дать вам хорошее место для начала.

+0

Хмм, я получаю: Неопределенный индекс: node_add в drupal_retrieve_form() – Nealv

+0

Ах да, извините, добавьте 'module_load_include ('inc', 'node', 'node.pages');' на как вы это делали в своей первоначальной функции. Также вы должны вернуть элемент формы из своего обратного вызова AJAX или команду ajax, созданную с использованием функций [AJAX] (http://api.drupal.org/api/drupal/includes--ajax.inc/group/ajax) – Clive

+0

Вы могли бы помочь мне с проверкой и сохранением узла, пожалуйста? – Nealv