Drupal автозаполнение представить при выборе предложения - PullRequest
2 голосов
/ 20 мая 2011

Я следовал учебному руководству на этом сайте: http://thedrupalblog.com/creating-autocomplete-field-using-forms-api-and-menu-callback и у меня отлично работает автозаполнение.

То, что я не уверен, как это сделать, и что я не могу найти в Интернете, - это отправить форму, когда пользователь щелкает предложение, а не просто заполняет это поле.

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

Ответы [ 6 ]

10 голосов
/ 13 августа 2011

Следующий код переопределит функцию «Drupal.jsAC.prototype.select», и ее можно использовать в любом файле JS без изменения misc/autocomplete.js.

 $(document).ready(function(){
      Drupal.jsAC.prototype.select = function (node) {
        this.input.value = $(node).data('autocompleteValue');
        if(jQuery(this.input).hasClass('auto_submit')){
          this.input.form.submit();
        }
      };
    });
6 голосов
/ 20 мая 2011

Возможно, это не лучший "друпал" способ сделать это, может быть, кто-то может улучшить его ...

в вашем файле 'misc / autocomplete.js' найдите:

Drupal.jsAC.prototype.select = function (node) {
  this.input.value = $(node).data('autocompleteValue');
}; 

и измените его на:

Drupal.jsAC.prototype.select = function (node) {
  this.input.value = $(node).data('autocompleteValue');
  if(jQuery(this.input).hasClass('auto_submit')){
      this.input.form.submit();
  }
};

затем к форме добавьте:

'#attributes' => array('class'=> array('auto_submit')),

Это приведет к отправке формы независимо от того, как пользователь выберет выбор (кнопка ввода или щелчок мыши)

РЕДАКТИРОВАТЬ: 4 года спустя я получил голосование и понял, что это нужно обновить ... в основном @Azhar прав, вместо того, чтобы редактировать существующий файл, этот код должен быть добавлен в новый файл JS, который загружается после автозаполнения .js.

Как и всегда, когда вы редактируете ядро, вам приходится беспокоиться об обновлениях безопасности ядра, которые могут переопределить ваше изменение и оставить ваш сайт сломанным, а вы изо всех сил пытаетесь его исправить.

1 голос
/ 15 декабря 2014

Это работает, только если вы щелкнете по предложению автозаполнения, а не при выборе его с помощью клавиатуры.

Чтобы перехватить выбор клавиатуры и мыши, переопределите метод hidePopup.

// Autosubmit on keyboard & click.
Drupal.jsAC.prototype.hidePopup = function (keycode) {
    // Select item if the right key or mousebutton was pressed.
    if (this.selected && ((keycode && keycode != 46 && keycode != 8 && keycode != 27) || !keycode)) {
      this.input.value = $(this.selected).data('autocompleteValue');
      if (jQuery(this.input).hasClass('auto-submit')) {
        this.input.form.submit();
      }
    }
    // Hide popup.
    var popup = this.popup;
    if (popup) {
      this.popup = null;
      $(popup).fadeOut('fast', function () { $(popup).remove(); });
    }
    this.selected = false;
    $(this.ariaLive).empty();
  };
0 голосов
/ 14 февраля 2017

Предположим, у вас есть два поля, такие как заголовок, описание. Мы предполагаем, что оба поля не содержат тегов html. Мы создали представление, чтобы перечислить заголовок и описание. У нас также есть заголовок как выставленный фильтр с автозаполнением.

jQuery('html').on('click touchstart','.ui-autocomplete li a', function(e){
          var text = jQuery(this).html();
          jQuery('.form-autocomplete').val(text);
          jQuery('.form-autocomplete').parent().parent('form').submit();
      }); 

Наиболее подробная версия - https://www.drupal.org/node/2852380

0 голосов
/ 11 сентября 2015

По состоянию на 7,36 / Выпуск # 365241 , это гораздо лучше поддерживается при запуске события autocompleteSelect при выборе.

Если вы используете инфраструктуру Ajax, вы можете перехватить это и событие изменения для трех основных типов обязательств на местах (щелчок, ввод, вкладка для обновленного значения), например ::

$field = array(
    // ...
    '#ajax' => array(
      // ...
      'event' => 'change autocompleteSelect',
    ),
);

В противном случае вы можете поймать событие из пользовательского скрипта. Он запускается в элементе редактирования (после обновления) с дополнительным параметром одноэлементного массива выбранного узла.

0 голосов
/ 26 июня 2012

Или, если вы хотите включить его во всех формах автозаполнения без использования средства изменения формы, вы можете использовать следующий фрагмент ниже в вашем файле JS:

Drupal.jsAC.prototype.select = function (node) {
  this.input.value = $(node).data('autocompleteValue');
  if(jQuery(this.input).hasClass('form-autocomplete')){
    this.input.form.submit();
  }
};
...