memaksa generasi gaya gambar pada save node

Jawaban:

12

Ya - Anda dapat menerapkan hook_node_insert()dan hook_node_update()dalam modul khusus dan membuat gambar di sana menggunakan fungsi API gambar. Sebagai contoh

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
sumber
terlihat keren terima kasih! tetapi apakah Anda mungkin tahu cara mendapatkan nilai item koleksi bidang yang terkait dengan nodetype saya?
sinini
Saya perhatikan sekarang, bahwa gambar yang dihasilkan tidak diubah ukurannya, hanya disimpan dalam ukuran asli. apakah ini pernah terjadi pada Anda dan Anda mungkin punya ide bagaimana menyelesaikannya?
sinini
@sinini jawaban Anda ada di drupal.stackexchange.com/questions/155823/…
Tanvir Ahmad
Kehidupan D7 terbatas, tetapi untuk berjaga-jaga jika seseorang menemukan ini seperti yang saya lakukan hari ini, koreksi. image_style_create_derivative () mengharapkan array untuk parameter pertama, sehingga baris tersebut seharusnya: image_style_create_derivative (image_style_load ($ style_name), $ file-> uri, $ derivative_uri);
Tandai
9

Dua jawaban dengan blok kode sebagian besar benar kecuali mereka menghadap satu hal utama:

Argumen pertama dari image_style_create_derivative diharapkan menjadi array gaya gambar.

Apa yang mereka lewati hanyalah nama gaya. Di bagian depan jika Anda menambahkan:

$style = image_style_load($style_name);

kemudian ubah $ style_name menjadi $ style dalam fungsi image_style_create_derivative itu harus bekerja seperti yang diharapkan dan menghasilkan gambar gaya.

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

Semoga ini bisa membantu orang lain yang memiliki masalah ini.

Jason Gray
sumber
4

Terima kasih atas bantuan Anda Clive, seluruh fungsi saya untuk item koleksi bidang: (pos membantu lainnya dari Anda: Mengakses koleksi bidang )

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

Disarankan untuk menggunakan hook_node_insert () dan hook_node_update () dan untuk memeriksa apakah turunan gambar yang dibutuhkan tidak dihasilkan, kemudian buat, jika tidak, jangan lakukan apa-apa.

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

Catatan: Jika bidang gambar Anda mengambil banyak gambar maka Anda harus mengulanginya seperti itu:

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

Generasi gaya gambar diambil dari sini

Omar Alahmed
sumber