View source
<?php
namespace Drupal\video\Plugin\Field\FieldWidget;
use Drupal\Component\Utility\Bytes;
use Drupal\Component\Render\PlainTextOutput;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Form\FormStateInterface;
use Drupal\file\Entity\File;
use Drupal\file\Plugin\Field\FieldWidget\FileWidget;
use Drupal\Core\StreamWrapper\StreamWrapperInterface;
class VideoUploadWidget extends FileWidget {
public static function defaultSettings() {
$settings = [
'file_extensions' => 'mp4 ogv webm',
'file_directory' => 'videos/[date:custom:Y]-[date:custom:m]',
'max_filesize' => '',
'uri_scheme' => 'public',
] + parent::defaultSettings();
return $settings;
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$element = parent::settingsForm($form, $form_state);
$settings = $this
->getSettings();
$element['file_directory'] = [
'#type' => 'textfield',
'#title' => t('File directory'),
'#default_value' => $settings['file_directory'],
'#description' => t('Optional subdirectory within the upload destination where files will be stored. Do not include preceding or trailing slashes.'),
'#element_validate' => [
[
get_class($this),
'validateDirectory',
],
],
'#weight' => 3,
];
$extensions = str_replace(' ', ', ', $settings['file_extensions']);
$element['file_extensions'] = [
'#type' => 'textfield',
'#title' => t('Allowed file extensions'),
'#default_value' => $extensions,
'#description' => t('Separate extensions with a space or comma and do not include the leading dot.'),
'#element_validate' => [
[
get_class($this),
'validateExtensions',
],
],
'#weight' => 1,
'#maxlength' => 256,
'#required' => TRUE,
];
$element['max_filesize'] = [
'#type' => 'textfield',
'#title' => t('Maximum upload size'),
'#default_value' => $settings['max_filesize'],
'#description' => t('Enter a value like "512" (bytes), "80 KB" (kilobytes) or "50 MB" (megabytes) in order to restrict the allowed file size. If left empty the file sizes will be limited only by PHP\'s maximum post and file upload sizes (current limit <strong>%limit</strong>).', array(
'%limit' => format_size(file_upload_max_size()),
)),
'#size' => 10,
'#element_validate' => [
[
get_class($this),
'validateMaxFilesize',
],
],
'#weight' => 5,
];
$scheme_options = \Drupal::service('stream_wrapper_manager')
->getNames(StreamWrapperInterface::WRITE_VISIBLE);
$element['uri_scheme'] = [
'#type' => 'radios',
'#title' => t('Upload destination'),
'#options' => $scheme_options,
'#default_value' => $this
->getSetting('uri_scheme'),
'#description' => t('Select where the final files should be stored. Private file storage has significantly more overhead than public files, but allows restricted access to files within this field.'),
'#weight' => 6,
];
return $element;
}
public static function validateDirectory($element, FormStateInterface $form_state) {
$value = trim($element['#value'], '\\/');
$form_state
->setValueForElement($element, $value);
}
public static function validateExtensions($element, FormStateInterface $form_state) {
if (!empty($element['#value'])) {
$extensions = preg_replace('/([, ]+\\.?)/', ' ', trim(strtolower($element['#value'])));
$extensions = array_filter(explode(' ', $extensions));
$extensions = implode(' ', array_unique($extensions));
if (!preg_match('/^([a-z0-9]+([.][a-z0-9])* ?)+$/', $extensions)) {
$form_state
->setError($element, t('The list of allowed extensions is not valid, be sure to exclude leading dots and to separate extensions with a comma or space.'));
}
else {
$form_state
->setValueForElement($element, $extensions);
}
}
}
public static function validateMaxFilesize($element, FormStateInterface $form_state) {
if (!empty($element['#value']) && Bytes::toInt($element['#value']) == 0) {
$form_state
->setError($element, t('The option must contain a valid value. You may either leave the text field empty or enter a string like "512" (bytes), "80 KB" (kilobytes) or "50 MB" (megabytes).'));
}
}
public function settingsSummary() {
$summary = [];
$summary[] = t('Progress indicator: @progress_indicator<br/>Extensions : @file_extensions<br/>File directory : @file_directory<br/>@max_filesize', [
'@progress_indicator' => $this
->getSetting('progress_indicator'),
'@file_extensions' => $this
->getSetting('file_extensions'),
'@file_directory' => $this
->getSetting('uri_scheme') . '://' . $this
->getSetting('file_directory'),
'@max_filesize' => $this
->getSetting('max_filesize') ? 'Max filesize: ' . $this
->getSetting('max_filesize') : '',
]);
return $summary;
}
protected function formMultipleElements(FieldItemListInterface $items, array &$form, FormStateInterface $form_state) {
$elements = parent::formMultipleElements($items, $form, $form_state);
$cardinality = $this->fieldDefinition
->getFieldStorageDefinition()
->getCardinality();
$file_upload_help = [
'#theme' => 'file_upload_help',
'#description' => '',
'#upload_validators' => $elements[0]['#upload_validators'],
'#cardinality' => $cardinality,
];
if ($cardinality == 1) {
if (empty($elements[0]['#default_value']['fids'])) {
$file_upload_help['#description'] = $this->fieldDefinition
->getDescription();
$elements[0]['#description'] = \Drupal::service('renderer')
->renderPlain($file_upload_help);
}
}
else {
$elements['#file_upload_description'] = $file_upload_help;
}
return $elements;
}
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$element = parent::formElement($items, $delta, $element, $form, $form_state);
$element['#upload_location'] = $this
->getUploadLocation();
$element['#upload_validators'] = $this
->getUploadValidators();
return $element;
}
public function getUploadLocation($data = []) {
return static::doGetUploadLocation($this
->getSettings(), $data);
}
protected static function doGetUploadLocation(array $settings, $data = []) {
$destination = trim($settings['file_directory'], '/');
$destination = PlainTextOutput::renderFromHtml(\Drupal::token()
->replace($destination, $data));
return $settings['uri_scheme'] . '://' . $destination;
}
public function getUploadValidators() {
$validators = [];
$settings = $this
->getSettings();
$max_filesize = Bytes::toInt(file_upload_max_size());
if (!empty($settings['max_filesize'])) {
$max_filesize = min($max_filesize, Bytes::toInt($settings['max_filesize']));
}
$validators['file_validate_size'] = [
$max_filesize,
];
if (!empty($settings['file_extensions'])) {
$validators['file_validate_extensions'] = [
$settings['file_extensions'],
];
}
return $validators;
}
public static function process($element, FormStateInterface $form_state, $form) {
return parent::process($element, $form_state, $form);
}
}