Różnica między tworzeniem nowego i edytowaniem węzła w formie zmiany


24

Mam sekcję zmian dla określonego typu treści. W formularzu zmień, jak mogę dowiedzieć się, czy jest to nowy formularz, czy edycja formularza ?

Z dsm ($ form) w alter mogę uzyskać wyniki z kilkoma różnicami między nimi. Jak najlepiej odróżnić je od siebie?

czy to dobry sposób?

    if(isset($form['nid']['#value']))
     'means in edit form'
    else 
     'means in create new from'

Odpowiedzi:


61

Jeśli spojrzysz na kod node_object_prepare () , który jest wywoływany z node_form () (konstruktora formularzy do edycji / tworzenia węzłów), zobaczysz, że zawiera on następujący kod:

  // If this is a new node, fill in the default values.
  if (!isset($node->nid) || isset($node->is_new)) {
    foreach (array('status', 'promote', 'sticky') as $key) {
      // Multistep node forms might have filled in something already.
      if (!isset($node->$key)) {
        $node->$key = (int) in_array($key, $node_options);
      }
    }
    global $user;
    $node->uid = $user->uid;
    $node->created = REQUEST_TIME;
  }

W implementacji hook_form_BASE_FORM_ID_alter () wystarczy użyć kodu podobnego do poniższego.

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state['node'];

  if (!isset($node->nid) || isset($node->is_new)) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}

Jeśli węzeł jest nowy, wówczas formularz tworzy węzeł; jeśli węzeł nie jest nowy, formularz edytuje istniejący węzeł.

W Drupal 8 każda implementacja klasy EntityInterface(która obejmuje Nodeklasę) implementuje EntityInterface::isNew()metodę. Sprawdzanie, czy węzeł jest nowy, staje się tak proste, jak dzwonienie $node->isNew(). Ponieważ w Drupal 8 nie ma $form_state['node']już tego kodu, kod wygląda następująco:

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state->getFormObject()->getEntity();

  if ($node->isNew()) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}

Dlaczego oba warunki są potrzebne?
digitgopher

Ponieważ może istnieć moduł, który ustawia identyfikator węzła dla nowego węzła.
kiamlaluno

lepiej użyć !empty($node->is_new)jako isset($node->is_new)zwrotów, TRUEjeśli jest ustawiony na FALSE.
bloke_zero

@bloke_zero Biorę, że Drupal nie oczekuje, że zostanie ustawiony na FALSE. Rzeczywiście, jeśli istnieją złe moduły, które ustawiają go na FALSEzamiast go wyłączać, lepiej odpowiednio zmienić kod.
kiamlaluno


4
/**
 * Implementation of hook_form_alter().
 */
function MY_MODULE_form_alter(&$form, $form_state, $form_id) {
  if ($form['#node'] && $form['#node']->type .'_node_form' === $form_id) {
    // Is node form.

    if ($form['#node']->nid) {
      // Is node edit form.
    }
  }
}

1

W Drupal 8 będziesz potrzebować form_idzmiennej, która będzie różna w każdym przypadku i będzie zawierać _edit_ją, jeśli edytujemy węzeł

function MODULENAME_form_alter(&$form, &$form_state, $form_id) { 
    if($form_id == '"node_article_edit_form"'){
        //edit form
    }
    if($form_id == 'node_article_form') {
        //create form
    }
}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.