Форма Drupal FAPI вызывает обратный вызов дважды - PullRequest
0 голосов
/ 22 марта 2011

Первый пост о переполнении стека ... так что будьте осторожны со мной!

Похоже, не существует подходящего решения проблемы множественного обратного вызова Drupal FAPI для простой отправки формы.

ПРОБЛЕМА. Моя форма при отправке добавляет две записи в соответствующую таблицу базы данных.Учитывая, что есть только один вызов, чтобы добавить его в базу данных, я думаю, можно с уверенностью предположить, что запрос выполняется дважды (отсюда и двойные записи).

Следующий код может помочь обеспечить основу длярешение.О, это тоже Drupal 7, так что документация все еще в значительной степени ориентирована на D6.

function mymodule_sidebar_form_add_submit(&$form, &$form_state) {

  $form_values = $form_state['values'];

  $se_title = check_plain(trim($form_values['title']));
  $se_link = url(trim($form_values['link']));
  $se_content = check_plain(trim($form_values['content']));
  $se_image = isset($form_values['image']) ? $form_values['image'] : '';

  // The multi-line part below is actually a single line the real code
  $query = sprintf("INSERT INTO sidebar_element(title, image_url, content) 
      VALUES ('%s', '%s', '%s');", $se_title, $se_image, $se_content);

  db_query($query);
  drupal_set_message(t('Sidebar Element has been added successfully.'));
}

... и моя функция формы содержит кнопку отправки:

  $form['submit'] = array(
      '#value' => t('Add Sidebar'),
      '#type' => 'submit',
      '#title' => t('Add Sidebar'),
      '#submit' => array('mymodule_sidebar_form_add_submit'),
      );

Наверное, вопросыМне нужно ответить:

  1. Почему двойной ответ на первом месте?
  2. Есть ли способ идентифицировать первый обратный вызов?

Заранее всем спасибо.

Ответы [ 3 ]

0 голосов
/ 22 марта 2011

Для Drupal 7

// Add the buttons.
  $form['actions'] = array('#type' => 'actions');

  $form['actions']['submit'] = array(
    '#type' => 'submit', 
    '#access' => my_func(), 
    '#value' => t('Save'), 
    '#weight' => 100, 
    '#submit' => array('my_form_submit'),
  );

В качестве примера читайте node_form () code

0 голосов
/ 22 марта 2011

Чтобы выяснить, откуда поступает второй вызов, проще всего установить devel.module и использовать ddebug_backtrace () в вашем обратном вызове submit. Возможно, вам придется отключить перенаправление HTTP, чтобы увидеть его (exit ()).

Но что более важно, используйте API, Люк!

<?php
db_insert('sidebar_element')
  ->fields(array(
    'title' => $se_title,
    'image_url' => $se_image,
    'content' => $se_content,
  ))
  ->execute():
?>

Вот так должен выглядеть ваш запрос на вставку, то, что вы делаете, небезопасно!

А для SELECT используйте db_query () с именованными заполнителями:

<?php
$result = db_query('SELECT * FROM {sidebar_element} WHERE title = :title', array(':title' => $something));
?>
0 голосов
/ 22 марта 2011
  $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save')
  );
  $form['#submit'] = array('my_form_submit');

И заменить

// The multi-line part below is actually a single line the real code
  $query = sprintf("INSERT INTO sidebar_element(title, image_url, content) 
      VALUES ('%s', '%s', '%s');", $se_title, $se_image, $se_content);

  db_query($query);

с

// The multi-line part below is actually a single line the real code
  $query = "INSERT INTO {sidebar_element} (title, image_url, content) 
      VALUES ('%s', '%s', '%s')";

  db_query($query, $se_title, $se_image, $se_content);
...