Boucle documents aléatoire

Bonjour à tous !
Un problème qui me semble pas évident :
Comment pourrais-je faire pour sélectionner aléatoirement un document dans un secteur ?
A savoir que ce secteur ne contient pas d’articles, seulement des rubriques avec des documents liés (photothèque)

L’idée étant de générer un bouton sur la page d’accueil qui change régulièrement, automatiquement et aléatoirement.

Des pistes que j’ai suivi :
Le #FICHIER n’est la que pour le test ^^

<BOUCLE_photos(RUBRIQUES){id_secteur=13}{tout}{par hasard}{0,1}>
<BOUCLE_doc(DOCUMENTS){id_rubrique}{par hasard}{0,1}>#FICHIER</BOUCLE_doc><BOUCLE_recurs(BOUCLE_photos)></BOUCLE_recurs><//B_doc>
</BOUCLE_photos>

=> Me retourne une belle erreur apache !

Sinon (mais j’étais quand même très sceptique…) :

<BOUCLE_doc2(DOCUMENTS){par hasard}{id_secteur=13}{0,1}{tout}>#FICHIER</BOUCLE_doc2>

Merci de m’avoir lu !!!

Bonne journée !

Quentin a écrit :

Bonjour à tous !
Un problème qui me semble pas évident :
Comment pourrais-je faire pour sélectionner aléatoirement un document dans un secteur ?
A savoir que ce secteur ne contient pas d'articles, seulement des rubriques avec des documents liés (photothèque)

L'idée étant de générer un bouton sur la page d'accueil qui change régulièrement, automatiquement et aléatoirement.

Des pistes que j'ai suivi :
Le #FICHIER n'est la que pour le test ^^

<BOUCLE_photos(RUBRIQUES){id_secteur=13}{tout}{par hasard}{0,1}>
        <BOUCLE_doc(DOCUMENTS){id_rubrique}{par hasard}{0,1}>#FICHIER</BOUCLE_doc><BOUCLE_recurs(BOUCLE_photos)></BOUCLE_recurs><//B_doc>
</BOUCLE_photos>

=> Me retourne une belle erreur apache !

