Perbedaan antara buat simpul baru dan edit dalam bentuk ubah

24

Saya memiliki bagian ubah untuk jenis konten tertentu. Dalam formulir ubah, bagaimana saya bisa mengetahui apakah itu membuat formulir baru atau mengedit formulir ?

Dengan dsm ($ form) dari alter saya bisa mendapatkan hasil dengan beberapa perbedaan di antara mereka. Apa cara terbaik untuk membedakan mereka dari satu sama lain?

apakah ini cara yang baik?

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

Jawaban:

61

Jika Anda melihat kode node_object_prepare () , yang dipanggil dari node_form () (pembangun formulir untuk node edit / buat formulir), Anda akan melihatnya berisi kode berikut:

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

Dalam implementasi hook_form_BASE_FORM_ID_alter () , cukup menggunakan kode yang mirip dengan yang berikut.

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

Jika simpul baru, maka formulir tersebut membuat simpul; jika node tersebut bukan baru, maka formnya sedang mengedit node yang sudah ada.

Dalam Drupal 8, setiap kelas yang mengimplementasikan EntityInterface(termasuk Nodekelas) mengimplementasikan EntityInterface::isNew()metode. Memeriksa apakah sebuah simpul baru menjadi semudah menelepon $node->isNew(). Karena dalam Drupal 8 tidak ada $form_state['node']lagi, kode menjadi sebagai berikut:

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
sumber
Mengapa kedua kondisi tersebut dibutuhkan?
digitgopher
Karena mungkin ada modul yang mengatur ID simpul untuk simpul baru, saya kira.
kiamlaluno
lebih baik digunakan !empty($node->is_new)sebagai isset($node->is_new)pengembalian TRUEjika diatur ke FALSE.
bloke_zero
@bloke_zero Saya mengambil Drupal tidak mengharapkannya diatur ke FALSE. Memang, jika ada beberapa modul buruk yang mengaturnya FALSEalih-alih membukanya, lebih baik mengubah kode.
kiamlaluno
12

Ya, Anda harus memeriksa apakah ID simpul ada atau tidak.

Tareq Assaf
sumber
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
sumber
1

Dalam Drupal 8 Anda akan memerlukan form_idvariabel dan itu akan berbeda pada setiap kasus dan itu akan termasuk _edit_di dalamnya jika kita mengedit simpul

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
sumber
Atau ->isNew(), lihat drupal.stackexchange.com/a/223234/15055
leymannx