getOwner()) { $this->setOwnerId(\Drupal::currentUser()->id()); } // If no revision author has been set explicitly, make the node owner the // revision author. if (!$this->getRevisionAuthor()) { $this->setRevisionAuthorId($this->getOwnerId()); } } /** * {@inheritdoc} */ public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record) { parent::preSaveRevision($storage, $record); if (!$this->isNewRevision() && isset($this->original) && (!isset($record->revision_log) || $record->revision_log === '')) { // If we are updating an existing node without adding a new revision, we // need to make sure $entity->revision_log is reset whenever it is empty. // Therefore, this code allows us to avoid clobbering an existing log // entry with an empty one. $record->revision_log = $this->original->revision_log->value; } } /** * {@inheritdoc} */ public function postSave(EntityStorageInterface $storage, $update = TRUE) { parent::postSave($storage, $update); // Update the node access table for this node, but only if it is the // default revision. There's no need to delete existing records if the node // is new. if ($this->isDefaultRevision()) { \Drupal::entityManager()->getAccessControlHandler('node')->writeGrants($this, $update); } // Reindex the node when it is updated. The node is automatically indexed // when it is added, simply by being added to the node table. if ($update) { node_reindex_node_search($this->id()); } } /** * {@inheritdoc} */ public static function preDelete(EntityStorageInterface $storage, array $entities) { parent::preDelete($storage, $entities); // Ensure that all nodes deleted are removed from the search index. if (\Drupal::moduleHandler()->moduleExists('search')) { foreach ($entities as $entity) { search_index_clear('node_search', $entity->nid->value); } } } /** * {@inheritdoc} */ public static function postDelete(EntityStorageInterface $storage, array $nodes) { parent::postDelete($storage, $nodes); \Drupal::service('node.grant_storage')->deleteNodeRecords(array_keys($nodes)); } /** * {@inheritdoc} */ public function getType() { return $this->bundle(); } /** * {@inheritdoc} */ public function access($operation = 'view', AccountInterface $account = NULL, $return_as_object = FALSE) { if ($operation == 'create') { return parent::access($operation, $account, $return_as_object); } return \Drupal::entityManager() ->getAccessControlHandler($this->entityTypeId) ->access($this, $operation, $this->prepareLangcode(), $account, $return_as_object); } /** * {@inheritdoc} */ public function prepareLangcode() { $langcode = $this->language()->getId(); // If the Language module is enabled, try to use the language from content // negotiation. if (\Drupal::moduleHandler()->moduleExists('language')) { // Load languages the node exists in. $node_translations = $this->getTranslationLanguages(); // Load the language from content negotiation. $content_negotiation_langcode = \Drupal::languageManager()->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId(); // If there is a translation available, use it. if (isset($node_translations[$content_negotiation_langcode])) { $langcode = $content_negotiation_langcode; } } return $langcode; } /** * {@inheritdoc} */ public function getTitle() { return $this->get('title')->value; } /** * {@inheritdoc} */ public function setTitle($title) { $this->set('title', $title); return $this; } /** * {@inheritdoc} */ public function getCreatedTime() { return $this->get('created')->value; } /** * {@inheritdoc} */ public function setCreatedTime($timestamp) { $this->set('created', $timestamp); return $this; } /** * {@inheritdoc} */ public function getChangedTime() { return $this->get('changed')->value; } /** * {@inheritdoc} */ public function isPromoted() { return (bool) $this->get('promote')->value; } /** * {@inheritdoc} */ public function setPromoted($promoted) { $this->set('promote', $promoted ? NODE_PROMOTED : NODE_NOT_PROMOTED); return $this; } /** * {@inheritdoc} */ public function isSticky() { return (bool) $this->get('sticky')->value; } /** * {@inheritdoc} */ public function setSticky($sticky) { $this->set('sticky', $sticky ? NODE_STICKY : NODE_NOT_STICKY); return $this; } /** * {@inheritdoc} */ public function isPublished() { return (bool) $this->get('status')->value; } /** * {@inheritdoc} */ public function setPublished($published) { $this->set('status', $published ? NODE_PUBLISHED : NODE_NOT_PUBLISHED); return $this; } /** * {@inheritdoc} */ public function getOwner() { return $this->get('uid')->entity; } /** * {@inheritdoc} */ public function getOwnerId() { return $this->get('uid')->target_id; } /** * {@inheritdoc} */ public function setOwnerId($uid) { $this->set('uid', $uid); return $this; } /** * {@inheritdoc} */ public function setOwner(UserInterface $account) { $this->set('uid', $account->id()); return $this; } /** * {@inheritdoc} */ public function getRevisionCreationTime() { return $this->get('revision_timestamp')->value; } /** * {@inheritdoc} */ public function setRevisionCreationTime($timestamp) { $this->set('revision_timestamp', $timestamp); return $this; } /** * {@inheritdoc} */ public function getRevisionAuthor() { return $this->get('revision_uid')->entity; } /** * {@inheritdoc} */ public function setRevisionAuthorId($uid) { $this->set('revision_uid', $uid); return $this; } /** * {@inheritdoc} */ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields['nid'] = BaseFieldDefinition::create('integer') ->setLabel(t('Node ID')) ->setDescription(t('The node ID.')) ->setReadOnly(TRUE) ->setSetting('unsigned', TRUE); $fields['uuid'] = BaseFieldDefinition::create('uuid') ->setLabel(t('UUID')) ->setDescription(t('The node UUID.')) ->setReadOnly(TRUE); $fields['vid'] = BaseFieldDefinition::create('integer') ->setLabel(t('Revision ID')) ->setDescription(t('The node revision ID.')) ->setReadOnly(TRUE) ->setSetting('unsigned', TRUE); $fields['type'] = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Type')) ->setDescription(t('The node type.')) ->setSetting('target_type', 'node_type') ->setReadOnly(TRUE); $fields['langcode'] = BaseFieldDefinition::create('language') ->setLabel(t('Language')) ->setDescription(t('The node language code.')) ->setRevisionable(TRUE) ->setDisplayOptions('view', array( 'type' => 'hidden', )) ->setDisplayOptions('form', array( 'type' => 'language_select', 'weight' => 2, )); $fields['title'] = BaseFieldDefinition::create('string') ->setLabel(t('Title')) ->setDescription(t('The title of this node, always treated as non-markup plain text.')) ->setRequired(TRUE) ->setTranslatable(TRUE) ->setRevisionable(TRUE) ->setDefaultValue('') ->setSetting('max_length', 255) ->setDisplayOptions('view', array( 'label' => 'hidden', 'type' => 'string', 'weight' => -5, )) ->setDisplayOptions('form', array( 'type' => 'string_textfield', 'weight' => -5, )) ->setDisplayConfigurable('form', TRUE); $fields['uid'] = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Authored by')) ->setDescription(t('The user ID of the node author.')) ->setRevisionable(TRUE) ->setSetting('target_type', 'user') ->setSetting('handler', 'default') ->setDefaultValueCallback('Drupal\node\Entity\Node::getCurrentUserId') ->setTranslatable(TRUE) ->setDisplayOptions('view', array( 'label' => 'hidden', 'type' => 'author', 'weight' => 0, )) ->setDisplayOptions('form', array( 'type' => 'entity_reference_autocomplete', 'weight' => 5, 'settings' => array( 'match_operator' => 'CONTAINS', 'size' => '60', 'autocomplete_type' => 'tags', 'placeholder' => '', ), )) ->setDisplayConfigurable('form', TRUE); $fields['status'] = BaseFieldDefinition::create('boolean') ->setLabel(t('Publishing status')) ->setDescription(t('A boolean indicating whether the node is published.')) ->setRevisionable(TRUE) ->setTranslatable(TRUE) ->setDefaultValue(TRUE); $fields['created'] = BaseFieldDefinition::create('created') ->setLabel(t('Authored on')) ->setDescription(t('The time that the node was created.')) ->setRevisionable(TRUE) ->setTranslatable(TRUE) ->setDisplayOptions('view', array( 'label' => 'hidden', 'type' => 'timestamp', 'weight' => 0, )) ->setDisplayOptions('form', array( 'type' => 'datetime_timestamp', 'weight' => 10, )) ->setDisplayConfigurable('form', TRUE); $fields['changed'] = BaseFieldDefinition::create('changed') ->setLabel(t('Changed')) ->setDescription(t('The time that the node was last edited.')) ->setRevisionable(TRUE) ->setTranslatable(TRUE); $fields['promote'] = BaseFieldDefinition::create('boolean') ->setLabel(t('Promote')) ->setDescription(t('A boolean indicating whether the node should be displayed on the front page.')) ->setRevisionable(TRUE) ->setTranslatable(TRUE) ->setDefaultValue(TRUE) ->setDisplayOptions('form', array( 'type' => 'boolean_checkbox', 'settings' => array( 'display_label' => TRUE, ), 'weight' => 15, )) ->setDisplayConfigurable('form', TRUE); $fields['sticky'] = BaseFieldDefinition::create('boolean') ->setLabel(t('Sticky')) ->setDescription(t('A boolean indicating whether the node should be displayed at the top of lists in which it appears.')) ->setRevisionable(TRUE) ->setTranslatable(TRUE) ->setDisplayOptions('form', array( 'type' => 'boolean_checkbox', 'settings' => array( 'display_label' => TRUE, ), 'weight' => 16, )) ->setDisplayConfigurable('form', TRUE); $fields['revision_timestamp'] = BaseFieldDefinition::create('created') ->setLabel(t('Revision timestamp')) ->setDescription(t('The time that the current revision was created.')) ->setQueryable(FALSE) ->setRevisionable(TRUE); $fields['revision_uid'] = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Revision user ID')) ->setDescription(t('The user ID of the author of the current revision.')) ->setSetting('target_type', 'user') ->setQueryable(FALSE) ->setRevisionable(TRUE); $fields['revision_log'] = BaseFieldDefinition::create('string_long') ->setLabel(t('Revision log message')) ->setDescription(t('Briefly describe the changes you have made.')) ->setRevisionable(TRUE) ->setTranslatable(TRUE) ->setDisplayOptions('form', array( 'type' => 'string_textarea', 'weight' => 25, 'settings' => array( 'rows' => 4, ), )); return $fields; } /** * Default value callback for 'uid' base field definition. * * @see ::baseFieldDefinitions() * * @return array * An array of default values. */ public static function getCurrentUserId() { return array(\Drupal::currentUser()->id()); } }