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'
Yusef
źródło

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.
  }
}
kiamlaluno
źródło
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
12

Tak, musisz sprawdzić, czy identyfikator węzła istnieje, czy nie.

Tareq Assaf
źródło
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.
    }
  }
}
Jekis
źródło
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
    }
}
GiorgosK
źródło
Lub ->isNew()zobacz drupal.stackexchange.com/a/223234/15055
leymannx