ฉันยังคงมีปัญหาของฉันอธิบายที่นี่รูปแบบภาพที่นำมาใช้ใหม่ในรายการคอลเลกชันสนามแต่ฉันให้ขึ้นเพื่อแก้ปัญหา
วิธีแก้ปัญหาที่เกิดขึ้นในใจของฉันคือการบังคับให้สร้างจินตภาพบนโหนด มีความเป็นไปได้ที่จะทำเช่นนั้น?
ฉันยังคงมีปัญหาของฉันอธิบายที่นี่รูปแบบภาพที่นำมาใช้ใหม่ในรายการคอลเลกชันสนามแต่ฉันให้ขึ้นเพื่อแก้ปัญหา
วิธีแก้ปัญหาที่เกิดขึ้นในใจของฉันคือการบังคับให้สร้างจินตภาพบนโหนด มีความเป็นไปได้ที่จะทำเช่นนั้น?
คำตอบ:
ใช่ - คุณสามารถนำไปใช้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);
}
}
}
คำตอบสองข้อที่มีกลุ่มของรหัสส่วนใหญ่จะถูกต้องเว้นแต่ว่าพวกเขากำลังมองสิ่งสำคัญ:
อาร์กิวเมนต์แรกของ 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);
หวังว่าจะช่วยคนอื่นที่มีปัญหานี้
ขอบคุณสำหรับความช่วยเหลือของคุณคลีฟฟังก์ชั่นทั้งหมดของฉันสำหรับรายการคอลเลกชันฟิลด์: (โพสต์ที่เป็นประโยชน์อื่นจากคุณ: การเข้าถึงคอลเลกชันฟิลด์ )
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);
}
}
}
ดูเหมือนว่าจะมีโมดูลสำหรับปัญหานั้น: https://www.drupal.org/project/imageinfo_cache
ลองดูที่ "โมดูลที่เกี่ยวข้อง" - ส่วนบนของหน้าเช่นกัน
ขอแนะนำให้ใช้ทั้ง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']);
}
}
การสร้างสไตล์ของภาพนั้นมาจากที่นี่