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