diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php index d6ef1d3..8ce6762 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -820,7 +820,7 @@ public function isArchived() { $status_key = $this->getEntityType()->getKey('status'); if ($this->hasField($status_key)) { $status = $this->$status_key->getValue(); - if ($status[0]['state'] == 3) { + if ($status[0]['state'] == StatusItem::STATUS_ARCHIVED) { return TRUE; } } @@ -833,7 +833,7 @@ public function isArchived() { public function setArchived($archived) { $status_key = $this->getEntityType()->getKey('status'); if ($this->hasField($status_key) && $archived) { - $this->set($status_key, 3); + $this->$status_key->state = StatusItem::STATUS_ARCHIVED; } } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StatusItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StatusItem.php index d4d96fd..9ee95e1 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StatusItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StatusItem.php @@ -16,6 +16,11 @@ */ class StatusItem extends IntegerItem { + const STATUS_UNPUBLISHED = 0; + const STATUS_PUBLISHED = 1; + const STATUS_DRAFT = 2; + const STATUS_ARCHIVED = 3; + public static function schema(FieldStorageDefinitionInterface $field_definition) { $schema = parent::schema($field_definition); $schema['columns']['state'] = [ @@ -29,15 +34,39 @@ public static function schema(FieldStorageDefinitionInterface $field_definition) /** * @inheritDoc */ - public function preSave() { - parent::preSave(); - - $this->values['state'] = 0; - if ($this->values['value'] == 1) { - $this->values['state'] = 1; + public function onChange($property_name, $notify = TRUE) { + parent::onChange($property_name, $notify); + $property_value = $this->get($property_name)->getValue(); + if ($property_name == 'value') { + if ($property_value == self::STATUS_PUBLISHED) { + $this->writePropertyValue('state', self::STATUS_PUBLISHED); + } + else { + $this->writePropertyValue('state', self::STATUS_UNPUBLISHED); + } + } + elseif ($property_name == 'state') { + if ($property_value == self::STATUS_PUBLISHED) { + $this->writePropertyValue('value', self::STATUS_PUBLISHED); + } + else { + $this->writePropertyValue('value', self::STATUS_UNPUBLISHED); + } } } + /** + * @inheritDoc + */ + public function setValue($values, $notify = TRUE) { + parent::setValue($values, $notify); + if (is_array($values) && isset($values['value']) && !isset($values['state'])) { + $this->onChange('value', FALSE); + } + elseif (is_array($values) && !isset($values['value']) && isset($values['state'])) { + $this->onChange('state', FALSE); + } + } public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties = parent::propertyDefinitions($field_definition); diff --git a/core/tests/Drupal/KernelTests/Core/Field/StatusItemFieldTest.php b/core/tests/Drupal/KernelTests/Core/Field/StatusItemFieldTest.php index e69de29..5f43bbc 100644 --- a/core/tests/Drupal/KernelTests/Core/Field/StatusItemFieldTest.php +++ b/core/tests/Drupal/KernelTests/Core/Field/StatusItemFieldTest.php @@ -0,0 +1,51 @@ +installEntitySchema('user'); + $this->installEntitySchema('node'); + + $this->installSchema('node', 'node_access'); + + NodeType::create(['type' => 'example'])->save(); + $node = Node::create([ + 'type' => 'example', + 'title' => 'Please Please Me']); + $node->save(); + + $this->assertEquals(TRUE, $node->isPublished()); + $this->assertEquals(StatusItem::STATUS_PUBLISHED, $node->status->value); + $this->assertEquals(StatusItem::STATUS_PUBLISHED, $node->status->state); + + $node->setArchived(TRUE); + $node->save(); + + $this->assertEquals(FALSE, $node->isPublished()); + $this->assertEquals(StatusItem::STATUS_UNPUBLISHED, $node->status->value); + $this->assertEquals(StatusItem::STATUS_ARCHIVED, $node->status->state); + + $node->setPublished(FALSE); + $node->save(); + + $this->assertEquals(FALSE, $node->isPublished()); + $this->assertEquals(StatusItem::STATUS_UNPUBLISHED, $node->status->value); + $this->assertEquals(StatusItem::STATUS_UNPUBLISHED, $node->status->state); + + } + +} \ No newline at end of file