Document partagé, critères optionnels et {vu=non}

Considérons le squelette test.html suivant :

<!DOCTYPE html>
<html lang="fr">
<head>
	<title>Test</title>
</head>
<body>
	<BOUCLE_photos(DOCUMENTS){id_rubrique?}{id_article?}{media=image}{vu=non}>
	    <br>- #ID_DOCUMENT - #VU
	</BOUCLE_photos>
</body>
</html>

On appelle la page comme ceci ?page=test&id_article=123

On s'attend à obtenir les images de l'article 123 non insérées dans le texte. Il existe un cas où des images avec vu=oui sont retournées quand même ! Il s'agit du cas ou cette image est partagée avec un autre article pour lequel vu=non.

Le SQL généré est le suivant :

SELECT documents.id_document, L1.vu
FROM spip_documents AS `documents`  
INNER JOIN spip_documents_liens AS L2 ON ( L2.id_document = documents.id_document ) 
INNER JOIN spip_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.statut = 'publie')
	AND (documents.mode IN ('image','document'))
	AND (documents.taille > 0 OR documents.distant='oui')
	AND (L2.id_objet = 123)
	AND (L2.objet = 'article')
	AND (documents.media = 'image')
	AND (L1.vu = 'non')
GROUP BY documents.id_document

On voit que 2 jointures vers la table spip_documents_liens sont générées : L1 et L2. Il existe une jointure entre l'article 123 et L2, mais pas avec L1 sur lequel le test du champ vu est fait...

En résumé :

  • Document 1 sur Article 123 avec vu=oui
  • Document 1 sur Article 456 avec vu=non
  • Boucle des documents de l'article 123 avec vu=non retourne le document 1 quand même.
Modification effectuée par marcimat