View source
<?php
namespace Drupal\media_directories_ui\Form;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\InvokeCommand;
use Drupal\Core\Ajax\ReplaceCommand;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\media\MediaTypeInterface;
use Drupal\media_library\Form\AddFormBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
abstract class AddMediaFormBase extends AddFormBase {
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_type.manager'), $container
->get('media_directories_ui.ui_builder'), $container
->get('media_library.opener_resolver'));
}
public function getFormId() {
return 'media_directories_add_form';
}
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
$form['#action'] = Url::fromRoute('media_directories_library.ui', [], [
'query' => $this
->getMediaLibraryState($form_state)
->all(),
])
->toString();
$added_media = $this
->getAddedMediaItems($form_state);
if (empty($added_media)) {
$form['actions'] = [
'#type' => 'actions',
'back' => [
'#type' => 'submit',
'#value' => $this
->t('Back to the library'),
'#ajax' => [
'callback' => '::backToLibraryCallback',
'wrapper' => 'media-library-wrapper',
],
],
];
}
return $form;
}
protected function getDirectory(FormStateInterface $form_state) {
$state = $this
->getMediaLibraryState($form_state);
$directory_id = (int) $state
->get('directory');
if ($directory_id === MEDIA_DIRECTORY_ROOT) {
$directory_id = NULL;
}
return $directory_id;
}
public function updateFormCallback(array &$form, FormStateInterface $form_state) {
$triggering_element = $form_state
->getTriggeringElement();
$wrapper_id = $triggering_element['#ajax']['wrapper'];
$added_media = $form_state
->get('media');
$response = new AjaxResponse();
if ($form_state::hasAnyErrors()) {
$response
->addCommand(new ReplaceCommand('#media-library-add-form-wrapper', $form));
return $response;
}
if (end($triggering_element['#parents']) === 'remove_button') {
if (empty($added_media)) {
$form_state
->setRebuild();
$response
->addCommand(new ReplaceCommand('#media-library-add-form-wrapper', $this
->buildMediaLibraryUi($form_state)));
$response
->addCommand(new InvokeCommand('#media-library-add-form-wrapper :tabbable', 'focus'));
}
else {
$response
->addCommand(new ReplaceCommand("#{$wrapper_id}", $form));
$removed_delta = array_slice($triggering_element['#array_parents'], -2, 1)[0];
$delta_to_focus = 0;
foreach ($added_media as $delta => $media) {
$delta_to_focus = $delta;
if ($delta > $removed_delta) {
break;
}
}
$response
->addCommand(new InvokeCommand(".media-library-add-form__media[data-media-library-added-delta={$delta_to_focus}]", 'focus'));
}
}
else {
$response
->addCommand(new ReplaceCommand("#{$wrapper_id}", $form));
$response
->addCommand(new InvokeCommand('.media-library-add-form__added-media', 'focus'));
}
return $response;
}
public function backToLibraryCallback(&$form, FormStateInterface $form_state) {
$response = new AjaxResponse();
$response
->addCommand(new ReplaceCommand('#media-library-wrapper', $this
->buildMediaLibraryUi($form_state)));
$response
->addCommand(new InvokeCommand('#media-library-wrapper :tabbable', 'focus'));
$form_state
->setRebuild();
return $response;
}
protected function buildUploadUi(FormStateInterface $form_state) {
$state = $this
->getMediaLibraryState($form_state);
$state
->remove('media_library_content');
return $this->libraryUiBuilder
->buildUploadUi($state);
}
protected function processInputValues(array $source_field_values, array $form, FormStateInterface $form_state) {
$media_type = $this
->getMediaType($form_state);
$media_storage = $this->entityTypeManager
->getStorage('media');
$source_field_name = $this
->getSourceFieldName($media_type);
$media = array_map(function ($source_field_value) use ($media_type, $media_storage, $source_field_name, $form_state) {
return $this
->createMediaFromValue($media_type, $media_storage, $source_field_name, $source_field_value, $form_state);
}, $source_field_values);
$form_state
->set('media', array_values($media));
$form_state
->set('current_selection', array_filter(explode(',', $form_state
->getValue('current_selection'))));
$form_state
->setRebuild();
}
protected function createMediaFromValue(MediaTypeInterface $media_type, EntityStorageInterface $media_storage, $source_field_name, $source_field_value, FormStateInterface $form_state = NULL) {
$media = $media_storage
->create([
'bundle' => $media_type
->id(),
$source_field_name => $source_field_value,
'directory' => $this
->getDirectory($form_state),
]);
$media
->setName($media
->getName());
return $media;
}
protected function getMediaLibraryState(FormStateInterface $form_state) {
$state = parent::getMediaLibraryState($form_state);
$state
->remove('ajax_form');
$state
->remove('_wrapper_format');
return $state;
}
}