X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fdropzonejs%2Fmodules%2Feb_widget%2Fsrc%2FPlugin%2FEntityBrowser%2FWidget%2FInlineEntityFormMediaWidget.php;fp=web%2Fmodules%2Fcontrib%2Fdropzonejs%2Fmodules%2Feb_widget%2Fsrc%2FPlugin%2FEntityBrowser%2FWidget%2FInlineEntityFormMediaWidget.php;h=3b4a212e6f80ffc36e14c695f1c73b3fcb97d6e0;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/modules/contrib/dropzonejs/modules/eb_widget/src/Plugin/EntityBrowser/Widget/InlineEntityFormMediaWidget.php b/web/modules/contrib/dropzonejs/modules/eb_widget/src/Plugin/EntityBrowser/Widget/InlineEntityFormMediaWidget.php new file mode 100644 index 000000000..3b4a212e6 --- /dev/null +++ b/web/modules/contrib/dropzonejs/modules/eb_widget/src/Plugin/EntityBrowser/Widget/InlineEntityFormMediaWidget.php @@ -0,0 +1,273 @@ +entityDisplayRepository = $entity_display_repository; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { + return new static( + $configuration, + $plugin_id, + $plugin_definition, + $container->get('event_dispatcher'), + $container->get('entity_type.manager'), + $container->get('plugin.manager.entity_browser.widget_validation'), + $container->get('dropzonejs.upload_save'), + $container->get('current_user'), + $container->get('token'), + $container->get('module_handler'), + $container->get('entity_display.repository') + ); + } + + /** + * {@inheritdoc} + */ + public function defaultConfiguration() { + return [ + 'form_mode' => 'default', + ] + parent::defaultConfiguration(); + } + + /** + * {@inheritdoc} + */ + public function getForm(array &$original_form, FormStateInterface $form_state, array $additional_widget_parameters) { + $form = parent::getForm($original_form, $form_state, $additional_widget_parameters); + + // @todo Remove this when/if EB provides a way to define dependencies. + if (!$this->moduleHandler->moduleExists('inline_entity_form')) { + return [ + '#type' => 'container', + 'error' => [ + '#markup' => $this->t('Missing requirement: in order to use this widget you have to install Inline entity form module first'), + ], + ]; + } + + $form['#attached']['library'][] = 'dropzonejs_eb_widget/ief_edit'; + $form['edit'] = [ + '#type' => 'submit', + '#value' => $this->t('Edit'), + '#attributes' => [ + 'class' => ['js-hide'], + ], + '#ajax' => [ + 'wrapper' => 'ief-dropzone-upload', + 'callback' => [static::class, 'onEdit'], + 'effect' => 'fade', + ], + '#submit' => [ + [$this, 'submitEdit'], + ], + ]; + + $form['entities']['#prefix'] = '
'; + $form['entities']['#suffix'] = '
'; + + $form += ['entities' => []]; + if ($entities = $form_state->get('uploaded_entities')) { + foreach ($entities as $entity) { + /** @var \Drupal\Core\Entity\EntityInterface $entity */ + $form['entities'][$entity->uuid()] = [ + '#type' => 'inline_entity_form', + '#entity_type' => $entity->getEntityTypeId(), + '#bundle' => $entity->bundle(), + '#default_value' => $entity, + '#form_mode' => $this->configuration['form_mode'], + ]; + } + } + + if (!empty(Element::children($form['entities']))) { + // Make it possible to select those submitted entities. + $pos = array_search('dropzonejs-disable-submit', $original_form['#attributes']['class']); + if ($pos !== FALSE) { + unset($original_form['#attributes']['class'][$pos]); + } + } + + $form['actions']['submit'] += ['#submit' => []]; + + return $form; + } + + /** + * Submit callback for the edit button. + * + * @param array $form + * Form array. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * Form object. + */ + public function submitEdit(array $form, FormStateInterface $form_state) { + $form_state->setRebuild(TRUE); + + // Files have to saved before they can be viewed in the IEF form. + $media_entities = $this->prepareEntities($form, $form_state); + $source_field = $this->getBundle()->getTypeConfiguration()['source_field']; + foreach ($media_entities as $media_entity) { + /** @var \Drupal\file\Entity\File $file */ + $file = $media_entity->$source_field->entity; + $file->save(); + $media_entity->$source_field->target_id = $file->id(); + } + + $form_state->set('uploaded_entities', $media_entities); + } + + /** + * Ajax callback triggered when hitting the edit button. + * + * @param array $form + * The form. + * + * @return array + * Returns the entire form. + */ + public static function onEdit(array $form) { + return $form['widget']['entities']; + } + + /** + * {@inheritdoc} + */ + public function validate(array &$form, FormStateInterface $form_state) { + // Skip the DropzoneJsEbWidget specific validations. + WidgetBase::validate($form, $form_state); + } + + /** + * Prepares entities from the form. + * + * @param array $form + * The form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state. + * + * @return \Drupal\media_entity\MediaInterface[] + * The prepared media entities. + */ + protected function prepareEntitiesFromForm(array $form, FormStateInterface $form_state) { + $media_entities = []; + foreach (Element::children($form['widget']['entities']) as $key) { + /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ + $entity = $form['widget']['entities'][$key]['#entity']; + $inline_entity_form_handler = InlineEntityForm::getInlineFormHandler($entity->getEntityTypeId()); + $inline_entity_form_handler->entityFormSubmit($form['widget']['entities'][$key], $form_state); + $media_entities[] = $entity; + } + return $media_entities; + } + + /** + * {@inheritdoc} + */ + public function submit(array &$element, array &$form, FormStateInterface $form_state) { + $media_entities = $this->prepareEntitiesFromForm($form, $form_state); + $source_field = $this->getBundle()->getTypeConfiguration()['source_field']; + + foreach ($media_entities as $media_entity) { + $file = $media_entity->{$source_field}->entity; + /** @var \Drupal\dropzonejs\Events\DropzoneMediaEntityCreateEvent $event */ + $event = $this->eventDispatcher->dispatch(Events::MEDIA_ENTITY_CREATE, new DropzoneMediaEntityCreateEvent($media_entity, $file, $form, $form_state, $element)); + $media_entity = $event->getMediaEntity(); + $media_entity->save(); + } + + if (!empty(array_filter($media_entities))) { + $this->selectEntities($media_entities, $form_state); + $this->clearFormValues($element, $form_state); + } + } + + /** + * {@inheritdoc} + */ + protected function clearFormValues(array &$element, FormStateInterface $form_state) { + parent::clearFormValues($element, $form_state); + // Clear uploaded_entities to get a clean form in multi-step selection. + $form_state->set('uploaded_entities', []); + } + + /** + * {@inheritdoc} + */ + public function buildConfigurationForm(array $form, FormStateInterface $form_state) { + $form = parent::buildConfigurationForm($form, $form_state); + $form['form_mode'] = [ + '#type' => 'select', + '#title' => $this->t('Form mode'), + '#options' => $this->entityDisplayRepository->getFormModeOptions('media'), + '#default_value' => $this->configuration['form_mode'], + ]; + return $form; + } + +}