alterの新規作成ノードと編集ノードの違い


24

特定のコンテンツタイプの変更セクションがあります。フォームを変更して、新しいフォームを作成するのか、フォームを編集するのかを確認するにはどうすればよいですか?

alterから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を設定するモジュールが存在する可能性があるため、推測します。
キアムルノ

に設定されている場合!empty($node->is_new)isset($node->is_new)戻り値として使用する方が適切です。TRUEFALSE
bloke_zero

@bloke_zero Drupalがに設定されることを期待していませんFALSE。実際、設定FALSEを解除するのではなく設定する不良モジュールがいくつかある場合は、それに応じてコードを変更することをお勧めします。
キアムルノ


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

または->isNew()drupal.stackexchange.com
a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.