it-swarm-ko.tech

양식 요소 #default_value 및 AJAX

AJAX 호출 후 (기본값?) 값을 표시하는 양식을 얻을 수 없습니다. 다음 코드를 사용하고 있습니다.

function foo_form ($form, &$form_state, $foo) {

  $form['#prefix'] = '<div id="foo-form-wrapper">';
  $form['#suffix'] = '</div>';

  $form['copy'] = array(
    '#type' => 'submit',
    '#value' => t('Copy foo'),
    '#limit_validation_errors' => array(),
    // #submit is required to use #limit_validation_errors
    '#submit' => array('foo_form_submit'),
    '#ajax' => array(
      'wrapper' => 'foo-form-wrapper',
      'callback' => 'foo_form_callback',
    ),
  );

  $form['description'] = array(
    '#type' => 'textarea',
    '#title' => t('Short description'),
    '#required' => TRUE,
    '#maxlength' => 255,
    '#default_value' => $foo->description,
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );

  return $form;
}

function foo_form_callback($form, $form_state) {
  return $form;
}

function foo_form_submit ($form, &$form_state) {
  if (!isset($form_state['triggering_element']['#ajax'])) {
    $foo = (object)$form_state['values'];

    entity_get_controller('foo')->save($foo);

    $form_state['redirect'] = 'admin/foo';
    return;
  } else {
    form_set_value($form['description'], 'description text', $form_state);
    $form_state['rebuild'] = true;
  }
}

내가 이해하는 것처럼 양식은 $ form_state에 설정된 경우 자동으로 값을 표시하려고합니다. 콜백이 실행되고 양식이 작성되면 $ form_state [ 'values'] [ 'description']은 foo_form_submit에 설정된 값입니다. 그러나 아무것도 표시되지 않습니다.

5
Bart

특히 텍스트 필드, 확인란 및 라디오에서 비슷한 문제가 발생했습니다. 내가 찾은 해결책 (그리고 "올바른"해결책이라고 보장 할 수 없음)은 $form_state['input'][VARIABLE] 들. 유효성 검증 기능에서이를 수행하십시오.

function foo_form_validate ($form, &$form_state) {
  // this will take a entered value from one element and make it display in another
  $form_state['input']['some_value_to_change'] = $form_state['values']['another_element'];
}
1
John House

나는 이것이 늦었다는 것을 알고 있지만 Drupal의 아약스와 양식에 여전히 비슷한 문제가있는 사람들을 위해 이것을 수정 한 방법이 있습니다. ajax 콜백 함수에서 렌더 배열 만 반환하는 대신 form_builder () 함수를 호출하고 결과를 반환해야합니다. 예를 들어, 내 코드는 다음과 같습니다.

function inventory_purchase_item_add_ajax(&$form, &$form_state) {
    //...

    unset($form_state['input']['line']);
    unset($form_state['values']['line']);

    //Update the form's lines array
    $lines = update_inventory_purchase_form_lines($form_state['node']->line, $purchase_item_count);
    $form['vtab1']['purchase']['items_wrapper']['line'] = $lines;
    return form_builder($form['#id'], $lines, $form_state);
}
4
Anand kumar

이 버그는 drupal 8)에도 존재하며 여기 로 표시됩니다.

가장 간단한 해결책은 해당 요소를 작성하기 전에 양식 작성기 함수에서 양식 요소의 input 값을 제거하는 것입니다.

unset($form_state['input']['description']);
$form['description'] = array(
    '#type' => 'textarea',
    '#title' => t('Short description'),
    '#required' => TRUE,
    '#maxlength' => 255,
    '#default_value' => $foo->description,
 );

다른 해결책 :

Java 해당 요소에 첨부 된 스크립트 이벤트 핸들러가없는 경우) 요소의 이름이 다를 수 있으므로 input가 방해가되지 않습니다. 예 :

$name='description_'.Rand();
$form[$name] = array(
    '#type' => 'textarea',
    '#title' => t('Short description'),
    '#required' => TRUE,
    '#maxlength' => 255,
    '#default_value' => $foo->description,
 );

나중에 사용할 수 있도록 이름을 $form에 저장하십시오 (유효성 검사, 제출 등).

$form['a_unique_name']=$name;
3
sepehr

고마워,이 코드는 나를 위해 작동 input 방법은 나를 위해 작동 ...

if (isset($form_state['values']['task-name'])) {
  $form_state['input']['task-description'] = show_task_description($form_state['values']['task-name']);
}

enter image description here

0
Sibin Xavier