Newer
Older
<?php
/**
* @file
* Definition of Drupal\node\Entity\Node.
namespace Drupal\node\Entity;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityStorageControllerInterface;
use Drupal\Core\Language\Language;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
/**
* Defines the node entity class.
Angie Byron
committed
*
* @EntityType(
Angie Byron
committed
* id = "node",
Angie Byron
committed
* label = @Translation("Content"),
Angie Byron
committed
* bundle_label = @Translation("Content type"),
* controllers = {
* "storage" = "Drupal\node\NodeStorageController",
Alex Pott
committed
* "view_builder" = "Drupal\node\NodeViewBuilder",
* "access" = "Drupal\node\NodeAccessController",
* "form" = {
Alex Pott
committed
* "default" = "Drupal\node\NodeFormController",
* "delete" = "Drupal\node\Form\NodeDeleteForm",
Alex Pott
committed
* "edit" = "Drupal\node\NodeFormController"
Angie Byron
committed
* "list" = "Drupal\node\NodeListController",
* "translation" = "Drupal\node\NodeTranslationController"
Angie Byron
committed
* },
* base_table = "node",
* data_table = "node_field_data",
* revision_table = "node_revision",
* revision_data_table = "node_field_revision",
Angie Byron
committed
* uri_callback = "node_uri",
* fieldable = TRUE,
Angie Byron
committed
* translatable = TRUE,
* render_cache = FALSE,
Angie Byron
committed
* entity_keys = {
* "id" = "nid",
* "revision" = "vid",
* "bundle" = "type",
* "label" = "title",
* "uuid" = "uuid"
* },
* bundle_keys = {
* "bundle" = "type"
Angie Byron
committed
* },
catch
committed
* bundle_entity_type = "node_type",
Alex Pott
committed
* permission_granularity = "bundle",
* links = {
* "canonical" = "node.view",
* "edit-form" = "node.page_edit",
catch
committed
* "version-history" = "node.revision_overview",
* "admin-form" = "node.type_edit"
Alex Pott
committed
* }
Angie Byron
committed
* )
class Node extends ContentEntityBase implements NodeInterface {
/**
Alex Pott
committed
* Implements Drupal\Core\Entity\EntityInterface::id().
Alex Pott
committed
public function id() {
return $this->get('nid')->value;
}
Dries Buytaert
committed
/**
Alex Pott
committed
* Overrides Drupal\Core\Entity\Entity::getRevisionId().
Dries Buytaert
committed
*/
Alex Pott
committed
public function getRevisionId() {
return $this->get('vid')->value;
}
Dries Buytaert
committed
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function preSave(EntityStorageControllerInterface $storage_controller) {
Angie Byron
committed
parent::preSave($storage_controller);
Alex Pott
committed
// Before saving the node, set changed and revision times.
$this->changed->value = REQUEST_TIME;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function preSaveRevision(EntityStorageControllerInterface $storage_controller, \stdClass $record) {
Angie Byron
committed
parent::preSaveRevision($storage_controller, $record);
Alex Pott
committed
if ($this->newRevision) {
// When inserting either a new node or a new node revision, $node->log
// must be set because {node_field_revision}.log is a text column and
// therefore cannot have a default value. However, it might not be set at
// this point (for example, if the user submitting a node form does not
// have permission to create revisions), so we ensure that it is at least
// an empty string in that case.
// @todo Make the {node_field_revision}.log column nullable so that we
// can remove this check.
if (!isset($record->log)) {
$record->log = '';
}
}
elseif (isset($this->original) && (!isset($record->log) || $record->log === '')) {
// If we are updating an existing node without adding a new revision, we
// need to make sure $entity->log is reset whenever it is empty.
// Therefore, this code allows us to avoid clobbering an existing log
// entry with an empty one.
catch
committed
$record->log = $this->original->log->value;
Alex Pott
committed
}
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function postSave(EntityStorageControllerInterface $storage_controller, $update = TRUE) {
Angie Byron
committed
parent::postSave($storage_controller, $update);
Alex Pott
committed
// 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()) {
catch
committed
\Drupal::entityManager()->getAccessController('node')->writeGrants($this, $update);
Alex Pott
committed
}
// 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());
}
Alex Pott
committed
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public static function preDelete(EntityStorageControllerInterface $storage_controller, array $entities) {
Angie Byron
committed
parent::preDelete($storage_controller, $entities);
// Assure that all nodes deleted are removed from the search index.
if (\Drupal::moduleHandler()->moduleExists('search')) {
foreach ($entities as $entity) {
search_reindex($entity->nid->value, 'node_search');
Alex Pott
committed
}
}
}
/**
* {@inheritdoc}
*/
public function getType() {
return $this->bundle();
}
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/**
* {@inheritdoc}
*/
public function access($operation = 'view', AccountInterface $account = NULL) {
if ($operation == 'create') {
return parent::access($operation, $account);
}
return \Drupal::entityManager()
->getAccessController($this->entityType)
->access($this, $operation, $this->prepareLangcode(), $account);
}
/**
* {@inheritdoc}
*/
public function prepareLangcode() {
$langcode = $this->language()->id;
// 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()->getLanguage(Language::TYPE_CONTENT)->id;
// 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;
}
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function setTitle($title) {
$this->set('title', $title);
return $this;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function getCreatedTime() {
return $this->get('created')->value;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function setCreatedTime($timestamp) {
$this->set('created', $timestamp);
return $this;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function getChangedTime() {
return $this->get('changed')->value;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function isPromoted() {
return (bool) $this->get('promote')->value;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function setPromoted($promoted) {
$this->set('promote', $promoted ? NODE_PROMOTED : NODE_NOT_PROMOTED);
Alex Pott
committed
return $this;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function isSticky() {
return (bool) $this->get('sticky')->value;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function setSticky($sticky) {
$this->set('sticky', $sticky ? NODE_STICKY : NODE_NOT_STICKY);
return $this;
}
catch
committed
/**
Alex Pott
committed
* {@inheritdoc}
catch
committed
*/
Alex Pott
committed
public function isPublished() {
return (bool) $this->get('status')->value;
}
catch
committed
Alex Pott
committed
* {@inheritdoc}
Angie Byron
committed
*/
Alex Pott
committed
public function setPublished($published) {
$this->set('status', $published ? NODE_PUBLISHED : NODE_NOT_PUBLISHED);
return $this;
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public function getAuthor() {
return $this->get('uid')->entity;
Dries Buytaert
committed
/**
Alex Pott
committed
* {@inheritdoc}
Dries Buytaert
committed
*/
Alex Pott
committed
public function getAuthorId() {
return $this->get('uid')->target_id;
Dries Buytaert
committed
}
Dries Buytaert
committed
/**
* {@inheritdoc}
*/
Alex Pott
committed
public function setAuthorId($uid) {
$this->set('uid', $uid);
return $this;
}
/**
* {@inheritdoc}
*/
Alex Pott
committed
public function getRevisionCreationTime() {
return $this->get('revision_timestamp')->value;
}
/**
* {@inheritdoc}
*/
Alex Pott
committed
public function setRevisionCreationTime($timestamp) {
$this->set('revision_timestamp', $timestamp);
return $this;
}
/**
* {@inheritdoc}
*/
Alex Pott
committed
public function getRevisionAuthor() {
return $this->get('revision_uid')->entity;
}
/**
* {@inheritdoc}
*/
Alex Pott
committed
public function setRevisionAuthorId($uid) {
$this->set('revision_uid', $uid);
return $this;
}
Alex Pott
committed
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
/**
* {@inheritdoc}
*/
public static function baseFieldDefinitions($entity_type) {
$properties['nid'] = array(
'label' => t('Node ID'),
'description' => t('The node ID.'),
'type' => 'integer_field',
'read-only' => TRUE,
);
$properties['uuid'] = array(
'label' => t('UUID'),
'description' => t('The node UUID.'),
'type' => 'uuid_field',
'read-only' => TRUE,
);
$properties['vid'] = array(
'label' => t('Revision ID'),
'description' => t('The node revision ID.'),
'type' => 'integer_field',
'read-only' => TRUE,
);
$properties['type'] = array(
'label' => t('Type'),
'description' => t('The node type.'),
'type' => 'string_field',
'read-only' => TRUE,
);
$properties['langcode'] = array(
'label' => t('Language code'),
'description' => t('The node language code.'),
'type' => 'language_field',
);
$properties['title'] = array(
'label' => t('Title'),
'description' => t('The title of this node, always treated as non-markup plain text.'),
'type' => 'field_item:text',
'list_class' => '\Drupal\node\NodeTitleItemList',
Alex Pott
committed
'required' => TRUE,
'settings' => array(
'default_value' => '',
'max_length' => 255,
'text_processing' => 0,
Alex Pott
committed
),
'translatable' => TRUE,
Alex Pott
committed
);
$properties['uid'] = array(
'label' => t('User ID'),
'description' => t('The user ID of the node author.'),
'type' => 'entity_reference_field',
'settings' => array(
'target_type' => 'user',
'default_value' => 0,
),
);
$properties['status'] = array(
'label' => t('Publishing status'),
'description' => t('A boolean indicating whether the node is published.'),
'type' => 'boolean_field',
);
$properties['created'] = array(
'label' => t('Created'),
'description' => t('The time that the node was created.'),
'type' => 'integer_field',
);
$properties['changed'] = array(
'label' => t('Changed'),
'description' => t('The time that the node was last edited.'),
'type' => 'integer_field',
'property_constraints' => array(
Angie Byron
committed
'value' => array('EntityChanged' => array()),
Alex Pott
committed
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
),
);
$properties['promote'] = array(
'label' => t('Promote'),
'description' => t('A boolean indicating whether the node should be displayed on the front page.'),
'type' => 'boolean_field',
);
$properties['sticky'] = array(
'label' => t('Sticky'),
'description' => t('A boolean indicating whether the node should be displayed at the top of lists in which it appears.'),
'type' => 'boolean_field',
);
$properties['revision_timestamp'] = array(
'label' => t('Revision timestamp'),
'description' => t('The time that the current revision was created.'),
'type' => 'integer_field',
'queryable' => FALSE,
);
$properties['revision_uid'] = array(
'label' => t('Revision user ID'),
'description' => t('The user ID of the author of the current revision.'),
'type' => 'entity_reference_field',
'settings' => array('target_type' => 'user'),
'queryable' => FALSE,
);
$properties['log'] = array(
'label' => t('Log'),
'description' => t('The log entry explaining the changes in this version.'),
'type' => 'string_field',
);
return $properties;
}