it-swarm-eu.dev

Prvek formuláře #default_value a AJAX

Po volání AJAX) nemůžu získat formulář pro zobrazení (výchozí?) Hodnoty. Používám následující kód:

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;
  }
}

Jak to chápu, měl by se formulář automaticky pokusit zobrazit hodnotu, pokud je nastavena v $ form_state. Když je zpětné volání provedeno a formulář je vytvořen, $ form_state ['hodnoty'] ['description'] je hodnota nastavená v foo_form_submit. Nic se však nezobrazuje.

5
Bart

Podobné problémy jsem zažil zejména u textových polí, zaškrtávacích políček a rádií. Řešení, které jsem našel (a nemůžu zaručit, že je „správným“ řešením), je změnit $form_state['input'][VARIABLE] pole. Proveďte to ve funkci ověření:

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

Vím, že je pozdě, ale pro lidi, jako jsem já, kteří stále mají podobné problémy s ajaxem a formami v Drupalu, jsem to vyřešil takto. Ve vaší funkci zpětného volání ajax musíte namísto vrácení pouze renderovacího pole zavolat funkci form_builder () a vrátit její výsledek. Např. Můj kód vypadá takto:

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

tato chyba existuje dokonce v drupal 8 a je prezentována ZDE .

nejjednodušším jednoduchým řešením je odebrání input hodnoty prvku formuláře ve funkci tvůrce formulářů před vytvořením tohoto prvku:

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

Další řešení:

v některých případech, kdy k tomuto prvku není připojeno žádné zpracování události skriptu Java skriptovací událost skriptu, můžete mít pro prvek jiný název, takže input nepřekáží v cestě, například:

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

a uložte jméno do $form pro pozdější použití (při ověření, odeslání, ...):

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

díky, tento kód funguje pro mě, metoda input funguje pro mě ...

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