ความแตกต่างระหว่างการสร้างใหม่และโหนดแก้ไขในการเปลี่ยนแปลงรูปแบบ


24

ฉันมีส่วนแก้ไขสำหรับเนื้อหาบางประเภท ในแบบฟอร์มแก้ไขฉันจะทราบได้อย่างไรว่ามีการสร้างฟอร์มใหม่หรือแก้ไขฟอร์มหรือไม่

ด้วย dsm ($ form) จากการเปลี่ยนแปลงฉันสามารถรับผลลัพธ์ที่มีความแตกต่างระหว่างพวกเขา อะไรคือวิธีที่ดีที่สุดในการแยกความแตกต่างจากสิ่งอื่น

นี่เป็นวิธีที่ดีหรือไม่?

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

คำตอบ:


61

หากคุณดูที่รหัสของnode_object_prepare ()ซึ่งถูกเรียกจากnode_form () (ตัวสร้างฟอร์มสำหรับโหนดแก้ไข / สร้างฟอร์ม) คุณจะเห็นว่ามีรหัสต่อไปนี้:

  // 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 ()มันก็เพียงพอที่จะใช้รหัสที่คล้ายกับรหัสต่อไปนี้

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

ถ้าโหนดนั้นใหม่แล้วฟอร์มกำลังสร้างโหนด หากโหนดนั้นไม่ใช่ของใหม่ฟอร์มจะแก้ไขโหนดที่มีอยู่

ใน Drupal 8 การใช้งานทุกคลาสEntityInterface(ซึ่งรวมถึงNodeคลาสด้วย) ใช้EntityInterface::isNew()วิธีการ การตรวจสอบว่าโหนดใหม่กลายเป็นเรื่องง่ายเหมือนการโทร$node->isNew()หรือไม่ ตั้งแต่ใน Drupal 8 ไม่มี$form_state['node']อีกต่อไปรหัสกลายเป็นดังต่อไปนี้:

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

ทำไมทั้งสองเงื่อนไขจึงจำเป็น?
digitgopher

เนื่องจากอาจมีโมดูลที่ตั้งค่า ID โหนดสำหรับโหนดใหม่ฉันเดา
kiamlaluno

ดีกว่าที่จะใช้!empty($node->is_new)เป็นisset($node->is_new)ผลตอบแทนถ้ามีการตั้งค่าTRUE FALSE
bloke_zero

@bloke_zero ผมใช้ Drupal FALSEไม่ได้คาดหวังว่ามันจะได้รับการตั้งค่าให้ แน่นอนถ้ามีบางโมดูลที่ไม่ดีที่ตั้งค่าเป็นFALSEแทนที่จะยกเลิกการตั้งค่ามันจะเป็นการดีกว่าที่จะเปลี่ยนรหัสให้สอดคล้องกัน
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

ในDrupal 8คุณจะต้องใช้form_idตัวแปรและมันจะแตกต่างกันในแต่ละกรณีและมันจะรวมไว้_edit_ในนั้นถ้าเราแก้ไขโหนด

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.