Issue #2256679 by alexpott, tim.plunkett: Fixed Use config schema to determine which config entity properties to export regardless of whether they are public or protected.

8.0.x
Nathaniel Catchpole 2014-06-14 10:03:25 +01:00
parent 7d1c02a73d
commit 0c33183a9e
49 changed files with 304 additions and 403 deletions

View File

@ -235,15 +235,9 @@ config_dependencies:
config_entity:
type: mapping
mapping:
id:
type: string
label: 'ID'
uuid:
type: string
label: 'UUID'
label:
type: label
label: 'Label'
langcode:
type: string
label: 'Default language'

View File

@ -10,6 +10,7 @@ namespace Drupal\Core\Config\Entity;
use Drupal\Component\Plugin\ConfigurablePluginInterface;
use Drupal\Component\Utility\String;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Config\Schema\SchemaIncompleteException;
use Drupal\Core\Entity\Entity;
use Drupal\Core\Config\ConfigDuplicateUUIDException;
use Drupal\Core\Entity\EntityStorageInterface;
@ -240,19 +241,35 @@ abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface
* {@inheritdoc}
*/
public function toArray() {
// Configuration objects do not have a schema. Extract all key names from
// class properties.
$class_info = new \ReflectionClass($this);
$properties = array();
foreach ($class_info->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
$name = $property->getName();
$properties[$name] = $this->get($name);
$config_name = $this->getEntityType()->getConfigPrefix() . '.' . $this->id();
$definition = $this->getTypedConfig()->getDefinition($config_name);
if (!isset($definition['mapping'])) {
throw new SchemaIncompleteException(String::format('Incomplete or missing schema for @config_name', array('@config_name' => $config_name)));
}
$id_key = $this->getEntityType()->getKey('id');
foreach (array_keys($definition['mapping']) as $name) {
// Special handling for IDs so that computed compound IDs work.
// @see \Drupal\entity\EntityDisplayBase::id()
if ($name == $id_key) {
$properties[$name] = $this->id();
}
else {
$properties[$name] = $this->get($name);
}
}
// Add protected dependencies property.
$properties['dependencies'] = $this->dependencies;
return $properties;
}
/**
* Gets the typed config manager.
*
* @return \Drupal\Core\Config\TypedConfigManagerInterface
*/
protected function getTypedConfig() {
return \Drupal::service('config.typed');
}
/**
* {@inheritdoc}
*/

View File

@ -4,6 +4,9 @@ block.block.*:
type: config_entity
label: 'Block'
mapping:
id:
type: string
label: 'ID'
theme:
type: string
label: 'Theme'

View File

@ -33,8 +33,7 @@ use Drupal\Core\Entity\EntityStorageInterface;
* admin_permission = "administer blocks",
* fieldable = FALSE,
* entity_keys = {
* "id" = "id",
* "label" = "label"
* "id" = "id"
* },
* links = {
* "delete-form" = "block.admin_block_delete",
@ -134,25 +133,6 @@ class Block extends ConfigEntityBase implements BlockInterface, EntityWithPlugin
}
}
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$names = array(
'theme',
'region',
'weight',
'plugin',
'settings',
'visibility',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* Sorts active blocks by weight; sorts inactive blocks by name.
*/

View File

@ -90,13 +90,15 @@ class BlockStorageUnitTest extends DrupalUnitTestBase {
// Ensure that default values are filled in.
$expected_properties = array(
'id' => 'test_block',
'weight' => NULL,
'status' => TRUE,
'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
'status' => TRUE,
'dependencies' => array('module' => array('block_test'), 'theme' => array('stark')),
'id' => 'test_block',
'theme' => 'stark',
'region' => '-1',
'weight' => NULL,
'provider' => NULL,
'visibility' => NULL,
'plugin' => 'test_html',
'settings' => array(
'id' => 'test_html',
@ -108,8 +110,8 @@ class BlockStorageUnitTest extends DrupalUnitTestBase {
'contexts' => array(),
),
),
'visibility' => NULL,
);
$this->assertIdentical($actual_properties, $expected_properties);
$this->assertTrue($entity->getPlugin() instanceof TestHtmlBlock, 'The entity has an instance of the correct block plugin.');

View File

@ -4,6 +4,12 @@ block_content.type.*:
type: config_entity
label: 'Custom block type settings'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
revision:
type: integer
label: 'Create new revision'

View File

@ -3,6 +3,12 @@ breakpoint.breakpoint.*.*.*:
type: config_entity
label: 'Defines the Breakpoint entity'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
name:
type: string
label: 'Machine name'
@ -29,6 +35,12 @@ breakpoint.breakpoint_group.*.*.*:
type: config_entity
label: 'Breakpoint group settings'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
name:
type: string
label: 'Machine name'

View File

@ -211,29 +211,6 @@ class BreakpointGroup extends ConfigEntityBase implements BreakpointGroupInterfa
return FALSE;
}
/**
* {@inheritdoc}
*/
public function toArray() {
$names = array(
'id',
'uuid',
'name',
'label',
'breakpoint_ids',
'source',
'sourceType',
'status',
'langcode',
'dependencies',
);
$properties = array();
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -120,7 +120,7 @@ function comment_uri(CommentInterface $comment) {
function comment_entity_extra_field_info() {
$return = array();
foreach (CommentType::loadMultiple() as $comment_type) {
$return['comment'][$comment_type->id] = array(
$return['comment'][$comment_type->id()] = array(
'form' => array(
'author' => array(
'label' => t('Author'),

View File

@ -47,6 +47,12 @@ comment.type.*:
type: config_entity
label: 'Comment type settings'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
target_entity_type_id:
type: string
label: 'Target Entity Type ID'

View File

@ -82,7 +82,7 @@ class CommentTypeForm extends EntityForm {
$form['description'] = array(
'#type' => 'textarea',
'#default_value' => $comment_type->description,
'#default_value' => $comment_type->getDescription(),
'#description' => t('Describe this comment type. The text will be displayed on the <em>Comment types</em> administration overview page'),
'#title' => t('Description'),
);

View File

@ -47,28 +47,28 @@ class CommentType extends ConfigEntityBundleBase implements CommentTypeInterface
*
* @var string
*/
public $id;
protected $id;
/**
* The comment type label.
*
* @var string
*/
public $label;
protected $label;
/**
* The description of the comment type.
*
* @var string
*/
public $description;
protected $description;
/**
* The target entity type.
*
* @var string
*/
public $target_entity_type_id;
protected $target_entity_type_id;
/**
* {@inheritdoc}

View File

@ -111,11 +111,12 @@ class ConfigDiffTest extends DrupalUnitTestBase {
$diff = \Drupal::service('config.manager')->diff($active, $staging, 'config_test.dynamic.' . $new_test_entity_id, $config_name);
$edits = $diff->getEdits();
$this->assertEqual($edits[0]->type, 'change', 'The second item in the diff is a copy.');
$this->assertEqual($edits[0]->orig, array('id: ' . $new_test_entity_id));
$this->assertEqual($edits[0]->closing, array('id: ' . $test_entity_id));
$this->assertEqual($edits[1]->type, 'copy', 'The second item in the diff is a copy.');
$this->assertEqual(count($edits), 2, 'There are two items in the diff.');
$this->assertEqual($edits[0]->type, 'copy', 'The first item in the diff is a copy.');
$this->assertEqual($edits[1]->type, 'change', 'The second item in the diff is a change.');
$this->assertEqual($edits[1]->orig, array('id: ' . $new_test_entity_id));
$this->assertEqual($edits[1]->closing, array('id: ' . $test_entity_id));
$this->assertEqual($edits[2]->type, 'copy', 'The third item in the diff is a copy.');
$this->assertEqual(count($edits), 3, 'There are three items in the diff.');
}
/**

View File

@ -46,7 +46,6 @@ class ConfigEntityTest extends WebTestBase {
$default_langcode = \Drupal::languageManager()->getDefaultLanguage()->id;
// Verify default properties on a newly created empty entity.
$empty = entity_create('config_test');
$this->assertIdentical($empty->id, NULL);
$this->assertTrue($empty->uuid);
$this->assertIdentical($empty->label, NULL);
$this->assertIdentical($empty->style, NULL);
@ -105,7 +104,6 @@ class ConfigEntityTest extends WebTestBase {
'label' => $this->randomString(),
'style' => $this->randomName(),
));
$this->assertIdentical($config_test->id, $expected['id']);
$this->assertTrue($config_test->uuid);
$this->assertNotEqual($config_test->uuid, $empty->uuid);
$this->assertIdentical($config_test->label, $expected['label']);
@ -159,7 +157,7 @@ class ConfigEntityTest extends WebTestBase {
try {
$id_length_config_test->save();
$this->pass(String::format("config_test entity with ID length @length was saved.", array(
'@length' => strlen($id_length_config_test->id))
'@length' => strlen($id_length_config_test->id()))
));
}
catch (ConfigEntityIdLengthException $e) {
@ -173,7 +171,7 @@ class ConfigEntityTest extends WebTestBase {
try {
$id_length_config_test->save();
$this->pass(String::format("config_test entity with ID length @length was saved.", array(
'@length' => strlen($id_length_config_test->id),
'@length' => strlen($id_length_config_test->id()),
)));
}
catch (ConfigEntityIdLengthException $e) {
@ -187,13 +185,13 @@ class ConfigEntityTest extends WebTestBase {
try {
$status = $id_length_config_test->save();
$this->fail(String::format("config_test entity with ID length @length exceeding the maximum allowed length of @max saved successfully", array(
'@length' => strlen($id_length_config_test->id),
'@length' => strlen($id_length_config_test->id()),
'@max' => static::MAX_ID_LENGTH,
)));
}
catch (ConfigEntityIdLengthException $e) {
$this->pass(String::format("config_test entity with ID length @length exceeding the maximum allowed length of @max failed to save", array(
'@length' => strlen($id_length_config_test->id),
'@length' => strlen($id_length_config_test->id()),
'@max' => static::MAX_ID_LENGTH,
)));
}
@ -221,7 +219,7 @@ class ConfigEntityTest extends WebTestBase {
$this->assertIdentical($config_test->getOriginalId(), $old_id);
// Rename.
$config_test->id = $new_id;
$config_test->set('id', $new_id);
$this->assertIdentical($config_test->id(), $new_id);
$status = $config_test->save();
$this->assertIdentical($status, SAVED_UPDATED);

View File

@ -56,15 +56,15 @@ class ConfigImportUITest extends WebTestBase {
// Create new config entity.
$original_dynamic_data = array(
'uuid' => '30df59bd-7b03-4cf7-bb35-d42fc49f0651',
'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
'status' => TRUE,
'dependencies' => array(),
'id' => 'new',
'label' => 'New',
'weight' => 0,
'style' => '',
'test_dependencies' => array(),
'status' => TRUE,
'uuid' => '30df59bd-7b03-4cf7-bb35-d42fc49f0651',
'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
'dependencies' => array(),
'protected_property' => '',
);
$staging->write($dynamic_name, $original_dynamic_data);
@ -349,31 +349,31 @@ class ConfigImportUITest extends WebTestBase {
$uuid = $this->container->get('uuid');
$values_primary = array(
'uuid' => $uuid->generate(),
'langcode' => 'en',
'status' => TRUE,
'dependencies' => array(),
'id' => 'primary',
'label' => 'Primary',
'weight' => 0,
'style' => NULL,
'test_dependencies' => array(),
'status' => TRUE,
'uuid' => $uuid->generate(),
'langcode' => 'en',
'dependencies' => array(),
'protected_property' => null,
);
$staging->write($name_primary, $values_primary);
$values_secondary = array(
'uuid' => $uuid->generate(),
'langcode' => 'en',
'status' => TRUE,
// Add a dependency on primary, to ensure that is synced first.
'dependencies' => array(
'entity' => array($name_primary),
),
'id' => 'secondary',
'label' => 'Secondary Sync',
'weight' => 0,
'style' => NULL,
'test_dependencies' => array(),
'status' => TRUE,
'uuid' => $uuid->generate(),
'langcode' => 'en',
// Add a dependency on primary, to ensure that is synced first.
'dependencies' => array(
'entity' => array($name_primary),
),
'protected_property' => null,
);
$staging->write($name_secondary, $values_secondary);

View File

@ -170,15 +170,15 @@ class ConfigImporterTest extends DrupalUnitTestBase {
// Create new config entity.
$original_dynamic_data = array(
'uuid' => '30df59bd-7b03-4cf7-bb35-d42fc49f0651',
'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
'status' => TRUE,
'dependencies' => array(),
'id' => 'new',
'label' => 'New',
'weight' => 0,
'style' => '',
'test_dependencies' => array(),
'status' => TRUE,
'uuid' => '30df59bd-7b03-4cf7-bb35-d42fc49f0651',
'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
'dependencies' => array(),
'protected_property' => '',
);
$staging->write($dynamic_name, $original_dynamic_data);

View File

@ -135,12 +135,8 @@ class ConfigSchemaTest extends DrupalUnitTestBase {
$expected['label'] = 'Image style';
$expected['class'] = '\Drupal\Core\Config\Schema\Mapping';
$expected['mapping']['name']['type'] = 'string';
$expected['mapping']['id']['label'] = 'ID';
$expected['mapping']['id']['type'] = 'string';
$expected['mapping']['uuid']['type'] = 'string';
$expected['mapping']['uuid']['label'] = 'UUID';
$expected['mapping']['label']['type'] = 'label';
$expected['mapping']['label']['label'] = 'Label';
$expected['mapping']['langcode']['type'] = 'string';
$expected['mapping']['langcode']['label'] = 'Default language';
$expected['mapping']['status']['type'] = 'boolean';
@ -148,6 +144,8 @@ class ConfigSchemaTest extends DrupalUnitTestBase {
$expected['mapping']['dependencies']['type'] = 'config_dependencies';
$expected['mapping']['dependencies']['label'] = 'Dependencies';
$expected['mapping']['name']['type'] = 'string';
$expected['mapping']['label']['type'] = 'label';
$expected['mapping']['label']['label'] = 'Label';
$expected['mapping']['effects']['type'] = 'sequence';
$expected['mapping']['effects']['sequence'][0]['type'] = 'mapping';
$expected['mapping']['effects']['sequence'][0]['mapping']['id']['type'] = 'string';

View File

@ -1,34 +1,23 @@
# Schema for the configuration files of the Configuration Test module.
config_test.dynamic.*:
type: mapping
label: 'Config test entity'
config_test_dynamic:
type: config_entity
mapping:
id:
type: string
label: 'Machine name'
label: 'ID'
label:
type: label
label: 'Label'
weight:
type: integer
label: 'Weight'
style:
type: string
label: 'Image style'
protected_property:
type: string
label: 'Protected property'
config_test_dynamic:
type: config_entity
mapping:
weight:
type: integer
label: 'Weight'
style:
type: string
label: 'style'
test_dependencies:
type: config_dependencies
label: 'Configuration dependencies'
protected_property:
type: string
label: 'Protected property'
@ -41,6 +30,24 @@ config_test.dynamic.*.*:
type: config_test_dynamic
label: 'Config test dynamic settings'
config_test.query.*:
type: config_entity
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
array:
type: sequence
label: 'Array'
sequence:
- type: string
number:
type: integer
label: 'number'
config_test.types:
type: mapping
label: 'Configuration type'

View File

@ -48,7 +48,7 @@ class ConfigTest extends ConfigEntityBase implements ConfigTestInterface {
*
* @var string
*/
public $id;
protected $id;
/**
* The human-readable name of the configuration entity.
@ -85,20 +85,6 @@ class ConfigTest extends ConfigEntityBase implements ConfigTestInterface {
*/
protected $protected_property;
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$protected_names = array(
'protected_property',
);
foreach ($protected_names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::sort().
*/

View File

@ -4,6 +4,12 @@ contact.category.*:
type: config_entity
label: 'Contact category'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
recipients:
type: sequence
label: 'Recipients'

View File

@ -176,21 +176,4 @@ class Editor extends ConfigEntityBase implements EditorInterface {
return $this;
}
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$names = array(
'format',
'editor',
'settings',
'image_upload',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
}

View File

@ -33,6 +33,12 @@ entity.form_mode.*.*:
type: config_entity
label: 'Entity form mode settings'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
targetEntityType:
type: string
label: 'Target entity type'
@ -45,6 +51,12 @@ entity.view_display.*.*.*:
type: config_entity
label: 'Entity display'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
targetEntityType:
type: string
label: 'Target entity type'
@ -71,6 +83,9 @@ entity.form_display.*.*.*:
type: config_entity
label: 'Entity form display'
mapping:
id:
type: string
label: 'ID'
targetEntityType:
type: string
label: 'Target entity type'
@ -80,9 +95,12 @@ entity.form_display.*.*.*:
mode:
type: string
label: 'View or form mode machine name'
status:
type: boolean
label: 'Enabled'
content:
type: sequence
label: 'Field form display formatters'
label: 'Field display formatters'
sequence:
- type: entity_form_display.field.[type]
hidden:
@ -91,6 +109,9 @@ entity.form_display.*.*.*:
sequence:
- type: boolean
label: 'Component'
dependencies:
type: config_dependencies
label: 'Dependencies'
# Default schema for entity display field with undefined type.
entity_view_display.field.*:

View File

@ -200,23 +200,7 @@ abstract class EntityDisplayBase extends ConfigEntityBase implements EntityDispl
* {@inheritdoc}
*/
public function toArray() {
$names = array(
'uuid',
'targetEntityType',
'bundle',
'mode',
'content',
'hidden',
'status',
'dependencies'
);
$properties = array(
'id' => $this->id(),
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
$properties = parent::toArray();
// Do not store options for fields whose display is not set to be
// configurable.
foreach ($this->getFieldDefinitions() as $field_name => $definition) {

View File

@ -12,6 +12,9 @@ field.field.*.*:
type: config_entity
label: 'Field'
mapping:
id:
type: string
label: 'ID'
name:
type: string
label: 'Name'
@ -49,6 +52,12 @@ field.instance.*.*.*:
type: config_entity
label: 'Field instance'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
field_uuid:
type: string
label: 'Field UUID'

View File

@ -224,34 +224,6 @@ class FieldConfig extends ConfigEntityBase implements FieldConfigInterface {
return $this->entity_type . '.' . $this->name;
}
/**
* {@inheritdoc}
*/
public function toArray() {
$names = array(
'uuid',
'status',
'langcode',
'name',
'entity_type',
'type',
'settings',
'module',
'locked',
'cardinality',
'translatable',
'indexes',
'dependencies',
);
$properties = array(
'id' => $this->id(),
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* Overrides \Drupal\Core\Entity\Entity::preSave().
*
@ -728,7 +700,10 @@ class FieldConfig extends ConfigEntityBase implements FieldConfigInterface {
*/
public function __sleep() {
// Only serialize properties from self::toArray().
return array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
$properties = array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
// Serialize $entityTypeId property so that toArray() works when waking up.
$properties[] = 'entityTypeId';
return $properties;
}
/**

View File

@ -272,29 +272,7 @@ class FieldInstanceConfig extends ConfigEntityBase implements FieldInstanceConfi
* {@inheritdoc}
*/
public function toArray() {
$names = array(
'uuid',
'status',
'langcode',
'field_uuid',
'field_name',
'entity_type',
'bundle',
'label',
'description',
'required',
'default_value',
'default_value_function',
'settings',
'dependencies',
);
$properties = array(
'id' => $this->id(),
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
$properties = parent::toArray();
// Additionally, include the field type, that is needed to be able to
// generate the field-type-dependant parts of the config schema.
$properties['field_type'] = $this->getType();
@ -672,7 +650,10 @@ class FieldInstanceConfig extends ConfigEntityBase implements FieldInstanceConfi
*/
public function __sleep() {
// Only serialize properties from self::toArray().
return array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
$properties = array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
// Serialize $entityTypeId property so that toArray() works when waking up.
$properties[] = 'entityTypeId';
return $properties;
}
/**

View File

@ -64,14 +64,18 @@ class FieldInstanceConfigEntityUnitTest extends UnitTestCase {
*/
public function setUp() {
$this->entityTypeId = $this->randomName();
$this->entityType = $this->getMock('\Drupal\Core\Entity\EntityTypeInterface');
$this->entityManager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface');
$this->uuid = $this->getMock('\Drupal\Component\Uuid\UuidInterface');
$this->typedConfigManager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
$container = new ContainerBuilder();
$container->set('entity.manager', $this->entityManager);
$container->set('uuid', $this->uuid);
$container->set('config.typed', $this->typedConfigManager);
\Drupal::setContainer($container);
// Create a mock FieldConfig object.
@ -139,12 +143,12 @@ class FieldInstanceConfigEntityUnitTest extends UnitTestCase {
*/
public function testToArray() {
$values = array('field_name' => $this->field->getName(), 'entity_type' => 'test_entity_type', 'bundle' => 'test_bundle');
$instance = new FieldInstanceConfig($values);
$export = $instance->toArray();
$instance = new FieldInstanceConfig($values, $this->entityTypeId);
$expected = array(
'id' => 'test_entity_type.test_bundle.field_test',
'uuid' => NULL,
'status' => 1,
'status' => TRUE,
'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
'field_uuid' => NULL,
'field_name' => 'field_test',
@ -159,6 +163,19 @@ class FieldInstanceConfigEntityUnitTest extends UnitTestCase {
'dependencies' => array(),
'field_type' => 'test_field',
);
$this->entityManager->expects($this->any())
->method('getDefinition')
->with($this->entityTypeId)
->will($this->returnValue($this->entityType));
$this->entityType->expects($this->once())
->method('getKey')
->with('id')
->will($this->returnValue('id'));
$this->typedConfigManager->expects($this->once())
->method('getDefinition')
->will($this->returnValue(array('mapping' => array_fill_keys(array_keys($expected), ''))));
$export = $instance->toArray();
$this->assertEquals($expected, $export);
}
}

View File

@ -162,13 +162,9 @@ class FilterFormat extends ConfigEntityBase implements FilterFormatInterface, En
*/
public function toArray() {
$properties = parent::toArray();
// @todo Make self::$weight and self::$cache protected and add them here.
$names = array(
'filters',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
// The 'roles' property is only used during install and should never
// actually be saved.
unset($properties['roles']);
return $properties;
}

View File

@ -6,6 +6,9 @@ image.style.*:
mapping:
name:
type: string
label:
type: label
label: 'Label'
effects:
type: sequence
sequence:

View File

@ -354,20 +354,6 @@ class ImageStyle extends ConfigEntityBase implements ImageStyleInterface, Entity
return $configuration['uuid'];
}
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$names = array(
'effects',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -85,6 +85,12 @@ language.entity.*:
type: config_entity
label: 'Language'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
direction:
type: integer
label: 'Direction'

View File

@ -339,4 +339,18 @@ class Migration extends ConfigEntityBase implements MigrationInterface, Requirem
return TRUE;
}
/**
* {@inheritdoc}
*/
public function toArray() {
// @todo Remove once migration config entities have schema
// https://drupal.org/node/2183957.
$class_info = new \ReflectionClass($this);
foreach ($class_info->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
$name = $property->getName();
$properties[$name] = $this->get($name);
}
return $properties;
}
}

View File

@ -4,6 +4,9 @@ rdf.mapping.*.*:
type: config_entity
label: 'RDF mapping'
mapping:
id:
type: string
label: 'ID'
targetEntityType:
type: string
label: 'Target entity type'

View File

@ -133,30 +133,6 @@ class RdfMapping extends ConfigEntityBase implements RdfMappingInterface {
return $this->targetEntityType . '.' . $this->bundle;
}
/**
* {@inheritdoc}
*/
public function toArray() {
$names = array(
'uuid',
'targetEntityType',
'bundle',
'types',
'fieldMappings',
);
$properties = array(
'id' => $this->id(),
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
if (!empty($this->dependencies)) {
// Add protected dependencies property if set.
$properties['dependencies'] = $this->dependencies;
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -187,24 +187,6 @@ class ResponsiveImageMapping extends ConfigEntityBase implements ResponsiveImage
return $mapping_found;
}
/**
* {@inheritdoc}
*/
public function toArray() {
$names = array(
'id',
'uuid',
'label',
'mappings',
'breakpointGroup',
);
$properties = array();
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -68,6 +68,12 @@ search.page.*:
type: config_entity
label: 'Search page'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
path:
type: string
label: 'Search page path'

View File

@ -166,23 +166,6 @@ class SearchPage extends ConfigEntityBase implements SearchPageInterface, Entity
return $this->weight;
}
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$names = array(
'path',
'weight',
'plugin',
'configuration',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -4,6 +4,12 @@ shortcut.set.*:
type: config_entity
label: 'Shortcut settings'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
links:
type: sequence
label: 'Shortcuts'

View File

@ -118,6 +118,12 @@ system.date_format.*:
type: config_entity
label: 'Date format'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
locked:
type: boolean
label: 'Locked'
@ -278,6 +284,12 @@ system.menu.*:
type: config_entity
label: 'Menu'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
description:
type: label
label: 'Menu description'
@ -289,6 +301,12 @@ system.action.*:
type: config_entity
label: 'System action'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
type:
type: string
label: 'Type'

View File

@ -148,20 +148,4 @@ class Action extends ConfigEntityBase implements ActionConfigEntityInterface, En
return parent::sort($a, $b);
}
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$names = array(
'type',
'plugin',
'configuration',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
}

View File

@ -68,21 +68,6 @@ class DateFormat extends ConfigEntityBase implements DateFormatInterface {
*/
protected $locked = FALSE;
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$names = array(
'locked',
'pattern',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -57,22 +57,6 @@ class Menu extends ConfigEntityBase implements MenuInterface {
*/
protected $locked = FALSE;
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
// @todo Make $description protected and include it here, see
// https://drupal.org/node/2030645.
$names = array(
'locked',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -4,6 +4,12 @@ tour.tour.*:
type: config_entity
label: 'Tour settings'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
module:
type: string
label: 'Providing module'

View File

@ -120,21 +120,6 @@ class Tour extends ConfigEntityBase implements TourInterface {
return array_values($tips);
}
/**
* {@inheritdoc}
*/
public function toArray() {
$properties = parent::toArray();
$names = array(
'routes',
'tips',
);
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -119,6 +119,12 @@ user.role.*:
type: config_entity
label: 'User role settings'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
weight:
type: integer
label: 'User role weight'

View File

@ -72,6 +72,12 @@ views.view.*:
type: config_entity
label: 'View'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
module:
type: string
label: 'Module'

View File

@ -240,32 +240,6 @@ class View extends ConfigEntityBase implements ViewStorageInterface {
return $this->display[$display_id];
}
/**
* {@inheritdoc}
*/
public function toArray() {
$names = array(
'base_field',
'base_table',
'core',
'description',
'status',
'display',
'label',
'module',
'id',
'tag',
'uuid',
'langcode',
'dependencies',
);
$properties = array();
foreach ($names as $name) {
$properties[$name] = $this->get($name);
}
return $properties;
}
/**
* {@inheritdoc}
*/

View File

@ -85,6 +85,13 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
*/
protected $cacheBackend;
/**
* The mocked typed config manager.
*
* @var \Drupal\Core\Config\TypedConfigManagerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $typedConfigManager;
/**
* {@inheritdoc}
*/
@ -129,11 +136,14 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
$this->cacheBackend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
$this->typedConfigManager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
$container = new ContainerBuilder();
$container->set('entity.manager', $this->entityManager);
$container->set('uuid', $this->uuid);
$container->set('language_manager', $this->languageManager);
$container->set('cache.test', $this->cacheBackend);
$container->set('config.typed', $this->typedConfigManager);
$container->setParameter('cache_bins', array('cache.test' => 'test'));
\Drupal::setContainer($container);
@ -431,14 +441,21 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
* @covers ::toArray
*/
public function testToArray() {
$this->typedConfigManager->expects($this->once())
->method('getDefinition')
->will($this->returnValue(array('mapping' => array('id' => '', 'dependencies' => ''))));
$properties = $this->entity->toArray();
$this->assertInternalType('array', $properties);
$class_info = new \ReflectionClass($this->entity);
foreach ($class_info->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
$name = $property->getName();
$this->assertArrayHasKey($name, $properties);
$this->assertSame($this->entity->get($name), $properties[$name]);
}
$this->assertEquals(array('id' => $this->entity->id(), 'dependencies' => array()), $properties);
}
/**
* @covers ::toArray
*
* @expectedException \Drupal\Core\Config\Schema\SchemaIncompleteException
*/
public function testToArrayFallback() {
$this->entity->toArray();
}
}

View File

@ -97,6 +97,13 @@ class ConfigEntityStorageTest extends UnitTestCase {
*/
protected $cacheBackend;
/**
* The mocked typed config manager.
*
* @var \Drupal\Core\Config\TypedConfigManagerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $typedConfigManager;
/**
* {@inheritdoc}
*/
@ -167,8 +174,13 @@ class ConfigEntityStorageTest extends UnitTestCase {
$this->cacheBackend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
$this->typedConfigManager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
$this->typedConfigManager->expects($this->any())
->method('getDefinition')
->will($this->returnValue(array('mapping' => array('id' => '', 'uuid' => '', 'dependencies' => ''))));
$container = new ContainerBuilder();
$container->set('entity.manager', $this->entityManager);
$container->set('config.typed', $this->typedConfigManager);
$container->set('cache.test', $this->cacheBackend);
$container->setParameter('cache_bins', array('cache.test' => 'test'));
\Drupal::setContainer($container);
@ -242,7 +254,7 @@ class ConfigEntityStorageTest extends UnitTestCase {
$config_object->expects($this->atLeastOnce())
->method('isNew')
->will($this->returnValue(TRUE));
$config_object->expects($this->exactly(4))
$config_object->expects($this->exactly(3))
->method('set');
$config_object->expects($this->once())
->method('save');
@ -301,7 +313,7 @@ class ConfigEntityStorageTest extends UnitTestCase {
$config_object->expects($this->atLeastOnce())
->method('isNew')
->will($this->returnValue(FALSE));
$config_object->expects($this->exactly(4))
$config_object->expects($this->exactly(3))
->method('set');
$config_object->expects($this->once())
->method('save');
@ -361,7 +373,7 @@ class ConfigEntityStorageTest extends UnitTestCase {
$config_object->expects($this->atLeastOnce())
->method('isNew')
->will($this->returnValue(FALSE));
$config_object->expects($this->exactly(4))
$config_object->expects($this->exactly(3))
->method('set');
$config_object->expects($this->once())
->method('save');