モジュールディレクトリにある画像のテーマ画像スタイル


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()を使用しても、存在しないファイルへのパスができてしまいます。画像をファイルディレクトリに移動して$ file_uriを 'public://logo.jpg'に変更すると、問題なく動作します。

モジュールコードの一部として画像をファイルディレクトリにコピーする必要がありますか?もしそうなら、これはばかげていませんか?

私は何が欠けていますか?このようなことをする方法のドキュメントはありますか?私は1時間以上Drupalのドキュメントをマイニングし、完全に乾燥しました。


public://sites/all/modules/my_module/logo.jpgは効果的にsites / default / files / sites / all / modules / my_module / logo.jpgに変換されます-これが上記が機能しない理由です。私の質問は、theme_image_styleで実行するためだけにファイルをコピーしないようにするにはどうすればよいですか。
PrairieHippo 2013

回答:


4

残念ながらそれは仕様によるものです。theme_image_style()許容パラメータのドキュメントの説明から:

path:Drupalファイルのディレクトリに対する画像ファイルの相対パスこの関数は、filesディレクトリ外の画像やリモートでホストされている画像では機能しません。これは、「images / image.jpg」などの形式にするか、「public://images/image.jpg」などのストリームラッパーを使用する必要があります。

強調鉱山。

画像スタイルシステムは、パブリックファイルディレクトリのコンテキストでのみ機能するようです(おそらくプライベートでも、私にはわかりません)。

私は最近同様の状況に遭遇し、自分でコーディングしなければならなくなりました(ただし、コアイメージモジュールから多くを借用しました)。


おかげで、本当にこのように機能しないことを願っていますが、開発者がこのアプローチを選択した理由を推測できると思います。
PrairieHippo 2013

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://表現するためのDrupalのストリームラッパーあり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.