/core/modules/node/src/Entity/Node.php
PHP | 397 lines | 196 code | 40 blank | 161 comment | 9 complexity | cf6efd1ae8b35ed3c555e8952900dda0 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
- <?php
- namespace Drupal\node\Entity;
- use Drupal\Core\Entity\EditorialContentEntityBase;
- use Drupal\Core\Entity\EntityStorageInterface;
- use Drupal\Core\Entity\EntityTypeInterface;
- use Drupal\Core\Field\BaseFieldDefinition;
- use Drupal\Core\Session\AccountInterface;
- use Drupal\node\NodeInterface;
- use Drupal\user\EntityOwnerTrait;
- /**
- * Defines the node entity class.
- *
- * @ContentEntityType(
- * id = "node",
- * label = @Translation("Content"),
- * label_collection = @Translation("Content"),
- * label_singular = @Translation("content item"),
- * label_plural = @Translation("content items"),
- * label_count = @PluralTranslation(
- * singular = "@count content item",
- * plural = "@count content items"
- * ),
- * bundle_label = @Translation("Content type"),
- * handlers = {
- * "storage" = "Drupal\node\NodeStorage",
- * "storage_schema" = "Drupal\node\NodeStorageSchema",
- * "view_builder" = "Drupal\node\NodeViewBuilder",
- * "access" = "Drupal\node\NodeAccessControlHandler",
- * "views_data" = "Drupal\node\NodeViewsData",
- * "form" = {
- * "default" = "Drupal\node\NodeForm",
- * "delete" = "Drupal\node\Form\NodeDeleteForm",
- * "edit" = "Drupal\node\NodeForm",
- * "delete-multiple-confirm" = "Drupal\node\Form\DeleteMultiple"
- * },
- * "route_provider" = {
- * "html" = "Drupal\node\Entity\NodeRouteProvider",
- * },
- * "list_builder" = "Drupal\node\NodeListBuilder",
- * "translation" = "Drupal\node\NodeTranslationHandler"
- * },
- * base_table = "node",
- * data_table = "node_field_data",
- * revision_table = "node_revision",
- * revision_data_table = "node_field_revision",
- * show_revision_ui = TRUE,
- * translatable = TRUE,
- * list_cache_contexts = { "user.node_grants:view" },
- * entity_keys = {
- * "id" = "nid",
- * "revision" = "vid",
- * "bundle" = "type",
- * "label" = "title",
- * "langcode" = "langcode",
- * "uuid" = "uuid",
- * "status" = "status",
- * "published" = "status",
- * "uid" = "uid",
- * "owner" = "uid",
- * },
- * revision_metadata_keys = {
- * "revision_user" = "revision_uid",
- * "revision_created" = "revision_timestamp",
- * "revision_log_message" = "revision_log"
- * },
- * bundle_entity_type = "node_type",
- * field_ui_base_route = "entity.node_type.edit_form",
- * common_reference_target = TRUE,
- * permission_granularity = "bundle",
- * links = {
- * "canonical" = "/node/{node}",
- * "delete-form" = "/node/{node}/delete",
- * "delete-multiple-form" = "/admin/content/node/delete",
- * "edit-form" = "/node/{node}/edit",
- * "version-history" = "/node/{node}/revisions",
- * "revision" = "/node/{node}/revisions/{node_revision}/view",
- * "create" = "/node",
- * }
- * )
- */
- class Node extends EditorialContentEntityBase implements NodeInterface {
- use EntityOwnerTrait;
- /**
- * Whether the node is being previewed or not.
- *
- * The variable is set to public as it will give a considerable performance
- * improvement. See https://www.drupal.org/node/2498919.
- *
- * @var true|null
- * TRUE if the node is being previewed and NULL if it is not.
- */
- public $in_preview = NULL;
- /**
- * {@inheritdoc}
- */
- public function preSave(EntityStorageInterface $storage) {
- parent::preSave($storage);
- foreach (array_keys($this->getTranslationLanguages()) as $langcode) {
- $translation = $this->getTranslation($langcode);
- // If no owner has been set explicitly, make the anonymous user the owner.
- if (!$translation->getOwner()) {
- $translation->setOwnerId(0);
- }
- }
- // If no revision author has been set explicitly, make the node owner the
- // revision author.
- if (!$this->getRevisionUser()) {
- $this->setRevisionUserId($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()) {
- /** @var \Drupal\node\NodeAccessControlHandlerInterface $access_control_handler */
- $access_control_handler = \Drupal::entityTypeManager()->getAccessControlHandler('node');
- $grants = $access_control_handler->acquireGrants($this);
- \Drupal::service('node.grant_storage')->write($this, $grants, NULL, $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::hasService('search.index')) {
- /** @var \Drupal\search\SearchIndexInterface $search_index */
- $search_index = \Drupal::service('search.index');
- 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) {
- // This override exists to set the operation to the default value "view".
- return parent::access($operation, $account, $return_as_object);
- }
- /**
- * {@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 isPromoted() {
- return (bool) $this->get('promote')->value;
- }
- /**
- * {@inheritdoc}
- */
- public function setPromoted($promoted) {
- $this->set('promote', $promoted ? NodeInterface::PROMOTED : NodeInterface::NOT_PROMOTED);
- return $this;
- }
- /**
- * {@inheritdoc}
- */
- public function isSticky() {
- return (bool) $this->get('sticky')->value;
- }
- /**
- * {@inheritdoc}
- */
- public function setSticky($sticky) {
- $this->set('sticky', $sticky ? NodeInterface::STICKY : NodeInterface::NOT_STICKY);
- return $this;
- }
- /**
- * {@inheritdoc}
- */
- public function getRevisionAuthor() {
- @trigger_error(__NAMESPACE__ . '\Node::getRevisionAuthor is deprecated in drupal:8.2.0 and is removed from drupal:9.0.0. Use \Drupal\Core\Entity\RevisionLogInterface::getRevisionUser() instead. See https://www.drupal.org/node/3069750', E_USER_DEPRECATED);
- return $this->getRevisionUser();
- }
- /**
- * {@inheritdoc}
- */
- public function setRevisionAuthorId($uid) {
- @trigger_error(__NAMESPACE__ . '\Node::setRevisionAuthorId is deprecated in drupal:8.2.0 and is removed from drupal:9.0.0. Use \Drupal\Core\Entity\RevisionLogInterface::setRevisionUserId() instead. See https://www.drupal.org/node/3069750', E_USER_DEPRECATED);
- return $this->setRevisionUserId($uid);
- }
- /**
- * {@inheritdoc}
- */
- public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
- $fields = parent::baseFieldDefinitions($entity_type);
- $fields += static::ownerBaseFieldDefinitions($entity_type);
- $fields['title'] = BaseFieldDefinition::create('string')
- ->setLabel(t('Title'))
- ->setRequired(TRUE)
- ->setTranslatable(TRUE)
- ->setRevisionable(TRUE)
- ->setSetting('max_length', 255)
- ->setDisplayOptions('view', [
- 'label' => 'hidden',
- 'type' => 'string',
- 'weight' => -5,
- ])
- ->setDisplayOptions('form', [
- 'type' => 'string_textfield',
- 'weight' => -5,
- ])
- ->setDisplayConfigurable('form', TRUE);
- $fields['uid']
- ->setLabel(t('Authored by'))
- ->setDescription(t('The username of the content author.'))
- ->setRevisionable(TRUE)
- ->setDisplayOptions('view', [
- 'label' => 'hidden',
- 'type' => 'author',
- 'weight' => 0,
- ])
- ->setDisplayOptions('form', [
- 'type' => 'entity_reference_autocomplete',
- 'weight' => 5,
- 'settings' => [
- 'match_operator' => 'CONTAINS',
- 'size' => '60',
- 'placeholder' => '',
- ],
- ])
- ->setDisplayConfigurable('form', TRUE);
- $fields['status']
- ->setDisplayOptions('form', [
- 'type' => 'boolean_checkbox',
- 'settings' => [
- 'display_label' => TRUE,
- ],
- 'weight' => 120,
- ])
- ->setDisplayConfigurable('form', 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', [
- 'label' => 'hidden',
- 'type' => 'timestamp',
- 'weight' => 0,
- ])
- ->setDisplayOptions('form', [
- '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('Promoted to front page'))
- ->setRevisionable(TRUE)
- ->setTranslatable(TRUE)
- ->setDefaultValue(TRUE)
- ->setDisplayOptions('form', [
- 'type' => 'boolean_checkbox',
- 'settings' => [
- 'display_label' => TRUE,
- ],
- 'weight' => 15,
- ])
- ->setDisplayConfigurable('form', TRUE);
- $fields['sticky'] = BaseFieldDefinition::create('boolean')
- ->setLabel(t('Sticky at top of lists'))
- ->setRevisionable(TRUE)
- ->setTranslatable(TRUE)
- ->setDefaultValue(FALSE)
- ->setDisplayOptions('form', [
- 'type' => 'boolean_checkbox',
- 'settings' => [
- 'display_label' => TRUE,
- ],
- 'weight' => 16,
- ])
- ->setDisplayConfigurable('form', TRUE);
- return $fields;
- }
- /**
- * Default value callback for 'uid' base field definition.
- *
- * @see ::baseFieldDefinitions()
- *
- * @deprecated The ::getCurrentUserId method is deprecated in 8.6.x and will
- * be removed before 9.0.0.
- *
- * @return array
- * An array of default values.
- */
- public static function getCurrentUserId() {
- @trigger_error('The ::getCurrentUserId method is deprecated in 8.6.x and will be removed before 9.0.0.', E_USER_DEPRECATED);
- return [\Drupal::currentUser()->id()];
- }
- }