Как динамично реконфигурировать основанное на jQuery автоматическое заполнение Drupal во времени выполнения?

На данный момент, я думаю, нам нужен рекурсивный генератор , на всякий случай ...

В питоне 2:

def chunks(li, n):
    if li == []:
        return
    yield li[:n]
    for e in chunks(li[n:], n):
        yield e

В питоне 3:

def chunks(li, n):
    if li == []:
        return
    yield li[:n]
    yield from chunks(li[n:], n)

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

def dec(gen):
    def new_gen(li, n):
        for e in gen(li, n):
            if e == []:
                return
            yield e
    return new_gen

@dec
def chunks(li, n):
    yield li[:n]
    for e in chunks(li[n:], n):
        yield e
5
задан Isaac Waller 29 August 2009 в 04:05
поделиться

4 ответа

Well, for reference, I've thrown together a hack that works, but if anyone can think of a better solution, I'd be happy to hear it.

Drupal.behaviors.dingCampaignRules = function () {
  $('#campaign-rules')
    .find('.campaign-rule-wrap')
      .each(function (i) {
          var type = $(this).find('select').val();

          $(this).find('.form-text')
            // Remove the current autocomplete bindings.
            .unbind()
            // And remove the autocomplete class
            .removeClass('form-autocomplete')
          .end()
          .find('select:not(.dingcampaignrules-processed)')
            .addClass('dingcampaignrules-processed')
            .change(Drupal.behaviors.dingCampaignRules)
          .end();

          if (type == 'page' || type == 'library' || type == 'taxonomy') {
            $(this).find('input.autocomplete')
              .removeClass('autocomplete-processed')
              .val(Drupal.settings.dingCampaignRules.autocompleteUrl + type)
            .end()
            .find('.form-text')
              .addClass('form-autocomplete');
            Drupal.behaviors.autocomplete(this);
          }
      });
};

This code comes from the ding_campaign module. Feel free to check out the code if you need to do something similar. It's all GPL2.

3
ответ дан 14 December 2019 в 01:15
поделиться

Взгляните на misc / autocomplete.js.

/**
 * Attaches the autocomplete behavior to all required fields
 */
Drupal.behaviors.autocomplete = function (context) {
  var acdb = [];
  $('input.autocomplete:not(.autocomplete-processed)', context).each(function () {
    var uri = this.value;
    if (!acdb[uri]) {
      acdb[uri] = new Drupal.ACDB(uri);
    }
    var input = $('#' + this.id.substr(0, this.id.length - 13))
      .attr('autocomplete', 'OFF')[0];
    $(input.form).submit(Drupal.autocompleteSubmit);
    new Drupal.jsAC(input, acdb[uri]);
    $(this).addClass('autocomplete-processed');
  });
};

Атрибут значения ввода используется для создания ACDB, который является кешем значений для этого пути автозаполнения (uri). Это используется в функции Drupal.jsAC для привязки событий keydown, keyup и blur элемента с триггерами операции автозаполнения ajax (которая кэширует свои значения в объекте ACDB для этого элемента), открывает всплывающие окна и т. Д.

/**
 * An AutoComplete object
 */
Drupal.jsAC = function (input, db) {
  var ac = this;
  this.input = input;
  this.db = db;

  $(this.input)
    .keydown(function (event) { return ac.onkeydown(this, event); })
    .keyup(function (event) { ac.onkeyup(this, event); })
    .blur(function () { ac.hidePopup(); ac.db.cancel(); });

};

What you ' Мне нужно будет изменить входное значение, а также повторно подключить поведение. Вы повторно подключите поведение, удалив класс «.autocomplete-processing» в элементе ввода текстового поля автозаполнения, а затем вызовите Drupal.attachBehaviors (thatInputElement).

Это может не сработать. Все может пойти очень плохо, если вы снова и снова будете применять одно и то же поведение к одному и тому же элементу. Может быть более разумным создать разные поля автозаполнения и просто скрыть и показать их в зависимости от значения выбора. Это все равно потребует вызова Drupal.attachBehaviors при скрытии и отображении виджета, но такое же поведение останется прикрепленным, если переключение произойдет более одного раза, и вы не рискуете прикрепить одно и то же поведение к элементу несколько раз.

4
ответ дан 14 December 2019 в 01:15
поделиться

это должно быть так просто, как динамическое изменение «значения» «скрытого» автозаполнения элемент ввода, который идет в сторону полей автозаполнения формы. например,

$('select#myelement').bind('change', function(e) { 
  if (/* something */) {
    $('input#myelement-autocomplete').attr('value', '/mycustom/path');
  }
}); 
1
ответ дан 14 December 2019 в 01:15
поделиться

Рабочее решение для Drupal 5

/*
 *  Błażej Owczarczyk
 *  blazej.owczarczyk@gmail.com 
 * 
 *  Name: Autocomplete City Taxonomy 
 *  Description: Hierarchical city selecting (province select and city autocomplete)
 */

var Act = Act || {};

Act.init = function () {
    $('select.act-province').change(Act.provinceChange);        // select with top taxonomy terms    
}

/*
 *  Change event of select element
 */
Act.provinceChange = function () { 
    var context = $(this).parent().parent();              
    var currentTid = $(this).val();
    Act.rewriteURI(context, currentTid);
    Act.unbind();
    Drupal.autocompleteAutoAttach();
};

/*
 *  Changes the value of hidden autocomplete input
 */
Act.rewriteURI = function (context, newTid) {
    var tempArray;
    tempArray = $('.autocomplete', context).val().split('/');
    tempArray.pop();
    tempArray.push(newTid);
    $('.autocomplete', context).val(tempArray.join('/'));    
};

/*
 *  Prevents muliple binding of the same events
 */
Act.unbind = function () {
    $('.form-autocomplete').unbind().parents('form').unbind('submit');
};

$(document).ready(Act.init);
1
ответ дан 14 December 2019 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: