[RESOLU] Jointures de tables et tableaux associatifs dans une UDT -
nicks - 27/06/2016
Citation :#~~~~~ DEBUT BLOC A NE PAS SUPPRIMER ~~~~~
#~ Version du CMS: 1.12.x
#~ Url du site :
#~ Hébergeur / Soft :
#~ Informations Système :
#~~~~~ FIN BLOC A NE PAS SUPPRIMER ~~~~~
Bonjour,
Je rencontre quelques difficultés avec le mode "search" de ListItExtended (ListIt2) (en gros, impossible de rechercher avec les catégories et surtout les résultats me semblent hasardeux avec certains champs que j'ai créé bref, ce n'est pas vraiment le sujet).
J'essaie donc dans un premier temps de créer une UDT qui me permettrait de lister chaque "item" de mon listIt.
J'ai donc repéré les 6 tables utilisées pour mon instance (que j'ai appelé "ressources"):
cms_module_listit2ressources_category (liste les catégories)
cms_module_listit2ressources_fielddef (liste les types de champs que j'ai créé)
cms_module_listit2ressources_fielddef_opts (liste les options des types de champs créé => je n'utilise pas)
cms_module_listit2ressources_fieldval (liste les valeurs des types de champs que j'ai créé)
cms_module_listit2ressources_item (liste les différents item (id + titre de l'item))
cms_module_listit2ressources_item_categories (relation entre les items et les catégories).
J'essaie donc simplement d'afficher chaque ressource : Son Id, son titre, sa catégorie liée et les différents champs "custom" que j'ai créé avec le couple : clé => valeur).
Voici mon UDT contenant ma requête :
Code :
[== Indéfini ==]
//Je récupère le connecteur de la bdd
$db = cmsms()->GetDb();
// Création et éxécution de la requête
//V1 Tout ensemble => problème 1 ligne par type de valeurs...
$sql = 'SELECT DISTINCT
item.item_id AS id,
item.title AS title,
item.active AS active,
item_cat.category_id AS cat_id,
item_cat.item_id AS item_id,
category.category_id,
category.category_name as cat_name,
category.category_alias as cat_alias,
fieldval.item_id as fkItemId,
fieldval.fielddef_id as fkfieldefId,
fieldval.value as theVal,
fielddef.fielddef_id,
fielddef.name as valueTitle
FROM `'.cms_db_prefix().'module_listit2ressources_item` AS item
LEFT JOIN `'.cms_db_prefix().'module_listit2ressources_item_categories` AS item_cat
ON item.item_id = item_cat.item_id
LEFT JOIN `'.cms_db_prefix().'module_listit2ressources_category` AS category
ON item_cat.category_id = category.category_id
LEFT JOIN `'.cms_db_prefix().'module_listit2ressources_fieldval` AS fieldval
ON item.item_id = fieldval.item_id
LEFT JOIN `'.cms_db_prefix().'module_listit2ressources_fielddef` AS fielddef
ON fieldval.fielddef_id = fielddef.fielddef_id
WHERE item.active=1
';
$articles = $db->Execute($sql);
echo "<table>";
while ($row = $articles->FetchRow())
{
echo <<<REQUETE
<tr>
<td>Article id : {$row['id']}</td>
<td>Titre : {$row['title']}</td>
<td>Active : {$row['active']}</td>
<td>Category id : {$row['cat_id']}</td>
<td>Item id : {$row['item_id']}</td>
<td>Categorie : {$row['cat_name']}</td>
<td>Id: {$row['fkItemId']}<br/>{$row['valueTitle']} : {$row['theVal']}</td>
</td>
</tr>
REQUETE;
}
echo "</table>";
Et voilà le résultat qui est retourné :
Mon problème est donc le suivant :
Je ne voudrai qu'une seule ligne pour l'item avec l'id 328. Ici il en créait autant qu'il y a de champs customs créés (dernière colonne : date, type, langue, source).
J'ai pensé utiliser GROUP_CONCAT, mais du coup je n'ai pas l'association nom du champ => valeur, mais tous les noms de champs regroupés ensemble et toutes leurs valeurs regroupées ensemble...
Je ne vois pas quel type de requête je dois faire, je pense qu'il faut faire une seconde boucle (qui liste les champs custom : fielddef et fieldval) dans la boucle qui liste les articles? Mais comment?
Je regarde les sources de ListIt2 mais je ne suis pas très à l'aise avec les objets du coup j'ai du mal à me repérer.
Si quelqu'un à une piste à me donner, ne serait-ce qu'une piste pour faire des recherches google, je suis preneur!
Merci
[RESOLU] Jointures de tables et tableaux associatifs dans une UDT -
nicks - 19/07/2016
J'ai réussi en intégrant simplement une seconde requête dans la boucle :
Code :
[== PHP ==]
//Connexion BDD
$db = cmsms()->GetDb();
//Requête pour lister les items de ListIt
$itemReq = 'SELECT i.item_id AS id
, i.title AS title
, i.active AS active
, ic.category_id AS cat_id
, ic.item_id AS item_id
, c.category_id
, c.category_name as cat_name
, c.category_alias as cat_alias
, fielddef.alias
FROM cms_module_listit2ressources_item i
INNER
JOIN cms_module_listit2ressources_item_categories ic
ON ic.item_id = i.item_id
INNER
JOIN cms_module_listit2ressources_category c
ON c.category_id = ic.category_id
'.$categorieDoc .'
INNER JOIN `'.cms_db_prefix().'module_listit2ressources_fieldval` AS fieldval
ON i.item_id = fieldval.item_id
INNER JOIN `'.cms_db_prefix().'module_listit2ressources_fielddef` AS fielddef
ON fieldval.fielddef_id = fielddef.fielddef_id
'.$typeDoc .'
'.$langueDoc .'
'.$sourceDoc .'
WHERE i.active = 1 AND fielddef.alias="date"
'.$dateDoc.'
ORDER BY fieldval.value DESC';
//Execution de la requête
$items = $db->Execute($itemReq);
//On affiche les résultats...
while ($row = $items->FetchRow())
{
//Et dans la boucle on fait une seconde requête pour faire correspondre les champs 'custom'
$fieldReq = 'SELECT
item.item_id AS id,
item.active AS active,
fieldval.item_id as fkItemId,
fieldval.fielddef_id as fkfieldefId,
fieldval.value as theVal,
fielddef.fielddef_id,
fielddef.name as valueTitle,
fielddef.alias
FROM `'.cms_db_prefix().'module_listit2ressources_item` AS item
INNER JOIN `'.cms_db_prefix().'module_listit2ressources_fieldval` AS fieldval
ON item.item_id = fieldval.item_id
INNER JOIN `'.cms_db_prefix().'module_listit2ressources_fielddef` AS fielddef
ON fieldval.fielddef_id = fielddef.fielddef_id
WHERE fielddef.alias IN("langue", "source", "type") AND item.active=1 AND item.item_id='.$row['id'].'
';
}
Je ne détaille pas plus que ca puisque ca concerne un module qui n'est plus mis à jour sur la v2 de CMSMS, mais si quelqu'un est interessé je peux partager mon UDT complète.
Pour rappel l'idée était de créer un formulaire de recherche multi-critères pour ListIt2. (Bien que prévue par le module, je n'ai pas réussi à faire fonctionner correctement cette fonctionnalité, d'où l'UDT).