it-swarm-eu.dev

Obnovit formulář uzlu po AJAX odeslání)

V bloku mám tvar uzlu, který je odeslán pomocí AJAX.

Vytvořil jsem vlastní zpětné volání, protože pokud bylo odeslání úspěšné, přidávám vytvořený uzel na stránku.

Nyní chci obnovit tvar uzlu na výchozí hodnoty. Nějaké nápady, jak toho dosáhnout?

Aktualizace: Podařilo se mi nahradit formulář tím, že jsem se podíval na to, jak funguje node_add ().

$new_node = (object) array(
  'uid' => $user->uid,
  'name' => (isset($user->name) ? $user->name : ''),
  'type' => 'node_type',
  'language' => LANGUAGE_NONE,
);

A pak nahradím celý formulář návratovou hodnotou z drupal_render(drupal_get_form('node_form', $new_node));

Formulář bude nahrazen tak, jak by měl být, kromě toho, že některé idy se liší. Když však odešlu nový formulář, zobrazí se mi výstražné okno javascriptu s celým obsahem nové stránky. Z HTML vidím, že je to stránka uzlu, který byl vytvořen. Předpokládám, že zpětné volání AJAX zpětné volání bude přesměrováno na nový uzel, ale nevím proč).

Nějaké stopy?

5
Olof Johansson

Mám to!

Hlavním problémem bylo, že nový formulář byl načten z mezipaměti verze předchozího odeslaného formuláře.

To je to, co jsem dostal v mém AJAX zpětném volání:

$new_form_state = array();
$new_form_state['build_info']['args'][] = (object) array(
  'uid' => $user->uid,
  'name' => (isset($user->name) ? $user->name : ''),
  'type' => 'node_type',
  'language' => LANGUAGE_NONE,
);
$new_form_state['no_redirect'] = TRUE;
$new_form_state['input'] = array();
$new_form = drupal_build_form('node_type_node_form', $new_form_state);
$commands[] = ajax_command_replace('#node-type-node-form', drupal_render($new_form));

The $new_form_state['no_redirect'] = TRUE; zabraňuje přesměrování a prázdné pole v $new_form_state['input'] zabraňuje načtení formuláře z mezipaměti.

@googletorp, děkuji za pomoc!

7
Olof Johansson

Pokud používáte Drupal 7, můžete zrušit form_state['values'] a znovu vytvořte formulář, který by měl fungovat (netestováno).

Alternativním řešením by bylo vydat příkazy ajax a aktualizovat formulář s výchozími hodnotami získanými z definice formuláře.

3
googletorp

Mám stejný úkol. Node přidat formulář musí být zaúčtován přes AJAX. Po úspěšném vytvoření uzlu - formulář musí být připraven k přidání dalšího uzlu (tj. Všechna pole formuláře musí být prázdná). Pokud není formulář ověřen - musí být být uživateli znovu zobrazen, aby mu umožnil opravit chyby.

To je moje řešení

function MY_MODULE_form_CONTENT_TYPE_node_form_alter(&$form, &$form_state, $form_id) {

  $form['actions']['submit']['#ajax'] = array(
    'wrapper' => $form_state['node']->type . '-node-form',
    'callback' => 'MY_MODULE_node_add_callback',
    'method' => 'replace',
    'effect' => 'fade',
  );

  // We can have several forms on one page.
  // This id must be unique, because ajax behavior is attached using it.
  $form['actions']['submit']['#id'] = 'edit-submit-' . $form_state['node']->type . '-ajax';
}

function MY_MODULE_node_add_callback($form, &$form_state) {

  $node = $form_state['node'];

  if (!empty($node->nid)) {

    // Node is created successfully.
    // Return the same from but with empty fields.
    $new_node = (object) array(
      'uid' => $node->uid,
      'name' => $node->name,
      'type' => $node->type,
      'language' => $node->language,
    );

    $new_form_state = array();
    $new_form_state['build_info']['args'] = array($new_node);
    $new_form_state['values'] = array();
    $new_form_state['method'] = $form_state['method'];

    form_load_include($new_form_state, 'inc', 'node', 'node.pages');

    return drupal_rebuild_form($node->type . '_node_form', $new_form_state);
  }
  else {

    // Node is not created because of validation fail.
    // Return current form so user can continue editing and fix errors.
    return $form;
  }
}
2
Eugene Fidelin
0
Igor Rodinov