Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / modules / contrib / media_entity_image / src / Plugin / EntityBrowser / Widget / Upload.php
1 <?php
2
3 namespace Drupal\media_entity_image\Plugin\EntityBrowser\Widget;
4
5 use Drupal\Core\Form\FormStateInterface;
6 use Drupal\Core\Url;
7 use Drupal\entity_browser\Plugin\EntityBrowser\Widget\Upload as FileUpload;
8 use Drupal\media_entity\MediaInterface;
9
10 /**
11  * Uses upload to create media entity images.
12  *
13  * @EntityBrowserWidget(
14  *   id = "media_entity_image_upload",
15  *   label = @Translation("Upload images"),
16  *   description = @Translation("Upload widget that creates media entity images."),
17  *   auto_select = FALSE
18  * )
19  */
20 class Upload extends FileUpload {
21
22   /**
23    * {@inheritdoc}
24    */
25   public function defaultConfiguration() {
26     return [
27       'extensions' => 'jpg jpeg png gif',
28       'media_bundle' => NULL,
29     ] + parent::defaultConfiguration();
30   }
31
32   /**
33    * {@inheritdoc}
34    */
35   public function getForm(array &$original_form, FormStateInterface $form_state, array $aditional_widget_parameters) {
36     /** @var \Drupal\media_entity\MediaBundleInterface $bundle */
37     if (!$this->configuration['media_bundle'] || !($bundle = $this->entityTypeManager->getStorage('media_bundle')->load($this->configuration['media_bundle']))) {
38       return ['#markup' => $this->t('The media bundle is not configured correctly.')];
39     }
40
41     if ($bundle->getType()->getPluginId() != 'image') {
42       return ['#markup' => $this->t('The configured bundle is not using image plugin.')];
43     }
44
45     $form = parent::getForm($original_form, $form_state, $aditional_widget_parameters);
46     $form['upload']['#upload_validators']['file_validate_extensions'] = [$this->configuration['extensions']];
47
48     return $form;
49   }
50
51   /**
52    * {@inheritdoc}
53    */
54   protected function prepareEntities(array $form, FormStateInterface $form_state) {
55     $files = parent::prepareEntities($form, $form_state);
56
57     /** @var \Drupal\media_entity\MediaBundleInterface $bundle */
58     $bundle = $this->entityTypeManager
59       ->getStorage('media_bundle')
60       ->load($this->configuration['media_bundle']);
61
62     $images = [];
63     foreach ($files as $file) {
64       /** @var \Drupal\media_entity\MediaInterface $image */
65       $image = $this->entityTypeManager->getStorage('media')->create([
66         'bundle' => $bundle->id(),
67         $bundle->getTypeConfiguration()['source_field'] => $file,
68       ]);
69       $images[] = $image;
70     }
71
72     return $images;
73   }
74
75   /**
76    * {@inheritdoc}
77    */
78   public function submit(array &$element, array &$form, FormStateInterface $form_state) {
79     if (!empty($form_state->getTriggeringElement()['#eb_widget_main_submit'])) {
80       $images = $this->prepareEntities($form, $form_state);
81       array_walk(
82         $images,
83         function (MediaInterface $media) {
84           $media->save();
85         }
86       );
87
88       $this->selectEntities($images, $form_state);
89       $this->clearFormValues($element, $form_state);
90     }
91   }
92
93   /**
94    * {@inheritdoc}
95    */
96   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
97     $form = parent::buildConfigurationForm($form, $form_state);
98     $form['extensions'] = [
99       '#type' => 'textfield',
100       '#title' => $this->t('Allowed extensions'),
101       '#default_value' => $this->configuration['extensions'],
102       '#required' => TRUE,
103     ];
104
105     $bundle_options = [];
106     $bundles = $this
107       ->entityTypeManager
108       ->getStorage('media_bundle')
109       ->loadByProperties(['type' => 'image']);
110
111     foreach ($bundles as $bundle) {
112       $bundle_options[$bundle->id()] = $bundle->label();
113     }
114
115     if (empty($bundle_options)) {
116       $url = Url::fromRoute('media.bundle_add')->toString();
117       $form['media_bundle'] = [
118         '#markup' => $this->t("You don't have media bundle of the Image type. You should <a href='!link'>create one</a>", ['!link' => $url]),
119       ];
120     }
121     else {
122       $form['media_bundle'] = [
123         '#type' => 'select',
124         '#title' => $this->t('Media bundle'),
125         '#default_value' => $this->configuration['media_bundle'],
126         '#options' => $bundle_options,
127       ];
128     }
129
130     return $form;
131   }
132
133 }