class FileWidget

Plugin implementation of the 'file_generic' widget.

Plugin annotation


@Plugin(
  id = "file_generic",
  module = "file",
  label = @Translation("File"),
  field_types = {
    "file"
  },
  settings = {
    "progress_indicator" = "throbber"
  },
  default_value = FALSE
)

Hierarchy

Expanded class hierarchy of FileWidget

1 file declares its use of FileWidget
ImageWidget.php in drupal/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php
Contains \Drupal\image\Plugin\field\widget\ImageWidget.

File

drupal/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php, line 31
Contains \Drupal\file\Plugin\field\widget\FileWidget.

Namespace

Drupal\file\Plugin\field\widget
View source
class FileWidget extends WidgetBase {

  /**
   * Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm().
   */
  public function settingsForm(array $form, array &$form_state) {
    $element['progress_indicator'] = array(
      '#type' => 'radios',
      '#title' => t('Progress indicator'),
      '#options' => array(
        'throbber' => t('Throbber'),
        'bar' => t('Bar with progress meter'),
      ),
      '#default_value' => $this
        ->getSetting('progress_indicator'),
      '#description' => t('The throbber display does not show the status of uploads but takes up less space. The progress bar is helpful for monitoring progress on large uploads.'),
      '#weight' => 16,
      '#access' => file_progress_implementation(),
    );
    return $element;
  }

  /**
   * Overrides \Drupal\field\Plugin\Type\Widget\WidgetBase::formMultipleElements().
   *
   * Special handling for draggable multiple widgets and 'add more' button.
   */
  protected function formMultipleElements(EntityInterface $entity, array $items, $langcode, array &$form, array &$form_state) {
    $field = $this->field;
    $instance = $this->instance;
    $field_name = $field['field_name'];
    $parents = $form['#parents'];

    // Load the items for form rebuilds from the field state as they might not be
    // in $form_state['values'] because of validation limitations. Also, they are
    // only passed in as $items when editing existing entities.
    $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
    if (isset($field_state['items'])) {
      $items = $field_state['items'];
    }

    // Determine the number of widgets to display.
    switch ($field['cardinality']) {
      case FIELD_CARDINALITY_UNLIMITED:
        $max = count($items);
        $is_multiple = TRUE;
        break;
      default:
        $max = $field['cardinality'] - 1;
        $is_multiple = $field['cardinality'] > 1;
        break;
    }
    $id_prefix = implode('-', array_merge($parents, array(
      $field_name,
    )));
    $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper');
    $title = check_plain($instance['label']);
    $description = field_filter_xss($instance['description']);
    $elements = array();
    $delta = 0;

    // Add an element for every existing item.
    foreach ($items as $item) {
      $element = array(
        '#title' => $title,
        '#description' => $description,
      );
      $element = $this
        ->formSingleElement($entity, $items, $delta, $langcode, $element, $form, $form_state);
      if ($element) {

        // Input field for the delta (drag-n-drop reordering).
        if ($is_multiple) {

          // We name the element '_weight' to avoid clashing with elements
          // defined by widget.
          $element['_weight'] = array(
            '#type' => 'weight',
            '#title' => t('Weight for row @number', array(
              '@number' => $delta + 1,
            )),
            '#title_display' => 'invisible',
            // Note: this 'delta' is the FAPI #type 'weight' element's property.
            '#delta' => $max,
            '#default_value' => isset($item['_weight']) ? $item['_weight'] : $delta,
            '#weight' => 100,
          );
        }
        $elements[$delta] = $element;
        $delta++;
      }
    }
    $empty_single_allowed = $this->field['cardinality'] == 1 && $delta == 0;
    $empty_multiple_allowed = ($this->field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta < $this->field['cardinality']) && empty($form_state['programmed']);

    // Add one more empty row for new uploads except when this is a programmed
    // multiple form as it is not necessary.
    if ($empty_single_allowed || $empty_multiple_allowed) {
      $element = array(
        '#title' => $title,
        '#description' => $description,
      );
      $element = $this
        ->formSingleElement($entity, $items, $delta, $langcode, $element, $form, $form_state);
      if ($element) {
        $element['#required'] = $element['#required'] && $delta == 0;
        $elements[$delta] = $element;
      }
    }
    if ($is_multiple) {

      // The group of elements all-together need some extra functionality after
      // building up the full list (like draggable table rows).
      $elements['#file_upload_delta'] = $delta;
      $elements['#theme'] = 'file_widget_multiple';
      $elements['#theme_wrappers'] = array(
        'details',
      );
      $elements['#process'] = array(
        'file_field_widget_process_multiple',
      );
      $elements['#title'] = $title;
      $elements['#description'] = $description;
      $elements['#field_name'] = $element['#field_name'];
      $elements['#language'] = $element['#language'];
      $elements['#display_field'] = !empty($this->field['settings']['display_field']);

      // Add some properties that will eventually be added to the file upload
      // field. These are added here so that they may be referenced easily
      // through a hook_form_alter().
      $elements['#file_upload_title'] = t('Add a new file');
      $elements['#file_upload_description'] = theme('file_upload_help', array(
        'description' => '',
        'upload_validators' => $elements[0]['#upload_validators'],
      ));
    }
    return $elements;
  }

