모듈 디렉토리에있는 이미지의 테마 이미지 스타일


10

아마도 Drupal 6의 관점에서 너무 많이 나오는 것 같지만 ...

이미지가 모듈 폴더에있을 때 지정된 이미지 스타일로 이미지를 테마로 지정하려면 어떻게합니까? 이것은 나를 끈적 끈적하게 만들고 나는 단순한 것을 놓치고 있다는 것을 안다.

다음은 내가하려는 일을 보여주는 예제 코드입니다.

$file_uri = 'public://sites/all/modules/my_module/logo.jpg';
$data['logo'] = theme('image_style', array('style_name' => 'medium', 'path' => $file_uri));

file_build_uri ()를 사용하더라도 존재하지 않는 파일의 경로로 끝납니다. 이미지를 files 디렉토리로 옮기고 $ file_uri를 'public : //logo.jpg'로 변경하면 정상적으로 작동합니다.

모듈 코드의 일부로 이미지를 파일 디렉토리에 복사해야합니까? 그렇다면,이 말도 안되나요?

내가 무엇을 놓치고 있습니까? 이와 같은 작업을 수행하는 방법에 대한 설명서가 있습니까? 나는 Drupal 문서를 채굴하는 데 1 시간 이상을 보냈고 완전히 건조되었습니다.


public : //sites/all/modules/my_module/logo.jpg는 sites / default / files / sites / all / modules / my_module / logo.jpg로 효과적으로 번역되므로 위의 기능이 작동하지 않습니다. 내가 가진 질문은 theme_image_style을 통해 파일을 실행하기 위해 파일을 복사하는 것을 피하는 것입니다.
PrairieHippo

답변:


4

불행히도 이것은 의도적으로 설계된 것입니다. 로부터 theme_image_style()수용 가능한 파라미터 문서 '설명 :

path : Drupal files 디렉토리와 관련된 이미지 파일의 경로 . 이 기능은 파일 디렉토리 외부의 이미지 나 원격으로 호스팅 된 이미지에서는 작동하지 않습니다 . 'images / image.jpg'와 같은 형식이거나 'public : //images/image.jpg'와 같은 스트림 래퍼를 사용해야합니다.

강조합니다.

이미지 스타일 시스템은 공용 파일 디렉토리의 컨텍스트에서만 작동하는 것 같습니다 (비공개 수도 확실하지 않습니다).

최근 비슷한 상황이 발생하여 직접 코딩해야했습니다 (핵심 이미지 모듈에서 많은 돈을 빌었지만).


고마워-실제로이 방법으로 작동하지 않기를 원하지만 개발자가 왜이 접근법을 선택했는지 추론 할 수 있다고 생각합니다.
PrairieHippo

9

방금이 문제를 다루고 이것을 처리하기 위해 코드를 작성해야했습니다.

이렇게 theme_image_style()하면 페이지 요청을 실행하는 동안 이미지 파생물을 효과적으로 복제 할 수 있습니다. 생성은 일반적으로 404를 트리거하는 보안 문제를 우회하지만 페이지를 처음 방문 할 때 페이지 속도가 느려집니다.

공용 파일 스키마 만 사용하고 있지만 개인 파일 스키마 기반 스타일에서는 실패 할 것으로 예상됩니다.

    /**
     * Implements hook_theme().
     */
    function MODULE_theme() {
      return array(
        'remote_image_style' => array(
          'variables' => array(
            'style_name' => NULL,
            'path' => NULL,
            'width' => NULL,
            'height' => NULL,
            'alt' => '',
            'title' => NULL,
            'attributes' => array(),
          ),
        ),
      );
    }

    /**
     * Returns HTML for an image using a specific image style.
     *
     * Clones theme_image_style() with the additional step of forcing the creation
     * of the derivative to bypass any 404 issues.
     */
    function theme_remote_image_style($variables) {
      // Determine the dimensions of the styled image.
      $dimensions = array(
        'width' => $variables['width'],
        'height' => $variables['height'],
      );
      image_style_transform_dimensions($variables['style_name'], $dimensions);

      $variables['width'] = $dimensions['width'];
      $variables['height'] = $dimensions['height'];

      $image_style_dest_path = image_style_path($variables['style_name'], $variables['path']);
      if (!file_exists($image_style_dest_path)) {
        $style = image_style_load($variables['style_name']);
        image_style_create_derivative($style, $variables['path'], $image_style_dest_path);
      }
      $variables['path'] = file_create_url($image_style_dest_path);
      return theme('image', $variables);
    }

2

theme_image_style() 실제 경로가 아닌 PHP의 스트림 래퍼를 사용하여 URI를 허용합니다.

input://인 PHP의 스트림 래퍼, 반면 public://, private://temporary://표현 드루팔의 스트림 래퍼 sites/default/files, 개인 및 임시 폴더.

모듈에서 찾은 이미지와 함께 이미지 스타일을 반드시 사용해야하는 경우 , 및 스트림 래퍼 를 추가하는 system_stream_wrapper 모듈 을 확인할 수 있습니다 .module://theme://profile://library://

공지 사항 : 현재 질문과 관련이 없지만 다른 게시물에서 언급 되었으므로 http : //, https : // 또는 feed : /를 사용하여 URL에 대한 지원을 추가 하는 remote_stream_wrapper 모듈을 가리키고 싶습니다 . / . 언급 했듯이이 스트림 래퍼는 읽기 전용이며 쓰기 작업을 수행 할 수 없지만와image_style_url() 같은 관련 기능과 함께 사용할 수 있다고 생각합니다 theme_image_style().

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.