Erzwingen Sie die Generierung des Bildstils auf dem Speicherknoten

9

Ich habe immer noch mein hier beschriebenes Problem. Bildstil, Bild im Feldsammlungselement wiederverwenden, aber ich habe aufgegeben, um eine Lösung zu finden.

Eine Problemumgehung, die mir in den Sinn kam, besteht darin, die Erzeugung von Bildstilen auf Nodesave zu erzwingen. Gibt es dafür Möglichkeiten?

Sinini
quelle

Antworten:

12

Ja - Sie können in einem benutzerdefinierten Modul implementieren hook_node_insert()und hook_node_update()die Bilder dort mithilfe von Bild-API-Funktionen erstellen. Zum Beispiel

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
quelle
sieht cool aus danke! Aber wissen Sie vielleicht, wie Sie den Wert der Feldsammlungselemente ermitteln können, die sich auf meinen Knotentyp beziehen?
Sinini
Ich habe jetzt bemerkt, dass die Größe der generierten Bilder nicht geändert wird, sondern nur in der Originalgröße gespeichert wird. Ist Ihnen das jemals passiert und Sie haben vielleicht eine Idee, wie Sie es lösen können?
Sinini
@ Sinini Ihre Antwort ist bei drupal.stackexchange.com/questions/155823/…
Tanvir Ahmad
Das Leben von D7 ist begrenzt, aber für den Fall, dass jemand wie heute darauf stößt, eine Korrektur. image_style_create_derivative () erwartet ein Array für den ersten Parameter, daher sollte diese Zeile lauten: image_style_create_derivative (image_style_load ($ style_name), $ file-> uri, $ derivative_uri);
Mark vor
9

Die beiden Antworten mit Codeblöcken sind größtenteils richtig, außer dass sie eine wichtige Sache übersehen:

Es wird erwartet, dass das erste Argument von image_style_create_derivative ein Bildstil-Array ist.

Was sie passieren, ist nur der Name des Stils. Im foreach, wenn Sie hinzufügen:

$style = image_style_load($style_name);

Ändern Sie dann $ style_name in $ style in der Funktion image_style_create_derivative, damit es wie erwartet funktioniert, und generieren Sie das gestaltete Bild.

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

Hoffe, das hilft allen anderen, die dieses Problem haben.

Jason Gray
quelle
4

Vielen Dank für Ihre Hilfe Clive, meine gesamte Funktion für die Feldsammlungselemente: (ein weiterer hilfreicher Beitrag von Ihnen: Zugriff auf eine Feldsammlung )

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
quelle
0

Es wird empfohlen, sowohl hook_node_insert () als auch hook_node_update () zu verwenden und zu überprüfen, ob die erforderlichen Bildableitungen nicht generiert werden, und sie dann zu generieren, andernfalls nichts zu tun.

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

Hinweis: Wenn Ihr Bildfeld mehrere Bilder aufnimmt, sollten Sie diese folgendermaßen durchlaufen:

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

Die Generierung der Bildstile erfolgt von hier aus

Omar Alahmed
quelle