Theme Image Style untuk gambar yang terletak di direktori modul

10

Mungkin karena ini terlalu banyak dari sudut pandang Drupal 6 tapi ...

Bagaimana cara tema gambar dalam gaya gambar yang diberikan ketika gambar itu hidup dalam folder modul? Ini membuatku batty dan aku tahu aku melewatkan sesuatu yang sederhana.

Berikut ini beberapa contoh kode yang menunjukkan apa yang saya coba lakukan:

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

Bahkan jika saya menggunakan file_build_uri (), saya berakhir dengan path ke file yang tidak ada. Jika saya memindahkan gambar ke direktori file dan mengubah $ file_uri ke 'public: //logo.jpg', itu berfungsi dengan baik.

Apakah saya perlu menyalin gambar ke direktori file sebagai bagian dari kode modul? Jika demikian, bukankah ini konyol?

Apa yang saya lewatkan? Apakah ada dokumentasi tentang cara melakukan hal seperti ini? Saya telah menghabiskan lebih dari satu jam menambang dokumentasi Drupal dan muncul sepenuhnya kering.

PrairieHippo
sumber
publik: //sites/all/modules/my_module/logo.jpg secara efektif diterjemahkan ke situs / default / file / sites / all / modules / my_module / logo.jpg - itulah sebabnya mengapa hal di atas tidak berfungsi. Tebak pertanyaan yang saya miliki adalah, bagaimana cara menghindari menyalin file hanya untuk menjalankannya melalui theme_image_style?
PrairieHippo

Jawaban:

4

Sayangnya itu karena desain. Dari theme_image_style()deskripsi dokumen tentang parameter yang dapat diterima:

jalur: Jalur file gambar relatif ke direktori file Drupal. Fungsi ini tidak berfungsi dengan gambar di luar direktori file atau dengan gambar yang di-host dari jarak jauh . Ini harus dalam format seperti 'gambar / image.jpg', atau menggunakan pembungkus aliran seperti 'publik: //images/image.jpg'.

Tekankan milikku.

Tampaknya sistem gaya gambar hanya bekerja dalam konteks direktori file publik (mungkin pribadi juga, saya tidak yakin).

Saya mengalami situasi yang sama baru-baru ini dan akhirnya harus kode sendiri (walaupun saya meminjam banyak dari modul gambar inti).

Clive
sumber
Terima kasih - benar-benar berharap itu tidak berfungsi seperti ini tapi saya kira saya bisa mencari alasan mengapa para pengembang memilih pendekatan ini.
PrairieHippo
9

Saya baru saja menemukan ini dan harus menulis kode untuk menangani ini.

Ini secara efektif mengkloning theme_image_style()untuk membuat turunan gambar selama pelaksanaan permintaan halaman. Generasi mengabaikan masalah keamanan yang biasanya memicu 404, tetapi itu juga berarti halaman yang lebih lambat saat pertama kali halaman dikunjungi.

Saya hanya menggunakan skema file publik, tapi saya berharap ini gagal dengan gaya skema file pribadi.

    /**
     * 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);
    }
Sebuah daratan.
sumber
2

theme_image_style() menerima URI menggunakan pembungkus aliran PHP dan bukan jalur nyata.

input://adalah pembungkus aliran PHP, sedangkan public://, private://dan temporary://pembungkus aliran Drupal untuk mewakili sites/default/filesfolder pribadi dan sementara.

Jika Anda pasti perlu menggunakan gaya gambar dengan gambar yang ditemukan di sebuah modul, Anda mungkin ingin memeriksa system_stream_wrapper modul yang menambahkan module://, theme://, profile://dan library://pembungkus aliran.

Perhatikan: Ini mungkin tidak relevan dengan pertanyaan saat ini tetapi karena itu disebutkan dalam posting lain, saya juga ingin merujuk ke modul remote_stream_wrapper yang menambahkan dukungan untuk URL apa pun menggunakan http: //, https: //, atau feed: / / . Seperti yang disebutkan, pembungkus aliran ini hanya untuk dibaca dan tidak dapat melakukan operasi penulisan apa pun, tetapi saya percaya ini dapat digunakan dengan image_style_url()dan fungsi terkait seperti theme_image_style().

vensires
sumber