diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc index d335e65..4222066 100644 --- a/core/includes/install.core.inc +++ b/core/includes/install.core.inc @@ -968,7 +968,7 @@ function install_base_system(&$install_state) { // Enable the user module so that sessions can be recorded during the // upcoming bootstrap step. - \Drupal::moduleHandler()->install(array('user'), FALSE); + \Drupal::moduleHandler()->install(array('user')); // Save the list of other modules to install for the upcoming tasks. // State can be set to the database now that system.module is installed. diff --git a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php index a1943b2..709a807 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php @@ -170,8 +170,8 @@ public static function createInstance(ContainerInterface $container, EntityTypeI return new static( $entity_type, $container->get('database'), - $container->get('field.info'), - $container->get('entity.manager') + $container->get('entity.manager'), + $container->get('field.info') ); } @@ -182,12 +182,13 @@ public static function createInstance(ContainerInterface $container, EntityTypeI * The entity type definition. * @param \Drupal\Core\Database\Connection $database * The database connection to be used. - * @param \Drupal\field\FieldInfo $field_info - * The field info service. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. + * @param \Drupal\field\FieldInfo $field_info + * (optional) The field info service. Defaults to NULL as storage can be + * instantiated before Field module is installed. */ - public function __construct(EntityTypeInterface $entity_type, Connection $database, FieldInfo $field_info, EntityManagerInterface $entity_manager) { + public function __construct(EntityTypeInterface $entity_type, Connection $database, EntityManagerInterface $entity_manager, FieldInfo $field_info = NULL) { parent::__construct($entity_type); $this->database = $database; @@ -417,7 +418,12 @@ protected function processFields($field_names) { $mapping = array(); foreach ($field_names as $field_name) { $columns = isset($this->fieldDefinitions[$field_name]) ? array_keys($this->fieldDefinitions[$field_name]->getColumns()) : array(); - if (count($columns) > 1) { + // @todo Remove the entity reference check once we can handle schema + // changes or the Entity reference module stops messing with field + // schema. See: + // - https://drupal.org/node/1498720 + // - https://drupal.org/node/2209981 + if (count($columns) > 1 && $this->fieldDefinitions[$field_name]->getType() != 'entity_reference') { foreach ($columns as $column) { $mapping[$field_name][] = $field_name . '__' . $column; } diff --git a/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php b/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php index c1e636c..0ce7242 100644 --- a/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php +++ b/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php @@ -117,7 +117,14 @@ public function getSchema() { } } - $this->schema[$this->entityType->id()] = $schema; + // TODO Document this. + // We do not allow field schema to be changed. +// $alterable_schema = array_diff_key($schema, array('fields' => TRUE)); + $alterable_schema = $schema; + $context = array('entity_type_id' => $this->entityType->id()); + \Drupal::moduleHandler()->alter('entity_schema', $alterable_schema, $context); + + $this->schema[$this->entityType->id()] = $alterable_schema + $schema; } return $this->schema[$this->entityType->id()]; @@ -277,7 +284,7 @@ protected function initializeBaseTable() { if ($this->storage->getLayoutType() & ContentEntityDatabaseStorage::LAYOUT_REVISION) { $key = $this->entityType->getKey('revision'); - $schema['indexes'][$this->getEntityIndexName($key)] = array($key); + $schema['unique keys'][$this->getEntityIndexName($key)] = array($key); } return $schema; diff --git a/core/modules/block/custom_block/custom_block.install b/core/modules/block/custom_block/custom_block.install index 3474559..a4b555c 100644 --- a/core/modules/block/custom_block/custom_block.install +++ b/core/modules/block/custom_block/custom_block.install @@ -6,123 +6,6 @@ */ /** - * Implements hook_schema(). - */ -function custom_block_schema() { - $schema = array(); - $schema['custom_block'] = array( - 'description' => 'Stores contents of custom-made blocks.', - 'fields' => array( - 'id' => array( - 'type' => 'serial', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'description' => "The block's {custom_block}.id.", - ), - 'uuid' => array( - 'description' => 'Unique Key: Universally unique identifier for this entity.', - 'type' => 'varchar', - 'length' => 128, - 'not null' => FALSE, - ), - 'info' => array( - 'type' => 'varchar', - 'length' => 128, - 'not null' => TRUE, - 'default' => '', - 'description' => 'Block description.', - ), - // Defaults to NULL in order to avoid a brief period of potential - // deadlocks on the index. - 'revision_id' => array( - 'description' => 'The current {block_custom_revision}.revision_id version identifier.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => FALSE, - 'default' => NULL, - ), - 'type' => array( - 'description' => 'The type of this custom block.', - 'type' => 'varchar', - 'length' => 32, - 'not null' => TRUE, - 'default' => '', - ), - 'changed' => array( - 'description' => 'The Unix timestamp when the custom block was most recently saved.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'langcode' => array( - 'description' => 'The {language}.langcode of this node.', - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - ), - ), - 'primary key' => array('id'), - 'indexes' => array( - 'block_custom_type' => array(array('type', 4)), - ), - 'unique keys' => array( - 'revision_id' => array('revision_id'), - 'uuid' => array('uuid'), - 'info' => array('info'), - ), - 'foreign keys' => array( - 'custom_block_revision' => array( - 'table' => 'custom_block_revision', - 'columns' => array('revision_id' => 'revision_id'), - ), - ), - ); - - $schema['custom_block_revision'] = array( - 'description' => 'Stores contents of custom-made blocks.', - 'fields' => array( - 'id' => array( - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - 'description' => "The block's {custom_block}.id.", - ), - // Defaults to NULL in order to avoid a brief period of potential - // deadlocks on the index. - 'revision_id' => array( - 'description' => 'The current version identifier.', - 'type' => 'serial', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'log' => array( - 'description' => 'The log entry explaining the changes in this version.', - 'type' => 'text', - 'not null' => TRUE, - 'size' => 'big', - ), - 'info' => array( - 'type' => 'varchar', - 'length' => 128, - 'not null' => TRUE, - 'default' => '', - 'description' => 'Block description.', - ), - 'changed' => array( - 'description' => 'The Unix timestamp when the version was most recently saved.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - ), - 'primary key' => array('revision_id'), - ); - return $schema; -} - -/** * Implements hook_schema_0(). */ function custom_block_schema_0() { diff --git a/core/modules/comment/lib/Drupal/comment/CommentStorage.php b/core/modules/comment/lib/Drupal/comment/CommentStorage.php index ccc6a74..b0958d4 100644 --- a/core/modules/comment/lib/Drupal/comment/CommentStorage.php +++ b/core/modules/comment/lib/Drupal/comment/CommentStorage.php @@ -39,13 +39,13 @@ class CommentStorage extends ContentEntityDatabaseStorage implements CommentStor * The database connection to be used. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. - * @param \Drupal\field\FieldInfo $field_info - * The field info service. * @param \Drupal\comment\CommentStatisticsInterface $comment_statistics * The comment statistics service. + * @param \Drupal\field\FieldInfo $field_info + * The field info service. */ - public function __construct(EntityTypeInterface $entity_info, Connection $database, FieldInfo $field_info, EntityManagerInterface $entity_manager, CommentStatisticsInterface $comment_statistics) { - parent::__construct($entity_info, $database, $field_info, $entity_manager); + public function __construct(EntityTypeInterface $entity_info, Connection $database, EntityManagerInterface $entity_manager, CommentStatisticsInterface $comment_statistics, FieldInfo $field_info) { + parent::__construct($entity_info, $database, $entity_manager, $field_info); $this->statistics = $comment_statistics; } @@ -56,9 +56,9 @@ public static function createInstance(ContainerInterface $container, EntityTypeI return new static( $entity_info, $container->get('database'), - $container->get('field.info'), $container->get('entity.manager'), - $container->get('comment.statistics') + $container->get('comment.statistics'), + $container->get('field.info') ); } diff --git a/core/modules/entity/entity.module b/core/modules/entity/entity.module index 4ac08c2..c14ff66 100644 --- a/core/modules/entity/entity.module +++ b/core/modules/entity/entity.module @@ -107,6 +107,7 @@ function entity_modules_installed($modules) { $entity_manager = \Drupal::entityManager(); $schema = \Drupal::database()->schema(); $definitions = $entity_manager->getDefinitions(); + $installed = array(); foreach ($modules as $module) { foreach ($definitions as $entity_type_id => $entity_type) { @@ -118,12 +119,16 @@ function entity_modules_installed($modules) { // have been converted to an automatic schema. if (!drupal_get_schema($table_name) && !$schema->tableExists($table_name)) { $schema->createTable($table_name, $table_schema); + $installed[$module] = $entity_type_id; } } } } } } + + // TODO Document this. + \Drupal::moduleHandler()->invokeAll('entity_schema_installed', array($installed)); } /** diff --git a/core/modules/file/file.install b/core/modules/file/file.install index fb5a4eb..17722b4 100644 --- a/core/modules/file/file.install +++ b/core/modules/file/file.install @@ -9,104 +9,6 @@ * Implements hook_schema(). */ function file_schema() { - $schema['file_managed'] = array( - 'description' => 'Stores information for uploaded files.', - 'fields' => array( - 'fid' => array( - 'description' => 'File ID.', - 'type' => 'serial', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'uuid' => array( - 'description' => 'Unique Key: Universally unique identifier for this entity.', - 'type' => 'varchar', - 'length' => 128, - 'not null' => FALSE, - ), - 'uid' => array( - 'description' => 'The {users}.uid of the user who is associated with the file.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'filename' => array( - 'description' => 'Name of the file with no path components. This may differ from the basename of the URI if the file is renamed to avoid overwriting an existing file.', - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - ), - 'uri' => array( - 'description' => 'The URI to access the file (either local or remote).', - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - 'binary' => TRUE, - ), - 'langcode' => array( - 'description' => 'The {language}.langcode of this file.', - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - ), - 'filemime' => array( - 'description' => "The file's MIME type.", - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - ), - 'filesize' => array( - 'description' => 'The size of the file in bytes.', - 'type' => 'int', - 'size' => 'big', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'status' => array( - 'description' => 'A field indicating the status of the file. Two status are defined in core: temporary (0) and permanent (1). Temporary files older than DRUPAL_MAXIMUM_TEMP_FILE_AGE will be removed during a cron run.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'size' => 'tiny', - ), - 'created' => array( - 'description' => 'UNIX timestamp for when the file added.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'changed' => array( - 'description' => 'UNIX timestamp for when the file was last changed.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - ), - 'indexes' => array( - 'uid' => array('uid'), - 'status' => array('status'), - 'changed' => array('changed'), - ), - 'unique keys' => array( - 'uuid' => array('uuid'), - 'uri' => array('uri'), - ), - 'primary key' => array('fid'), - 'foreign keys' => array( - 'file_owner' => array( - 'table' => 'users', - 'columns' => array('uid' => 'uid'), - ), - ), - ); $schema['file_usage'] = array( 'description' => 'Track where a file is used.', diff --git a/core/modules/node/node.install b/core/modules/node/node.install index a6af612..2634bb2 100644 --- a/core/modules/node/node.install +++ b/core/modules/node/node.install @@ -39,310 +39,6 @@ function node_requirements($phase) { * Implements hook_schema(). */ function node_schema() { - $schema['node'] = array( - 'description' => 'The base table for nodes.', - 'fields' => array( - 'nid' => array( - 'description' => 'The primary identifier for a node.', - 'type' => 'serial', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'uuid' => array( - 'description' => 'Unique Key: Universally unique identifier for this entity.', - 'type' => 'varchar', - 'length' => 128, - 'not null' => FALSE, - ), - // Defaults to NULL in order to avoid a brief period of potential - // deadlocks on the index. - 'vid' => array( - 'description' => 'The current {node_field_revision}.vid version identifier.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => FALSE, - 'default' => NULL, - ), - 'type' => array( - 'description' => 'The type of this node.', - 'type' => 'varchar', - 'length' => 32, - 'not null' => TRUE, - 'default' => '', - ), - ), - 'indexes' => array( - 'node_type' => array(array('type', 4)), - ), - 'unique keys' => array( - 'vid' => array('vid'), - 'uuid' => array('uuid'), - ), - 'foreign keys' => array( - 'node_revision' => array( - 'table' => 'node_revision', - 'columns' => array('vid' => 'vid'), - ), - ), - 'primary key' => array('nid'), - ); - - $schema['node_revision'] = array( - 'description' => 'Stores information about each saved version of a {node}.', - 'fields' => array( - 'nid' => array( - 'description' => 'The {node} this version belongs to.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'vid' => array( - 'description' => 'The primary identifier for this version.', - 'type' => 'serial', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'revision_uid' => array( - 'description' => 'The {users}.uid that created this version.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'log' => array( - 'description' => 'The log entry explaining the changes in this version.', - 'type' => 'text', - 'not null' => FALSE, - 'size' => 'big', - ), - 'revision_timestamp' => array( - 'description' => 'The Unix timestamp when the version was created.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'langcode' => array( - 'description' => 'The {language}.langcode of this version.', - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - ), - ), - 'indexes' => array( - 'nid' => array('nid'), - 'revision_uid' => array('revision_uid'), - 'node_langcode' => array('langcode'), - ), - 'foreign keys' => array( - 'versioned_node' => array( - 'table' => 'node', - 'columns' => array('nid' => 'nid'), - ), - 'version_author' => array( - 'table' => 'users', - 'columns' => array('revision_uid' => 'uid'), - ), - ), - 'primary key' => array('vid'), - ); - - // Node field storage. - $schema['node_field_data'] = array( - 'description' => 'Data table for node base fields.', - 'fields' => array( - 'nid' => array( - 'description' => 'The primary identifier for a node.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'vid' => array( - 'description' => 'The current {node_field_revision}.vid version identifier.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'type' => array( - 'description' => 'The {node_type}.type of this node.', - 'type' => 'varchar', - 'length' => 32, - 'not null' => TRUE, - 'default' => '', - ), - 'langcode' => array( - 'description' => 'The {language}.langcode of these node property values.', - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - ), - 'default_langcode' => array( - 'description' => 'Boolean indicating whether the property values are in the {language}.langcode of this node.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 1, - ), - 'title' => array( - 'description' => 'The title of this node, always treated as non-markup plain text.', - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - ), - 'uid' => array( - 'description' => 'The {users}.uid that owns this node; initially, this is the user that created it.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'status' => array( - 'description' => 'Boolean indicating whether the node translation is published (visible to non-administrators).', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 1, - ), - 'created' => array( - 'description' => 'The Unix timestamp when the node translation was created.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'changed' => array( - 'description' => 'The Unix timestamp when the node translation was most recently saved.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'promote' => array( - 'description' => 'Boolean indicating whether the node translation should be displayed on the front page.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'sticky' => array( - 'description' => 'Boolean indicating whether the node translation should be displayed at the top of lists in which it appears.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - ), - 'indexes' => array( - 'node_changed' => array('changed'), - 'node_created' => array('created'), - 'node_default_langcode' => array('default_langcode'), - 'node_langcode' => array('langcode'), - 'node_frontpage' => array('promote', 'status', 'sticky', 'created'), - 'node_status_type' => array('status', 'type', 'nid'), - 'node_title_type' => array('title', array('type', 4)), - 'node_type' => array(array('type', 4)), - 'vid' => array('vid'), - 'uid' => array('uid'), - ), - 'foreign keys' => array( - 'node_base' => array( - 'table' => 'node', - 'columns' => array('nid' => 'nid'), - ), - 'node_author' => array( - 'table' => 'users', - 'columns' => array('uid' => 'uid'), - ), - ), - 'primary key' => array('nid', 'langcode'), - ); - - $schema['node_field_revision'] = array( - 'description' => 'Revision table for node base fields.', - 'fields' => array( - 'nid' => array( - 'description' => 'The {node} this version belongs to.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'vid' => array( - 'description' => 'The primary identifier for this version.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - ), - 'langcode' => array( - 'description' => 'The {language}.langcode of this version.', - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - ), - 'default_langcode' => array( - 'description' => 'Boolean indicating whether the property values of this version are in the {language}.langcode of this node.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 1, - ), - 'title' => array( - 'description' => 'The title of this version, always treated as non-markup plain text.', - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - ), - 'uid' => array( - 'description' => 'The {users}.uid that created this node.', - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'default' => 0, - ), - 'status' => array( - 'description' => 'Boolean indicating whether the node (at the time of this revision) is published (visible to non-administrators).', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 1, - ), - 'created' => array( - 'description' => 'The Unix timestamp when the node was created.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'changed' => array( - 'description' => 'The Unix timestamp when the version was most recently saved.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'promote' => array( - 'description' => 'Boolean indicating whether the node (at the time of this revision) should be displayed on the front page.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - 'sticky' => array( - 'description' => 'Boolean indicating whether the node (at the time of this revision) should be displayed at the top of lists in which it appears.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - ), - 'indexes' => array( - 'uid' => array('uid'), - 'node_default_langcode' => array('default_langcode'), - 'node_langcode' => array('langcode'), - ), - 'foreign keys' => array( - 'versioned_node' => array( - 'table' => 'node', - 'columns' => array('nid' => 'nid'), - ), - 'node_author' => array( - 'table' => 'users', - 'columns' => array('uid' => 'uid'), - ), - ), - 'primary key' => array('vid', 'langcode'), - ); $schema['node_access'] = array( 'description' => 'Identifies which realm/grant pairs a user must possess in order to view, update, or delete specific nodes.', diff --git a/core/modules/taxonomy/taxonomy.install b/core/modules/taxonomy/taxonomy.install index f76d350..fdf7fa1 100644 --- a/core/modules/taxonomy/taxonomy.install +++ b/core/modules/taxonomy/taxonomy.install @@ -9,77 +9,6 @@ * Implements hook_schema(). */ function taxonomy_schema() { - $schema['taxonomy_term_data'] = array( - 'description' => 'Stores term information.', - 'fields' => array( - 'tid' => array( - 'type' => 'serial', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'description' => 'Primary Key: Unique term ID.', - ), - 'uuid' => array( - 'description' => 'Unique Key: Universally unique identifier for this entity.', - 'type' => 'varchar', - 'length' => 128, - 'not null' => FALSE, - ), - 'vid' => array( - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - 'description' => 'The ID of the vocabulary to which the term is assigned.', - ), - 'langcode' => array( - 'description' => 'The {language}.langcode of this term.', - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - ), - 'name' => array( - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - 'description' => 'The term name.', - ), - 'description__value' => array( - 'type' => 'text', - 'not null' => FALSE, - 'size' => 'big', - 'description' => 'A description of the term.', - ), - 'description__format' => array( - 'type' => 'varchar', - 'length' => 255, - 'not null' => FALSE, - 'description' => 'The filter format ID of the description.', - ), - 'weight' => array( - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'description' => 'The weight of this term in relation to other terms.', - ), - 'changed' => array( - 'description' => 'The Unix timestamp when the term was most recently saved.', - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - ), - ), - 'primary key' => array('tid'), - 'unique keys' => array( - 'uuid' => array('uuid'), - ), - 'indexes' => array( - 'taxonomy_tree' => array(array('vid', 64), 'weight', 'name'), - 'vid_name' => array(array('vid', 64), 'name'), - 'name' => array('name'), - ), - ); $schema['taxonomy_term_hierarchy'] = array( 'description' => 'Stores the hierarchical relationship between terms.', diff --git a/core/modules/user/lib/Drupal/user/UserStorage.php b/core/modules/user/lib/Drupal/user/UserStorage.php index 81266b4..6c74e91 100644 --- a/core/modules/user/lib/Drupal/user/UserStorage.php +++ b/core/modules/user/lib/Drupal/user/UserStorage.php @@ -48,8 +48,6 @@ class UserStorage extends ContentEntityDatabaseStorage implements UserStorageInt * The entity type definition. * @param \Drupal\Core\Database\Connection $database * The database connection to be used. - * @param \Drupal\field\FieldInfo $field_info - * The field info service. * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager * The entity manager. * @param \Drupal\Core\Entity\Schema\ContentEntitySchemaHandlerInterface $schema_builder @@ -58,9 +56,12 @@ class UserStorage extends ContentEntityDatabaseStorage implements UserStorageInt * The password hashing service. * @param \Drupal\user\UserDataInterface $user_data * The user data service. + * @param \Drupal\field\FieldInfo $field_info + * (optional) The field info service. Defaults to NULL as user storage can + * be instantiated before Field module is installed. */ - public function __construct(EntityTypeInterface $entity_type, Connection $database, FieldInfo $field_info, EntityManagerInterface $entity_manager, PasswordInterface $password, UserDataInterface $user_data) { - parent::__construct($entity_type, $database, $field_info, $entity_manager); + public function __construct(EntityTypeInterface $entity_type, Connection $database, EntityManagerInterface $entity_manager, PasswordInterface $password, UserDataInterface $user_data, FieldInfo $field_info = NULL) { + parent::__construct($entity_type, $database, $entity_manager, $field_info); $this->password = $password; $this->userData = $user_data; @@ -73,10 +74,10 @@ public static function createInstance(ContainerInterface $container, EntityTypeI return new static( $entity_type, $container->get('database'), - $container->get('field.info'), $container->get('entity.manager'), $container->get('password'), - $container->get('user.data') + $container->get('user.data'), + $container->has('field.info') ? $container->get('field.info') : NULL ); } diff --git a/core/modules/user/user.info.yml b/core/modules/user/user.info.yml index 45a421a..dbdb520 100644 --- a/core/modules/user/user.info.yml +++ b/core/modules/user/user.info.yml @@ -6,3 +6,5 @@ version: VERSION core: 8.x required: true configure: user.admin_index +dependencies: + - entity diff --git a/core/modules/user/user.install b/core/modules/user/user.install index c21e295..fda74db 100644 --- a/core/modules/user/user.install +++ b/core/modules/user/user.install @@ -12,129 +12,6 @@ * Implements hook_schema(). */ function user_schema() { - // The table name here is plural, despite Drupal table naming standards, - // because "user" is a reserved word in many databases. - $schema['users'] = array( - 'description' => 'Stores user data.', - 'fields' => array( - 'uid' => array( - 'type' => 'int', - 'unsigned' => TRUE, - 'not null' => TRUE, - 'description' => 'Primary Key: Unique user ID.', - 'default' => 0, - ), - 'uuid' => array( - 'description' => 'Unique Key: Universally unique identifier for this entity.', - 'type' => 'varchar', - 'length' => 128, - 'not null' => FALSE, - ), - 'name' => array( - 'type' => 'varchar', - 'length' => 60, - 'not null' => TRUE, - 'default' => '', - 'description' => 'Unique user name.', - ), - 'langcode' => array( - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - 'description' => "The {language}.langcode of the user's profile.", - ), - 'pass' => array( - 'type' => 'varchar', - 'length' => 128, - 'not null' => TRUE, - 'default' => '', - 'description' => "User's password (hashed).", - ), - 'mail' => array( - 'type' => 'varchar', - 'length' => 254, - 'not null' => FALSE, - 'default' => '', - 'description' => "User's e-mail address.", - ), - 'signature' => array( - 'type' => 'varchar', - 'length' => 255, - 'not null' => TRUE, - 'default' => '', - 'description' => "User's signature.", - ), - 'signature_format' => array( - 'type' => 'varchar', - 'length' => 255, - 'not null' => FALSE, - 'description' => 'The filter format ID of the signature.', - ), - 'created' => array( - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'description' => 'Timestamp for when user was created.', - ), - 'access' => array( - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'description' => 'Timestamp for previous time user accessed the site.', - ), - 'login' => array( - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'description' => "Timestamp for user's last login.", - ), - 'status' => array( - 'type' => 'int', - 'not null' => TRUE, - 'default' => 0, - 'size' => 'tiny', - 'description' => 'Whether the user is active(1) or blocked(0).', - ), - 'timezone' => array( - 'type' => 'varchar', - 'length' => 32, - 'not null' => FALSE, - 'description' => "User's time zone.", - ), - 'preferred_langcode' => array( - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - 'description' => 'The {language}.langcode that the user prefers for receiving emails and viewing the site.', - ), - 'preferred_admin_langcode' => array( - 'type' => 'varchar', - 'length' => 12, - 'not null' => TRUE, - 'default' => '', - 'description' => 'The {language}.langcode that the user prefers for viewing administration pages.', - ), - 'init' => array( - 'type' => 'varchar', - 'length' => 254, - 'not null' => FALSE, - 'default' => '', - 'description' => 'E-mail address used for initial account creation.', - ), - ), - 'indexes' => array( - 'access' => array('access'), - 'created' => array('created'), - 'mail' => array('mail'), - ), - 'unique keys' => array( - 'uuid' => array('uuid'), - 'name' => array('name'), - ), - 'primary key' => array('uid'), - ); $schema['users_data'] = array( 'description' => 'Stores module data as key/value pairs per user.', @@ -217,31 +94,33 @@ function user_schema() { } /** - * Implements hook_install(). + * Implements hook_entity_schema_installed(). */ -function user_install() { - // Insert a row for the anonymous user. - db_insert('users') - ->fields(array( - 'uid' => 0, - 'uuid' => \Drupal::service('uuid')->generate(), - 'name' => '', - 'mail' => '', - 'langcode' => language_default()->id, - )) - ->execute(); +function user_entity_schema_installed($installed) { + if (isset($installed['user'])) { + // Insert a row for the anonymous user. + db_insert('users') + ->fields(array( + 'uid' => 0, + 'uuid' => \Drupal::service('uuid')->generate(), + 'name' => '', + 'mail' => '', + 'langcode' => language_default()->id, + )) + ->execute(); - // We need some placeholders here as name and mail are uniques. - // This will be changed by the settings form in the installer. - db_insert('users') - ->fields(array( - 'uid' => 1, - 'uuid' => \Drupal::service('uuid')->generate(), - 'name' => 'placeholder-for-uid-1', - 'mail' => 'placeholder-for-uid-1', - 'created' => REQUEST_TIME, - 'status' => 1, - 'langcode' => language_default()->id, - )) - ->execute(); + // We need some placeholders here as name and mail are uniques. + // This will be changed by the settings form in the installer. + db_insert('users') + ->fields(array( + 'uid' => 1, + 'uuid' => \Drupal::service('uuid')->generate(), + 'name' => 'placeholder-for-uid-1', + 'mail' => 'placeholder-for-uid-1', + 'created' => REQUEST_TIME, + 'status' => 1, + 'langcode' => language_default()->id, + )) + ->execute(); + } } diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 0ed9aa1..5de7394 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -146,6 +146,15 @@ function user_js_alter(&$javascript) { } /** + * Implements hook_entity_schema_alter(). + */ +function user_entity_schema_alter(&$schema, $context) { + if ($context['entity_type_id'] == 'user') { + $schema['users']['fields']['uid']['type'] = 'int'; + } +} + +/** * Implements hook_entity_bundle_info(). */ function user_entity_bundle_info() {