Submitted by Luneh on
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!
Visiblement tu as un pb ds
Permalien Soumis par tostinni le 20 Mars, 2007 - 22:21
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
Permalien Soumis par Luneh le 21 Mars, 2007 - 10:55
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
Permalien Soumis par tostinni le 21 Mars, 2007 - 23:37
Tu pourrais faire un truc genre
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...
Salut,
Permalien Soumis par Luneh le 22 Mars, 2007 - 18:02
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
Permalien Soumis par tostinni le 22 Mars, 2007 - 18:43
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
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.