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


Réponses:


12

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);
    }
  }
}

semble cool merci! mais savez-vous comment obtenir la valeur des éléments de collection de champs liés à mon nodetype?
sinini


j'ai remarqué maintenant que les images générées ne sont pas redimensionnées, juste stockées dans la taille d'origine. est-ce que cela vous est déjà arrivé et vous pourriez avoir une idée de comment le résoudre?
sinini


La vie de D7 est limitée, mais juste au cas où quelqu'un tomberait sur ce sujet comme je l'ai fait aujourd'hui, une correction. image_style_create_derivative () attend un tableau pour le premier paramètre, de sorte que la ligne doit être: image_style_create_derivative (image_style_load ($ style_name), $ file-> uri, $ dérivé_uri);
Mark

9

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.


4

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);
    }
  }
}


0

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 de les générer, 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 ceci:

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 prise d' ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.