From 1ea2fde5f56d7665f6648df49d64d3bdfddb01c4 Mon Sep 17 00:00:00 2001 From: Brian Date: Thu, 1 Dec 2016 20:21:06 -0500 Subject: [PATCH] Issue #2830050 by bkosborne: FileUpload widget should allow file extensions from all supported media bundles (#227) --- .../src/BundleResolverBase.php | 33 +++---------------- .../src/BundleResolverInterface.php | 8 +++++ .../EntityBrowser/Widget/FileUpload.php | 20 +++++++++++ .../Plugin/MediaBundleResolver/FileUpload.php | 2 +- .../lightning_media/src/SourceFieldTrait.php | 21 ++++++++++-- 5 files changed, 53 insertions(+), 31 deletions(-) diff --git a/modules/lightning_features/lightning_media/src/BundleResolverBase.php b/modules/lightning_features/lightning_media/src/BundleResolverBase.php index 5e3c2a547..58fdb2056 100644 --- a/modules/lightning_features/lightning_media/src/BundleResolverBase.php +++ b/modules/lightning_features/lightning_media/src/BundleResolverBase.php @@ -13,6 +13,8 @@ */ abstract class BundleResolverBase extends PluginBase implements BundleResolverInterface, ContainerFactoryPluginInterface { + use SourceFieldTrait; + /** * The media bundle entity storage handler. * @@ -20,13 +22,6 @@ abstract class BundleResolverBase extends PluginBase implements BundleResolverIn */ protected $bundleStorage; - /** - * The configurable field entity storage handler. - * - * @var \Drupal\Core\Entity\EntityStorageInterface - */ - protected $fieldStorage; - /** * BundleResolverBase constructor. * @@ -58,35 +53,17 @@ public static function create(ContainerInterface $container, array $configuratio } /** - * Returns all possible bundles for the field type(s) this plugin supports. - * - * @return MediaBundleInterface[] - * Applicable media bundles, keyed by ID. + * {@inheritdoc} */ - protected function getPossibleBundles() { + public function getPossibleBundles() { $plugin_definition = $this->getPluginDefinition(); $filter = function (MediaBundleInterface $bundle) use ($plugin_definition) { - $field = $this->getSourceField($bundle); + $field = $this->getSourceFieldForBundle($bundle); return $field ? in_array($field->getType(), $plugin_definition['field_types']) : FALSE; }; return array_filter($this->bundleStorage->loadMultiple(), $filter); } - /** - * Returns the source field for a media bundle. - * - * @param \Drupal\media_entity\MediaBundleInterface $bundle - * The media bundle entity. - * - * @return \Drupal\Core\Field\FieldConfigInterface - * The configurable source field entity. - */ - protected function getSourceField(MediaBundleInterface $bundle) { - $type_config = $bundle->getType()->getConfiguration(); - $id = 'media.' . $bundle->id() . '.' . $type_config['source_field']; - return $this->fieldStorage->load($id); - } - } diff --git a/modules/lightning_features/lightning_media/src/BundleResolverInterface.php b/modules/lightning_features/lightning_media/src/BundleResolverInterface.php index c49b61d87..d53393602 100644 --- a/modules/lightning_features/lightning_media/src/BundleResolverInterface.php +++ b/modules/lightning_features/lightning_media/src/BundleResolverInterface.php @@ -23,4 +23,12 @@ interface BundleResolverInterface { */ public function getBundle($input); + /** + * Returns all possible bundles for the field type(s) this plugin supports. + * + * @return MediaBundleInterface[] + * Applicable media bundles, keyed by ID. + */ + public function getPossibleBundles(); + } diff --git a/modules/lightning_features/lightning_media/src/Plugin/EntityBrowser/Widget/FileUpload.php b/modules/lightning_features/lightning_media/src/Plugin/EntityBrowser/Widget/FileUpload.php index 7ab505a90..a90dd36bf 100644 --- a/modules/lightning_features/lightning_media/src/Plugin/EntityBrowser/Widget/FileUpload.php +++ b/modules/lightning_features/lightning_media/src/Plugin/EntityBrowser/Widget/FileUpload.php @@ -134,6 +134,9 @@ public function getForm(array &$original_form, FormStateInterface $form_state, a [ManagedFile::class, 'processManagedFile'], [$this, 'processInitialFileElement'], ], + '#upload_validators' => [ + 'file_validate_extensions' => [$this->getAllowedFileUploadExtensions()], + ], ); return $form; @@ -315,6 +318,23 @@ public function onRemove(array &$form, FormStateInterface $form_state, Request $ return $response->addCommand($command); } + /** + * Returns a list of acceptable file extensions for the file upload field. + * + * @return array + * The list of acceptable file extensions. + */ + protected function getAllowedFileUploadExtensions() { + $extensions = []; + $possible_bundles = $this->bundleResolver->getPossibleBundles(); + foreach ($possible_bundles as $bundle) { + $field = $this->getSourceFieldForBundle($bundle); + $extensions = array_merge($extensions, preg_split('/,?\s+/', $field->getSetting('file_extensions'))); + } + + return implode(' ', array_unique($extensions)); + } + /** * {@inheritdoc} */ diff --git a/modules/lightning_features/lightning_media/src/Plugin/MediaBundleResolver/FileUpload.php b/modules/lightning_features/lightning_media/src/Plugin/MediaBundleResolver/FileUpload.php index 210469bc5..14ce22593 100644 --- a/modules/lightning_features/lightning_media/src/Plugin/MediaBundleResolver/FileUpload.php +++ b/modules/lightning_features/lightning_media/src/Plugin/MediaBundleResolver/FileUpload.php @@ -21,7 +21,7 @@ class FileUpload extends BundleResolverBase { public function getBundle($input) { if ($input instanceof FileInterface) { foreach ($this->getPossibleBundles() as $bundle) { - $field = $this->getSourceField($bundle); + $field = $this->getSourceFieldForBundle($bundle); $extensions = preg_split('/,?\s+/', $field->getSetting('file_extensions')); $extension = pathinfo($input->getFilename(), PATHINFO_EXTENSION); diff --git a/modules/lightning_features/lightning_media/src/SourceFieldTrait.php b/modules/lightning_features/lightning_media/src/SourceFieldTrait.php index 774382dad..9a3d43f0b 100644 --- a/modules/lightning_features/lightning_media/src/SourceFieldTrait.php +++ b/modules/lightning_features/lightning_media/src/SourceFieldTrait.php @@ -2,6 +2,7 @@ namespace Drupal\lightning_media; +use Drupal\media_entity\MediaBundleInterface; use Drupal\media_entity\MediaInterface; /** @@ -26,8 +27,24 @@ trait SourceFieldTrait { * The source field config entity. */ protected function getSourceField(MediaInterface $entity) { - $type_config = $entity->getType()->getConfiguration(); - $id = $entity->getEntityTypeId() . '.' . $entity->bundle() . '.' . $type_config['source_field']; + return $this->getSourceFieldForBundle($entity->bundle->entity); + } + + /** + * Returns the source field for a media bundle. + * + * @param \Drupal\media_entity\MediaBundleInterface $bundle + * The media bundle entity. + * + * @return \Drupal\Core\Field\FieldConfigInterface + * The configurable source field entity. + */ + protected function getSourceFieldForBundle(MediaBundleInterface $bundle) { + $type_config = $bundle->getType()->getConfiguration(); + if (empty($type_config['source_field'])) { + return NULL; + } + $id = 'media.' . $bundle->id() . '.' . $type_config['source_field']; return $this->fieldStorage->load($id); }