[spip-dev] Logo Auteur après login public

Salut,
en regardant casse-noisette, j'ai trouvé un "truc qui devrait marche" :
<?php <BOUCLE_LOGO_AUTEUR(AUTEURS)>[if
($auteur_session[id_auteur]=='[(#ID_AUTEUR)]') echo '<img class="vignette"
src="IMG/[(#LOGO_AUTEUR|fichier)]" width="50" height="40" alt=""
/>';</BOUCLE_LOGO_AUTEUR>] ?>

Bon, ok, appeler tous les logos de tous les auteurs, c'est pas top, surtout
si c'est une grosse base,
MAIS en le placant dans un squelette avec un delai assez long ET en faisant
un INCLURE sans parametres, ca le fait.

LE PROBLEME : ca marche pô !
il y a un '[' qui l'embete et y veut pas compiler.
alors que
<?php <BOUCLE_LOGO_AUTEUR(AUTEURS)>if
($auteur_session[id_auteur]=='[(#ID_AUTEUR)]') echo '<img class="vignette"
src="IMG/[(#LOGO_AUTEUR|fichier)]" width="50" height="40" alt=""
/>';</BOUCLE_LOGO_AUTEUR> ?>

ca marche mais bon, le code generé reste horrible (comparer l'id à chaque id
de la base on peut pas parler d'optimisation ...)
J'ai donc sans doute raté un épisode.
c'est assez génant en fait de ne pas pouvoir utiliser de variables locales,
surtout qu'avant, on pouvait ...
Au niveau d'une boucle directement, je comprend que ca pause probleme, mais
ne peut-on pas passer une variable locale à un INCLURE ?
Et à ce moment la, avoir le moyen de l'utiliser dans les boucles de la meme
facon que ce qui est passé en POST et en GET ?
Je me prend la tete pour rien et y a un autre moyen de faire ?
qui m'explique ?

PS : ma CVS est préhistorique : au moins deux jours !
c'est peut etre deja résolu ...
PS2 : il faudra ajouter une clause "auteurs ayant un logo"
(logo_auteur!=null ?), ca "optimisera" deja un peu
PS3 : comment on fait pour generer un "select disctinct" (ici, ca n'a pas
d'interet mais ca peut servir quand on fait des requetes avec un JOIN...)
PS4 : JMB, pas de commentaires STP, c'est legal de faire une requete avec un
JOIN à la boucle, à droite comme à gauche d'ailleurs !

-----Message d'origine-----

Salut,
en regardant casse-noisette, j'ai trouvé un "truc qui devrait marche" :
<?php <BOUCLE_LOGO_AUTEUR(AUTEURS)>[if
($auteur_session[id_auteur]=='[(#ID_AUTEUR)]') echo '<img class="vignette"
src="IMG/[(#LOGO_AUTEUR|fichier)]" width="50" height="40" alt=""
/>';</BOUCLE_LOGO_AUTEUR>] ?>

Tu as mal regardé: le "]" est avant le "</BOUCLE" heureusement.

LE PROBLEME : ca marche pô !
il y a un '[' qui l'embete et y veut pas compiler.

Spip ne peut pas savoir qu'un "[" concerne php et pas lui,
et effectivement la correction ci-dessus ne suffit pas.
Mais la multivocité du parenthésage des crochets est le prix à payer pour éviter XML :-).

Cela dit, ton élément de tableau est un invariant de boucle,
et j'aurais écrit spontanément la chose suivante qui se compile sans pb:

<?php $x=$auteur_session[id_auteur];
<BOUCLE_LOGO_AUTEUR(AUTEURS)>[
if ($x=='(#ID_AUTEUR)')
echo '<img class="vignette" src="IMG/[(#LOGO_AUTEUR|fichier)]" width="50" height="40" alt=""/>';
]</BOUCLE_LOGO_AUTEUR> ?>

c'est assez génant en fait de ne pas pouvoir utiliser de variables locales,
surtout qu'avant, on pouvait ...

Pardon ?

Au niveau d'une boucle directement, je comprend que ca pause probleme, mais
ne peut-on pas passer une variable locale à un INCLURE ?
Et à ce moment la, avoir le moyen de l'utiliser dans les boucles de la meme
facon que ce qui est passé en POST et en GET ?

Avec la notation %x tu références ce qui est passé dans le contexte de l'INCLURE,
je comprends pas.

Je me prend la tete pour rien et y a un autre moyen de faire ?
qui m'explique ?

Moi :slight_smile:

PS : ma CVS est préhistorique : au moins deux jours !
c'est peut etre deja résolu ...

c'est ton code qui est trop vieux...

PS2 : il faudra ajouter une clause "auteurs ayant un logo"
(logo_auteur!=null ?), ca "optimisera" deja un peu

Avec le paramétrage du compilo dans le déclarations des boucles,
tu peux faire une variante de la boucle AUTEUR qui inclut la table des logos
associée, sur le modèle de la boucle MOTS.
Je réfléchis à donner une interface plus intuitive à ce genre de chose,
mais ce n'est qu'une tâche de fond de mon cerveau.

PS3 : comment on fait pour generer un "select disctinct" (ici, ca n'a pas
d'interet mais ca peut servir quand on fait des requetes avec un JOIN...)

autre tâche de fond

      Emmanuel

Parfait! Ca marche nickel!
En voulant ajouter ceci pour que lorsqu'il n'y a aucun avatar, apparaisse
une image par défaut:
echo '<img src="http://www.iziplanet.com/IMG/noavatar.gif&quot; width="64"
height="64" />';
<//BOUCLE_LOGO_AUTEUR>

Mais ça provoque une erreur de compilation.
Je dois sûrement mal écrire le code.

Jean
"Déesse A." <esj@vertsdesevres.net> a écrit dans le message de
news:0E9F09DE-0D36-11D9-BC7B-000A95DF14B8@vertsdesevres.net...

Salut,
en regardant casse-noisette, j'ai trouvé un "truc qui devrait marche" :
<?php <BOUCLE_LOGO_AUTEUR(AUTEURS)>[if
($auteur_session[id_auteur]=='[(#ID_AUTEUR)]') echo '<img
class="vignette"
src="IMG/[(#LOGO_AUTEUR|fichier)]" width="50" height="40" alt=""
/>';</BOUCLE_LOGO_AUTEUR>] ?>

Tu as mal regardé: le "]" est avant le "</BOUCLE" heureusement.

LE PROBLEME : ca marche pô !
il y a un '[' qui l'embete et y veut pas compiler.

Spip ne peut pas savoir qu'un "[" concerne php et pas lui,
et effectivement la correction ci-dessus ne suffit pas.
Mais la multivocité du parenthésage des crochets est le prix à payer
pour éviter XML :-).

Cela dit, ton élément de tableau est un invariant de boucle,
et j'aurais écrit spontanément la chose suivante qui se compile sans pb:

<?php $x=$auteur_session[id_auteur];
<BOUCLE_LOGO_AUTEUR(AUTEURS)>[
if ($x=='(#ID_AUTEUR)')
echo '<img class="vignette" src="IMG/[(#LOGO_AUTEUR|fichier)]"
width="50" height="40" alt=""/>';
]</BOUCLE_LOGO_AUTEUR> ?>

c'est assez génant en fait de ne pas pouvoir utiliser de variables
locales,
surtout qu'avant, on pouvait ...

Pardon ?

Au niveau d'une boucle directement, je comprend que ca pause probleme,
mais
ne peut-on pas passer une variable locale à un INCLURE ?
Et à ce moment la, avoir le moyen de l'utiliser dans les boucles de la
meme
facon que ce qui est passé en POST et en GET ?

Avec la notation %x tu références ce qui est passé dans le contexte de
l'INCLURE,
je comprends pas.

Je me prend la tete pour rien et y a un autre moyen de faire ?
qui m'explique ?

Moi :slight_smile:

PS : ma CVS est préhistorique : au moins deux jours !
c'est peut etre deja résolu ...

c'est ton code qui est trop vieux...

PS2 : il faudra ajouter une clause "auteurs ayant un logo"
(logo_auteur!=null ?), ca "optimisera" deja un peu

Avec le paramétrage du compilo dans le déclarations des boucles,
tu peux faire une variante de la boucle AUTEUR qui inclut la table des
logos
associée, sur le modèle de la boucle MOTS.
Je réfléchis à donner une interface plus intuitive à ce genre de chose,
mais ce n'est qu'une tâche de fond de mon cerveau.

PS3 : comment on fait pour generer un "select disctinct" (ici, ca n'a
pas
d'interet mais ca peut servir quand on fait des requetes avec un
JOIN...)

autre tâche de fond

Emmanuel

//BOUCLE_ ca n'existe pas.
--> /BOUCLE_...
ou ///B_...

      Emmanuel

Si je fais par exemple:

<?php $x=$auteur_session[id_auteur];
<B_LOGO_AUTEUR>
<BOUCLE_LOGO_AUTEUR(AUTEURS)>[
if ($x=='(#ID_AUTEUR)')
echo '<img class="vignette" src="IMG/[(#LOGO_AUTEUR|fichier)]" alt=""/>';
]</BOUCLE_LOGO_AUTEUR>
</B_LOGO_AUTEUR>
echo 'test';
<//B_LOGO_AUTEUR> ?>

Le mot "test" n'apparait pas à la place du logo s'il n'y en a pas.

Jean
"Déesse A." <esj@vertsdesevres.net> a écrit dans le message de
news:49DDF996-0D4F-11D9-BC7B-000A95DF14B8@vertsdesevres.net...

Tu produis une balise IMG meme si LOGO_AUTEUR est vide

Une fois de plus, interpoler du PHP n'est pas la bonne solution.
Essaye:

<B_LOGO_AUTEUR>
<BOUCLE_LOGO_AUTEUR(AUTEURS)>[
(#LOGO_AUTEUR|fichier||compareauteur{#ID_AUTEUR})
]</BOUCLE_LOGO_AUTEUR>
</B_LOGO_AUTEUR>
test
<//B_LOGO_AUTEUR>

Et définis dans mes_fonction.php3

function compareauteur($l, $x)
{
global $auteur_session;
  return (($x!=$auteur_session[id_auteur] || (!$l)) ? '' :
   '<img class="vignette" src="' . $l . '" alt=""/>';
}

Au passage, voilà pourquoi je n'aime pas les pseudo-filtres (ici "fichier"):
j'ai du passer "LOGO_AUTEUR" comme premier argument parce qu'il fallait que le
pseudo-filtre le traite, alors qu'intuitivement c'est ID_AUTEUR qu'on aurait du passer.

      Emmanuel

Malheureusement, cela me donne cette erreur:
Parse error: parse error, unexpected ';' in /home/.../mes_fonctions.php3 on
line 52

Jean
"Déesse A." <esj@vertsdesevres.net> a écrit dans le message de
news:7F713C3F-0D5A-11D9-BC7B-000A95DF14B8@vertsdesevres.net...

<?php $x=$auteur_session[id_auteur];
<B_LOGO_AUTEUR>
<BOUCLE_LOGO_AUTEUR(AUTEURS)>[
if ($x=='(#ID_AUTEUR)')
echo '<img class="vignette" src="IMG/[(#LOGO_AUTEUR|fichier)]"
alt=""/>';
]</BOUCLE_LOGO_AUTEUR>
</B_LOGO_AUTEUR>
echo 'test';
<//B_LOGO_AUTEUR> ?>

Le mot "test" n'apparait pas à la place du logo s'il n'y en a pas.

  Tu produis une balise IMG meme si LOGO_AUTEUR est vide

Une fois de plus, interpoler du PHP n'est pas la bonne solution.
Essaye:

<B_LOGO_AUTEUR>
<BOUCLE_LOGO_AUTEUR(AUTEURS)>[
(#LOGO_AUTEUR|fichier||compareauteur{#ID_AUTEUR})
]</BOUCLE_LOGO_AUTEUR>
</B_LOGO_AUTEUR>
test
<//B_LOGO_AUTEUR>

Et définis dans mes_fonction.php3

function compareauteur($l, $x)
{
global $auteur_session;
  return (($x!=$auteur_session[id_auteur] || (!$l)) ? '' :
'<img class="vignette" src="' . $l . '" alt=""/>';
}

Au passage, voilà pourquoi je n'aime pas les pseudo-filtres (ici
"fichier"):
j'ai du passer "LOGO_AUTEUR" comme premier argument parce qu'il fallait
que le
pseudo-filtre le traite, alors qu'intuitivement c'est ID_AUTEUR qu'on
aurait du passer.

Emmanuel

Mauvais coupé/collé de toi ou moi, c'est plus du Spip, c'est du PHP. Stop pour moi.

esj

Je précise tout de meme mon idée pour lancer les réflexions.

Dans la syntaxe de Spip <BOUCLEnom(type)...
"type" référérence la plupart du temps une table SQL,
et le compilateur traduit ça en "...FROM type...".

Partant, pourquoi ne pas offrir à partir de Spip toutes les possibilités de SQL avec:
<BOUCLEnom(table1,table2,...)...
qui se traiduirait par "... FROM table1, table2..."
autrement dit par un join.
L'intéret serait évidemment d'écrire des critères inter-tables (genre table1.ID = table2.ID)
qui répondrait au pb ci-dessus (et refléterait ce qui est permis en PostGres ... je suis en plein dedans en ce moment).

Encore plus fort (mais ne me le demandez pas)
<BOUCLEnom(serveur1:table1,serveur2:table2)...
demanderait à Spip de faire le join lui-même entre des tables de 2 serveurs SQL.

Qu'en pensez-vous ?

      Emmanuel

Déesse A. wrote:

<BOUCLEnom(table1,table2,...)...
qui se traiduirait par "... FROM table1, table2..."
autrement dit par un join.
Qu'en pensez-vous ?

on va bientôt pouvoir se passer d'SQL...
JL

Partant, pourquoi ne pas offrir à partir de Spip toutes les
possibilités de SQL avec:
<BOUCLEnom(table1,table2,...)...
qui se traiduirait par "... FROM table1, table2..."
autrement dit par un join.
L'intéret serait évidemment d'écrire des critères inter-tables (genre
table1.ID = table2.ID)

  Mais ce =, il serait généré d'office ou il serait à mettre comme
critère de la boucle ?
  Dans le second cas, à mon avis, on en arrive vraiment à paraphraser
sql; autant faire un truc comme ça :
<BOUCLE(SQL){from ... where ... group by ...}>

Encore plus fort (mais ne me le demandez pas)
<BOUCLEnom(serveur1:table1,serveur2:table2)...

  Heu ... là, ça devient chaud quand même. On va pas réécrire mysql
en php non plus :slight_smile:

À+, Pif.

L'intéret serait évidemment d'écrire des critères inter-tables (genre
table1.ID = table2.ID)

  Mais ce =, il serait généré d'office ou il serait à mettre comme
critère de la boucle ?

C'est le pb: actuellement Spip a une syntaxe unifiée pour les FROM a 1 ou plusieurs arguments,
ce qui lui permet de "générer d'office" l'égalité.
En fait l'idée m'est venue en écrivant un script prenant des déclarations de tables Postgres
pour en faire des tableaux PHP comme ceux de inc_serialbase (pour accéder en lecture à ces tables
avec un squelette SPIP), et je déplorais qu'on doive laisser tomber le "references" de Postgres
(qui est une de ses supériorités sur MySQL). On pourrait dire que l'on génère d'office si
la table2 a dit "references table2": cette déclaration est implicite dans les tables actuelles
de Spip, mais on pourrait l'expliciter dans les tableaux PHP de inc_serialbase (ce qui serait
transparent pour les utilisateurs).

  Dans le second cas, à mon avis, on en arrive vraiment à paraphraser
sql; autant faire un truc comme ça :
<BOUCLE(SQL){from ... where ... group by ...}>

Encore plus fort (mais ne me le demandez pas)
<BOUCLEnom(serveur1:table1,serveur2:table2)...

  Heu ... là, ça devient chaud quand même. On va pas réécrire mysql
en php non plus :slight_smile:

Ca vaudrait mieux que l'inverse :slight_smile:

      Emmanuel

> sql; autant faire un truc comme ça :
> <BOUCLE(SQL){from ... where ... group by ...}>

Tu peux très bien avoir des critères SQL dans une boucle(ARTICLES) !
Il suffit de créer les fonctions critere_from(), critere_where() et
critere_select() qui injectent directement les trucs voulus. un
critere_sql() générique est aussi envisageable indépendamment du nom
de la boucle.

Indépendamment, tu peux imaginer une function boucle_SQL() pour
définir une boucle "vide", mais qui acceptera d'entrée de jeu les
critères basiques.

Ca ferait une joilie contrib, qu'on hésiterait un peu à mettre en
standard (enfin, il faudrait réfléchir, car après plus moyen de
refermer la boite).

-- Fil

Hello,
j'entre dans le debat avec mes vieux arguments de mapping objet/relationnel
...
il me semble qu'on melange 2 choses :
- La recuperation d'une structure de données s'appuyant sur plusieurs tables
- L'ajout de critères sur une table liée
Je m'explique à partir d'un cas d'ecole.
on peut par exemple avoir une structure du genre :
Entreprise 1<->n Personne 1<->n RDV
Si je travaille sur le coté "annuaire" de la stucture, je vais
systematiquement vouloir ramener des paires entreprise/personne.
Il est donc logique d'avoir decrit une entitée "personne" s'alimentant par
une requete du genre :
select * from Personne INNER JOIN Entreprise ON
Entreprise.id_entreprise=Personne.id_entreprise
(ou peut etre un left join, ca depend si on veut ou non autoriser les null
donc gerer des liens 0..1<->n)

Si je cherche juste à remonter les noms et prenoms des personnes ayant un
RDV tel jour à tel heure, il n'est pas necessaire d'aller faire la jointure
sur entreprise, les champs accédés sont tous de la table personne mais il me
faut quand meme faire la jointure pour pouvoir ajouter la clause. Dans ce
cas, je ferai :
select * from Personne, RDV where RDV.id_personne=Personne.id_personne AND
RDV.heuredebut=14
par exemple.

Pourquoi un join d'un coté et plusieurs tables et des clauses dans l'autre
me direz vous.
Parcque ca n'a pas le meme sens et que les automatisations ne peuvent pas
etre les memes.

Les clauses peuvent etre
- soit sur "l'objet" manipulé, qu'il soit complexe (remonté à l'aide d'un
join) ou non. Il suffit donc à ce moment la d'ajouter la clause where
correspondante.
- soit sur une table liée, il faut alors ajouter la ou les tables y menant
(arg, parcours de graphe, on peut peut etre limiter l'automatisation aux
tables directement liées à l'objet) au FROM, la clause where correspondant à
la jointure et la clause where correspondant au critère.

Ca peut paraitre tordu comme approche mais je pense qu'il ne faut pas
confondre 2 fonctionnalités sous pretexte qu'elles font appel aux memes
mecanismes techniques (d'autant que la, je propose justement de gérer les 2
fonctionnalités avec 2 approches techniques differentes).
En plus, je n'ai pas creusé le probleme, mais avec les histoires de prefixe
et tout ca, il faut generer un nommage des tables.

En résumé, je crois qu'il y a du boulot de reflexion sur comment on decrit
un "objet" et comment on decrit les liaisons entre les tables avant de se
jetter dans des fonctionnalités qui risquent fort de coincer rapidement.
Pour ceux qui ont jeté un oeil au lien vers le repository OJB, je precise
qu'il est classique de donner plusieurs definitions à un "meme" objet.
Dans mon exemple, je ferai une "personne_info" ne prenant que les champs
utiles de la table personne et un "personne_complet" prenant tous les champs
de entreprise et tous les champs de personne.
Ce qui implique que BOUCLE(PERSONNE_INFO) ne donnerait accès qu'à #NOM et
#PRENOM alors qu'une BOUCLE(PERSONNE_COMPLET) laisserait l'accès à bien plus
d'infos.

Voila, c'etait les divagations de fin de semaine ...

PS : et je n'ai pas reparlé du distinct qu'il est indispensable de pouvoir
gerer mais qui peut à mon avis rester au niveau du parametrage de l'objet
(quitte à faire 2 mapping identiques, un en select distinct, l'autre non
selon les besoins)