私はまだここに説明されている私の問題を抱えています画像スタイル、フィールドコレクションアイテムで画像を再利用しますが、解決策を得るために諦めました。
私の頭に浮かんだ回避策は、nodesaveでimagestylesの生成を強制することです。そうする可能性はありますか?
私はまだここに説明されている私の問題を抱えています画像スタイル、フィールドコレクションアイテムで画像を再利用しますが、解決策を得るために諦めました。
私の頭に浮かんだ回避策は、nodesaveでimagestylesの生成を強制することです。そうする可能性はありますか?
回答:
はい- カスタムモジュールに実装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);
}
}
}
コードブロックによる2つの答えは、1つの主要なことを見落としていることを除いて、ほとんどが正しいです。
image_style_create_derivativeの最初の引数は、画像スタイル配列であることが期待されています。
彼らが渡しているのは、スタイルの名前だけです。追加した場合、foreachで:
$style = image_style_load($style_name);
次に、image_style_create_derivative関数で$ style_nameを$ styleに変更すると、期待どおりに機能し、スタイル付き画像が生成されます。
image_style_create_derivative($style, $file->uri, $derivative_uri);
この問題を抱えている他の人を助けることを願っています。
助けてくれてありがとうClive、フィールドコレクションアイテムの全機能:(あなたからの別の役立つ投稿:フィールドコレクションへのアクセス)
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']);
}
}