在表单alter中创建new和edit节点之间的区别


24

我有一个特定内容类型的更改部分。在表单alter中,如何确定它是创建新表单还是编辑表单

使用来自alter的dsm($ form)可以得到结果,它们之间存在一些差异。区别彼此的最佳方法是什么?

这是个好方法吗?

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

Answers:


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中,每个实现EntityInterfaceNode类(包括该类)都实现该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 2015年

我想是因为可能会有一个模块为新节点设置节点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
    }
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.