normal, la récursion ne s'arrete jamais.
ajoute au moins un {doublons} à ta BOUCLE_photos (si c'est bien un document au hazard pour chaque rubrique de ton secteur 13 que tu veux...)

@++

En fait il me faut un document aléatoire unique (à chaque calcul de la noisette) de tout le secteur 13 !
Et la je ne vois pas comment faire...
Je ne sais même pas si y a une solution autre que de parcourir la liste de tous les documents présents et d'en sélectionner un seul...

Le 18/09/2009 13:25, Stephane a écrit :

Quentin a écrit :

Bonjour à tous !
Un problème qui me semble pas évident :
Comment pourrais-je faire pour sélectionner aléatoirement un document dans un secteur ?
A savoir que ce secteur ne contient pas d'articles, seulement des rubriques avec des documents liés (photothèque)

L'idée étant de générer un bouton sur la page d'accueil qui change régulièrement, automatiquement et aléatoirement.

Des pistes que j'ai suivi :
Le #FICHIER n'est la que pour le test ^^

<BOUCLE_photos(RUBRIQUES){id_secteur=13}{tout}{par hasard}{0,1}>
<BOUCLE_doc(DOCUMENTS){id_rubrique}{par hasard}{0,1}>#FICHIER</BOUCLE_doc><BOUCLE_recurs(BOUCLE_photos)></BOUCLE_recurs><//B_doc>

</BOUCLE_photos>

=> Me retourne une belle erreur apache !

normal, la récursion ne s'arrete jamais.
ajoute au moins un {doublons} à ta BOUCLE_photos (si c'est bien un document au hazard pour chaque rubrique de ton secteur 13 que tu veux...)

@++

Quentin a écrit :

En fait il me faut un document aléatoire unique (à chaque calcul de la noisette) de tout le secteur 13 !
Et la je ne vois pas comment faire...
Je ne sais même pas si y a une solution autre que de parcourir la liste de tous les documents présents et d'en sélectionner un seul...

et il y a systematiquement des documents attachés aux rubriques ou non ?
déjà, en ajoutant {doublons} à la boucle _photos, ca evitera qu'il repasse plusieurs fois sur une ne contenant pas de document (attention, on parle bien ici de documents attachés aux rubriques, pas aux articles de la rubrique).

C'est exactement ça !
En fait j'avais zappé le critère doublons...
Faut que je vois si avec le contenu cela fonctionne sans soucis.

Merci en tout cas :slight_smile:
Bon weekend !

Le 18/09/2009 15:59, Stephane a écrit :

Quentin a écrit :

En fait il me faut un document aléatoire unique (à chaque calcul de la noisette) de tout le secteur 13 !
Et la je ne vois pas comment faire...
Je ne sais même pas si y a une solution autre que de parcourir la liste de tous les documents présents et d'en sélectionner un seul...

et il y a systematiquement des documents attachés aux rubriques ou non ?
déjà, en ajoutant {doublons} à la boucle _photos, ca evitera qu'il repasse plusieurs fois sur une ne contenant pas de document (attention, on parle bien ici de documents attachés aux rubriques, pas aux articles de la rubrique).
_______________________________________________
liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Discuter chez rezo.net

Documentation de SPIP : http://www.spip.net/

Irc : de l'aide à toute heure : http://spip.net/irc

Quentin a écrit :

C'est exactement ça !
En fait j'avais zappé le critère doublons...
Faut que je vois si avec le contenu cela fonctionne sans soucis.

selon le nombre de rubriques dans ton secteur 13, tu as peut etre interet à faire plutot :
<BOUCLE_D(DOCUMENTS spip_documents_rubriques spip_rubriques){id_secteur=13}{0,1}{par hasard}>

(enfin ca, c'est en spip 1.9.2, en 2.0, (DOCUMENTS RUBRIQUES) passe peut etre)

A tester aussi :
<BOUCLE_R(RUBRIQUES){id_secteur=13}{id_document!=0}{0,1}{par hasard}>
<BOUCLE_D(DOCUMENTS){id_rubrique}{0,1}{par hasard}>

@++

Je te suggererais une solution du genre
#SET{doc,#ARRAY}
[(#SET{doc,[(#GET{doc}|push{0})]})]

Une première série de boucles pour recencer les documents
<BOUCLE_R(RUBRIQUES){id_secteur=13}>
<BOUCLE_D(DOCUMENTS){id_rubrique}{>
[(#SET{doc,[(#GET{doc}|push{#ID_DOCUMENT})]})]
</BOUCLE_D>
</BOUCLE_R>

ensuite une boucle pour en afficher 1 par hasard
<BOUCLE_un_doc(DOCUMENTS) {par hasard}{id_document IN #GET**{doc}}{0,1}>
#LES BALISES que tu souhaites
</BOUCLE_un_doc>

Pas testé mais la direction est là

manu a écrit :

Je te suggererais une solution du genre
#SET{doc,#ARRAY}
[(#SET{doc,[(#GET{doc}|push{0})]})]

Une première série de boucles pour recencer les documents
<BOUCLE_R(RUBRIQUES){id_secteur=13}>
<BOUCLE_D(DOCUMENTS){id_rubrique}{>
[(#SET{doc,[(#GET{doc}|push{#ID_DOCUMENT})]})]
</BOUCLE_D>
</BOUCLE_R>

ensuite une boucle pour en afficher 1 par hasard
<BOUCLE_un_doc(DOCUMENTS) {par hasard}{id_document IN #GET**{doc}}{0,1}>
#LES BALISES que tu souhaites
</BOUCLE_un_doc>

Pas testé mais la direction est là

ah oui, en 2 boucles dans cet esprit, il doit y avoir (pas testé non plus) :
#SET{rubs,#ARRAY}
<BOUCLE_R(RUBRIQUES){id_secteur=13}>
  [(#GET*{rubs}|array_push{#ID_RUBRIQUE)|?)]
</BOUCLE_R>
<BOUCLE_D(DOCUMENTS) {par hasard}{id_rubrique IN #GET*{rubs}}{0,1}>

qui dit mieux ?

Stephane a écrit :

qui dit mieux ?

une boucle ?

<BOUCLE_d(spip_documents_liens rubriques)
           {objet = rubrique}
           {rubriques.id_secteur = 13}
           {par hasard}
           {0, 1}>
   #LOGO_DOCUMENT
</BOUCLE_d>

Bonjour à tous, merci pour vos réponses !
Pour les #ARRAY, ce que je voulais justement c'était éviter de recenser tous les docs et d'en choisir un ensuite !
Je voulais voir s'il était possible de ne pas tout parcourir !

Concernant cette solution :
Le 19/09/2009 11:48, denisb a écrit :

<BOUCLE_d(spip_documents_liens rubriques)
          {objet = rubrique}
          {rubriques.id_secteur = 13}
          {par hasard}
          {0, 1}>
  #LOGO_DOCUMENT
</BOUCLE_d>

Elle me conviendrait parfaitement mais je ne sais pas la faire marcher...
Car en l'état, la requête ne me retourne que l'alea, et non tout les autres champs. En prenant la requête dans phpMyAdmin et en rajoutant dans le select un *, cela fonctionne parfaitement.
Comment le traduire en SPIP maintenant ?

Voila requête obtenue :
SELECT rand() AS alea
FROM spip_documents_liens AS `documents_liens`
INNER JOIN spip_rubriques AS L1 ON ( L1.id_rubrique = documents_liens.id_objet AND documents_liens.objet='rubrique')
WHERE (documents_liens.objet = 'rubrique')
     AND (L1.id_secteur = 13)
GROUP BY documents_liens.id_document,documents_liens.id_objet,documents_liens.objet
ORDER BY alea
LIMIT 0,1

Celle qui fonctionnerait :
SELECT *, rand() AS alea
FROM spip_documents_liens AS `documents_liens`
INNER JOIN spip_rubriques AS L1 ON ( L1.id_rubrique = documents_liens.id_objet AND documents_liens.objet='rubrique')
WHERE (documents_liens.objet = 'rubrique')
     AND (L1.id_secteur = 13)
GROUP BY documents_liens.id_document,documents_liens.id_objet,documents_liens.objet
ORDER BY alea
LIMIT 0,1

En tout cas merci encore pour vos réponses !!

denisb a écrit :

Stephane a écrit :

qui dit mieux ?

une boucle ?

<BOUCLE_d(spip_documents_liens rubriques)
          {objet = rubrique}
          {rubriques.id_secteur = 13}
          {par hasard}
          {0, 1}>
  #LOGO_DOCUMENT
</BOUCLE_d>

Une petite explication de texte serait la bienvenue pour bien comprendre la rédaction "séduisante" que tu proposes. Peux tu nous dire comment il faut comprendre la déclaration/liaison des tables et objet=rubrique ?
Merci d'avance !

manu a écrit :

Une petite explication de texte serait la bienvenue pour bien comprendre la rédaction "séduisante" que tu proposes.

la table spip_documents_liens est une table qui recense les liens (jointures) entre un document et un objet (article, rubrique, mot, site...)

des entrées type de cette table pourraient ressembler à :

+-------------+----------+----------+-----+
! id_document ! id_objet ! objet ! vu !
+-------------+----------+----------+-----+
! 14 ! 36 ! article ! non !
! 363 ! 66 ! rubrique ! non !
! ... ! ... ! ... ! ... !

nous allons donc chercher dans cette table
les documents rattachés à une rubrique {objet = rubrique}

mais nous voulons aussi que cette rubrique soit descendante
de la rubrique secteur d'id 13

nous devons donc établir dans notre requête une jointure entre
la table spip_documents_liens et spip_rubriques

cette jointure sera faite sur d'un côté
l'id_objet de spip_documents_liens, de l'autre
l'id_rubrique de spip_rubriques

pour cela nous indiquons à spip que nous voulons cette jointure
spécifique en donnant les 2 tables à la boucle
<BOUCLE_d(spip_documents_liens rubriques)

enfin, pour spécifier notre restriction concernant le secteur 13,
nous précisons le critère {rubriques.id_secteur = 13}
en spécifiant explicitement le nom complet du champ (nom de la table
inclu) pour que la requête n'aille pas chercher un champ
spip_documents_liens.id_secteur qui n'existe pas.

à partir de cette boucle, donc, nous avons alors accès à tous
les champs de spip_documents_liens *et* tous ceux de spip_rubriques :

#ID_DOCUMENT
#ID_OBJET
#OBJET
#VU

#ID_RUBRIQUE
#ID_PARENT
#TITRE
#DESCRIPTIF
#TEXTE
#ID_SECTEUR
...

la requête sql produite par notre boucle :

   SELECT rand() AS alea,
          spip_documents_liens.id_document
     FROM spip_documents_liens AS `spip_documents_liens`
          INNER JOIN spip_rubriques AS L1
                  ON L1.id_rubrique = spip_documents_liens.id_objet
                 AND spip_documents_liens.objet = 'rubrique'
    WHERE spip_documents_liens.objet = 'rubrique'
      AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
          spip_documents_liens.id_objet,
          spip_documents_liens.objet
ORDER BY alea
    LIMIT 0,1

enfin, la balise #LOGO_DOCUMENT nous retournera le source html :
   <img src='local/cache-vignettes/L135xH150/Image_10-d84e2.png'
    width='135' height='150' style='height:150px;width:135px;' alt=''
    class='spip_logos' />

......

et si nous voulions le *nom du fichier* document, que nous ne pouvons avoir directement avec cette requête car le champ spip_documents.fichier
n'est pas relevé (pas de jointure avec la table spip_documents), alors il faut déclarer une jointure supplémentaire sur la table
spip_documents :

<BOUCLE_d(spip_documents_liens documents rubriques)
           {objet = rubrique}
           {rubriques.id_secteur = 13}
           {par hasard}
           {0, 1}>
#LOGO_DOCUMENT / #FICHIER
</BOUCLE_d>

requête produite :

   SELECT rand() AS alea,
          spip_documents_liens.id_document,
          L2.fichier
     FROM spip_documents_liens AS `spip_documents_liens`
          INNER JOIN spip_documents AS L2
                  ON L2.id_document = spip_documents_liens.id_document
          INNER JOIN spip_rubriques AS L1
                  ON L1.id_rubrique = spip_documents_liens.id_objet
                 AND spip_documents_liens.objet='rubrique'
    WHERE spip_documents_liens.objet = 'rubrique'
      AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
          spip_documents_liens.id_objet,
          spip_documents_liens.objet
ORDER BY alea
    LIMIT 0,1

attention :
   ici, nous avons presque accès à tous les champs des 3 tables
   je dis "presque" car attention aux champs homonymes :
   les #TITRE, #DESCRIPTIF, #MAJ, #STATUT et #DATE affichés,
   qui sont des champs homonymes dans spip_documents *et* spip_rubriques,
   seront ceux de spip_documents ('table première' de la requête) !

(désolé pour la longueur de la prose)

denisb a écrit :

manu a écrit :

Une petite explication de texte serait la bienvenue pour bien comprendre la rédaction "séduisante" que tu proposes.

la table spip_documents_liens est une table qui recense les liens (jointures) entre un document et un objet (article, rubrique, mot, site...)

des entrées type de cette table pourraient ressembler à :

+-------------+----------+----------+-----+
! id_document ! id_objet ! objet ! vu !
+-------------+----------+----------+-----+
! 14 ! 36 ! article ! non !
! 363 ! 66 ! rubrique ! non !
! ... ! ... ! ... ! ... !

nous allons donc chercher dans cette table
les documents rattachés à une rubrique {objet = rubrique}

mais nous voulons aussi que cette rubrique soit descendante
de la rubrique secteur d'id 13

nous devons donc établir dans notre requête une jointure entre
la table spip_documents_liens et spip_rubriques

cette jointure sera faite sur d'un côté
l'id_objet de spip_documents_liens, de l'autre
l'id_rubrique de spip_rubriques

pour cela nous indiquons à spip que nous voulons cette jointure
spécifique en donnant les 2 tables à la boucle
<BOUCLE_d(spip_documents_liens rubriques)

et pas <BOUCLE_d(spip_documents_liens spip_rubriques) ?

enfin, pour spécifier notre restriction concernant le secteur 13,
nous précisons le critère {rubriques.id_secteur = 13}

et pas {spip_rubriques.id_secteur = 13} ?

Merci beaucoup pour les explications super claires et intéressantes !!!!

Mes dernières interrogations :
Comment se fait-il que le select soit conditionné par ce qu'il y a à l'intérieur de la boucle ?
Avec :
<BOUCLE_d(spip_documents_liens rubriques)
           {objet = rubrique}
           {rubriques.id_secteur = 13}
           {par hasard}
           {0, 1}>
#FICHIER
</BOUCLE_d>

J'ai pour résultat :
SELECT rand() AS alea
FROM spip_documents_liens AS `documents_liens`
INNER JOIN spip_rubriques AS L1 ON ( L1.id_rubrique = documents_liens.id_objet AND documents_liens.objet='rubrique')
WHERE (documents_liens.objet = 'rubrique')
     AND (L1.id_secteur = 13)
GROUP BY documents_liens.id_document,documents_liens.id_objet,documents_liens.objet
ORDER BY alea
LIMIT 0,1

Je n'ai pas l'id du document !!!

En revanche même boucle mais #URL_FICHIER : j'ai bien mon id_document (et donc tout ce qui me va bien) !

SELECT rand() AS alea, documents_liens.id_document
FROM spip_documents_liens AS `documents_liens`
INNER JOIN spip_rubriques AS L1 ON ( L1.id_rubrique = documents_liens.id_objet AND documents_liens.objet='rubrique')
WHERE (documents_liens.objet = 'rubrique')
      AND (L1.id_secteur = 13)
GROUP BY documents_liens.id_document,documents_liens.id_objet,documents_liens.objet
ORDER BY alea
LIMIT 0,1

Ce que je ne comprends pas : pourquoi la requête n'est pas la même ???

Le #FICHIER vide avec cette boucle, j'ai bien compris :slight_smile: je referais plus l'erreur.
Si je fais
<BOUCLE_d(spip_documents_liens documents rubriques)
           {objet = rubrique}
           {rubriques.id_secteur = 13}
           {par hasard}
           {0, 1}>
#FICHIER
</BOUCLE_d>

Le #FICHIER fonctionne effectivement normalement (il se trouve que j'en ai pas besoin, le #URL_DOCUMENT me suffit amplement... !)

Le 21/09/2009 11:00, denisb a écrit :

manu a écrit :

Une petite explication de texte serait la bienvenue pour bien comprendre la rédaction "séduisante" que tu proposes.

la table spip_documents_liens est une table qui recense les liens (jointures) entre un document et un objet (article, rubrique, mot, site...)

des entrées type de cette table pourraient ressembler à :

+-------------+----------+----------+-----+
! id_document ! id_objet ! objet ! vu !
+-------------+----------+----------+-----+
! 14 ! 36 ! article ! non !
! 363 ! 66 ! rubrique ! non !
! ... ! ... ! ... ! ... !

nous allons donc chercher dans cette table
les documents rattachés à une rubrique {objet = rubrique}

mais nous voulons aussi que cette rubrique soit descendante
de la rubrique secteur d'id 13

nous devons donc établir dans notre requête une jointure entre
la table spip_documents_liens et spip_rubriques

cette jointure sera faite sur d'un côté
l'id_objet de spip_documents_liens, de l'autre
l'id_rubrique de spip_rubriques

pour cela nous indiquons à spip que nous voulons cette jointure
spécifique en donnant les 2 tables à la boucle
<BOUCLE_d(spip_documents_liens rubriques)

enfin, pour spécifier notre restriction concernant le secteur 13,
nous précisons le critère {rubriques.id_secteur = 13}
en spécifiant explicitement le nom complet du champ (nom de la table
inclu) pour que la requête n'aille pas chercher un champ
spip_documents_liens.id_secteur qui n'existe pas.

à partir de cette boucle, donc, nous avons alors accès à tous
les champs de spip_documents_liens *et* tous ceux de spip_rubriques :

#ID_DOCUMENT
#ID_OBJET
#OBJET
#VU

#ID_RUBRIQUE
#ID_PARENT
#TITRE
#DESCRIPTIF
#TEXTE
#ID_SECTEUR
...

la requête sql produite par notre boucle :

  SELECT rand() AS alea,
         spip_documents_liens.id_document
    FROM spip_documents_liens AS `spip_documents_liens`
         INNER JOIN spip_rubriques AS L1
                 ON L1.id_rubrique = spip_documents_liens.id_objet
                AND spip_documents_liens.objet = 'rubrique'
   WHERE spip_documents_liens.objet = 'rubrique'
     AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
         spip_documents_liens.id_objet,
         spip_documents_liens.objet
ORDER BY alea
   LIMIT 0,1

enfin, la balise #LOGO_DOCUMENT nous retournera le source html :
<img src='local/cache-vignettes/L135xH150/Image_10-d84e2.png'
   width='135' height='150' style='height:150px;width:135px;' alt=''
   class='spip_logos' />

......

et si nous voulions le *nom du fichier* document, que nous ne pouvons avoir directement avec cette requête car le champ spip_documents.fichier
n'est pas relevé (pas de jointure avec la table spip_documents), alors il faut déclarer une jointure supplémentaire sur la table
spip_documents :

<BOUCLE_d(spip_documents_liens documents rubriques)
          {objet = rubrique}
          {rubriques.id_secteur = 13}
          {par hasard}
          {0, 1}>
#LOGO_DOCUMENT / #FICHIER
</BOUCLE_d>

requête produite :

  SELECT rand() AS alea,
         spip_documents_liens.id_document,
         L2.fichier
    FROM spip_documents_liens AS `spip_documents_liens`
         INNER JOIN spip_documents AS L2
                 ON L2.id_document = spip_documents_liens.id_document
         INNER JOIN spip_rubriques AS L1
                 ON L1.id_rubrique = spip_documents_liens.id_objet
                AND spip_documents_liens.objet='rubrique'
   WHERE spip_documents_liens.objet = 'rubrique'
     AND L1.id_secteur = 13
GROUP BY spip_documents_liens.id_document,
         spip_documents_liens.id_objet,
         spip_documents_liens.objet
ORDER BY alea
   LIMIT 0,1

attention :
  ici, nous avons presque accès à tous les champs des 3 tables
  je dis "presque" car attention aux champs homonymes :
  les #TITRE, #DESCRIPTIF, #MAJ, #STATUT et #DATE affichés,
  qui sont des champs homonymes dans spip_documents *et* spip_rubriques,
  seront ceux de spip_documents ('table première' de la requête) !

(désolé pour la longueur de la prose)

Quentin a écrit :

Comment se fait-il que le select soit conditionné par ce qu'il y a à l'intérieur de la boucle ?

le select se construit à partir des balises qui devront être affichées
dans la boucle

En revanche même boucle mais #URL_FICHIER : j'ai bien mon id_document (et donc tout ce qui me va bien) !

parce que #URL_FICHIER n'est pas un champ de table, mais une
construction de spip qui, pour se faire, se dépatouille d'aller
chercher ce qu'il lui faut 'a minima' pour produire un
résultat valable : ici l'id du document.

Jean-Christophe Villeneuve a écrit :

denisb a écrit :

<BOUCLE_d(spip_documents_liens rubriques)

et pas <BOUCLE_d(spip_documents_liens spip_rubriques) ?

on pourrait oui, mais ce n'est pas nécessaire ici, spip
reconnaissant ses petits...

nous précisons le critère {rubriques.id_secteur = 13}

et pas {spip_rubriques.id_secteur = 13} ?

idem

attention toutefois à ces écritures de nom de table !

ainsi :
   <BOUCLE_d(DOCUMENTS_LIENS
   <BOUCLE_d(documents_liens
   <BOUCLE_d(SPIP_DOCUMENTS_LIENS
   <BOUCLE_d(spip_documents_liens
sont équivalentes.

tout comme :
   <BOUCLE_d(documents_liens documents rubriques
   <BOUCLE_d(documents_liens documents spip_rubriques
   <BOUCLE_d(documents_liens documents RUBRIQUES

MAIS :

si :
   <BOUCLE_d(documents_liens documents
   <BOUCLE_d(documents_liens spip_documents
   <BOUCLE_d(spip_documents_liens spip_documents
   <BOUCLE_d(spip_documents_liens documents
sont aussi équivalentes,

il n'en va pas de même avec :
   <BOUCLE_d(DOCUMENTS_LIENS DOCUMENTS
   <BOUCLE_d(documents_liens DOCUMENTS
   <BOUCLE_d(SPIP_DOCUMENTS_LIENS DOCUMENTS
   <BOUCLE_d(spip_documents_liens DOCUMENTS
où la mise en capitales de 'documents' occasionne une perte de jointure
entre spip_documents_liens et spip_documents

(ouille ouille ouille...)

Et bien merci pour toutes ces explications, j'ai enfin tout saisi !!
Je m'en vais de ce pas optimiser certains squelettes qui sont plein de #ARRAY (je sais bien que je ne pourrais pas tout améliorer mais je vais tenter :stuck_out_tongue: )

Bonne semaine à vous !!!

Le 21/09/2009 12:27, denisb a écrit :

Quentin a écrit :

Comment se fait-il que le select soit conditionné par ce qu'il y a à l'intérieur de la boucle ?

le select se construit à partir des balises qui devront être affichées
dans la boucle

En revanche même boucle mais #URL_FICHIER : j'ai bien mon id_document (et donc tout ce qui me va bien) !

parce que #URL_FICHIER n'est pas un champ de table, mais une
construction de spip qui, pour se faire, se dépatouille d'aller
chercher ce qu'il lui faut 'a minima' pour produire un
résultat valable : ici l'id du document.

denisb a écrit :

manu a écrit :

Une petite explication de texte serait la bienvenue pour bien comprendre la rédaction "séduisante" que tu proposes.

la table spip_documents_liens est une table qui recense les liens (jointures) entre un document et un objet (article, rubrique, mot, site...)

des entrées type de cette table pourraient ressembler à :

+-------------+----------+----------+-----+
! id_document ! id_objet ! objet ! vu !
+-------------+----------+----------+-----+
! 14 ! 36 ! article ! non !
! 363 ! 66 ! rubrique ! non !
! ... ! ... ! ... ! ... !

.... à ce propos, le champ "vu" sert à quoi ? Je veux dire, il est soit oui soit non mais ces valeurs correspondent à quoi ? (quel est le rôle ou la fonction de ce champ ?)

manu a écrit :

le champ "vu" sert à quoi ? Je veux dire, il est soit oui soit non mais ces valeurs correspondent à quoi ? (quel est le rôle ou la fonction de ce champ ?)

si le document est 'intégré' dans l'objet (typiquement un <imgxx> ou un
<docyy|left> ou encore un <embzz> dans le texte d'un article par
exemple) alors dans la table spip_documents_liens, le trio id_document,
id_objet, objet sera noté avec vu = oui

ce critère 'vu' ne peut être associé directement à un document (dans la
table spip_documents) car un même document peut être lié à plusieurs
objets.

ce critère porte donc sur une association id_document / id_objet
et il est mis-à-jour à chaque modification du-dit objet.

ce qui veut dire que dans une boucle portfolio appelée à l'intérieur
d'une boucle articles, on peut ne faire s'afficher *que* les documents
qui n'ont pas *déjà* été affichés (dans le corps de l'article) avec le
critère {vu = non} sur cette boucle portfolio.

denisb a écrit :

attention toutefois à ces écritures de nom de table !

c'est autrement plus complet et précis que ce que j'ai mis
dans Accés SPIP aux tables non-SPIP et jointures - SPIP-Contrib
et que ça mériterait de compléter...

t'es sur de tout ça denisb ?
JL

ainsi :
  <BOUCLE_d(DOCUMENTS_LIENS
  <BOUCLE_d(documents_liens
  <BOUCLE_d(SPIP_DOCUMENTS_LIENS
  <BOUCLE_d(spip_documents_liens
sont équivalentes.

tout comme :
  <BOUCLE_d(documents_liens documents rubriques
  <BOUCLE_d(documents_liens documents spip_rubriques
  <BOUCLE_d(documents_liens documents RUBRIQUES

MAIS :

si :
  <BOUCLE_d(documents_liens documents
  <BOUCLE_d(documents_liens spip_documents
  <BOUCLE_d(spip_documents_liens spip_documents
  <BOUCLE_d(spip_documents_liens documents
sont aussi équivalentes,

il n'en va pas de même avec :
  <BOUCLE_d(DOCUMENTS_LIENS DOCUMENTS
  <BOUCLE_d(documents_liens DOCUMENTS
  <BOUCLE_d(SPIP_DOCUMENTS_LIENS DOCUMENTS
  <BOUCLE_d(spip_documents_liens DOCUMENTS
où la mise en capitales de 'documents' occasionne une perte de jointure
entre spip_documents_liens et spip_documents

(ouille ouille ouille...)