Browse Source

Merge pull request #892 from rosiel/update-image-file-derivs

Fix multi-file media to allow image fields only on image derivatives.
pull/922/head
Nigel Banks 2 years ago committed by GitHub
parent
commit
dfa095951e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 31
      modules/islandora_image/src/Plugin/Action/GenerateImageDerivativeFile.php
  2. 3
      src/Controller/MediaSourceController.php
  3. 4
      src/MediaSource/MediaSourceService.php
  4. 17
      src/Plugin/Action/AbstractGenerateDerivativeMediaFile.php

31
modules/islandora_image/src/Plugin/Action/GenerateImageDerivativeFile.php

@ -6,7 +6,10 @@ use Drupal\Core\Form\FormStateInterface;
use Drupal\islandora\Plugin\Action\AbstractGenerateDerivativeMediaFile; use Drupal\islandora\Plugin\Action\AbstractGenerateDerivativeMediaFile;
/** /**
* Emits a Node for generating derivatives event. * Emits a Media for generating derivatives event.
*
* Attaches the result as a file in an image field on the emitting
* Media ("multi-file media").
* *
* @Action( * @Action(
* id = "generate_image_derivative_file", * id = "generate_image_derivative_file",
@ -24,7 +27,6 @@ class GenerateImageDerivativeFile extends AbstractGenerateDerivativeMediaFile {
$config['path'] = '[date:custom:Y]-[date:custom:m]/[media:mid]-ImageService.jpg'; $config['path'] = '[date:custom:Y]-[date:custom:m]/[media:mid]-ImageService.jpg';
$config['mimetype'] = 'application/xml'; $config['mimetype'] = 'application/xml';
$config['queue'] = 'islandora-connector-houdini'; $config['queue'] = 'islandora-connector-houdini';
$config['destination_media_type'] = 'file';
$config['scheme'] = $this->config->get('default_scheme'); $config['scheme'] = $this->config->get('default_scheme');
return $config; return $config;
} }
@ -34,9 +36,30 @@ class GenerateImageDerivativeFile extends AbstractGenerateDerivativeMediaFile {
*/ */
public function buildConfigurationForm(array $form, FormStateInterface $form_state) { public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form = parent::buildConfigurationForm($form, $form_state); $form = parent::buildConfigurationForm($form, $form_state);
$form['mimetype']['#description'] = $this->t('Mimetype to convert to (e.g. application/xml, etc...)'); $map = $this->entityFieldManager->getFieldMapByFieldType('image');
$file_fields = $map['media'];
$file_options = array_combine(array_keys($file_fields), array_keys($file_fields));
$file_options = array_merge(['' => ''], $file_options);
// @todo figure out how to write to thumbnail, which is not a real field.
// see https://github.com/Islandora/islandora/issues/891.
unset($file_options['thumbnail']);
$form['destination_field_name'] = [
'#required' => TRUE,
'#type' => 'select',
'#options' => $file_options,
'#title' => $this->t('Destination Image field'),
'#default_value' => $this->configuration['destination_field_name'],
'#description' => $this->t('This Action stores the derivative in an
Image field. If you need to store the result in a File field, use
"Generate a Derivative File for Media Attachment". Selected target field
must be an additional field, not the media\'s main storage field.
Selected target field must be present on the media.'),
];
$form['mimetype']['#value'] = 'image/jpeg'; $form['mimetype']['#value'] = 'image/jpeg';
$form['mimetype']['#type'] = 'hidden'; $form['mimetype']['#description'] = 'Mimetype to convert to. Must be
compatible with the destination image field.';
return $form; return $form;
} }

3
src/Controller/MediaSourceController.php

@ -280,8 +280,7 @@ class MediaSourceController extends ControllerBase {
*/ */
public function attachToMediaAccess(AccountInterface $account, RouteMatch $route_match) { public function attachToMediaAccess(AccountInterface $account, RouteMatch $route_match) {
$media = $route_match->getParameter('media'); $media = $route_match->getParameter('media');
$node = $this->utils->getParentNode($media); return AccessResult::allowedIf($media->access('update', $account));
return AccessResult::allowedIf($node->access('update', $account) && $account->hasPermission('create media'));
} }
} }

4
src/MediaSource/MediaSourceService.php

@ -268,8 +268,8 @@ class MediaSourceService {
'uri' => $content_location, 'uri' => $content_location,
'filename' => $this->fileSystem->basename($content_location), 'filename' => $this->fileSystem->basename($content_location),
'filemime' => $mimetype, 'filemime' => $mimetype,
'status' => FILE_STATUS_PERMANENT,
]); ]);
$file->setPermanent();
// Validate file extension. // Validate file extension.
$source_field_config = $this->entityTypeManager->getStorage('field_config')->load("media.$bundle.$source_field"); $source_field_config = $this->entityTypeManager->getStorage('field_config')->load("media.$bundle.$source_field");
@ -349,8 +349,8 @@ class MediaSourceService {
'uri' => $content_location, 'uri' => $content_location,
'filename' => $this->fileSystem->basename($content_location), 'filename' => $this->fileSystem->basename($content_location),
'filemime' => $mimetype, 'filemime' => $mimetype,
'status' => FILE_STATUS_PERMANENT,
]); ]);
$file->setPermanent();
// Validate file extension. // Validate file extension.
$bundle = $media->bundle(); $bundle = $media->bundle();

17
src/Plugin/Action/AbstractGenerateDerivativeMediaFile.php

@ -7,7 +7,10 @@ use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url; use Drupal\Core\Url;
/** /**
* Emits a Node for generating derivatives event. * Emits a Media for generating derivatives event.
*
* Attaches the result as a file in a file field on the emitting
* Media ("multi-file media").
* *
* @Action( * @Action(
* id = "generate_derivative_file", * id = "generate_derivative_file",
@ -98,15 +101,23 @@ class AbstractGenerateDerivativeMediaFile extends AbstractGenerateDerivativeBase
$image_options = array_combine(array_keys($image_fields), array_keys($image_fields)); $image_options = array_combine(array_keys($image_fields), array_keys($image_fields));
$file_options = array_merge(['' => ''], $file_options, $image_options); $file_options = array_merge(['' => ''], $file_options, $image_options);
// @todo figure out how to write to thumbnail, which is not a real field.
// see https://github.com/Islandora/islandora/issues/891.
unset($file_options['thumbnail']);
$form['event']['#disabled'] = 'disabled'; $form['event']['#disabled'] = 'disabled';
$form['destination_field_name'] = [ $form['destination_field_name'] = [
'#required' => TRUE, '#required' => TRUE,
'#type' => 'select', '#type' => 'select',
'#options' => $file_options, '#options' => $file_options,
'#title' => $this->t('Destination File field Name'), '#title' => $this->t('Destination File field'),
'#default_value' => $this->configuration['destination_field_name'], '#default_value' => $this->configuration['destination_field_name'],
'#description' => $this->t('File field on Media Type to hold derivative. Cannot be the same as source'), '#description' => $this->t('This Action stores a derivative file
in a File or Image field on a media. The destination field
must be an additional field, not the media\'s main storage field.
Selected destination field must be present on the media.'),
]; ];
$form['args'] = [ $form['args'] = [

Loading…
Cancel
Save