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'

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

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


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.