Answers:
如果你看的代码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.
}
}
!empty($node->is_new)
作为isset($node->is_new)
回报TRUE
,如果它被设置为FALSE
。
FALSE
。确实,如果有一些错误的模块将其设置为FALSE
而不是取消设置,则最好随便更改代码。
是的,您必须检查节点ID是否存在。
在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/223234/15055