メディアからレンダリングされたファイルをリンクでラップする


7

これは、Media 7.1.2 / Media 7.2.Xでメディアスタイルを設定する方法に関する質問ですか。

Drupal 7サイトでMedia 1.2を使用して、画像にいくつかのフィールド(キャプション、クレジットなど)を追加しています。

たとえば、特定のビューモードでレンダリングされたファイルとして表示するように設定された画像フィールドがある場合

ここに画像の説明を入力してください

このビューモードの適切なフィールドを表示する方法をディスプレイに設定しました。ファイル表示では、例えば

ここに画像の説明を入力してください

メディア/ fidページへのリンクで画像をラップする方法はありますか?UIからこれを行う方法がわかりません。テーマ開発者から、画像フィールド全体のコンテンツ関数(コンテンツタイプに関するもの)間で呼び出されているテーマ関数と前処理/処理関数に関する有用な情報が提供されていません。関係あり)および画像自体(実際の<img />要素)。

この時点では、フィールドコレクションに切り替えたくありませんが、それが唯一の選択肢である場合は、Media 2.xへの切り替えを楽しんでいます。


1
使用を検討しましたhook_field_attach_view_alter()か?
kiamlaluno

そのフックの使い方にそれほど慣れていませんが、それがどのように機能するかはわかりませんでした。
mpdonadio

その目的は、フィールドのレンダリング方法を変更することであり、field_attach_view()またはfield_view_field()が呼び出されたときに呼び出されます。そのフックを使用すると、画像フィールドのレンダリング方法を変更できるはずです。
kiamlaluno

[ 有効な表示]で[ レンダリングファイル]も選択するとどうなりますか?
kiamlaluno

その表示モードは、元のファイルへのアイコン+リンクです。問題は、私が概説するオプションのテーマ( 'image_style')をだれが呼び出すかをより理解することですが、これを理解することはできません。私の次のオプションは、MYTHEME_image_styleを作成して、コールスタックを確認できるようにすることです。喜び。
mpdonadio

回答:


1

あなたが言及したように、メディアはDrupalのフィールド表示フォーマッターメカニズムを介してフィールドをレンダリングします。カスタムモジュールは動作しますが、これには1つあります:リンクフィールド


1
これはより良いオプションのように見えますが、この特定のサイトでは爆発的に増え続けています。私はこれを私のテストサイトの1つに組み込んで、それがどうなるかを確認する必要があります。
mpdonadio

4

わかりました、これが作業コードです。

Mediaモジュールはhook_file_formatter_info()、画像をレンダリングするためのコールバックを設定するために実装されます。

Drupalの方法と同様にhook_file_formatter_info_alter()、デフォルトの動作を変更する方法があります。そこで、file_entity.moduleからデフォルトのコールバックを取得し、それをカスタムモジュールに複製しました。次に、これをオルターに配線しました。私のカスタムコールバックには、画像のスタイルをチェックし、要素をリンクでラップする追加のロジックがあります。

唯一の本当の癖は、のデフォルトの実装がtheme_link()リーフ要素であると想定しているため、最初にイメージ要素をレンダリングする必要があるということです。

補足として、これは画像にalt / titleテキストを取得する方法でもあり、デフォルトではありません。

function MYMODULE_file_formatter_info_alter(&$info) {
  if (!empty($info['file_image'])) {
    $info['file_image']['view callback'] = 'MYMODULE_file_formatter_file_image_view';
  }
}

function MYMODULE_file_formatter_file_image_view($file, $display, $langcode) {
  // Prevent PHP notices when trying to read empty files.
  // @see http://drupal.org/node/681042
  if (!$file->filesize) {
    return;
  }

  // Do not bother proceeding if this file does not have an image mime type.
  if (strpos($file->filemime, 'image/') !== 0) {
    return;
  }

  if (file_entity_file_is_local($file) && $image = image_load($file->uri)) {
    if (!empty($display['settings']['image_style'])) {
      $element = array(
        '#theme' => 'image_style',
        '#style_name' => $display['settings']['image_style'],
        '#path' => $file->uri,
        '#width' => $image->info['width'],
        '#height' => $image->info['height'],
      );
      if ($display['settings']['image_style'] == 'MYSTYLE') {
        $element = array(
          '#theme' => 'link',
          '#text' => drupal_render($element),
          '#path' => 'media/' . $file->fid,
          '#options' => array(
            'attributes' => array(),
            'html' => TRUE,
          ),
        );
      }
      else {
      }
    }
    else {
      $element = array(
        '#theme' => 'image',
        '#path' => $file->uri,
        '#width' => $image->info['width'],
        '#height' => $image->info['height'],
      );
    }
    return $element;
  }
}

プロジェクトで私が使用する各呼び出しで画像をロードする作業をしているとimage_load大きなパフォーマンスの問題が発生します。のデフォルトの実装を調べるfile_entity_file_formatter_file_image_viewと、$file->image_dimensions配列widthheightキーを使用して画像サイズを取得できることがわかります。
iamweird 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.