diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc
index e3a7d7c..77a6264 100644
--- a/core/modules/file/file.field.inc
+++ b/core/modules/file/file.field.inc
@@ -7,6 +7,7 @@
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Template\Attribute;
/**
* Implements hook_field_info().
@@ -580,40 +581,36 @@ function file_field_widget_submit($form, &$form_state) {
}
/**
- * Returns HTML for an individual file upload widget.
+ * Prepares variables for file form widget templates.
*
- * @param $variables
- * An associative array containing:
- * - element: A render element representing the widget.
+ * Default template: file-widget.html.twig.
*
- * @ingroup themeable
+ * @param array $variables
+ * An associative array containing:
+ * - element: A render element representing the file.
+ * - element_attributes: An Array of HTML attributes.
*/
-function theme_file_widget($variables) {
+function template_preprocess_file_widget(&$variables) {
$element = $variables['element'];
- $output = '';
-
- // The "form-managed-file" class is required for proper Ajax functionality.
- $output .= '
';
if ($element['fid']['#value'] != 0) {
// Add the file size after the file name.
- $element['filename']['#markup'] .= ' (' . format_size($element['#file']->filesize) . ') ';
+ $element['filename']['#markup'] .= ' array('file-size'))) . '>(' . format_size($element['#file']->filesize) . ') ';
}
- $output .= drupal_render_children($element);
- $output .= '
';
-
- return $output;
+ $variables['element'] = drupal_render_children($element);
+ // The "form-managed-file" class is required for proper Ajax functionality.
+ $variables['attributes'] = new Attribute(array('class' => array('file-widget', 'form-managed-file', 'clearfix')));
}
/**
- * Returns HTML for a group of file upload widgets.
+ * Prepares variables for multi file form widget templates.
+ *
+ * Default template: file-widget-multiple.html.twig.
*
- * @param $variables
+ * @param array $variables
* An associative array containing:
* - element: A render element representing the widgets.
- *
- * @ingroup themeable
*/
-function theme_file_widget_multiple($variables) {
+function template_preprocess_file_widget_multiple(&$variables) {
$element = $variables['element'];
// Special ID and classes for draggable tables.
@@ -695,6 +692,7 @@ function theme_file_widget_multiple($variables) {
}
$row[] = $weight;
$row[] = $operations;
+
$rows[] = array(
'data' => $row,
'class' => isset($widget['#attributes']['class']) ? array_merge($widget['#attributes']['class'], array('draggable')) : array('draggable'),
@@ -703,26 +701,28 @@ function theme_file_widget_multiple($variables) {
drupal_add_tabledrag($table_id, 'order', 'sibling', $weight_class);
- $output = '';
- $output = empty($rows) ? '' : theme('table', array('header' => $headers, 'rows' => $rows, 'attributes' => array('id' => $table_id)));
- $output .= drupal_render_children($element);
- return $output;
+ $variables['table'] = array(
+ '#theme' => 'table',
+ '#header' => $headers,
+ '#rows' => $rows,
+ '#attributes' => array('id' => $table_id),
+ );
+ $variables['element'] = drupal_render_children($element);
}
-
/**
- * Returns HTML for help text based on file upload validators.
+ * Prepares variables for help text templates.
+ *
+ * Default template: file-upload-help.html.twig
*
- * @param $variables
+ * @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'].
- *
- * @ingroup themeable
*/
-function theme_file_upload_help($variables) {
+function template_preprocess_file_upload_help(&$variables) {
$description = $variables['description'];
$upload_validators = $variables['upload_validators'];
@@ -737,6 +737,7 @@ function theme_file_upload_help($variables) {
if (isset($upload_validators['file_validate_extensions'])) {
$descriptions[] = t('Allowed file types: !extensions.', array('!extensions' => '' . check_plain($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];
@@ -754,7 +755,7 @@ function theme_file_upload_help($variables) {
}
}
- return implode('
', $descriptions);
+ $variables['descriptions'] = $descriptions;
}
/**
@@ -781,23 +782,35 @@ function file_field_find_file_reference_column($field) {
}
/**
- * Returns HTML for a file attachments table.
+ * Prepares variables for file attachments table templates.
+ *
+ * Default template: file-formatter-table.html.twig.
*
- * @param $variables
+ * @param array $variables
* An associative array containing:
* - items: An array of file attachments.
- *
- * @ingroup themeable
*/
-function theme_file_formatter_table($variables) {
+function template_preprocess_file_formatter_table(&$variables) {
$header = array(t('Attachment'), t('Size'));
$rows = array();
foreach ($variables['items'] as $delta => $item) {
$rows[] = array(
- theme('file_link', array('file' => (object) $item)),
- format_size($item['filesize']),
+ array(
+ 'data' => array(
+ '#theme' => 'file_link',
+ '#file' => (object) $item,
+ ),
+ ),
+ array('data' => format_size($item['filesize'])),
);
}
- return empty($rows) ? '' : theme('table', array('header' => $header, 'rows' => $rows));
+ $variables['content'] = array();
+ if (!empty($rows)) {
+ $variables['content'] = array(
+ '#theme' => 'table',
+ '#header' => $header,
+ '#rows' => $rows,
+ );
+ }
}
diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index 69fcbf3..289abc4 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -588,29 +588,32 @@ function file_get_content_headers(File $file) {
*/
function file_theme() {
return array(
- // file.module.
+ // From file.module.
'file_link' => array(
'variables' => array('file' => NULL, 'icon_directory' => NULL, 'description' => NULL),
- ),
- 'file_icon' => array(
- 'variables' => array('file' => NULL, 'icon_directory' => NULL),
+ 'template' => 'file-link',
),
'file_managed_file' => array(
'render element' => 'element',
+ 'template' => 'file-managed-file',
),
- // file.field.inc.
+ // From file.field.inc.
'file_widget' => array(
'render element' => 'element',
+ 'template' => 'file-widget',
),
'file_widget_multiple' => array(
'render element' => 'element',
+ 'template' => 'file-widget-multiple'
),
'file_formatter_table' => array(
'variables' => array('items' => NULL),
+ 'template' => 'file-formatter-table',
),
'file_upload_help' => array(
'variables' => array('description' => NULL, 'upload_validators' => NULL),
+ 'template' => 'file-upload-help',
),
);
}
@@ -1167,15 +1170,16 @@ function file_managed_file_save_upload($element) {
}
/**
- * Returns HTML for a managed file element.
+ * Prepares variables for file form widget templates.
+ *
+ * Default template: file-managed-file.html.twig.
*
- * @param $variables
+ * @param array $variables
* An associative array containing:
* - element: A render element representing the file.
- *
- * @ingroup themeable
+ * - element_attributes: An Array of HTML attributes.
*/
-function theme_file_managed_file($variables) {
+function template_preprocess_file_managed_file(&$variables) {
$element = $variables['element'];
$attributes = array();
@@ -1187,12 +1191,8 @@ function theme_file_managed_file($variables) {
}
$attributes['class'][] = 'form-managed-file';
- // This wrapper is required to apply JS behaviors and CSS styling.
- $output = '';
- $output .= '';
- $output .= drupal_render_children($element);
- $output .= '
';
- return $output;
+ $variables['attributes'] = new Attribute($attributes);
+ $variables['element'] = drupal_render_children($element);
}
/**
@@ -1230,25 +1230,30 @@ function file_managed_file_pre_render($element) {
}
/**
- * Returns HTML for a link to a file.
+ * Prepares variables for file link templates.
*
- * @param $variables
+ * Default template: file-link.html.twig.
+ *
+ * @param array $variables
* An associative array containing:
* - file: A file object to which the link will be created.
* - icon_directory: (optional) A path to a directory of icons to be used for
- * files. Defaults to the value of the "icon.directory"
- * variable.
+ * files. Defaults to the value of the "icon.directory" variable.
* - description: A description to be displayed instead of the filename.
- *
- * @ingroup themeable
*/
-function theme_file_link($variables) {
+function template_preprocess_file_link(&$variables) {
$file = $variables['file'];
$icon_directory = $variables['icon_directory'];
$url = file_create_url($file->uri);
- // theme_file_icon() requires a file entity, make sure it gets one.
- $icon = theme('file_icon', array('file' => $file, 'icon_directory' => $icon_directory));
+ $file_entity = ($file instanceof File) ? $file : file_load($file->fid);
+ $variables['icon'] = array(
+ '#theme' => 'image',
+ '#uri' => file_icon_url($file_entity, $icon_directory),
+ '#alt' => '',
+ '#title' => check_plain($file_entity->filename),
+ '#attributes' => new Attribute(array('class' => 'file-icon')),
+ );
// Set options as per anchor format described at
// http://microformats.org/wiki/file-format-examples
@@ -1267,28 +1272,8 @@ function theme_file_link($variables) {
$options['attributes']['title'] = check_plain($file->filename);
}
- return '' . $icon . ' ' . l($link_text, $url, $options) . '';
-}
-
-/**
- * Returns HTML for an image with an appropriate icon for the given file.
- *
- * @param $variables
- * An associative array containing:
- * - file: A file entity for which to make an icon.
- * - icon_directory: (optional) A path to a directory of icons to be used for
- * files. Defaults to the value of the "icon.directory"
- * variable.
- *
- * @ingroup themeable
- */
-function theme_file_icon($variables) {
- $file = $variables['file'];
- $icon_directory = $variables['icon_directory'];
-
- $mime = check_plain($file->filemime);
- $icon_url = file_icon_url($file, $icon_directory);
- return '';
+ $variables['link'] = l($link_text, $url, $options);
+ $variables['attributes'] = new Attribute(array('class' => array('file')));
}
/**
diff --git a/core/modules/file/templates/file-formatter-table.html.twig b/core/modules/file/templates/file-formatter-table.html.twig
new file mode 100644
index 0000000..d6a62e0
--- /dev/null
+++ b/core/modules/file/templates/file-formatter-table.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a file attachments table.
+ *
+ * Available variables:
+ * - content: File form element HTML.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_formatter_table()
+ *
+ * @ingroup themeable
+ */
+#}
+{{ content }}
diff --git a/core/modules/file/templates/file-link.html.twig b/core/modules/file/templates/file-link.html.twig
new file mode 100644
index 0000000..9374587
--- /dev/null
+++ b/core/modules/file/templates/file-link.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Default theme implementation for a link to a file.
+ *
+ * Available variables:
+ * - attributes: Remaining HTML attributes of an element.
+ * - attributes.class: HTML classes.
+ * - icon: An icon as produced by file-icon.html.twig.
+ * - link: A rendered hyperlink.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_link()
+ *
+ * @ingroup themeable
+ */
+#}
+{{ icon }} {{ link }}
diff --git a/core/modules/file/templates/file-managed-file.html.twig b/core/modules/file/templates/file-managed-file.html.twig
new file mode 100644
index 0000000..95ce674
--- /dev/null
+++ b/core/modules/file/templates/file-managed-file.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a file form widget.
+ *
+ * Available variables:
+ * - element: Form element for the file upload.
+ * - attributes: HTML attributes for the containing element.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_managed_file()
+ *
+ * @ingroup themeable
+ */
+#}
+
+ {{ element }}
+
diff --git a/core/modules/file/templates/file-upload-help.html.twig b/core/modules/file/templates/file-upload-help.html.twig
new file mode 100644
index 0000000..9384231
--- /dev/null
+++ b/core/modules/file/templates/file-upload-help.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display help text for file fields.
+ *
+ * Available variables:
+ * - descriptions: Lines of help text for uploading a file.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_upload_help()
+ *
+ * @ingroup themeable
+ */
+#}
+{% for description in descriptions %}
+ {{ description|t }}
+{% endfor %}
diff --git a/core/modules/file/templates/file-widget-multiple.html.twig b/core/modules/file/templates/file-widget-multiple.html.twig
new file mode 100644
index 0000000..b53f5c8
--- /dev/null
+++ b/core/modules/file/templates/file-widget-multiple.html.twig
@@ -0,0 +1,17 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a multi file form widget.
+ *
+ * Available variables:
+ * - table: Table of previously uploaded files.
+ * - element: The form element for uploading another file.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_widget_multiple()
+ *
+ * @ingroup themeable
+ */
+#}
+{{ table }}
+{{ element }}
diff --git a/core/modules/file/templates/file-widget.html.twig b/core/modules/file/templates/file-widget.html.twig
new file mode 100644
index 0000000..bdc43c8
--- /dev/null
+++ b/core/modules/file/templates/file-widget.html.twig
@@ -0,0 +1,18 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a file widget.
+ *
+ * Available variables:
+ * - element: Form element for the managed file.
+ * - attributes: Remaining HTML attributes for the containing element.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_file_widget()
+ *
+ * @ingroup themeable
+ */
+#}
+
+ {{ element }}
+