Comment afficher une image liée (avec image_attach) à un noeud dans un bloc?

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Utilisant le module image_attach, j'aurais aimé pouvoir personnaliser un peu plus l'aspect de ma page et sortir l'image de la zone de contenu pour la placer dans un bloc situé dans une autre région de mon template.

Sur le site Drupal en anglais, j'avais trouvé quelqu'un qui donnait une piste. En insérant les lignes suivantes dans contemplate il était possible de faire afficher l'image:

<?php
  $node
= node_load($nid);
  print
theme('image_attach_body', $node);
?>

J'aimerais le même type de chose mais pour la création d'un bloc et pour cela quelque chose cloche visiblement. Quelqu'un serait-il en mesure de m'aiguiller un peu? Je ne connais rien à PHP... mais j'apprends vite.

Merci beaucoup d'avance.

Version de Drupal : 

Hello,

Pourquoi ne pas utiliser le code que tu as cité, mais dans un bloc ? Le truc, c'est que la variable $nid (l'id du node) ne sera pas disponible dans le bloc, il faudrait donc la récupérer dans l'url grâce à la fonction arg(), ce qui donne :

<?php
  $node
= node_load(arg(1));
  print
theme('image_attach_body', $node);
?>

Ce code suppose que le bloc est utilisé sur les pages de type www.monsite.com/node/18 (c. à d. les pages qui affichent un node).

Est-ce que ça te paraît clair ?

Ah ben tu vois, je n'y connais tellement rien en php que je n'aurais pas su dire. Ta suggestion va tout à fait dans le sens de ce dont j'ai besoin.

Bon, j'ai donc suivi ton conseil qui m'a donné au final un dédoublement de contenu dans sa totalité, image + texte. Imaginant que c'était normal vu qu'il s'agissait d'appeler theme('image_attach_body', $node), j'ai testé avec autre chose qui était suggéré mais en intégrant arg(1) comme tu l'as suggéré.

Je parviens à avoir presque ce que je souhaite avec le code suivant:

<?php
    $node
= node_load(arg(1));
   
$image = node_load($node->iid);
    print
l(image_display($image, 'thumbnail'), "node/$node->nid", array(), NULL, NULL, FALSE, TRUE);
 
?>

Presque, parce que sur les nodes qui n'ont pas d'image attachée, je récupère ce message d'erreur:

    * warning: implode(): Bad arguments. in /home/hyboria/www/modules/node.module on line 378.
    * user warning: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 query: SELECT n.nid, n.vid, n.type, n.status, n.created, n.changed, n.comment, n.promote, n.moderate, n.sticky, r.timestamp AS revision_timestamp, r.title, r.body, r.teaser, r.log, r.format, u.uid, u.name, u.picture, u.data FROM node n INNER JOIN users u ON u.uid = n.uid INNER JOIN node_revisions r ON r.vid = n.vid WHERE in /home/hyboria/www/includes/database.mysql.inc on line 121.

Il faut donc un "if" mais je n'ai pas trouvé quelque chose de satisfaisant.

Là encore, dans le code d'origine, la suggestion c'est:

<?php
 
if ($iid) {
   
$node = node_load($nid);
   
$image = node_load($node->iid);
    print
l(image_display($image, 'thumbnail'), "node/$node->nid", array(), NULL, NULL, FALSE, TRUE);
  }
 
?>

Mais rien ne s'affiche si j'intègre le "if" au code qui fonctionne avec arg(1). Si je comprends bien le raisonnement de ce que tu m'as expliqué dans ton premier post, mon problème ici c'est que la variable $iid n'est pas non plus disponible dans le bloc... Je dois intégrer quoi cette fois?

Un grand merci de m'aider. A défaut de savoir utiliser php je suis tenace... mais quand même :P

Caroline

Je dirais qu'il faut déplacer le test plus bas, à l'endroit où $node->iid est disponible :

<?php
$node
= node_load(arg(1));
if (
$node->iid) {
 
$image = node_load($node->iid);
  print
l(image_display($image, 'thumbnail'), "node/$node->nid", array(), NULL, NULL, FALSE, TRUE);
}
?>

[Edit]

Ca fonctionne!!!

Mille mercis!

Bon, maintenant prions pour que je ne revienne pas dans quelques temps pleurnicher parce qu'en fait ça n'est pas tout à fait ça. :P