paragraphs-8.x-1.11/modules/paragraphs_library/paragraphs_library.install
modules/paragraphs_library/paragraphs_library.install
<?php /** * @file * Install/Update hooks for paragraphs library. */ use Drupal\Core\Entity\Entity\EntityFormDisplay; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\field\Entity\FieldConfig; use Drupal\paragraphs_library\Entity\LibraryItem; /** * Implements hook_install(). */ function paragraphs_library_install() { if (\Drupal::isConfigSyncing()) { return; } if (\Drupal::moduleHandler()->moduleExists('entity_browser')) { EntityFormDisplay::load('paragraph.from_library.default') ->setComponent('field_reusable_paragraph', [ 'type' => 'entity_browser_entity_reference', 'settings' => [ 'entity_browser' => 'paragraphs_library_items', 'open' => TRUE, 'field_widget_display' => 'rendered_entity', 'field_widget_display_settings' => [ 'view_mode' => 'summary', ], 'field_widget_remove' => FALSE, 'field_widget_replace' => TRUE, ], ]) ->save(); } // Make sure the "Usage" local task is enabled for library items. $entity_usage_config = \Drupal::configFactory()->getEditable('entity_usage.settings'); $tabs_enabled = $entity_usage_config->get('local_task_enabled_entity_types'); if (is_array($tabs_enabled) && !in_array('paragraphs_library_item', $tabs_enabled)) { $tabs_enabled[] = 'paragraphs_library_item'; $entity_usage_config->set('local_task_enabled_entity_types', $tabs_enabled) ->save(); } // Enable the usage warning message on edit and delete forms. $edit_warning_enabled = $entity_usage_config->get('edit_warning_message_entity_types') ?: []; if (!in_array('paragraphs_library_item', $edit_warning_enabled)) { $edit_warning_enabled[] = 'paragraphs_library_item'; $entity_usage_config->set('edit_warning_message_entity_types', $edit_warning_enabled) ->save(); } $delete_warning_enabled = $entity_usage_config->get('delete_warning_message_entity_types') ?: []; if (!in_array('paragraphs_library_item', $delete_warning_enabled)) { $delete_warning_enabled[] = 'paragraphs_library_item'; $entity_usage_config->set('delete_warning_message_entity_types', $delete_warning_enabled) ->save(); } } /** * Make library items translatable. */ function paragraphs_library_update_8001() { \Drupal::service('entity_type.manager')->clearCachedDefinitions(); // Load all library items and store their values in memory. $library_values = \Drupal::database()->query('SELECT * FROM {paragraphs_library_item}')->fetchAll(PDO::FETCH_ASSOC); // Now, truncate the tables to delete the data without invoking APIs that // would also delete the referenced paragraphs. \Drupal::database()->truncate('paragraphs_library_item')->execute(); \Drupal::database()->truncate('paragraphs_library_item_revision')->execute(); // Make the entity type translatable. $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager(); $entity_type = $entity_definition_update_manager->getEntityType('paragraphs_library_item'); //$entity_definition_update_manager->uninstallEntityType($entity_type); $entity_type->set('translatable', TRUE); $keys = $entity_type->getKeys(); $keys['langcode'] = 'langcode'; $entity_type->set('entity_keys', $keys); //$entity_type->setHandlerClass('storage_schema', LibraryItemStorageSchema::class); $entity_definition_update_manager->updateEntityType($entity_type); $langcode_field = BaseFieldDefinition::create('language') ->setLabel(t('Language')) ->setDisplayOptions('view', [ 'region' => 'hidden', ]) ->setDisplayOptions('form', [ 'type' => 'language_select', 'weight' => 2, ]) ->setRevisionable(TRUE) ->setTranslatable(TRUE); $default_langcode_field = BaseFieldDefinition::create('boolean') ->setLabel(t('Default translation')) ->setDescription(t('A flag indicating whether this is the default translation.')) ->setTranslatable(TRUE) ->setRevisionable(TRUE) ->setDefaultValue(TRUE); $entity_definition_update_manager->installFieldStorageDefinition('langcode', $entity_type->id(), 'paragraphs_library', $langcode_field); $entity_definition_update_manager->installFieldStorageDefinition('default_langcode', $entity_type->id(), 'paragraphs_library', $default_langcode_field); \Drupal::entityTypeManager()->clearCachedDefinitions(); foreach ($library_values as $library_value) { $library_value['paragraphs'] = [ 'target_id' => $library_value['paragraphs__target_id'], 'target_revision_id' => $library_value['paragraphs__target_revision_id'] ]; unset($library_value['paragraphs__target_id']); unset($library_value['paragraphs__target_revision_id']); LibraryItem::create($library_value)->save(); } } /** * Set library item's paragraph field required. */ function paragraphs_library_update_8002() { if ($field = FieldConfig::load('paragraph.from_library.field_reusable_paragraph')) { $field->setRequired(TRUE)->save(); } } /** * Add revision log field. */ function paragraphs_library_update_8003() { $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager(); $entity_type = $entity_definition_update_manager->getEntityType('paragraphs_library_item'); $storage_definition = BaseFieldDefinition::create('string_long') ->setLabel(t('Revision log message')) ->setDescription(t('The log entry explaining the changes in this revision.')) ->setRevisionable(TRUE) ->setDisplayOptions('form', [ 'type' => 'string_textarea', 'weight' => 25, 'settings' => [ 'rows' => 4, ], ]); \Drupal::entityDefinitionUpdateManager()->installFieldStorageDefinition( 'revision_log', $entity_type->id(), 'paragraphs_library_item', $storage_definition ); } /** * Make the label revisionable. */ function paragraphs_library_update_8004() { $database = \Drupal::database(); $column_schema = [ 'type' => 'varchar', 'length' => 255, 'binary' => FALSE, 'not null' => FALSE, ]; $database->schema()->addField('paragraphs_library_item_revision_field_data', 'label', $column_schema); $result = $database->query('SELECT id, langcode, label FROM {paragraphs_library_item_field_data}'); foreach ($result as $row) { $database->update('paragraphs_library_item_revision_field_data') ->fields([ 'label' => $row->label, ]) ->condition('id', $row->id) ->condition('langcode', $row->langcode) ->execute(); } // Update the field storage repository. \Drupal::service('entity_field.manager')->clearCachedFieldDefinitions(); $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); $storage_definition = $definition_update_manager->getFieldStorageDefinition('label', 'paragraphs_library_item'); $storage_definition->setRevisionable(TRUE); \Drupal::service('entity.last_installed_schema.repository')->setLastInstalledFieldStorageDefinition($storage_definition); // Update the stored field schema. // @todo: There has to be a better way to do this. $key = 'paragraphs_library_item.field_schema_data.label'; $field_schema = \Drupal::keyValue('entity.storage_schema.sql')->get($key); $field_schema['paragraphs_library_item_revision_field_data']['fields']['label'] = $column_schema; \Drupal::keyValue('entity.storage_schema.sql')->set($key, $field_schema); } /** * Add author and revision fields. */ function paragraphs_library_update_8005() { $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager(); $entity_type = $entity_definition_update_manager->getEntityType('paragraphs_library_item'); $revision_metadata_keys = $entity_type->get('revision_metadata_keys'); $revision_metadata_keys += [ 'revision_created' => 'revision_created', 'revision_user' => 'revision_uid', 'revision_log_message' => 'revision_log' ]; $entity_type->set('revision_metadata_keys', $revision_metadata_keys); $entity_definition_update_manager->updateEntityType($entity_type); $uid = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Authored by')) ->setDescription(t('The user ID of the library item author.')) ->setRevisionable(TRUE) ->setSetting('target_type', 'user') ->setSetting('handler', 'default') ->setDefaultValueCallback('Drupal\paragraphs_library\Entity\LibraryItem::getCurrentUserId') ->setTranslatable(TRUE) ->setDisplayOptions('form', [ 'region' => 'hidden', 'weight' => 0, ]) ->setDisplayConfigurable('form', TRUE); $created = BaseFieldDefinition::create('created') ->setLabel(t('Revision create time')) ->setDescription(t('The time that the current revision was created.')) ->setRevisionable(TRUE); $revision_uid = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Revision user')) ->setDescription(t('The user ID of the author of the current revision.')) ->setSetting('target_type', 'user') ->setRevisionable(TRUE); $has_content_translation_uid_field = \Drupal::moduleHandler()->moduleExists('content_translation') && $entity_definition_update_manager->getFieldStorageDefinition('content_translation_uid', $entity_type->id()); if ($has_content_translation_uid_field) { $uid->setInitialValueFromField('content_translation_uid'); $revision_uid->setInitialValueFromField('content_translation_uid'); } else { $uid->setInitialValue(0); $revision_uid->setInitialValue(0); } $entity_definition_update_manager->installFieldStorageDefinition('uid', $entity_type->id(), 'paragraphs_library', $uid); $entity_definition_update_manager->installFieldStorageDefinition('revision_created', $entity_type->id(), 'paragraphs_library', $created); $entity_definition_update_manager->installFieldStorageDefinition('revision_uid', $entity_type->id(), 'paragraphs_library', $revision_uid); $database = \Drupal::database(); $result = $database->query('SELECT revision_id, MIN(changed) as changed FROM {paragraphs_library_item_field_data} GROUP BY revision_id'); foreach ($result as $row) { $database->update('paragraphs_library_item_revision') ->fields([ 'revision_created' => $row->changed, ]) ->condition('revision_id', $row->revision_id) ->execute(); } // Uninstall the 'content_translation_uid' field if needed. if ($has_content_translation_uid_field) { // First we have to remove the field data. $database->update($entity_type->getDataTable()) ->fields(['content_translation_uid' => NULL]) ->execute(); $database->update($entity_type->getRevisionDataTable()) ->fields(['content_translation_uid' => NULL]) ->execute(); $content_translation_status = $entity_definition_update_manager->getFieldStorageDefinition('content_translation_uid', $entity_type->id()); $entity_definition_update_manager->uninstallFieldStorageDefinition($content_translation_status); } } /** * Add a publishing status field. */ function paragraphs_library_update_8006() { $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); // Add the published entity key. $entity_type = $definition_update_manager->getEntityType('paragraphs_library_item'); $entity_keys = $entity_type->getKeys(); $entity_keys['published'] = 'status'; $entity_type->set('entity_keys', $entity_keys); $definition_update_manager->updateEntityType($entity_type); // Add the publishing status field. $status = BaseFieldDefinition::create('boolean') ->setLabel(t('Published')) ->setRevisionable(TRUE) ->setTranslatable(TRUE) ->setDefaultValue(TRUE) ->setDisplayOptions('form', [ 'type' => 'boolean_checkbox', 'settings' => [ 'display_label' => TRUE, ], 'weight' => 3, ]) ->setDisplayConfigurable('form', TRUE); $has_content_translation_status_field = \Drupal::moduleHandler()->moduleExists('content_translation') && $definition_update_manager->getFieldStorageDefinition('content_translation_status', $entity_type->id()); $database = \Drupal::database(); if ($has_content_translation_status_field) { // Make sure that there are no NULL values. $database->update($entity_type->getDataTable()) ->fields(['content_translation_status' => 1]) ->isNull('content_translation_status') ->execute(); $database->update($entity_type->getRevisionDataTable()) ->fields(['content_translation_status' => 1]) ->isNull('content_translation_status') ->execute(); $status->setInitialValueFromField('content_translation_status'); } else { $status->setInitialValue(TRUE); } $definition_update_manager->installFieldStorageDefinition('status', $entity_type->id(), 'paragraphs_library', $status); // Uninstall the 'content_translation_status' field if needed. if ($has_content_translation_status_field) { $database->update($entity_type->getDataTable()) ->fields(['content_translation_status' => NULL]) ->execute(); $database->update($entity_type->getRevisionDataTable()) ->fields(['content_translation_status' => NULL]) ->execute(); $content_translation_status = $definition_update_manager->getFieldStorageDefinition('content_translation_status', $entity_type->id()); $definition_update_manager->uninstallFieldStorageDefinition($content_translation_status); } } /** * Enable "Usage" tab on library items. */ function paragraphs_library_update_8101() { $entity_usage_config = \Drupal::configFactory()->getEditable('entity_usage.settings'); $tabs_enabled = $entity_usage_config->get('local_task_enabled_entity_types'); if (is_array($tabs_enabled) && !in_array('paragraphs_library_item', $tabs_enabled)) { $tabs_enabled[] = 'paragraphs_library_item'; $entity_usage_config->set('local_task_enabled_entity_types', $tabs_enabled) ->save(); } } /** * Enable the usage warning message on edit and delete forms. */ function paragraphs_library_update_8102() { $entity_usage_config = \Drupal::configFactory()->getEditable('entity_usage.settings'); $edit_warning_enabled = $entity_usage_config->get('edit_warning_message_entity_types') ?: []; if (!in_array('paragraphs_library_item', $edit_warning_enabled)) { $edit_warning_enabled[] = 'paragraphs_library_item'; $entity_usage_config->set('edit_warning_message_entity_types', $edit_warning_enabled) ->save(); } $delete_warning_enabled = $entity_usage_config->get('delete_warning_message_entity_types') ?: []; if (!in_array('paragraphs_library_item', $delete_warning_enabled)) { $delete_warning_enabled[] = 'paragraphs_library_item'; $entity_usage_config->set('delete_warning_message_entity_types', $delete_warning_enabled) ->save(); } } /** * Add the paragraphs_library module as dependency to the from_library paragraphs type. */ function paragraphs_library_update_8103() { $config = \Drupal::configFactory()->getEditable('paragraphs.paragraphs_type.from_library'); if ($config->isNew()) { return; } $dependencies = $config->get('dependencies') ?? []; $dependencies['enforced']['module'][] = 'paragraphs_library'; $config->set('dependencies', $dependencies); $config->save(); }