web-dev-qa-db-ja.com

プログラムでデフォルトのユーザー画像を表示する方法は?

ユーザーの画像をビューのテンプレートファイルに印刷したいのですが。ユーザーがまだ画像を設定していない場合は、デフォルトのユーザー画像(_public://pictures/default.jpg_で_Configuration > People > Account settings_に設定)がレンダリングされます。

次のコードを使用しました。

_<?php $account = user_load($user->uid); ?>
<?php if (isset($account->picture->uri)) {
          $path = $account->picture->uri; }
      else {$path = "public://pictures/default.jpg"; } ?>
<?php $array = array('style_name' => 'picture',
                     'path' => $path,
                     'alt' => 'Picture'); ?>
<div class="user-image"><?php print theme('image_style', $array); ?></div>
_

これは完全に機能しますが、issetアプローチはあまり好きではありません。構成でデフォルトのイメージパスを指定することは冗長であると思わせるからです。デフォルトのパスを自動的に使用する別の方法はありますか?

5
Jeroen

これは絞め殺されたルートの一部です-Drupal自体が template_preprocess_user_picture() のいくつかの条件を使用してその決定を行います:

_if (!empty($account->picture)) {
  // @TODO: Ideally this function would only be passed file objects, but
  // since there's a lot of legacy code that JOINs the {users} table to
  // {node} or {comments} and passes the results into this function if we
  // a numeric value in the picture field we'll assume it's a file id
  // and load it for them. Once we've got user_load_multiple() and
  // comment_load_multiple() functions the user module will be able to load
  // the picture files in mass during the object's load process.
  if (is_numeric($account->picture)) {
    $account->picture = file_load($account->picture);
  }
  if (!empty($account->picture->uri)) {
    $filepath = $account->picture->uri;
  }
}
elseif (variable_get('user_picture_default', '')) {
  $filepath = variable_get('user_picture_default', '');
}
_

ユースケースに適している場合は、_user_picture_style_変数をスタイル名に設定し、 theme_user_picture() を使用するだけです。

_$build = array(
  '#theme' => 'user_picture',
  '#account' => $user,
);
$picture = drupal_render($build);
_

警告は、_user_picture_style_がグローバル変数であるため、サイトの他の場所で使用されているスタイルとは異なるものを使用したい場合は、上記の前処理関数と同じロジックを再現する必要があります。

3
Clive

クライブの答えから、私は以下のコードを使用してノードの作者の画像をレンダリングするソリューションを得ました:

まず、uidを取得する必要があります

_$node = $variables['node'];
$author = user_load($node->uid);
_

次に、uidを使用して、ユーザーの画像を次のようにレンダリングできます

_<img src="<?php print file_create_url($author->picture->uri); ?>" alt="user picture" />
_

ユーザーアカウントの他のフィールドを取得するには、_field_get_items_を使用する必要があります

_$field = field_get_items('user', $author, 'field_mac_name');
_

次に、print render($field[0]['value']);を使用してフィールドをレンダリングします

1
Hashmat