1

我正在尝试向我们的公司网站添加功能(这个名为“userpasswords2”的模块搜索本地邮件系统密码的数据库)。我正在使用 AJAX 自动完成和修改表单。

我无法通过输入键提交表单。AJAX 自动完成工作正常,但是当我选择用户时,表单只能通过提交按钮提交。

我希望它像这里一样工作https://api.drupal.org/api/drupal - 用户输入例如“hook”,选择例如 hook_menu,点击 enter,然后再次点击 enter 并获得结果!

所以再次 - 点击提交按钮工作正常,点击“输入”键不起作用。

谷歌了很多,我发现的解决方法对我不起作用。请帮忙。

function userpasswords2_menu() {
  $items = array();
  $items['userpasswords2'] = array(
    'title' => 'User passwords',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('userpasswords2_form'),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  $items['userpasswords2/ajax_username_autocomplete_callback2'] = array(
    'page callback' => 'ajax_username_autocomplete_callback2',
    'type' => MENU_CALLBACK,
    'access callback' => TRUE,
  );
  return $items;
}

function userpasswords2_form($form, &$form_state) {
  $form = array();
  $form['user'] = array(
      '#type' => 'textfield',
      '#title' => t('Enter username'),
      '#autocomplete_path' => 'userpasswords2/ajax_username_autocomplete_callback2',
      '#executes_submit_callback' => 'TRUE',
  );
  $form['box'] = array(
    '#type' => 'markup',
    '#prefix' => '<div id="box">',
    '#suffix' => '</div>',
    '#markup' => '<br>',
  );   
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#ajax' => array(
      'callback' => 'userpasswords2_callback',
      'wrapper' => 'box',
    ),
    '#value' => t('Submit'),
);
  return $form;
}

function ajax_username_autocomplete_callback2($string = "") {
  $matches = array();
  if ($string) {
    $result = db_select('my_domain_passwords')
      ->fields('my_domain_passwords',array('fullname','password'))
      ->condition('fullname', db_like($string) . '%', 'LIKE')
      ->range(0,10)
      ->execute();
    foreach ($result as $user) {
      $form['custom']['username'] = $matches[$user->fullname] = check_plain($user->fullname);
      $form['custom']['password'] = check_plain($user->password);
    }
  }
  drupal_json_output($matches);
}

function userpasswords2_form_validate($form, &$form_state) {
  $username = $form_state['values']['user'];
  $matches = array();
  // select from database by fullname
  $result = db_select('my_domain_passwords')
    ->fields('my_domain_passwords', array('fullname'))
    ->condition('fullname', db_like($username), 'LIKE')
    ->range(0,1)
    ->execute()
    ->fetchField();

  if (!empty($username)) {
    $form_state['custom']['username'] = $result;
    $password = db_select('my_domain_passwords')
      ->fields('my_domain_passwords', array('password'))
      ->condition('fullname', db_like($username), 'LIKE')
      ->range(0,1)
      ->execute()
      ->fetchField();
    $form_state['custom']['password'] = $password;
  }
  return $form;
}

function userpasswords2_callback($form, &$form_state) {
  if ( (!empty($form_state['custom']['username'])) && (!empty($form_state['custom']['password'])) ) {
    $output_string = $form_state['custom']['username'] . " : " . $form_state['custom']['password'];
  } else {
    $output_string = "No such user: " . $form_state['values']['user'];
  }
  $username = $form_state['custom']['username'];
  $password = $form_state['custom']['password'];
  $element = $form['box'];
  $element['#markup'] = $output_string;
  return $element;
}
4

1 回答 1

0

如果您删除自动完成,您可以按回车键提交。所以问题在于自动完成功能。您需要修补misc/autocomplte.js. 以下是补丁,查看链接了解更多详情。

case 13: // Enter.
case 27: // Esc.
    this.hidePopup(e.keyCode);
    if (e.keyCode == 13 && $(input).hasClass('auto_submit')) {
       input.form.submit();
    }

这可以帮助你https://www.drupal.org/project/drupal/issues/309088

于 2018-01-09T06:49:43.293 回答