Form değiştirici yeni yaratma ve düzenleme düğümü arasındaki fark


24

Belirli bir içerik türü için değiştirici bir bölüm var. Değişen formda yeni form yaratıp yaratmadığını veya form düzenlediğini nasıl öğrenebilirim ?

Dsm ($ form) değiştirici ile aralarında çeşitli farklılıklar bulunan sonuçlar alabilirim. Bunları birbirinden ayırmanın en iyi yolu nedir?

bu iyi bir yol mu?

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

Yanıtlar:


61

Eğer koduna baktığımızda node_object_prepare () çağrılır, node_form () (düğüm düzenlemek için form oluşturucu / form oluşturmak), bunu aşağıdaki kodu içeren göreceksiniz:

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

Hook_form_BASE_FORM_ID_alter () uygulamasında , aşağıdakine benzer bir kod kullanılması yeterlidir.

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

Eğer düğüm yeniyse, form bir düğüm yaratıyordur; düğüm yeni değilse, o zaman form varolan bir düğümü düzenliyordur.

Drupal 8'de, uygulayan her sınıf EntityInterface( Nodesınıfı içeren ) EntityInterface::isNew()yöntemi uygular . Bir düğümün yeni olup olmadığını kontrol etmek, aramak kadar kolay olur $node->isNew(). Drupal 8'de $form_state['node']artık bulunmadığından, kod şu şekilde olur:

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

Her iki koşul da neden gerekli?
digitgopher

Yeni düğüm için düğüm kimliğini ayarlayan bir modül olabileceğinden, sanırım.
kiamlaluno

Daha iyi kullanmak !empty($node->is_new)olarak isset($node->is_new)geri döner TRUEeğer 's seti için FALSE.
bloke_zero

@ bloke_zero Drupal 'a ayarlanmasını beklemiyorum FALSE. Aslında, onu ayarlamak FALSEyerine ayarlamak için ayarlanmış bazı kötü modüller varsa , kodu uygun şekilde değiştirmek daha iyidir.
kiamlaluno

12

Evet, düğüm kimliğinin olup olmadığını kontrol etmeniz gerekir.


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

In Drupal 8 ihtiyacınız olacak form_iddeğişken ve her durumda farklı olacaktır ve içereceğini _edit_bir düğüm düzenleme eğer onun içinde

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.