web-dev-qa-db-ja.com

Gravatarがインストールされている場合のユーザー画像URLの取得

ユーザーのプロファイルへのリンクなしでユーザーの写真を印刷しようとしています。これはtheme('user_picture', array('account' =>$user_item))がレンダリングするものです。 image_style_url('thumbnail', $user->picture->uri)を使用すると、Gravatarフックが呼び出されません。

これまでのところ、私がこれを行う唯一の方法は次のとおりです。

if (function_exists('_gravatar_get_account_user_picture')) {
    $picture = _gravatar_get_account_user_picture($user);
} else {
    $picture = $user->picture->uri;
}
if (file_valid_uri($picture)) {
    $picture = image_style_url('thumbnail', $picture);
}

しかし、特にモジュールを開発していて、Gravatarモジュールを明示的に呼び出す必要がないため、これはあまりエレガントではありません。

助言がありますか?

ありがとう!

2
Godwin

theme('user_picture')を呼び出すとユーザー画像がリンクとして返されるのは、gravatar_preprocess_user_picture()関数にハードコード化されているためです(_gravatar.module_ファイルの148行と156行を参照)。

この関数は_gravatar_get_account_user_picture()自体を使用するため、オプションは次のとおりです。

  • 現在行っているように、その関数を直接使用します
  • gravatar_preprocess_user_picture()関数をハックして、リンクなしで_<img>_タグを返す
  • _<img>_タグを抽出するために、独自の前処理関数でレンダリングされたHTMLにある種の恐ろしい正規表現を実行します

個人的には、最初のオプションが最も望ましいと思います。

それを行うためのもう少し「Drupal」な方法は、関数自体の存在をチェックする代わりに、 module_exists() を使用することです。 TRUEを返します:

モジュールがインストールされて有効になっている場合

これは理想的ではありませんが、少しエレガントです。コードの長さが心配な場合は、少し短くすることができます。

_$uri = module_exists('gravatar') ? _gravatar_get_account_user_picture($user) : $user->picture->uri

if (file_valid_uri($uri)) {
  $options = array('style_name' => 'thumbnail', 'uri' => $uri, 'alt' => 'Alt');
  $img_html = theme('image_style', $options);
}
_

上記のコードは、_<img>_タグのHTMLを theme_image_style() を使用して直接生成しますが、URIを直接取得する必要はありません。

3
Clive

明らかに、Gravatarモジュールで直接処理するのが最善ですが、別のオプション(少しハックではあります)は、単純に

$img = strip_tags(theme("user_picture", array('account' => $user_item)), "<img>");
4
mpdonadio