web-dev-qa-db-fra.com

Drupal 8 images avec style d'image

Dans drupal 7, j'utilise la fonction image_style_url('style', uri) pour générer une nouvelle image avec style et retourner le chemin de l'image. alors que sera-t-il au lieu de cela dans drupal 8? Merci

23
user3810914

Par modifier les enregistrements :

use Drupal\image\Entity\ImageStyle;

$path = 'public://images/image.jpg';
$url = ImageStyle::load('style_name')->buildUrl($path);
55
Clive

Vous devriez essayer d'utiliser les nouvelles fonctions Drupal autant que possible).

Utilisez plutôt:

use Drupal\file\Entity\File;
use Drupal\image\Entity\ImageStyle;

$fid = 123;
$file = File::load($fid);
$image_uri = ImageStyle::load('your_style-name')->buildUrl($file->getFileUri());

Modifié selon https://www.drupal.org/node/2050669 :

$original_image = 'public://images/image.jpg';

// Load the image style configuration entity
use Drupal\image\Entity\ImageStyle;
$style = ImageStyle::load('thumbnail');

$uri = $style->buildUri($original_image);
$url = $style->buildUrl($original_image);
15
sagesolutions

Dans vos contrôleurs et autres OOP partie de Drupal vous pouvez utiliser:

use Drupal\image\Entity\ImageStyle;

$path = 'public://images/image.jpg';
$url = ImageStyle::load('style_name')->buildUrl($path);

Et en YOUR_THEME.theme fichier tandis que Error: Class 'ImageStyle' not found in YOURTHEMENAME_preprocess_node vous pouvez le faire avec le follwing

 $path = 'public://images/image.jpg';
 $style = \Drupal::entityTypeManager()->getStorage('image_style')->load('thumbnail');
 $url = $style->buildUrl($path);

Une autre méthode consiste à fournir un tableau pouvant être rendu et à laisser le moteur de rendu drupal le rendre.

$render = [
    '#theme' => 'image_style',
    '#style_name' => 'thumbnail',
    '#uri' => $path,
    // optional parameters
];
7
Yusef

J'ai constaté que je souhaitais souvent prétraiter l'image pour appliquer un style d'image à une image sur un nœud ou un type de paragraphe. Dans de nombreux cas, j'ai créé un paragraphe qui permet à l'utilisateur de choisir la largeur de l'image en pourcentage. Dans le prétraitement, je vérifierais la valeur de la largeur et appliquerais le style d'image correct.

use Drupal\image\Entity\ImageStyle;

function THEME_preprocess_paragraph__basic_content(&$vars) {
  //get the paragraph
  $paragraph = $vars['paragraph'];

  //get the image
  $images = $paragraph->get('field_para_image');
  //get the images value, in my case I only have one required image, but if you have unlimited image, you could loop thru $images
  $uri = $images[0]->entity->uri->value;

  //This is my field that determines the width the user wants for the image and is used to determine the image style
  $preset = $paragraph->get('field_column_width')->value;

  $properties = array();
  $properties['title'] = $images[0]->getValue()['title'];
  $properties['alt'] = $images[0]->getValue()['alt'];

  //this is where the Image style is applied
  switch($preset) {
     case 'image-20':
       $properties['uri'] = ImageStyle::load('width_20_percent')->buildUrl($uri);
       break;
     case 'image-45':
       $properties['uri'] = ImageStyle::load('width_45_percent')->buildUrl($uri);
       break;
     case 'image-55':
       $properties['uri'] = ImageStyle::load('width_55_percent')->buildUrl($uri);
       break;
     case 'image-100':
       $properties['uri'] = ImageStyle::load('width_100_percent')->buildUrl($uri);
       break;
  }
  //assign to a variable that the twig template can use
  $vars['basic_image_display'] = $properties;
}

Dans cet exemple, je prétraite un type de paragraphe spécifique nommé "basic_content" mais vous pouvez faire la même chose avec un prétraitement de noeud. Poursuivant mon exemple, j'aurais un modèle twig nommé paragraph - basic_content.html.twig pour gérer l'affichage de ce type de paragraphe.

L'affichage de l'image serait quelque chose comme ça dans le fichier twig.

<img class="img-responsive" src="{{basic_image_display['uri']}}" alt="{{ basic_image_display['alt'] }}" title="{{ basic_image_display['title'] }}"/>
1
Brian Williams

Fonctionne pour moi à partir d'une requête de base de données classique Drupal dans un fichier .module:

$query = \Drupal::database()->select('file_managed', 'f' );
$query->addField('f', 'uri');
$pictures = $query->execute()->fetchAll();

foreach ($pictures as $key => $picture) {

   $largePictureUri = entity_load('image_style', 'large')->buildUrl($picture->uri);
}
0
pierre delaunay