[RESOLU] Jointures de tables et tableaux associatifs dans une UDT

Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
#1
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é :
[Image: prob.jpg]

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 Smile
#1
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é :
[Image: prob.jpg]

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 Smile
#2
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).
#2
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).


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)