bynder-4.0.0-beta1/bynder.install
bynder.install
<?php
/**
* @file
* Install, uninstall and update hooks for Bynder module.
*/
use Drupal\bynder\Plugin\Field\FieldType\BynderMetadataItem;
use Drupal\bynder\Plugin\media\Source\Bynder;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Utility\UpdateException;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\system\Entity\Action;
/**
* Implements hook_requirements().
*/
function bynder_requirements($phase) {
$requirements = [];
// Test if we can connect to the Bynder API.
if ($phase === 'runtime') {
$api = \Drupal::service('bynder_api');
try {
$api->getBrands();
$requirements['bynder'] = [
'title' => t('Bynder'),
'value' => t('Connected to @url', ['@url' => \Drupal::config('bynder.settings')->get('account_domain')]),
];
}
catch (\Exception $e) {
$requirements['bynder'] = [
'title' => t('Bynder'),
'value' => t('Error connecting to @url', ['@url' => \Drupal::config('bynder.settings')->get('account_domain')]),
'description' => $e->getMessage(),
'severity' => REQUIREMENT_ERROR,
];
}
}
return $requirements;
}
/**
* Implements hook_install().
*/
function bynder_install() {
$source = \Drupal::service('extension.list.module')->getPath('bynder') . '/images/icons';
$destination = \Drupal::config('media.settings')->get('icon_base_uri');
\Drupal::service('file_system')->prepareDirectory($destination, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS);
$files = \Drupal::service('file_system')->scanDirectory($source, '/.*\.(svg|png|jpg|jpeg|gif)$/');
foreach ($files as $file) {
// When reinstalling this module we don't want to copy the icons when they
// already exist. The icons could be replaced (by a contrib module or
// manually), so we don't want to replace the existing files. Removing the
// files when we uninstall could also be a problem if the files are
// referenced somewhere else. Since showing an error that it was not
// possible to copy the files is also confusing, we silently do nothing.
if (!file_exists($destination . DIRECTORY_SEPARATOR . $file->filename)) {
\Drupal::service('file_system')->copy($file->uri, $destination, FileSystemInterface::EXISTS_ERROR);
}
}
}
/**
* Install Bynder metaproperty schema.
*/
function bynder_update_8001() {
// Removed so it won't run on sites that didn't run it yet.
}
/**
* Remove unecessary database table.
*/
function bynder_update_8002() {
$database = \Drupal::database();
if ($database->tableExists('bynder_metaproperty_information')) {
$database->dropTable('bynder_metaproperty_information');
}
}
/**
* Update module's configuration.
*/
function bynder_update_8003() {
\Drupal::configFactory()->getEditable('bynder.settings')
->set('cache_lifetime', 86400)
->clear('derivatives')
->save();
}
/**
* Update cached information.
*/
function bynder_update_8004() {
\Drupal::service('bynder_api')->updateCachedData();
}
/**
* Set default timeout for API requests.
*/
function bynder_update_8005() {
\Drupal::configFactory()->getEditable('bynder.settings')
->set('timeout', 10)
->save();
}
/**
* Creates bynder_metadata field and set the update frequency.
*/
function bynder_update_8008() {
// Clear field type plugin caches to allow the new field to be installed.
\Drupal::service('plugin.manager.field.field_type')->clearCachedDefinitions();
// Update local metadata information once per week (in seconds).
\Drupal::configFactory()->getEditable('bynder.settings')->set('update_frequency', 7 * 24 * 60 * 60)->save();
// Add the action config entity to update the Bynder metadata.
if (!Action::load('bynder_metadata')) {
$action = Action::create([
'id' => 'bynder_metadata',
'label' => 'Update Bynder metadata',
'type' => 'media',
'plugin' => 'bynder_metadata',
]);
$action->save();
}
// Do nothing if the field already exists.
if ($metadata_field_storage = FieldStorageConfig::loadByName('media', BynderMetadataItem::METADATA_FIELD_NAME)) {
if ($metadata_field_storage->getType() !== 'bynder_metadata') {
throw new UpdateException('The "bynder_metadata" media field already exists. Please remove the it before running the update function.');
}
return;
}
$entity_type_manager = \Drupal::entityTypeManager();
$metadata_field_storage = NULL;
// Create a field instance for each of the Bynder media types.
foreach (\Drupal::service('bynder')->getBynderMediaTypes() as $media_type_id => $media_type) {
/** @var \Drupal\bynder\Plugin\media\Source\Bynder $source */
$source = $media_type->getSource();
if (!$metadata_field_storage) {
$metadata_field_storage = $source->createMetadataFieldStorage();
$metadata_field_storage->save();
}
$metadata_field = $source->createMetadataField($media_type);
$metadata_field->save();
/** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $form_display */
$form_display = $entity_type_manager->getStorage('entity_form_display')->load("media.$media_type_id.default");
if ($form_display) {
$form_display->removeComponent(BynderMetadataItem::METADATA_FIELD_NAME)->save();
}
/** @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface $view_display */
$view_display = $entity_type_manager->getStorage('entity_view_display')->load("media.$media_type_id.default");
if ($view_display) {
$view_display->removeComponent(BynderMetadataItem::METADATA_FIELD_NAME)->save();
}
}
}
/**
* Enables the bynder_usage submodule.
*/
function bynder_update_8009() {
/** @var \Drupal\Core\Extension\ModuleExtensionList $module_list */
$module_list = \Drupal::service('extension.list.module');
if ($module_list->exists('entity_usage')) {
\Drupal::service('module_installer')->install(['bynder_usage']);
}
if (!$module_list->exists('dropzonejs') || !$module_list->exists('entity_usage')) {
return t('Dropzonejs and Entity Usage are now optional dependencies and no longer required. Explicitly require these dependencies to keep upload and usage functionality available: composer require drupal/dropzonejs drupal/entity_usage:1.*');
}
}
/**
* Enables the jquery_ui_tooltip module.
*/
function bynder_update_8300() {
/** @var \Drupal\Core\Extension\ModuleExtensionList $module_list */
$module_list = \Drupal::service('extension.list.module');
if ($module_list->exists('jquery_ui_tooltip')) {
\Drupal::service('module_installer')->install(['jquery_ui_tooltip']);
}
}
/**
* Remove old configuration, manual reconfiguration is necessary.
*/
function bynder_update_8400() {
$config = \Drupal::configFactory()->getEditable('bynder.settings');
$config->set('account_domain', str_replace('https://', '', $config->get('account_domain')));
$config->clear('consumer_key');
$config->clear('consumer_secret');
$config->clear('token');
$config->clear('token_secret');
$config->save();
return t('Bynder configuration has changed, a permanent token and optionally client id/secret is now required instead of the previous API keys. Reconfigure it on the configuration page.');
}
/**
* Creates bynder_tranformation field.
*/
function bynder_update_8401() {
// Do nothing if the field already exists.
if ($transformations_field_storage = FieldStorageConfig::loadByName('media', Bynder::TRANSFORMATIONS_FIELD_NAME)) {
if ($transformations_field_storage->getType() !== 'text') {
throw new UpdateException('The "bynder_transformations" media field already exists. Please remove the it before running the update function.');
}
return;
}
$entity_type_manager = \Drupal::entityTypeManager();
$transformations_field_storage = NULL;
// Create a field instance for each of the Bynder media types.
foreach (\Drupal::service('bynder')->getBynderMediaTypes() as $media_type_id => $media_type) {
/** @var \Drupal\bynder\Plugin\media\Source\Bynder $source */
$source = $media_type->getSource();
if (!$transformations_field_storage) {
$transformations_field_storage = $source->createTransformationsFieldStorage();
$transformations_field_storage->save();
}
$transformations_field = $source->createTransformationsField($media_type);
$transformations_field->save();
}
}
