Newer
Older
<?php
/**
* @file
* Definition of Drupal\node\Entity\Node.
namespace Drupal\node\Entity;
Angie Byron
committed
use Drupal\Core\Entity\EntityNG;
use Drupal\Core\Entity\EntityStorageControllerInterface;
use Drupal\Core\Entity\Annotation\EntityType;
Angie Byron
committed
use Drupal\Core\Annotation\Translation;
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"),
Angie Byron
committed
* module = "node",
* controllers = {
* "storage" = "Drupal\node\NodeStorageController",
* "render" = "Drupal\node\NodeRenderController",
* "access" = "Drupal\node\NodeAccessController",
* "form" = {
Alex Pott
committed
* "default" = "Drupal\node\NodeFormController",
* "delete" = "Drupal\node\Form\NodeDeleteForm",
Alex Pott
committed
* "edit" = "Drupal\node\NodeFormController"
* },
* "translation" = "Drupal\node\NodeTranslationController"
Angie Byron
committed
* },
* base_table = "node",
* data_table = "node_field_data",
* revision_table = "node_field_revision",
Angie Byron
committed
* uri_callback = "node_uri",
* fieldable = TRUE,
Angie Byron
committed
* translatable = TRUE,
Angie Byron
committed
* entity_keys = {
* "id" = "nid",
* "revision" = "vid",
* "bundle" = "type",
* "label" = "title",
* "uuid" = "uuid"
* },
* bundle_keys = {
* "bundle" = "type"
Angie Byron
committed
* },
* route_base_path = "admin/structure/types/manage/{bundle}",
Alex Pott
committed
* permission_granularity = "bundle",
* links = {
* "canonical" = "/node/{node}",
* "edit-form" = "/node/{node}/edit",
* "version-history" = "/node/{node}/revisions"
* }
Angie Byron
committed
* )
class Node extends EntityNG 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) {
// 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) {
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) {
// 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
}
}
/**
Alex Pott
committed
* {@inheritdoc}
Alex Pott
committed
public static function preDelete(EntityStorageControllerInterface $storage_controller, array $entities) {
if (module_exists('search')) {
foreach ($entities as $entity) {
Alex Pott
committed
search_reindex($entity->nid->value, 'node');
}
}
}
/**
* {@inheritdoc}
*/
public function getType() {
return $this->bundle();
}
/**
* {@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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
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
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
/**
* {@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' => 'string_field',
'required' => TRUE,
'settings' => array(
'default_value' => '',
),
'property_constraints' => array(
'value' => array('Length' => array('max' => 255)),
),
);
$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(
'value' => array('NodeChanged' => array()),
),
);
$properties['comment'] = array(
'label' => t('Comment'),
'description' => t('Whether comments are allowed on this node: 0 = no, 1 = closed (read only), 2 = open (read/write).'),
'type' => 'integer_field',
);
$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['tnid'] = array(
'label' => t('Translation set ID'),
'description' => t('The translation set id for this node, which equals the node id of the source post in each set.'),
'type' => 'integer_field',
);
$properties['translate'] = array(
'label' => t('Translate'),
'description' => t('A boolean indicating whether this translation page needs to be updated.'),
'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;
}