162 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			162 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Drupal\image\Entity\ImageStyle;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The name of the query parameter for image derivative tokens.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								define('IMAGE_DERIVATIVE_TOKEN', 'itok');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Clears cached versions of a specific file in all styles.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param string $path
							 | 
						||
| 
								 | 
							
								 *   The Drupal file path to the original image.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function image_path_flush($path): void {
							 | 
						||
| 
								 | 
							
								  $styles = ImageStyle::loadMultiple();
							 | 
						||
| 
								 | 
							
								  foreach ($styles as $style) {
							 | 
						||
| 
								 | 
							
								    $style->flush($path);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Gets an array of image styles suitable for using as select list options.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param bool $include_empty
							 | 
						||
| 
								 | 
							
								 *   If TRUE a '- None -' option will be inserted in the options array.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @return string[]
							 | 
						||
| 
								 | 
							
								 *   Array of image styles both key and value are set to style name.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function image_style_options($include_empty = TRUE): array {
							 | 
						||
| 
								 | 
							
								  $styles = ImageStyle::loadMultiple();
							 | 
						||
| 
								 | 
							
								  $options = [];
							 | 
						||
| 
								 | 
							
								  if ($include_empty && !empty($styles)) {
							 | 
						||
| 
								 | 
							
								    $options[''] = t('- None -');
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  foreach ($styles as $name => $style) {
							 | 
						||
| 
								 | 
							
								    $options[$name] = $style->label();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (empty($options)) {
							 | 
						||
| 
								 | 
							
								    $options[''] = t('No defined styles');
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return $options;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Prepares variables for image style templates.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Default template: image-style.html.twig.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param array $variables
							 | 
						||
| 
								 | 
							
								 *   An associative array containing:
							 | 
						||
| 
								 | 
							
								 *   - width: The width of the image.
							 | 
						||
| 
								 | 
							
								 *   - height: The height of the image.
							 | 
						||
| 
								 | 
							
								 *   - style_name: The name of the image style to be applied.
							 | 
						||
| 
								 | 
							
								 *   - uri: URI of the source image before styling.
							 | 
						||
| 
								 | 
							
								 *   - alt: The alternative text for text-based browsers. HTML 4 and XHTML 1.0
							 | 
						||
| 
								 | 
							
								 *     always require an alt attribute. The HTML 5 draft allows the alt
							 | 
						||
| 
								 | 
							
								 *     attribute to be omitted in some cases. Therefore, this variable defaults
							 | 
						||
| 
								 | 
							
								 *     to an empty string, but can be set to NULL for the attribute to be
							 | 
						||
| 
								 | 
							
								 *     omitted. Usually, neither omission nor an empty string satisfies
							 | 
						||
| 
								 | 
							
								 *     accessibility requirements, so it is strongly encouraged for code using
							 | 
						||
| 
								 | 
							
								 *     '#theme' => 'image_style' to pass a meaningful value for this variable.
							 | 
						||
| 
								 | 
							
								 *     - https://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8
							 | 
						||
| 
								 | 
							
								 *     - https://www.w3.org/TR/xhtml1/dtds.html
							 | 
						||
| 
								 | 
							
								 *     - http://dev.w3.org/html5/spec/Overview.html#alt
							 | 
						||
| 
								 | 
							
								 *   - title: The title text is displayed when the image is hovered in some
							 | 
						||
| 
								 | 
							
								 *     popular browsers.
							 | 
						||
| 
								 | 
							
								 *   - attributes: Associative array of additional attributes to be placed in
							 | 
						||
| 
								 | 
							
								 *     the img tag.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function template_preprocess_image_style(&$variables): void {
							 | 
						||
| 
								 | 
							
								  $style = ImageStyle::load($variables['style_name']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Determine the dimensions of the styled image.
							 | 
						||
| 
								 | 
							
								  $dimensions = [
							 | 
						||
| 
								 | 
							
								    'width' => $variables['width'],
							 | 
						||
| 
								 | 
							
								    'height' => $variables['height'],
							 | 
						||
| 
								 | 
							
								  ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  $style->transformDimensions($dimensions, $variables['uri']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  $variables['image'] = [
							 | 
						||
| 
								 | 
							
								    '#theme' => 'image',
							 | 
						||
| 
								 | 
							
								    '#width' => $dimensions['width'],
							 | 
						||
| 
								 | 
							
								    '#height' => $dimensions['height'],
							 | 
						||
| 
								 | 
							
								    '#attributes' => $variables['attributes'],
							 | 
						||
| 
								 | 
							
								    '#style_name' => $variables['style_name'],
							 | 
						||
| 
								 | 
							
								  ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // If the current image toolkit supports this file type, prepare the URI for
							 | 
						||
| 
								 | 
							
								  // the derivative image. If not, just use the original image resized to the
							 | 
						||
| 
								 | 
							
								  // dimensions specified by the style.
							 | 
						||
| 
								 | 
							
								  if ($style->supportsUri($variables['uri'])) {
							 | 
						||
| 
								 | 
							
								    $variables['image']['#uri'] = $style->buildUrl($variables['uri']);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  else {
							 | 
						||
| 
								 | 
							
								    $variables['image']['#uri'] = $variables['uri'];
							 | 
						||
| 
								 | 
							
								    // Don't render the image by default, but allow other preprocess functions
							 | 
						||
| 
								 | 
							
								    // to override that if they need to.
							 | 
						||
| 
								 | 
							
								    $variables['image']['#access'] = FALSE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Inform the site builders why their image didn't work.
							 | 
						||
| 
								 | 
							
								    \Drupal::logger('image')->warning('Could not apply @style image style to @uri because the style does not support it.', [
							 | 
						||
| 
								 | 
							
								      '@style' => $style->label(),
							 | 
						||
| 
								 | 
							
								      '@uri' => $variables['uri'],
							 | 
						||
| 
								 | 
							
								    ]);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (\array_key_exists('alt', $variables)) {
							 | 
						||
| 
								 | 
							
								    $variables['image']['#alt'] = $variables['alt'];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (\array_key_exists('title', $variables)) {
							 | 
						||
| 
								 | 
							
								    $variables['image']['#title'] = $variables['title'];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Returns the offset in pixels from the anchor.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param string $anchor
							 | 
						||
| 
								 | 
							
								 *   The anchor ('top', 'left', 'bottom', 'right', 'center').
							 | 
						||
| 
								 | 
							
								 * @param int $current_size
							 | 
						||
| 
								 | 
							
								 *   The current size, in pixels.
							 | 
						||
| 
								 | 
							
								 * @param int $new_size
							 | 
						||
| 
								 | 
							
								 *   The new size, in pixels.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @return int|string
							 | 
						||
| 
								 | 
							
								 *   The offset from the anchor, in pixels, or the anchor itself, if its value
							 | 
						||
| 
								 | 
							
								 *   isn't one of the accepted values.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @deprecated in drupal:11.1.0 and is removed from drupal:12.0.0. Use
							 | 
						||
| 
								 | 
							
								 *   \Drupal\Component\Utility\Image::getKeywordOffset() instead.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @see https://www.drupal.org/node/3268441
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function image_filter_keyword($anchor, $current_size, $new_size) {
							 | 
						||
| 
								 | 
							
								  @trigger_error('image_filter_keyword() is deprecated in drupal:11.1.0 and is removed from drupal:12.0.0. Use \Drupal\Component\Utility\Image::getKeywordOffset() instead. See https://www.drupal.org/node/3268441', E_USER_DEPRECATED);
							 | 
						||
| 
								 | 
							
								  switch ($anchor) {
							 | 
						||
| 
								 | 
							
								    case 'top':
							 | 
						||
| 
								 | 
							
								    case 'left':
							 | 
						||
| 
								 | 
							
								      return 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    case 'bottom':
							 | 
						||
| 
								 | 
							
								    case 'right':
							 | 
						||
| 
								 | 
							
								      return $current_size - $new_size;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    case 'center':
							 | 
						||
| 
								 | 
							
								      return $current_size / 2 - $new_size / 2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								      return $anchor;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |