Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 27 |
CRAP | |
0.00% |
0 / 242 |
Node | |
0.00% |
0 / 1 |
|
0.00% |
0 / 27 |
1806 | |
0.00% |
0 / 242 |
preSave | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 11 |
|||
preSaveRevision | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 5 |
|||
postSave | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 8 |
|||
preDelete | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 7 |
|||
postDelete | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
getType | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
access | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 7 |
|||
getTitle | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setTitle | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
getCreatedTime | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setCreatedTime | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
isPromoted | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setPromoted | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
isSticky | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setSticky | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
isPublished | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setPublished | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 3 |
|||
getOwner | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getOwnerId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setOwnerId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
setOwner | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
getRevisionCreationTime | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setRevisionCreationTime | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
getRevisionAuthor | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setRevisionAuthorId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
baseFieldDefinitions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 152 |
|||
getCurrentUserId | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\node\Entity\Node. | |
*/ | |
namespace Drupal\node\Entity; | |
use Drupal\Core\Entity\ContentEntityBase; | |
use Drupal\Core\Entity\EntityChangedTrait; | |
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\UserInterface; | |
/** | |
* Defines the node entity class. | |
* | |
* @ContentEntityType( | |
* id = "node", | |
* label = @Translation("Content"), | |
* 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" | |
* }, | |
* "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", | |
* 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", | |
* "uid" = "uid", | |
* }, | |
* 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", | |
* "edit-form" = "/node/{node}/edit", | |
* "version-history" = "/node/{node}/revisions", | |
* "revision" = "/node/{node}/revisions/{node_revision}/view", | |
* } | |
* ) | |
*/ | |
class Node extends ContentEntityBase implements NodeInterface { | |
use EntityChangedTrait; | |
/** | |
* 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->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, $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 ? 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->getEntityKey('status'); | |
} | |
/** | |
* {@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->getEntityKey('uid'); | |
} | |
/** | |
* {@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.')) | |
->setTranslatable(TRUE) | |
->setRevisionable(TRUE) | |
->setDisplayOptions('view', array( | |
'type' => 'hidden', | |
)) | |
->setDisplayOptions('form', array( | |
'type' => 'language_select', | |
'weight' => 2, | |
)); | |
$fields['title'] = BaseFieldDefinition::create('string') | |
->setLabel(t('Title')) | |
->setRequired(TRUE) | |
->setTranslatable(TRUE) | |
->setRevisionable(TRUE) | |
->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 username of the content author.')) | |
->setRevisionable(TRUE) | |
->setSetting('target_type', 'user') | |
->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', | |
'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('Promoted to 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 at top of lists')) | |
->setRevisionable(TRUE) | |
->setTranslatable(TRUE) | |
->setDefaultValue(FALSE) | |
->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) | |
->setDefaultValue('') | |
->setDisplayOptions('form', array( | |
'type' => 'string_textarea', | |
'weight' => 25, | |
'settings' => array( | |
'rows' => 4, | |
), | |
)); | |
$fields['revision_translation_affected'] = BaseFieldDefinition::create('boolean') | |
->setLabel(t('Revision translation affected')) | |
->setDescription(t('Indicates if the last edit of a translation belongs to current revision.')) | |
->setReadOnly(TRUE) | |
->setRevisionable(TRUE) | |
->setTranslatable(TRUE); | |
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()); | |
} | |
} |