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'
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;}
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.}}
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.
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}}
!empty($node->is_new)
sebagaiisset($node->is_new)
pengembalianTRUE
jika diatur keFALSE
.FALSE
. Memang, jika ada beberapa modul buruk yang mengaturnyaFALSE
alih-alih membukanya, lebih baik mengubah kode.Ya, Anda harus memeriksa apakah ID simpul ada atau tidak.
sumber
sumber
Dalam Drupal 8 Anda akan memerlukan
form_id
variabel dan itu akan berbeda pada setiap kasus dan itu akan termasuk_edit_
di dalamnya jika kita mengedit simpulsumber
->isNew()
, lihat drupal.stackexchange.com/a/223234/15055