Phong cách hình ảnh chủ đề cho hình ảnh nằm trong thư mục mô-đun


10

Có lẽ đến từ điều này từ quá nhiều quan điểm của Drupal 6 nhưng ...

Làm cách nào để tôi tạo chủ đề cho hình ảnh theo kiểu hình ảnh nhất định khi hình ảnh đó nằm trong thư mục mô-đun? Điều này đang khiến tôi bực mình và tôi biết tôi chỉ thiếu một cái gì đó đơn giản.

Dưới đây là một số mã ví dụ cho thấy những gì tôi đang cố gắng làm:

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

Ngay cả khi tôi sử dụng file_build_uri (), tôi vẫn có một đường dẫn đến một tệp không tồn tại. Nếu tôi di chuyển hình ảnh vào thư mục tệp và thay đổi $ file_uri thành 'public: //logo.jpg', nó sẽ hoạt động tốt.

Tôi có cần sao chép hình ảnh vào thư mục tập tin như một phần của mã mô-đun không? Nếu vậy, điều này có vô lý không?

Tôi đang thiếu gì? Có tài liệu về cách làm một cái gì đó như thế này? Tôi đã dành hơn một giờ để khai thác tài liệu Drupal và đã hoàn toàn khô ráo.


công khai: //sites/all/modules/my_module/logo.jpg dịch hiệu quả sang các trang web / default / files / site / all / module / my_module / logo.jpg - đó là lý do tại sao cách trên không hoạt động. Đoán câu hỏi tôi có là, làm cách nào để tránh sao chép tệp chỉ để chạy nó qua theme_image_style?
PrairieHippo

Câu trả lời:


4

Thật không may đó là do thiết kế. Từ theme_image_style()mô tả của các tài liệu về các tham số có thể chấp nhận:

path: Đường dẫn của tệp hình ảnh liên quan đến thư mục tệp Drupal. Chức năng này không hoạt động với hình ảnh bên ngoài thư mục tập tin cũng như với hình ảnh được lưu trữ từ xa . Điều này phải ở định dạng như 'hình ảnh / hình ảnh' hoặc sử dụng trình bao bọc luồng, chẳng hạn như 'công khai: //images/image.jpg'.

Nhấn mạnh mỏ.

Có vẻ như hệ thống kiểu ảnh chỉ hoạt động trong ngữ cảnh của thư mục tệp công khai (có thể là riêng tư, tôi không chắc chắn).

Gần đây tôi đã gặp phải một tình huống tương tự và cuối cùng tôi phải tự viết mã (mặc dù tôi đã mượn rất nhiều từ mô-đun hình ảnh cốt lõi).


Cảm ơn - thực sự mong muốn nó không hoạt động theo cách này nhưng tôi cho rằng tôi có thể giải thích lý do tại sao các nhà phát triển chọn phương pháp này.
PrairieHippo

9

Tôi vừa gặp phải điều này và phải viết mã để xử lý việc này.

Điều này có hiệu quả nhân bản theme_image_style()để tạo dẫn xuất hình ảnh trong khi thực hiện yêu cầu trang. Thế hệ bỏ qua các vấn đề bảo mật thường sẽ kích hoạt 404, nhưng điều đó cũng có nghĩa là một trang chậm hơn trong lần đầu tiên trang được truy cập.

Tôi chỉ sử dụng lược đồ tệp công khai, nhưng tôi hy vọng điều này sẽ thất bại với các kiểu dựa trên lược đồ tệp riêng.

    /**
     * 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() chấp nhận một URI bằng cách sử dụng các trình bao bọc luồng của PHP và không phải là các đường dẫn thực.

input://là một PHP dòng wrapper, trong khi public://, private://temporary://là wrappers dòng Drupal cho đại diện sites/default/files, thư mục cá nhân và tạm thời.

Nếu bạn chắc chắn cần phải sử dụng một phong cách hình ảnh với một hình ảnh được tìm thấy trong một module, bạn có thể muốn kiểm tra system_stream_wrapper mô-đun mà thêm module://, theme://, profile://library://giấy gói suối.

Lưu ý: Có thể không liên quan đến câu hỏi hiện tại nhưng vì nó đã được đề cập trong các bài đăng khác, tôi cũng muốn chỉ đến mô-đun remote_stream_wrapperthêm hỗ trợ cho bất kỳ URL nào bằng http: //, https: // hoặc feed: / / . Như đã đề cập, các trình bao bọc luồng này chỉ đọc và không thể thực hiện bất kỳ thao tác viết nào nhưng tôi tin rằng nó có thể được sử dụng với image_style_url()và các chức năng liên quan như theme_image_style().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.