Sự khác biệt giữa tạo nút mới và chỉnh sửa ở dạng thay đổi


24

Tôi có một phần thay đổi cho một loại nội dung cụ thể. Trong biểu mẫu thay đổi, làm thế nào tôi có thể tìm hiểu xem nó đang tạo biểu mẫu mới hoặc biểu mẫu chỉnh sửa ?

Với dsm ($ form) trong các thay đổi, tôi có thể nhận được kết quả với một số khác biệt giữa chúng. Cách tốt nhất để phân biệt những người khác nhau là gì?

Đây có phải là một cách tốt?

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

Câu trả lời:


61

Nếu bạn nhìn vào mã của node_object_prepare () , được gọi từ node_form () (trình tạo biểu mẫu cho nút chỉnh sửa / tạo biểu mẫu nút), bạn sẽ thấy nó chứa mã sau:

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

Khi triển khai hook_form_BASE_FORM_ID_alter () , việc sử dụng mã tương tự như sau là đủ.

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

Nếu nút là mới, thì biểu mẫu đang tạo một nút; nếu nút không phải là mới, thì biểu mẫu đang chỉnh sửa một nút hiện có.

Trong Drupal 8, mọi lớp thực hiện EntityInterface(bao gồm cả Nodelớp) đều thực hiện EntityInterface::isNew()phương thức. Kiểm tra nếu một nút là mới trở nên dễ dàng như gọi $node->isNew(). Vì trong Drupal 8 không $form_state['node']còn nữa, mã trở thành như sau:

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

Tại sao cả hai điều kiện cần thiết?
chữ số

Bởi vì có thể có một mô-đun đặt ID nút cho nút mới, tôi đoán vậy.
kiamlaluno

tốt hơn để sử dụng !empty($node->is_new)như isset($node->is_new)trả về TRUEnếu nó được đặt thành FALSE.
bloke_zero

@bloke_zero Tôi dùng Drupal không mong đợi nó được đặt thành FALSE. Thật vậy, nếu có một số mô-đun xấu đặt nó FALSEthay vì bỏ đặt nó, tốt hơn là thay đổi mã một cách hợp lý.
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

Trong Drupal 8, bạn sẽ cần form_idbiến và nó sẽ khác nhau ở mỗi trường hợp và nó sẽ bao gồm _edit_trong đó nếu chúng ta đang chỉnh sửa một nút

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.