web-dev-qa-db-fra.com

forcer la génération du style d'image sur le noeud d'enregistrement

J'ai toujours mon problème décrit ici Style d'image, réutiliser l'image dans l'élément de collection de champs mais j'ai abandonné pour obtenir une solution.

Une solution de contournement qui m'est venue à l'esprit est de forcer la génération de styles d'images sur nodeave. y a-t-il des possibilités pour le faire?

9
sinini

Oui - vous pouvez implémenter hook_node_insert() et hook_node_update() dans un module personnalisé et y créer les images à l'aide des fonctions API d'image. Par exemple

function MYMODULE_node_insert($node) {
  // Get some field items from a field called 'field_photo.
  if ($image_items = field_get_items('node', $node, 'field_photo')) {
    $image_item = array_shift($image_items);

    // Load the associated file.
    $file = file_load($image_item['fid']);

    // An array of image styles to create.
    $image_styles = array('style_1', 'style_2');

    foreach ($image_styles as $style_name) {
      // Get the location of the new image.
      $derivative_uri = image_style_path($style_name, $file->uri);

      // Create the image.
      image_style_create_derivative($style_name, $file->uri, $derivative_uri);
    }
  }
}
12
Clive

Les deux réponses avec des blocs de code sont généralement correctes, sauf qu'elles négligent une chose importante:

Le premier argument de image_style_create_derivative devrait être un tableau de style d'image.

Ce qu'ils passent n'est que le nom du style. Dans le foreach si vous ajoutez:

$style = image_style_load($style_name);

puis changez $ style_name en $ style dans la fonction image_style_create_derivative, cela devrait fonctionner comme prévu et générer l'image stylisée.

image_style_create_derivative($style, $file->uri, $derivative_uri);

J'espère que cela aide toute personne ayant ce problème.

9
Jason Gray

Merci pour votre aide Clive, toute ma fonction pour les éléments de la collection de champs: (un autre article utile de votre part: Accéder à une collection de champs )

function channelportal_gallery_node_update($node) {

  //get all the id's from the field collection values
  $galleryimages = field_get_items('node', $node, 'field_gallery_and_caption');
  $fieldcollectionids = array();

  foreach ($galleryimages as $key => $value) {
    $fieldcollectionids[] = $value['value'];
  }

  // Load up the field collection items
  $items = field_collection_item_load_multiple($fieldcollectionids);

  foreach ($items as $item) {

    $image_item = field_get_items('field_collection_item', $item, 'field_gallery_image');

    // Load the associated file.
    $file = file_load($image_item[0]['fid']);

    // An array of image styles to create.
    $image_styles = array('gallery_big', 'gallery_thumbnail');

    foreach ($image_styles as $style_name) {
        // Get the location of the new image.
        $derivative_uri = image_style_path($style_name, $file->uri);

        // Create the image.
        image_style_create_derivative($style_name, $file->uri, $derivative_uri);
    }
  }
}
4
sinini

Il semble y avoir un module pour ce problème: https://www.drupal.org/project/imageinfo_cache

Jetez également un œil à la section "Modules associés" sur la page.

1
tFranz

Il est recommandé d'utiliser à la fois hook_node_insert () et hook_node_update () et de vérifier si les dérivées d'image nécessaires ne sont pas générées, puis générez-les, sinon, ne faites rien.

/**
 * Implements hook_node_insert to generate derivative images for the new inserted node in
 * case they are not generated
 * @param object $node
 */
function YOUR_MODULE_node_insert($node) {
  //REPLACE field_YOUR_IMAGE_FIELD WITH YOUR FIELD IMAGE NAME
  if(isset($node->field_YOUR_IMAGE_FIELD['und'][0]['uri'])) {
    _generate_image_style($node->field_YOUR_IMAGE_FIELD['und'][0]['uri']);
  }
}

/**
 * Implements hook_node_update to generate derivative images for the new updated node in
 * case they are not generated
 * @param object $node
 */
function YOUR_MODULE_node_update($node) {
  //REPLACE field_YOUR_IMAGE_FIELD WITH YOUR FIELD IMAGE NAME
  if(isset($node->field_YOUR_IMAGE_FIELD['und'][0]['uri'])) {
    _generate_image_style($node->field_YOUR_IMAGE_FIELD['und'][0]['uri']);
  }
}

/**
 * Generates the needed image styles by the image uri if they are not already generated
 * @param string $image_uri
 */
function _generate_image_style($image_uri) {
  //This should be changed to your image styles names.
  $image_styles = array('image_style_name1', 'large_image', 'promo_image');
  foreach ($image_styles as $style) {
    $derivative_uri = image_style_path($style, $image_uri);
    file_exists($derivative_uri) || image_style_create_derivative(image_style_load($style), $image_uri, $derivative_uri);
  }
}

Remarque: Si votre champ d'image prend plusieurs images, vous devez les parcourir comme ça:

if(isset($node->field_main_image['und']) && is_array($node->field_main_image['und'])) {
  foreach($node->field_main_image['und'] as $delta => $image_field) {
    _generate_image_style($node->field_YOUR_IMAGE_FIELD['und'][$delta]['uri']);
  }
}

La génération des styles d'image est tirée de ici

0
Omar Alahmed