저장 노드에서 이미지 스타일 생성 강제


답변:


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

멋진 감사합니다! 그러나 내 노드 유형과 관련된 필드 수집 항목의 값을 얻는 방법을 알고 있습니까?
sinini


생성 된 이미지의 크기가 조정되지 않고 원래 크기로 저장된 것만 알았습니다. 이 일이 당신에게 일어 났습니까? 그리고 그것을 해결하는 방법을 알고 있습니까?
sinini


D7의 삶은 제한되어 있지만 오늘 내가 한 것처럼 누군가가 이것을 만난 경우를 대비하여 수정했습니다. image_style_create_derivative ()는 첫 번째 매개 변수에 대한 배열을 예상하므로 행은 다음과 같아야합니다. image_style_create_derivative (image_style_load ($ style_name), $ file-> uri, $ derivative_uri);
마크

9

코드 블록이있는 두 가지 대답은 하나의 주요 사항을 간과하는 것을 제외하고는 대부분 정확합니다.

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

다른 사람 이이 문제를 겪는 데 도움이되기를 바랍니다.


4

도움을 주셔서 감사합니다 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);
    }
  }
}


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.