X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Ffile%2Ffile.field.inc;fp=web%2Fcore%2Fmodules%2Ffile%2Ffile.field.inc;h=80ffbe99794758c3fe381637955ffaf0e7e10691;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/file/file.field.inc b/web/core/modules/file/file.field.inc new file mode 100644 index 000000000..80ffbe997 --- /dev/null +++ b/web/core/modules/file/file.field.inc @@ -0,0 +1,209 @@ + t('Display'), + 'class' => ['checkbox'], + ]; + } + $headers[] = t('Weight'); + $headers[] = t('Operations'); + + // Get our list of widgets in order (needed when the form comes back after + // preview or failed validation). + $widgets = []; + foreach (Element::children($element) as $key) { + $widgets[] = &$element[$key]; + } + usort($widgets, '_field_multiple_value_form_sort_helper'); + + $rows = []; + foreach ($widgets as $key => &$widget) { + // Save the uploading row for last. + if (empty($widget['#files'])) { + $widget['#title'] = $element['#file_upload_title']; + $widget['#description'] = \Drupal::service('renderer')->renderPlain($element['#file_upload_description']); + continue; + } + + // Delay rendering of the buttons, so that they can be rendered later in the + // "operations" column. + $operations_elements = []; + foreach (Element::children($widget) as $sub_key) { + if (isset($widget[$sub_key]['#type']) && $widget[$sub_key]['#type'] == 'submit') { + hide($widget[$sub_key]); + $operations_elements[] = &$widget[$sub_key]; + } + } + + // Delay rendering of the "Display" option and the weight selector, so that + // each can be rendered later in its own column. + if ($element['#display_field']) { + hide($widget['display']); + } + hide($widget['_weight']); + + // Render everything else together in a column, without the normal wrappers. + $widget['#theme_wrappers'] = []; + $information = drupal_render($widget); + $display = ''; + if ($element['#display_field']) { + unset($widget['display']['#title']); + $display = [ + 'data' => render($widget['display']), + 'class' => ['checkbox'], + ]; + } + $widget['_weight']['#attributes']['class'] = [$weight_class]; + $weight = render($widget['_weight']); + + // Arrange the row with all of the rendered columns. + $row = []; + $row[] = $information; + if ($element['#display_field']) { + $row[] = $display; + } + $row[] = $weight; + + // Show the buttons that had previously been marked as hidden in this + // preprocess function. We use show() to undo the earlier hide(). + foreach (Element::children($operations_elements) as $key) { + show($operations_elements[$key]); + } + $row[] = [ + 'data' => $operations_elements, + ]; + $rows[] = [ + 'data' => $row, + 'class' => isset($widget['#attributes']['class']) ? array_merge($widget['#attributes']['class'], ['draggable']) : ['draggable'], + ]; + } + + $variables['table'] = [ + '#type' => 'table', + '#header' => $headers, + '#rows' => $rows, + '#attributes' => [ + 'id' => $table_id, + ], + '#tabledrag' => [ + [ + 'action' => 'order', + 'relationship' => 'sibling', + 'group' => $weight_class, + ], + ], + '#access' => !empty($rows), + ]; + + $variables['element'] = $element; +} + +/** + * Prepares variables for file upload help text templates. + * + * Default template: file-upload-help.html.twig. + * + * @param array $variables + * An associative array containing: + * - description: The normal description for this field, specified by the + * user. + * - upload_validators: An array of upload validators as used in + * $element['#upload_validators']. + */ +function template_preprocess_file_upload_help(&$variables) { + $description = $variables['description']; + $upload_validators = $variables['upload_validators']; + $cardinality = $variables['cardinality']; + + $descriptions = []; + + if (!empty($description)) { + $descriptions[] = FieldFilteredMarkup::create($description); + } + if (isset($cardinality)) { + if ($cardinality == -1) { + $descriptions[] = t('Unlimited number of files can be uploaded to this field.'); + } + else { + $descriptions[] = \Drupal::translation()->formatPlural($cardinality, 'One file only.', 'Maximum @count files.'); + } + } + if (isset($upload_validators['file_validate_size'])) { + $descriptions[] = t('@size limit.', ['@size' => format_size($upload_validators['file_validate_size'][0])]); + } + if (isset($upload_validators['file_validate_extensions'])) { + $descriptions[] = t('Allowed types: @extensions.', ['@extensions' => $upload_validators['file_validate_extensions'][0]]); + } + + if (isset($upload_validators['file_validate_image_resolution'])) { + $max = $upload_validators['file_validate_image_resolution'][0]; + $min = $upload_validators['file_validate_image_resolution'][1]; + if ($min && $max && $min == $max) { + $descriptions[] = t('Images must be exactly @size pixels.', ['@size' => $max]); + } + elseif ($min && $max) { + $descriptions[] = t('Images must be larger than @min pixels. Images larger than @max pixels will be resized.', ['@min' => $min, '@max' => $max]); + } + elseif ($min) { + $descriptions[] = t('Images must be larger than @min pixels.', ['@min' => $min]); + } + elseif ($max) { + $descriptions[] = t('Images larger than @max pixels will be resized.', ['@max' => $max]); + } + } + + $variables['descriptions'] = $descriptions; +} + +/** + * Determine whether a field references files stored in {file_managed}. + * + * @param \Drupal\Core\Field\FieldDefinitionInterface $field + * A field definition. + * + * @return bool + * The field column if the field references {file_managed}.fid, typically + * fid, FALSE if it does not. + */ +function file_field_find_file_reference_column(FieldDefinitionInterface $field) { + $schema = $field->getFieldStorageDefinition()->getSchema(); + foreach ($schema['foreign keys'] as $data) { + if ($data['table'] == 'file_managed') { + foreach ($data['columns'] as $field_column => $column) { + if ($column == 'fid') { + return $field_column; + } + } + } + } + return FALSE; +}