Image attachée 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.

Salut à vous!

J'avais eu une demande qui est visible <a href="http://www.drupalfr.org/node/997>ici.

Tout a très bien fonctionné mais... j'ai finalement pris la décision de développer le site en 5.x plutôt qu'en 4.7.x pour diverses raisons, du coup la question revient d'actualité étant donné que la solution donnée ne fonctionne pas sous la version 5.x.

Pour rappel, ma situation est la suivante:

J'aimerais sortir l'image attachée à un node par le biais du module image_attach pour la placer dans un bloc, ceci me permettant de mieux générer l'affichage de ma page.

La solution trouvée la dernière fois est la suivante:

<?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);
}
?>

D'après ce que j'ai pu voir, la requête elle-même pour appeler l'image attachée dans un bloc fonctionne très bien, mais sous Drupal 5.x, la condition if ne fonctionne plus alors qu'elle fonctionnait bien sous 4.7.

Sous les noeuds qui n'ont pas d'image attachée, je reçois donc le message d'erreur suivant:

    * warning: Invalid argument supplied for foreach() in c:\program files\easyphp1-8\www\modules\node\node.module on line 504.
    * warning: implode(): Bad arguments. in c:\program files\easyphp1-8\www\modules\node\node.module on line 508.
    * user warning: Erreur de syntaxe pr?s de '' ? la ligne 1 query: node_load SELECT n.nid, n.vid, n.type, n.status, n.created, n.changed, n.comment, n.promote, 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 c:\program files\easyphp1-8\www\includes\database.mysql.inc on line 172.

Sur les noeuds avec une image attachée, ça fonctionne très bien par contre puisque le système trouve une image.

Une bonne âme pour m'expliquer comment régler ça?

Merci!

Version de Drupal : 

Visiblement tu as un pb ds ta requete puisque le WHERE se termine abruptement...

Verifie le parametre arg(1) avec lequel tu appelles node_load

Ceci dit le pb a mon avis est que si tu mets ca ds un block, bin t'as pas forcement l'id du node, nan ?
Sinon si t'as pas d'image attache, faudrait teste voir ce qu'il y a ds $node->iid

Bon, vu mes grandes compétences en PHP, j'avoue que la moitié de ce que tu dis est du petit chinois pour moi, désolée, c'est de ma faute. :P

Pour ce qui est du problème avec arg(1), je n'en ai visiblement pas puisque l'image apparaît parfaitement bien dans le bloc si je vais sur un noeud qui a une image attachée. Le problème, comme je le dis plus haut, est donc clairement dans la condition "if" qui cloche.

Cette condition "if" a bien fonctionné avec la version 4.7.x, donc il y a quelque chose dans la 5.x qui a changé et je ne sais pas quoi.

Je viens de remarquer que le lien dans mon premier post n'était pas passé. Ma première demande était donc visible ici:

http://www.drupalfr.org/node/997

On peut y voir que le message d'erreur que je recevait était à mon avis identique à celui que je reçois maintenant. Le système cherche bel et bien l'image mais ne la trouve tout simplement pas sur les noeuds qui n'en ont pas. J'ai donc l'impression qu'avec la version 5.x de Drupal, c'est seulement la condition "if" qui ne fonctionne pas.

Tu pourrais faire un truc genre

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

pour savoir ce que tu as ds $node->iid, car a priori en regardant le code de node_load, il fait une erreur sur ce que tu lui as passe ($node->iid) car il attend soit un numero soit un tableau...

<?php
function node_load($param = array(), $revision = NULL, $reset = NULL) {
 
//...
 
if (is_numeric($param)) {
   
//...
 
}
  else {
   
// Turn the conditions into a query.
    //...
 
}
?>

Salut,

Alors, j'ai testé ce que tu as suggéré. Sur les noeuds sans image attachée ça donne toujours

    * warning: Invalid argument supplied for foreach() in c:\program files\easyphp1-8\www\modules\node\node.module on line 504.
    * warning: implode(): Bad arguments. in c:\program files\easyphp1-8\www\modules\node\node.module on line 508.
    * user warning: Erreur de syntaxe pr?s de '' ? la ligne 1 query: node_load SELECT n.nid, n.vid, n.type, n.status, n.created, n.changed, n.comment, n.promote, 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 c:\program files\easyphp1-8\www\includes\database.mysql.inc on line 172.

Et dire que mon PC n'aime pas ça (je suis en local) serait peu dire.

Sur les noeuds avec image, je vois toujours l'image dans le bloc mais cette fois avec un "1" devant, ce qui correspond au nid de mon image dans la table "node" et aussi bien sûr à l'iid de mon image dans la table "image_attach".

[plus tard]

Bon, en fait, en y repensant, j'ai fait une modification qui m'a facilement enlevé l'erreur. Puisque arg(1) appelle une valeur numérique qui n'existe pas sur toutes les pages qui ne sont pas un node/quelquechose, j'ai commencé par ne faire apparaître le bloc que sur les pages node/quelquechose. Un bon début qui régle un problème très bête et auquel j'aurais dû penser avant.

Mais du coup, je constate que le problème véritable est tout autre. La requête se fait sur les liens qui n'ont pas d'image attachée ce qui balance une requête dans le vide qui ralentit considérablement le chargement des pages qui n'ont pas d'image attachée. Il faudrait donc déplacer la condition à l'apparition du bloc et ne faire s'exécuter la requête d'affichage de l'image que si l'existence d'une image est déjà prouvée (je sais pas si c'est clair mais je me comprends :P ). Bref...

Je vais essayer de trouver comment faire ça.

En effet le print_r etait pour voir l'id de l'image.
Concernant l'affichage des blocs en effet c mieux si tu ne l'affiche que sur un node (et plus logique ;) )

Il faudrait donc déplacer la condition à l'apparition du bloc et ne faire s'exécuter la requête d'affichage de l'image que si l'existence d'une image est déjà prouvée (je sais pas si c'est clair mais je me comprends :P ). Bref...
La j'ai un doute, en effet ce qui te ralentit c le node_load.

Ceci dit je me demande si c bien necessaire de le faire vu que t sur la page et qu'a priori le node est deja charge...

Faudrait voir si un truc tout bete genre

<?php
 
global $node;
 
print_r($node);
?>

Te ramene qqch, mais j'ai qd meme un mega doute, faudrait checker ds le code de la generation des node voir s'il stock qque part toute la variable du node (ptet aussi en jetant un oeil ds le theming), bon par contre la j'ai pas de site de dev donc je peux pas checker.