Drupal 7 Ajax с выбором таблицы и последующим обновлением поля - PullRequest
0 голосов
/ 06 мая 2018

Я хочу заполнить набор полей формы на основе шаблона, выбранного из поля tableselect, и иметь возможность впоследствии изменить некоторые поля вручную, если это необходимо. Кажется, что $ form_state ['values'] не отражает эти последние изменения.

Например, я выбираю «Вариант 2» в таблице выбора. Текстовое поле меняется на «текст 2», как и ожидалось. Затем я набираю Обновлено в текстовое поле и нажимаю «Отправить». Хуки проверки и отправки получают значение $ forms_state ['values'] ['text'], равное "Text 2". Измененный текст («Обновлено») можно найти только в $ form_state ['input'] ['text'].

См. Код ниже.

<?php
function _pilates_test_dropdown_form($form, &$form_state) {
$header = array();
$data = [1 => ["name" => 'option 1', "text" => 'text 1'],
         2 => ["name" => 'option 2', "text" => 'text 2'],
        ];
$header[] = t('Option');
$header[] = t('Text');
$options = array();

foreach ($data as $data_id => $item) {
    if(! isset($initial_option_id)) {
        $initial_option_id = $data_id;
    }
    $options[$data_id] = array();
    $options[$data_id][] = $item['name'];
    $options[$data_id][] = $item['text'];
}

$selected_id = empty($form_state['values']['selected_id']) ? 
        $initial_option_id 
        : 
        $form_state['values']['selected_id'];

$form['selected_id'] = array(
  '#type' => 'tableselect',
  '#header' => $header,
  '#options' => $options,
  '#multiple' => FALSE,
  '#default_value' => $selected_id,
    '#ajax' => array(
      'callback' => '_pilates_test_dropdown_ajax_callback',
      'wrapper' => 'item-details-div',
      'method' => 'replace',
      'effect' => 'fade',
    ),  
  );
$form['details'] = array(
       '#type' => 'container',
       '#prefix' => '<div id="item-details-div">',
       '#suffix' => '</div>',);  
$form['details']['text'] = array(
       '#type' => 'textfield',
       '#description' => t('This field value is set after tableselect change.'),
       '#value' => $data[$selected_id]['text'],
    );  
$form['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Submit'),
);  

  return $form;
 }
function _pilates_test_dropdown_form_submit($form, &$form_state) { 
    dpm($form_state);  
}
function _pilates_test_dropdown_form_validate($form, &$form_state) {
  // already failed some checks ?  
  if (form_get_errors()) {
      return; 
  } 
  dpm($form_state);
}
function _pilates_test_dropdown_ajax_callback($form, $form_state) {
 return $form['details'];
}

1 Ответ

0 голосов
/ 07 мая 2018

Вы не должны использовать #value для этого элемента. Попробуйте это:

$form['details'] = array(
  '#type' => 'container',
  '#prefix' => '<div id="item-details-div">',
  '#suffix' => '</div>',);

$form['details']['text'] = array(
  '#type' => 'textfield',
  '#description' => t('This field value is set after tableselect change.'),
  '#default_value' => $data[$selected_id]['text'],
);

if (!empty($form_state['triggering_element'])) {
  if ($form_state['triggering_element']['#name'] == 'selected_id') {
    $form_state['input']['text'] = $data[$selected_id]['text'];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...