Кнопка с поведением Drupal jQuery, конфликтующая с кнопкой AJAX "Добавить больше" в поле Неограниченного количества элементов


У меня есть форма с неограниченным количеством полей, которая создает кнопку "Добавить больше", чтобы добавить больше полей. У меня также есть отдельная пара полей. Одно из этих полей имеет значение, предварительно заполненное при запуске новой формы, другое поле - это еще одно поле с неограниченным количеством элементов с кнопкой "Добавить больше", и оно пусто при загрузке страницы. Я прикрепил функцию jQuery поведения Drupal к кнопке, которую я добавил в пользовательский модуль с помощью hook_form_alter: этот jQuery устанавливает значение второе из пары полей соответствует значению первого при нажатии пользовательской кнопки. Это работает. И кнопки "Добавить больше" для полей с неограниченным количеством элементов также работают. Однако после того, как пользовательская кнопка была нажата один раз, кнопка "Добавить больше" больше не будет создавать новое поле, и я получаю следующие ошибки в своих журналах:

Apr 25 02:56:36 lucifer drupal: https://somesite.com|1366880196|php|111.111.111.111|https://somesite.com/system/ajax|https://somesite.com/node/add/inventory-stocking-ticket|1||Warning: implode(): Invalid arguments passed in form_error() (line 1649 of /hosting/somesite/com/htdocs/cms_sandbox/includes/form.inc).

Apr 25 02:56:41 lucifer drupal: https://somesite.com|1366880201|php|111.111.111.111|https://somesite.com/system/ajax|https://somesite.com/node/add/inventory-stocking-ticket|1||Notice: Undefined index: #ajax in ajax_form_callback() (line 379 of /hosting/somesite/com/htdocs/cms_sandbox/includes/ajax.inc).

Вот мой код для пользовательской кнопки:

$form['field_ending_weight_garbage']['und']['garbage_no_change'] = array(
  '#type' => 'button',
  '#value' => t('No Change'),
  '#attributes' => array('onclick' => 'return (false);'),
  '#name' => 'garbagenochange',
);

И код для поведение:

(function ($) {
  Drupal.behaviors.noChange = {
    attach: function (context, settings) {
     $('#edit-field-ending-weight-garbage-und-garbage-no-change').once('noChange', function() {
      $('#edit-field-ending-weight-garbage-und-garbage-no-change', context).click(function () {
     var a = $('#edit-field-starting-weight-garbage-und-0-value').val();
     var b = $('#edit-field-ending-weight-garbage-und-0-value').val();
     if (b == "")
     {
       $('#edit-field-ending-weight-garbage-und-0-value').val( a );
     }
     else
     {
       $('#edit-field-ending-weight-garbage-und-0-value').select();
     }
        return false;
      });
    });
   }
  };
}(jQuery));

Который прикрепляется в функции after_build следующим образом:

drupal_add_js(drupal_get_path('theme', 'corolla').'/js/inventoryNoChange.js');

Я использую jQuery 1.5 с помощью модуля обновления jQuery, несжатый. Что может быть причиной этого?

Редактировать: Мне удалось устранить первую ошибку, добавив пользовательскую кнопку следующим образом:

$form['field_starting_weight_garbage']['und'][0]['garbage_no_change'] = array(
  '#type' => 'button',
  '#value' => t('No Change'),
  '#attributes' => array('onclick' => 'return (false);'),
    '#limit_validation_errors' => array(),
  '#name' => 'garbagenochange',
);

Таким образом, он находится на первом поле в паре, а не на втором, и он находится на $form['field_starting_weight_garbage']['und'][0]['garbage_no_change'], а не $form['field_starting_weight_garbage']['und']['garbage_no_change'].

Но ошибка ajax сохраняется, и "Добавить еще один" функциональность все еще нарушена. Я должен отметить, что он только выдает ошибку и выходит из строя, по-видимому, случайным образом. Я могу добавить несколько дополнительных полей с помощью кнопки "Добавить еще", но затем она ломается, выдает ошибку и не добавляет больше полей.

Я определил, что это не поведение/jQuery, которое нарушает вещи. Простое добавление пользовательской кнопки без привязки к ней поведения вызывает проблему. Все еще надеюсь, что кто-нибудь сможет пролить свет на это.

Author: user16972, 2013-04-25

1 answers

Поэтому я выбрал другой подход, чтобы добиться того же самого. Вместо добавления кнопки с использованием свойства '#button' или '#submit' в hook_form_alter, которое вызывало конфликт, я добавил кнопку со следующим кодом:

$form['field_starting_weight_garbage']['und'][0]['value']['#prefix'] = '<div>';
$form['field_starting_weight_garbage']['und'][0]['value']['#suffix'] = '<input type="submit" value="No Change" class="form-submit" id="garbagenochange"></div>';

И скорректировал поведение Drupal для присоединения к этому элементу (id="garbagenochange").

Я до сих пор точно не знаю, что стало причиной конфликта или как его исправить, но это то, что мне нужно, поэтому я пойду по этому пути.

 1
Author: user16972, 2013-04-27 00:15:57