Drupal FAPI表单调用两次回调

时间:2011-03-22 00:55:44

标签: drupal drupal-modules drupal-7 drupal-fapi

关于堆栈溢出的第一篇帖子......所以对我来说很容易!

对于简单表单提交,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. 提前感谢所有人。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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()代码

答案 2 :(得分:0)

要找出第二个调用的来源,最简单的方法是在提交回调中安装devel.module并使用ddebug_backtrace()。您可能还需要禁用HTTP redirecto来查看它(exit())。

但更重要的是,使用API​​,Luke!

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