View source
<?php
namespace Drupal\plupload_widget\Plugin\Field\FieldWidget;
use Drupal\Component\Utility\NestedArray;
use Drupal\Component\Utility\Bytes;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldFilteredMarkup;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Render\Element;
use Drupal\Core\Render\ElementInfoManagerInterface;
use Drupal\file\Element\ManagedFile;
use Drupal\file\Entity\File;
use Drupal\Component\Utility\Xss;
use Drupal\file\Plugin\Field\FieldWidget\FileWidget as CoreFileWidget;
use Drupal\plupload_widget\Plugin\Field\FieldWidget\PluploadWidgetTrait;
use Drupal\plupload_widget\UploadConfiguration;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Validator\ConstraintViolationListInterface;
class FileWidget extends CoreFileWidget {
use PluploadWidgetTrait;
public static function process($element, FormStateInterface $form_state, $form) {
$element = parent::process($element, $form_state, $form);
if (!isset($element['upload'])) {
return $element;
}
$configuration = unserialize($form[$element['#parents'][0]]['#upload_configuration']);
$file_upload_help = array(
'#theme' => 'file_upload_help',
'#description' => '',
'#upload_validators' => '',
'#cardinality' => $configuration->cardinality,
);
$element['#description'] = \Drupal::service('renderer')
->renderPlain($file_upload_help);
$element['upload'] = [
'#type' => 'plupload',
'#title' => t('Upload files'),
'#autoupload' => TRUE,
'#autosubmit' => TRUE,
'#submit_element' => "[name={$element['upload_button']['#name']}]",
'#upload_validators' => [
'file_validate_extensions' => $configuration->validators['file_validate_extensions'],
],
'#plupload_settings' => [
'runtimes' => 'html5,flash,silverlight,html4',
'chunk_size' => $configuration->chunk_size . 'b',
'max_file_size' => $configuration->max_size . 'b',
'max_file_count' => 1,
],
'#event_callbacks' => [
'FilesAdded' => 'Drupal.plupload_widget.filesAddedCallback',
'UploadComplete' => 'Drupal.plupload_widget.uploadCompleteCallback',
],
'#attached' => [
'library' => [
'plupload_widget/plupload_widget',
'plupload/plupload',
],
],
];
return $element;
}
public function form(FieldItemListInterface $items, array &$form, FormStateInterface $form_state, $get_delta = NULL) {
$element = parent::form($items, $form, $form_state, $get_delta);
$field_definition = $this->fieldDefinition
->getFieldStorageDefinition();
$config = new UploadConfiguration();
$config->cardinality = $field_definition
->getCardinality();
$config->upload_location = $items[0]
->getUploadLocation();
$config->validators = $items[0]
->getUploadValidators();
$config->chunk_size = $this
->getChunkSize();
$config->max_size = $this
->getMaxFileSize();
$element['#upload_configuration'] = serialize($config);
return $element;
}
public static function value($element, $input = FALSE, FormStateInterface $form_state) {
$id = $element['#id'];
$id_backup = $id;
if (preg_match('/(.*)(--[0-9A-Za-z-]+)$/', $id, $reg)) {
$id = $reg[1];
}
$element['#id'] = $id . '-upload';
$files = \Drupal\plupload\Element\PlUploadFile::valueCallback($element, $input, $form_state);
$element['#id'] = $id_backup;
if (empty($files)) {
return parent::value($element, $input, $form_state);
}
$file = reset($files);
$destination = \Drupal::config('system.file')
->get('default_scheme') . '://' . $file['name'];
$destination = file_stream_wrapper_uri_normalize($destination);
$f = entity_create('file', array(
'uri' => $file['tmppath'],
'uid' => \Drupal::currentUser()
->id(),
'status' => 0,
'filename' => drupal_basename($destination),
'filemime' => \Drupal::service('file.mime_type.guesser')
->guess($destination),
));
$f
->save();
$return['fids'][] = $f
->id();
return $return;
}
}