class FileWidget extends WidgetBase {
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;
}
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'];
$field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
if (isset($field_state['items'])) {
$items = $field_state['items'];
}
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;
foreach ($items as $item) {
$element = array(
'#title' => $title,
'#description' => $description,
);
$element = $this
->formSingleElement($entity, $items, $delta, $langcode, $element, $form, $form_state);
if ($element) {
if ($is_multiple) {
$element['_weight'] = array(
'#type' => 'weight',
'#title' => t('Weight for row @number', array(
'@number' => $delta + 1,
)),
'#title_display' => 'invisible',
'#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']);
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) {
$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']);
$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;
}
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' => '',
);
$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'),
'#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;
}
}