Drupal AJAX форма - PullRequest
       15

Drupal AJAX форма

1 голос
/ 21 декабря 2011

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

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

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

Единственная проблема в том, что когда я отправляю форму, 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 мой идентификатор узла является нулевым, потому что он еще не сохранен? как я могу проверить и сохранить узел, в противном случае установите недопустимые элементы формы на красный, как обычно.

1 Ответ

5 голосов
/ 21 декабря 2011

Вероятно, это из-за того, что вы обходите правильные методы 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, но я могу ошибаться).

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

...