web-dev-qa-db-fra.com

Comment afficher l'image utilisateur par défaut par programme?

Je souhaite imprimer l'image d'un utilisateur dans le fichier de modèle d'une vue. Si l'utilisateur n'a pas encore défini d'image, l'image utilisateur par défaut (définie sur public://pictures/default.jpg à Configuration > People > Account settings) doit être rendu.

J'ai utilisé le code suivant:

<?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>

Cela fonctionne parfaitement, mais je n'aime pas vraiment l'approche isset, car cela me fait penser qu'il était redondant de spécifier le chemin d'image par défaut dans les configurations. Existe-t-il une autre méthode qui utilise automatiquement le chemin par défaut?

5
Jeroen

C'est un peu une route étranglée - Drupal lui-même utilise des conditions dans template_preprocess_user_picture() pour prendre cette décision:

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', '');
}

Si cela convient à votre cas d'utilisation, vous pouvez simplement définir la variable user_picture_style Sur le nom de votre style et utiliser theme_user_picture() :

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

La mise en garde est que user_picture_style Est une variable globale, donc si vous voulez utiliser quelque chose de différent pour le style utilisé ailleurs dans le site, vous êtes obligé de reproduire la même logique que la fonction de prétraitement ci-dessus.

3
Clive

De la réponse de Clive, j'ai obtenu la solution pour rendre l'image de l'auteur du nœud en utilisant les codes ci-dessous:

Tout d'abord, nous devons obtenir le UID

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

Ensuite, en utilisant l'uid, nous pouvons rendre l'image de l'utilisateur comme ceci

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

Pour obtenir d'autres champs d'un compte utilisateur, nous devons utiliser field_get_items

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

puis restituez les champs à l'aide de print render($field[0]['value']);

1
Hashmat