cloudinary-8.x-1.x-dev/modules/cloudinary_media_library_widget/src/Plugin/Field/FieldWidget/CloudinaryWidget.php
modules/cloudinary_media_library_widget/src/Plugin/Field/FieldWidget/CloudinaryWidget.php
<?php
namespace Drupal\cloudinary_media_library_widget\Plugin\Field\FieldWidget;
use Cloudinary\Asset\AssetType;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Plugin implementation of the 'cloudinary_widget' field widget.
*
* @FieldWidget(
* id = "cloudinary_widget",
* label = @Translation("Cloudinary widget"),
* description = @Translation("Allows you to choose cloudinary assets from the cloudinary library."),
* field_types = {
* "cloudinary_image",
* "cloudinary_video",
* "cloudinary_raw",
* },
* multiple_values = TRUE,
* )
*/
class CloudinaryWidget extends WidgetBase {
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'show_preview' => TRUE,
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$element = parent::settingsForm($form, $form_state);
$element['show_preview'] = [
'#type' => 'checkbox',
'#title' => $this->t('Show preview'),
'#description' => $this->t('Whether to show the preview image once you inserted an asset from cloudinary library.'),
'#default_value' => $this->getSetting('show_preview'),
];
return $element;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = parent::settingsSummary();
if (!$this->getSetting('show_preview')) {
$summary[] = $this->t('No preview');
}
else {
$summary[] = $this->t('Preview is enabled');
}
return $summary;
}
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
/** @var \Drupal\media\MediaTypeInterface $media_type */
$media_type = $items->getEntity()->get('bundle')->entity;
$configuration = $media_type->getSource()->getConfiguration();
$resource_type = $configuration['resource_type'];
$cardinality = $this->fieldDefinition->getFieldStorageDefinition()->getCardinality();
$element += [
'#type' => 'cloudinary_media_library',
'#field_name' => $items->getFieldDefinition()->getName(),
'#weight' => $delta,
'#extended' => TRUE,
'#extended_element_type' => 'textfield',
'#resource_type' => $resource_type,
'#preview' => $this->getSetting('show_preview'),
'#default_value' => $items->getValue(),
'#multiple' => $cardinality > 1 || $cardinality === FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
'#cardinality' => $cardinality,
];
if (!$element['#multiple'] && $element['#default_value']) {
$element['#default_value'] = reset($element['#default_value']);
}
// Add properties needed by process() method.
if ($resource_type === AssetType::IMAGE) {
$field_settings = $this->getFieldSettings();
$element['#alt_field'] = $field_settings['alt_field'];
$element['#alt_field_required'] = $field_settings['alt_field_required'];
$element['#title_field'] = $field_settings['title_field'];
$element['#title_field_required'] = $field_settings['title_field_required'];
}
return $element;
}
/**
* {@inheritdoc}
*/
public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
$values = parent::massageFormValues($values, $form, $form_state);
if (isset($values['value'])) {
unset($values['value']);
}
if (isset($values['type'])) {
unset($values['type']);
}
if (isset($values['_original_delta'])) {
unset($values['_original_delta']);
}
// Return single value.
if (isset($values['public_id'])) {
return $values;
}
foreach ($values as $delta => $value) {
unset($value['type']);
unset($value['_original_delta']);
unset($value['value']);
$values[$delta] = $value;
}
return $values;
}
/**
* {@inheritdoc}
*/
public static function isApplicable(FieldDefinitionInterface $field_definition) {
// The field widget is only applicable with cloudinary source media.
if ($field_definition->getTargetEntityTypeId() === 'media') {
/** @var \Drupal\media\MediaTypeInterface $media_type */
$media_type = \Drupal::entityTypeManager()->getStorage('media_type')
->load($field_definition->getTargetBundle());
return $media_type->getSource()->getPluginId() === 'cloudinary';
}
return FALSE;
}
}
