Если вы посмотрите на код 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;}
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.}}
Я думаю, потому что мог быть модуль, который устанавливает идентификатор узла для нового узла.
kiamlaluno
лучше использовать !empty($node->is_new)как isset($node->is_new)возврат, TRUEесли он установлен в FALSE.
bloke_zero
@bloke_zero Я беру Drupal, не ожидая, что он будет установлен в FALSE. Действительно, если есть некоторые плохие модули, которые устанавливают его FALSEвместо того, чтобы сбрасывать его, лучше соответствующим образом изменить код.
kiamlaluno
12
Да, вы должны проверить, существует ли идентификатор узла или нет.
!empty($node->is_new)
какisset($node->is_new)
возврат,TRUE
если он установлен вFALSE
.FALSE
. Действительно, если есть некоторые плохие модули, которые устанавливают егоFALSE
вместо того, чтобы сбрасывать его, лучше соответствующим образом изменить код.Да, вы должны проверить, существует ли идентификатор узла или нет.
источник
источник
В Drupal 8 вам понадобится
form_id
переменная, и она будет отличаться в каждом случае, и она будет включать_edit_
в себя, если мы редактируем узелисточник
->isNew()
см. Drupal.stackexchange.com/a/223234/15055