Version 1
[yaffs-website] / web / modules / contrib / media_entity_document / src / Plugin / EntityBrowser / Widget / Upload.php
diff --git a/web/modules/contrib/media_entity_document/src/Plugin/EntityBrowser/Widget/Upload.php b/web/modules/contrib/media_entity_document/src/Plugin/EntityBrowser/Widget/Upload.php
new file mode 100644 (file)
index 0000000..70d5727
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+
+namespace Drupal\media_entity_document\Plugin\EntityBrowser\Widget;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Url;
+use Drupal\entity_browser\Plugin\EntityBrowser\Widget\Upload as FileUpload;
+use Drupal\media_entity\MediaInterface;
+
+/**
+ * Uses upload to create media entity documents.
+ *
+ * @EntityBrowserWidget(
+ *   id = "media_entity_document_upload",
+ *   label = @Translation("Upload documents"),
+ *   description = @Translation("Upload widget that creates media entity documents.")
+ * )
+ */
+class Upload extends FileUpload {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'extensions' => 'txt, pdf',
+      'media_bundle' => NULL,
+    ] + parent::defaultConfiguration();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getForm(array &$original_form, FormStateInterface $form_state, array $aditional_widget_parameters) {
+    /** @var \Drupal\media_entity\MediaBundleInterface $bundle */
+    if (!$this->configuration['media_bundle'] || !($bundle = $this->entityTypeManager->getStorage('media_bundle')->load($this->configuration['media_bundle']))) {
+      return ['#markup' => $this->t('The media bundle is not configured correctly.')];
+    }
+
+    if ($bundle->getType()->getPluginId() != 'document') {
+      return ['#markup' => $this->t('The configured bundle is not using document plugin.')];
+    }
+
+    $form = parent::getForm($original_form, $form_state, $aditional_widget_parameters);
+    $form['upload']['#upload_validators']['file_validate_extensions'] = [$this->configuration['extensions']];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function prepareEntities(array $form, FormStateInterface $form_state) {
+    $files = parent::prepareEntities($form, $form_state);
+
+    /** @var \Drupal\media_entity\MediaBundleInterface $bundle */
+    $bundle = $this->entityTypeManager
+      ->getStorage('media_bundle')
+      ->load($this->configuration['media_bundle']);
+
+    $documents = [];
+    foreach ($files as $file) {
+      /** @var \Drupal\media_entity\MediaInterface $document */
+      $document = $this->entityTypeManager->getStorage('media')->create([
+        'bundle' => $bundle->id(),
+        $bundle->getTypeConfiguration()['source_field'] => $file,
+      ]);
+
+      $documents[] = $document;
+    }
+
+    return $documents;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submit(array &$element, array &$form, FormStateInterface $form_state) {
+    if (!empty($form_state->getTriggeringElement()['#eb_widget_main_submit'])) {
+      $documents = $this->prepareEntities($form, $form_state);
+      array_walk(
+        $documents,
+        function (MediaInterface $media) { $media->save(); }
+      );
+
+      $this->selectEntities($documents, $form_state);
+      $this->clearFormValues($element, $form_state);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $bundle_options = [];
+    $form = parent::buildConfigurationForm($form, $form_state);
+
+    $form['extensions'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Allowed extensions'),
+      '#default_value' => $this->configuration['extensions'],
+      '#required' => TRUE,
+    ];
+
+    $bundles = $this->entityTypeManager
+      ->getStorage('media_bundle')
+      ->loadByProperties(['type' => 'document']);
+
+    /** @var \Drupal\media_entity\MediaBundleInterface $bundle */
+    foreach ($bundles as $bundle) {
+      $bundle_options[$bundle->id()] = $bundle->label();
+    }
+
+    if (empty($bundle_options)) {
+      $url = Url::fromRoute('media.bundle_add')->toString();
+      $form['media_bundle'] = [
+        '#markup' => $this->t("You don't have media bundle of the Document type. You should <a href='!link'>create one</a>", ['!link' => $url]),
+      ];
+    }
+    else {
+      $form['media_bundle'] = [
+        '#type' => 'select',
+        '#title' => $this->t('Media bundle'),
+        '#default_value' => $this->configuration['media_bundle'],
+        '#options' => $bundle_options,
+      ];
+    }
+
+    return $form;
+  }
+
+}