บังคับให้สร้างรูปแบบรูปภาพบนโหนดบันทึก


9

ฉันยังคงมีปัญหาของฉันอธิบายที่นี่รูปแบบภาพที่นำมาใช้ใหม่ในรายการคอลเลกชันสนามแต่ฉันให้ขึ้นเพื่อแก้ปัญหา

วิธีแก้ปัญหาที่เกิดขึ้นในใจของฉันคือการบังคับให้สร้างจินตภาพบนโหนด มีความเป็นไปได้ที่จะทำเช่นนั้น?

คำตอบ:


12

ใช่ - คุณสามารถนำไปใช้hook_node_insert()และhook_node_update()ในโมดูลที่กำหนดเองและสร้างภาพที่นั่นโดยใช้ฟังก์ชั่น API ภาพ ตัวอย่างเช่น

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

ดูดีขอบคุณ! แต่คุณอาจรู้วิธีรับค่าของรายการคอลเลกชันฟิลด์ที่เกี่ยวข้องกับ nodetype ของฉันได้อย่างไร
sinini

อันที่จริง - drupal.stackexchange.com/questions/11062/… :) โอ้และในกรณีที่คุณต้องการ: drupal.stackexchange.com/questions/11062/
Clive

ฉันสังเกตเห็นแล้วว่าภาพที่สร้างขึ้นไม่ได้ถูกปรับขนาดเพียงแค่จัดเก็บในขนาดดั้งเดิม สิ่งนี้เคยเกิดขึ้นกับคุณและคุณอาจมีความคิดวิธีการแก้ปัญหาหรือไม่
sinini

@sinini คำตอบของคุณอยู่ที่drupal.stackexchange.com/questions/155823/…
Tanvir Ahmad

ชีวิตของ D7 นั้นมี จำกัด แต่ในกรณีที่มีคนเจอสิ่งนี้เหมือนที่ฉันทำในวันนี้การแก้ไข image_style_create_derivative () คาดว่าอาร์เรย์สำหรับพารามิเตอร์แรกดังนั้นบรรทัดควรเป็น: image_style_create_derivative (image_style_load ($ style_name), $ file-> uri, $ Deriv_uri);
ทำเครื่องหมาย

9

คำตอบสองข้อที่มีกลุ่มของรหัสส่วนใหญ่จะถูกต้องเว้นแต่ว่าพวกเขากำลังมองสิ่งสำคัญ:

อาร์กิวเมนต์แรกของ image_style_create_derivative คาดว่าจะเป็นอาร์เรย์สไตล์รูปภาพ

สิ่งที่พวกเขาผ่านเป็นเพียงชื่อของสไตล์ ในหน้า foreach ถ้าคุณเพิ่ม:

$style = image_style_load($style_name);

จากนั้นเปลี่ยน $ style_name เป็น $ style ในฟังก์ชั่น image_style_create_derivative ควรทำงานได้ตามที่คาดหวังและสร้างภาพสไตล์

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

หวังว่าจะช่วยคนอื่นที่มีปัญหานี้


4

ขอบคุณสำหรับความช่วยเหลือของคุณคลีฟฟังก์ชั่นทั้งหมดของฉันสำหรับรายการคอลเลกชันฟิลด์: (โพสต์ที่เป็นประโยชน์อื่นจากคุณ: การเข้าถึงคอลเลกชันฟิลด์ )

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

ขอแนะนำให้ใช้ทั้งhook_node_insert ()และhook_node_update ()และเพื่อตรวจสอบว่าไม่ได้สร้างอนุพันธ์ภาพที่จำเป็นจากนั้นสร้างมันขึ้นมามิฉะนั้นไม่ต้องทำอะไรเลย

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

หมายเหตุ: หากฟิลด์รูปภาพของคุณถ่ายหลายภาพคุณควรวนรอบรูปภาพดังนี้:

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

การสร้างสไตล์ของภาพนั้นมาจากที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.