Drupal 7サイトでは、無制限の画像を許可する画像フィールドがあり、field_gallery_images
。このフィールドのテンプレートファイルを作成して、カスタム画像スライダーを作成しました。画像のHTMLマークアップを書き換えて、遅延読み込みコンポーネントを追加したいと思います。したがって、代わりに:
<img src="/sites/default/files/myimage.jpg" width="668" height="500">
が欲しいです:
<img data-lazy="/sites/default/files/myimage.jpg" width="668" height="500" class="lazyload">
現在、画像はtheme_image()で実行されているため、テンプレートに到達するまでにマークアップがすべて設定されています。この1つのフィールドのマークアップを変更したいだけです。 theme_preprocess_image()を試しましたが、すべての画像が変更されました。
Drupal 7.を使用していると思います。
template_preprocess_field()
を実装し、theme_image()
をオーバーライドします。
_/**
* Implements template_preprocess_field().
*/
function mytheme_preprocess_field(&$variables) {
$element = &$variables['element'];
if ($element['#field_name'] === 'field_image') {
foreach (element_children($element) as $key) {
$item = &$element[$key]['#item'];
$src = file_create_url($item['uri']);
unset($item['uri']);
$item['attributes']['data-lazy'] = $src;
$item['attributes']['class'] = array('lazyload');
$element['#items'][$key] = $item;
$variables['items'][$key]['#item'] = $item;
}
}
}
/**
* Overrides theme_image().
*/
function mytheme_image($variables) {
$attributes = $variables['attributes'];
if (!empty($variables['path']) || !isset($attributes['data-lazy')) {
$attributes['src'] = file_create_url($variables['path']);
}
foreach (array('width', 'height', 'alt', 'title') as $key) {
if (isset($variables[$key])) {
$attributes[$key] = $variables[$key];
}
}
return '<img' . drupal_attributes($attributes) . ' />';
}
_
template_preprocess_field() を実装することで、テーマ変数とテーマを変更できますフィールドのfunction。
コード例:
_/**
* Implements template_preprocess_field().
*/
function mytheme_preprocess_field(&$variables) {
$element = &$variables['element'];
if ($element['#field_name'] === 'field_image') {
foreach (element_children($element) as $key) {
$item = &$element[$key]['#item'];
$src = file_create_url($item['uri']);
unset($item['uri']);
$item['attributes']['data-lazy'] = $src;
$item['attributes']['class'] = array('lazyload');
$element['#items'][$key] = $item;
$variables['items'][$key]['#item'] = $item;
}
}
}
_
_field_image
_を、定義したフィールド名に変更することを忘れないでください。
_$variables
_の構造です。
_$variables['items'][0]['#item']
_は、レンダー配列でのテーマ関数の一般的な使用法です。上記のコードはいくつかのことを行いました:
uri
。これは、theme_image()
で属性src
をフォーマットするために使用されますdata-lazy
_に割り当てますlazyload
を追加$variable
_の別の場所に同期します最後の点は少し奇妙ですが、常に同じ項目配列を格納する3つの異なる場所があります。彼らです
$variables['element'][0]['#item']
_$variables['element']['#items'][0]
_$variables['items'][0]['#item']
_理論的には、_$variables['items'][0]['#item']
_がテーマ関数で使用される唯一のものですが、私の考えでは、将来の潜在的な問題を防ぐために、それらを同時に変更することをお勧めします。 (たぶん誰かがここでより多くの提案を提供できますか?)
最後になりましたが、theme_image()
をオーバーライドする必要があります。これは地球規模の変化ですが、あまり影響はありません。
_/**
* Overrides theme_image().
*/
function mytheme_image($variables) {
$attributes = $variables['attributes'];
if (!empty($variables['path']) || !isset($attributes['data-lazy')) {
$attributes['src'] = file_create_url($variables['path']);
}
foreach (array('width', 'height', 'alt', 'title') as $key) {
if (isset($variables[$key])) {
$attributes[$key] = $variables[$key];
}
}
return '<img' . drupal_attributes($attributes) . ' />';
}
_