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->getType()->getSource()->getSourceFieldDefinition($this->getType())->getName(); 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\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->getType()->getSource()->getSourceFieldDefinition($this->getType())->getName(); 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; } }