Рейтинг:0

Форма с проблемой ajax и javascript

флаг br

Я воссоздаю вопрос с более точными данными (Исходный вопрос Форма с проблемой ajax и javascript). У меня есть кнопка в моей форме, которая генерирует набор полей через ajax. Когда я пытаюсь отследить нажатие этой кнопки с помощью jQuery, он просто не видит эту кнопку. Идентификатор кнопки показан ниже.введите описание изображения здесь Я пытался отслеживать использование только ввода в качестве селектора, все равно не работает. Javascript точно подключен, когда я нажимаю кнопку отправки, вывод есть.введите описание изображения здесь Вот php-код.

общедоступная функция buildForm (массив $ form, FormStateInterface $ form_state) {
    $config = \Drupal::config('pizza_javascript.settings');
    $type_pizza_config = $config->get('Types_pizza');
    $district_config = $config->get('Район');
    $sum_order = 0;
    foreach ($type_pizza_config как $key=>$name){
      $pizza_type[$name['Цена']] = $name['Имя'];
    }

    foreach ($district_config как $key=>$name){
      $blocks[$name['Цена']] = $name['name'];
    }


$num_pizza = $form_state->get('num_pizza');
если ($num_pizza === NULL) {
  $pizza_field = $form_state->set('num_pizza', 1);
  $num_pizza = 1;
}

$form['pizza_fieldset_general'] = [
  '#тип' => 'набор полей',
  '#дерево' => ИСТИНА,
  '#title' => $this->t('Заказы'),
  '#prefix' => '<div id="pizza-fieldset-general-wrapper">',
  '#суффикс' => '</div>',
];
для ($i = 0; $i < $num_pizza; $i++) {
  $form['pizza_fieldset_general']['pizza_fieldset'][$i] = [
    '#тип' => 'набор полей',
    '#дерево' => ИСТИНА,
    '#title' => $this->t('Пицца на заказ'),
  ];
  $form['pizza_fieldset_general']['pizza_fieldset'][$i]['name'] = [
    '#тип' => 'выбрать',
    '#title' => $this->t('Введите пиццу'),
    '#дерево' => ИСТИНА,
    '#options' => $pizza_type,
    '#default_value' => '940',
    '#attributes' => ['id' => 'выбрать-пицца-'.$i],
  ];

  $form['pizza_fieldset_general']['pizza_fieldset'][$i]['count'] = [
    '#тип' => 'выбрать',
    '#title' => $this->t('Считать пиццу'),
    '#дерево' => ИСТИНА,
    '#options' => диапазон (0, 10),
    '#attributes' => ['id' => 'select-count-'.$i],
  ];
}

$form['pizza_fieldset_general']['actions'] = [
  '#type' => 'действия',
];


$form['pizza_fieldset_general']['actions']['add_pizza'] = [
  '#type' => 'отправить',
  '#value' => $this->t('Добавить одну пиццу'),
  '#submit' => ['::addOnePizza'],
  '#ajax' => [
    'callback' => '::addmorepizzaCallback',
    'обертка' => 'пицца-fieldset-общая-обертка',
  ],
];
если ($num_pizza > 1) {
  $form['pizza_fieldset_general']['actions']['remove_pizza'] = [
    '#type' => 'отправить',
    '#value' => $this->t('Удалить один'),
    '#submit' => ['::removeCallback'],
    '#ajax' => [
      'callback' => '::addmorepizzaCallback',
      'обертка' => 'пицца-fieldset-общая-обертка',
    ],
  ];
}

$ форма ['блок'] = [
  '#title' => 'Районный порядок',
  '#type' => 'радио',
  '#options' => $блоки,
];


$ форма ['телефон'] = [
  '#тип' => 'текстовое поле',
  '#title' => $this->t('Номер телефона'),
  '#description' => $this->t('Пример номера телефона +79261234567, 89261234567, 8(926)123-45-67'),
];

$ форма ['адрес'] = [
  '#тип' => 'текстовое поле',
  '#title' => $this->t('Порядок адресов'),
  '#description' => $this->t('Адрес для заказа'),
];

$ форма ['all_price'] = [
  '#тип' => 'текстовое поле',
  '#title' => $this->t('Цена заказа'),
  '#attributes' => массив('только для чтения' => 'только для чтения'),
];

$form['pizza_price'] = [
  '#тип' => 'текстовое поле',
  '#title' => $this->t('Цена пиццы'),
  '#attributes' => массив('только для чтения' => 'только для чтения'),
];




$form['действия']['отправить'] = [
  '#type' => 'отправить',
  '#value' => $this->t('Отправить'),
];


$form['#attached']['library'][] = 'pizza_javascript/pizzaJS';
$form['#attached']['drupalSettings']['data']['blockprice'] = $form_state->getValue('block');
$form['#attached']['drupalSettings']['data']['count_pizza'] = $num_pizza;

вернуть $ форму;


 }



общедоступная функция addmorepizzaCallback (массив и $ форма, FormStateInterface $ form_state) {
    возврат $form['pizza_fieldset_general'];
  }




 
  общедоступная функция addOnePizza (массив и $ форма, FormStateInterface $ form_state) {
    $pizza_field = $form_state->get('num_pizza');
    $add_button = $pizza_field + 1;
    $form_state->set('num_pizza', $add_button);
    $form_state->setRebuild();
  }


  
  общедоступная функция removeCallback (массив и $ форма, FormStateInterface $ form_state) {
    $pizza_field = $form_state->get('num_pizza');
    если ($pizza_field > 1) {
      $remove_button = $pizza_field - 1;
      $form_state->set('num_pizza', $remove_button);
    }
    $form_state->setRebuild();
  }

Код JavaScript.

(функция ($, Друпал) {
  Drupal.behaviors.myBehaviour = {
    прикрепить: функция (контекст, настройки) {

     $('#edit-pizza-fieldset-general-actions-add-pizza',context).on('click',function (){
       console.log('Привет, мир!!!');
     })
      $('ввод').on('щелчок',функция (){
       console.log('Привет, мир!!!');
     })

    }

  }

})(jQuery, Drupal);

Так как я отслеживаю элементы ввода, должны отображаться поля генерации кнопок, но этого не происходит.введите описание изображения здесь Пожалуйста, помогите мне понять, в чем проблема. Извините за мой английский, я использовал перевод Google

Kevin avatar
флаг in
Как узнать, что JS подключен?
Павел Герасюта avatar
флаг br
Js точно прилагается, проверено. Console.log срабатывает, когда я вызываю его с помощью селектора ввода. $('ввод').on('щелчок',функция (){ console.log('Привет, мир!!!'); })
Павел Герасюта avatar
флаг br
Но это работает только с кнопками отправки формы. $form['действия']['отправить'] = [ '#type' => 'отправить', '#value' => $this->t('Отправить'), ];
sonfd avatar
флаг in
Самый простой ответ на это — ваш селектор неверен. Не могли бы вы добавить к вопросу реальную разметку формы? т.е. то, что вы увидите, когда используете инспектор вашего браузера или просматриваете исходный код страницы.
Павел Герасюта avatar
флаг br
Обновлен вопрос с более точной информацией
No Sssweat avatar
флаг ua
Я предполагаю, что ваш ajax повторно генерирует кнопку; таким образом, возможно, идентификатор изменится на что-то вроде `#edit-pizza-fieldset-general-actions-add-pizza-1`. Поэтому попробуйте нацелить его с помощью оболочки вместо `$('.pizza-fieldset-general-wrapper .form-submit').on('click',function (){`

Ответить или комментировать

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