forçar geração de estilo de imagem no nó de salvamento

Respostas:

12

Sim - você pode implementar hook_node_insert()e hook_node_update()em um módulo personalizado e criar as imagens usando as funções da API de imagem. Por exemplo

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);
    }
  }
}
Clive
fonte
parece legal obrigado! mas você pode saber como obter o valor dos itens da coleção de campos relacionados ao meu tipo de nó?
sinini
notei agora que as imagens geradas não são redimensionadas, apenas armazenadas no tamanho original. isso já aconteceu com você e você pode ter alguma idéia de como resolvê-lo?
sinini
@sinini sua resposta está em drupal.stackexchange.com/questions/155823/…
Tanvir Ahmad
A vida de D7 é limitada, mas no caso de alguém se deparar com isso como eu fiz hoje, uma correção. image_style_create_derivative () espera uma matriz para o primeiro parâmetro, para que a linha seja: image_style_create_derivative (image_style_load ($ style_name), $ file-> uri, $ derivative_uri);
Mark
9

As duas respostas com blocos de código estão na maior parte corretas, exceto que estão negligenciando uma coisa importante:

O primeiro argumento de image_style_create_derivative deve ser uma matriz de estilo de imagem.

O que eles estão passando é apenas o nome do estilo. No foreach, se você adicionar:

$style = image_style_load($style_name);

altere $ style_name para $ style na função image_style_create_derivative, para que funcione conforme o esperado e gere a imagem com estilo.

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

Espero que ajude outras pessoas com esse problema.

Jason Gray
fonte
4

Obrigado por sua ajuda, Clive, toda a minha função para os itens da coleção de campos: (outra publicação útil de você: Acessando uma coleção de campos )

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);
    }
  }
}
sinini
fonte
0

Recomenda-se usar hook_node_insert () e hook_node_update () e verificar se as derivadas de imagem necessárias não foram geradas e, em seguida, gere-as, caso contrário, não faça nada.

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

Nota: Se o seu campo de imagem capturar várias imagens, você deverá fazer um loop através delas assim:

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

A geração de estilos de imagem é tirada daqui

Omar Alahmed
fonte