  /**
   * Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement().
   */
  public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) {
    $defaults = array(
      'fid' => 0,
      'display' => !empty($this->field['settings']['display_default']),
      'description' => '',
    );

    // Essentially we use the managed_file type, extended with some
    // enhancements.
    $element_info = element_info('managed_file');
    $element += array(
      '#type' => 'managed_file',
      '#upload_location' => file_field_widget_uri($this->field, $this->instance),
      '#upload_validators' => file_field_widget_upload_validators($this->field, $this->instance),
      '#value_callback' => 'file_field_widget_value',
      '#process' => array_merge($element_info['#process'], array(
        'file_field_widget_process',
      )),
      '#progress_indicator' => $this
        ->getSetting('progress_indicator'),
      // Allows this field to return an array instead of a single value.
      '#extended' => TRUE,
    );
    $element['#weight'] = $delta;
    $element['#default_value'] = !empty($items[$delta]) ? $items[$delta] : $defaults;
    if (empty($element['#default_value']['fid'])) {
      $element['#description'] = theme('file_upload_help', array(
        'description' => $element['#description'],
        'upload_validators' => $element['#upload_validators'],
      ));
    }
    return $element;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
FileWidget::formElement public function Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). Overrides WidgetInterface::formElement 1
FileWidget::formMultipleElements protected function Overrides \Drupal\field\Plugin\Type\Widget\WidgetBase::formMultipleElements(). Overrides WidgetBase::formMultipleElements 1
FileWidget::settingsForm public function Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm(). Overrides WidgetBase::settingsForm 1
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$discovery protected property The discovery object.
PluginBase::$plugin_id protected property The plugin_id.
PluginBase::getDefinition public function Implements Drupal\Component\Plugin\PluginInterface::getDefinition(). Overrides PluginInspectionInterface::getDefinition
PluginBase::getPluginId public function Implements Drupal\Component\Plugin\PluginInterface::getPluginId(). Overrides PluginInspectionInterface::getPluginId
PluginSettingsBase::$defaultSettingsMerged protected property Whether default settings have been merged into the current $settings.
PluginSettingsBase::getDefaultSettings public function Implements Drupal\field\Plugin\PluginSettingsInterface::getDefaultSettings(). Overrides PluginSettingsInterface::getDefaultSettings
PluginSettingsBase::getSetting public function Implements Drupal\field\Plugin\PluginSettingsInterface::getSetting(). Overrides PluginSettingsInterface::getSetting
PluginSettingsBase::getSettings public function Implements Drupal\field\Plugin\PluginSettingsInterface::getSettings(). Overrides PluginSettingsInterface::getSettings
PluginSettingsBase::mergeDefaults protected function Merges default settings values into $settings.
PluginSettingsBase::setSetting public function Implements Drupal\field\Plugin\PluginSettingsInterface::setSetting(). Overrides PluginSettingsInterface::setSetting
PluginSettingsBase::setSettings public function Implements Drupal\field\Plugin\PluginSettingsInterface::setSettings(). Overrides PluginSettingsInterface::setSettings
WidgetBase::$field protected property The field definition.
WidgetBase::$instance protected property The field instance definition.
WidgetBase::$settings protected property The widget settings. Overrides PluginSettingsBase::$settings
WidgetBase::$weight protected property The widget weight.
WidgetBase::errorElement public function Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::errorElement(). Overrides WidgetInterface::errorElement 4
WidgetBase::flagErrors public function Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::flagErrors(). Overrides WidgetBaseInterface::flagErrors 1
WidgetBase::form public function Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::form(). Overrides WidgetBaseInterface::form
WidgetBase::formSingleElement protected function Generates the form element for a single copy of the widget.
WidgetBase::massageFormValues public function Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::massageFormValues() Overrides WidgetInterface::massageFormValues 1
WidgetBase::sortItems protected function Sorts submitted field values according to drag-n-drop reordering.
WidgetBase::submit public function Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::submit(). Overrides WidgetBaseInterface::submit
WidgetBase::__construct public function Constructs a WidgetBase object. Overrides PluginBase::__construct