Bonjour,
J’ai bien compris cette partie et je suis donc parvenue au fonctionnement de
cette liaison simple.
J’ai toutefois une liaison plus compliquée à mettre en œuvre et je crois que je
n’appréhende pas correctement le paramètre joinparams.
Le plugin sur lequel je travaille étend ticketstasks. Le plugin stocke les
informations standard dans la table glpi_tickettasks et les informations
spécifiques aux plugins dans sa table glpi_plugin_monplugin_tickettasks. Cette
table dispose donc d’une liaison avec glpi_tickettasks qui se nomme
tickettasks_id. Cette table contient aussi une liaison vers glpi_users avec un
champ nommé user_arbitre.
Ce plugin doit ajouter des éléments de recherche dans les tickets, et par
exemple, un champ « Arbitre » correspondant à la liaison entre glpi_users.id et
glpi_plugin_monplugin_tickettasks.user_arbitre. Pour que cela fonctionne, je
dois donc procéder à des liaisons multiples (ticket -> tickettasks ->
monplugin_tickettasks), voici ce que j’ai tenté et qui ne fonctionne pas :
function plugin_monplugin_getAddSearchOptions($itemtype)
{
$opt = array();
if ($itemtype == 'Ticket')
{
$opt['arbitrage'] = 'Arbitrage';
$opt[400]['table'] = 'glpi_users';
$opt[400]['field'] = 'name';
$opt[400]['name'] = 'Arbitre';
$opt[400]['linkfield'] = 'user_arbitre';
$opt[400]['datatype'] = 'itemlink';
$opt[400]['right'] = 'own_ticket';
$opt[400]['joinparams'] = array('beforejoin'
=> array('table' =>
'glpi_plugin_monplugin_tickettasks',
'joinparams' => array('beforejoin' => array('table'
=> 'glpi_tickettasks','joinparams' => array('jointype' => 'child')))));
}
return $opt;
}
Le champ apparait bien dans la liste des éléments de recherche, mais la
jointure dans requête SQL renvoyée n’est pas correcte. Le debug m’informe que
Unknown column 'glpi_tickettasks.plugin_monplugin_tickettasks_id' in 'on clause'
Pour ce que je cherche à faire, la jointure est inversée. Elle devrait être du
type glpi_tickettasks.id = glpi_plugin_monplugin_tickettasks.tickettasks_id
La requête generée est
SELECT '[email protected]' AS currentuser, `glpi_tickets`.`id` AS
ITEM_0, `glpi_tickets`.`name` AS ITEM_1, `glpi_tickets`.`id` AS ITEM_1_2,
`glpi_tickets`.`content` AS ITEM_1_3, `glpi_tickets`.`status` AS ITEM_1_4,
`glpi_entities`.`completename` AS ITEM_2, `glpi_tickets`.`status` AS ITEM_3,
`glpi_tickets`.`date_mod` AS ITEM_4, `glpi_tickets`.`date` AS ITEM_5,
`glpi_tickets`.`priority` AS ITEM_6, GROUP_CONCAT(DISTINCT
`glpi_users_647c2805c3795643b0f52f520e7cdb86`.`id` SEPARATOR '$$$$') AS ITEM_7,
GROUP_CONCAT(DISTINCT
CONCAT(`glpi_tickets_users_a900a61824c3906cc82f90407e525192`.`users_id`, ' ',
`glpi_tickets_users_a900a61824c3906cc82f90407e525192`.`alternative_email`)
SEPARATOR '$$$$') AS ITEM_7_2, GROUP_CONCAT(DISTINCT
`glpi_users_c5e682856a6d6fe48b5aed8f8b238708`.`id` SEPARATOR '$$$$') AS ITEM_8,
GROUP_CONCAT(DISTINCT
CONCAT(`glpi_tickets_users_74690f2626744a37ace4c70dd87cea83`.`users_id`, ' ',
`glpi_tickets_users_74690f2626744a37ace4c70dd87cea83`.`alternative_email`)
SEPARATOR '$$$$') AS ITEM_8_2, `glpi_itilcategories`.`completename` AS ITEM_9,
`glpi_tickets`.`due_date` AS ITEM_10, `glpi_tickets`.`status` AS ITEM_10_2,
`glpi_users_user_arbitre_3bf0be72301038f232c35fde040b8a1b`.`name` AS ITEM_11,
`glpi_users_user_arbitre_3bf0be72301038f232c35fde040b8a1b`.`realname` AS
ITEM_11_2, `glpi_users_user_arbitre_3bf0be72301038f232c35fde040b8a1b`.`id` AS
ITEM_11_3,
`glpi_users_user_arbitre_3bf0be72301038f232c35fde040b8a1b`.`firstname` AS
ITEM_11_4, `glpi_tickets`.`id` AS id
FROM `glpi_tickets`
LEFT JOIN `glpi_entities` ON (`glpi_tickets`.`entities_id` =
`glpi_entities`.`id` )
LEFT JOIN `glpi_tickets_users` AS
glpi_tickets_users_a900a61824c3906cc82f90407e525192 ON (`glpi_tickets`.`id` =
`glpi_tickets_users_a900a61824c3906cc82f90407e525192`.`tickets_id` AND
`glpi_tickets_users_a900a61824c3906cc82f90407e525192`.`type` = 1 )
LEFT JOIN `glpi_users` AS glpi_users_647c2805c3795643b0f52f520e7cdb86 ON
(`glpi_tickets_users_a900a61824c3906cc82f90407e525192`.`users_id` =
`glpi_users_647c2805c3795643b0f52f520e7cdb86`.`id` )
LEFT JOIN `glpi_tickets_users` AS
glpi_tickets_users_74690f2626744a37ace4c70dd87cea83 ON (`glpi_tickets`.`id` =
`glpi_tickets_users_74690f2626744a37ace4c70dd87cea83`.`tickets_id` AND
`glpi_tickets_users_74690f2626744a37ace4c70dd87cea83`.`type` = 2 )
LEFT JOIN `glpi_users` AS glpi_users_c5e682856a6d6fe48b5aed8f8b238708 ON
(`glpi_tickets_users_74690f2626744a37ace4c70dd87cea83`.`users_id` =
`glpi_users_c5e682856a6d6fe48b5aed8f8b238708`.`id` )
LEFT JOIN `glpi_itilcategories` ON (`glpi_tickets`.`itilcategories_id` =
`glpi_itilcategories`.`id` )
LEFT JOIN `glpi_tickettasks` ON (`glpi_tickets`.`id` =
`glpi_tickettasks`.`tickets_id` )
LEFT JOIN `glpi_plugin_monplugin_tickettasks` AS
glpi_plugin_monplugin_tickettasks_e5ca2f53018fdc28a31faf534186b3a2 ON
(`glpi_tickettasks`.`plugin_monplugin_tickettasks_id` =
`glpi_plugin_monplugin_tickettasks_e5ca2f53018fdc28a31faf534186b3a2`.`id` )
LEFT JOIN `glpi_users` AS
glpi_users_user_arbitre_3bf0be72301038f232c35fde040b8a1b ON
(`glpi_plugin_ridixinfor_tickettasks_e5ca2f53018fdc28a31faf534186b3a2`.`user_arbitre`
= `glpi_users_user_arbitre_3bf0be72301038f232c35fde040b8a1b`.`id` )
WHERE `glpi_tickets`.`is_deleted` = '0' AND ( `glpi_tickets`.`entities_id` IN
('0', '38', '80', '40', '9', '86', '81', '41', '32', '10', '42', '34', '55',
'11', '53', '43', '76', '12', '89', '13', '63', '44', '45', '88', '48', '49',
'87', '71', '3', '14', '36', '46', '93', '47', '15', '104', '77', '1', '82',
'83', '90', '108', '74', '75', '16', '17', '26', '29', '67', '79', '50', '51',
'27', '119', '25', '52', '54', '101', '117', '5', '56', '57', '70', '58', '59',
'60', '19', '106', '102', '37', '61', '20', '78', '73', '91', '18', '62', '65',
'64', '33', '103', '98', '35', '113', '84', '85', '95', '66', '2', '28', '30',
'99', '21', '118', '72', '39', '115', '96', '105', '31', '22', '107', '92',
'4', '100', '24', '68', '23', '69', '97', '116', '114', '94', '6', '7', '8',
'109', '110', '111', '112') ) AND (
(`glpi_users_user_arbitre_3bf0be72301038f232c35fde040b8a1b`.`id` = '6') ) GROUP
BY `glpi_tickets`.`id`
ORDER BY ITEM_4 DESC
Je n’ai pas trouvé, dans la classe ticket ou dans la classe computer, d’exemple
dont je pourrais m’inspirer pour m’aider à résoudre ce problème, qui je pense
viens d’un problème de compréhension du paramètre joinparams. La documentation
en ligne à ce sujet est assez pauvre pour comprendre le fonctionnement.
Pourriez-vous m’expliquer ou je fais erreur ou m’indiquer éventuellement un
exemple dont je pourrais m’inspirer ?
Merci,
Yannick
De : Glpi-dev [mailto:[email protected]] De la part de Julien Dombre
Envoyé : mardi 13 mai 2014 22:23
À : [email protected]
Objet : Re: [Glpi-dev] Jointure dans les recherches
Bonsoir,
Votre questionnement manque vraiment de précision pour vous apportez une
réponse vraiment précise.
Avoir plusieurs colonnes utilisateurs (ou autre d'ailleurs) n'a rien de
bloquant. Vous avez le même cas dans la table glpi_tickets par exemple ou même
glpi_computers. La définition des éléments est alors assez simple en suivant
les coding standards de GLPI.
Pour les computers par exemple la définition dans SearchOptions donne :
$tab[24]['table'] = 'glpi_users';
$tab[24]['field'] = 'name';
$tab[24]['linkfield'] = 'users_id_tech';
$tab[24]['name'] = __('Technician in charge of the hardware');
$tab[24]['datatype'] = 'dropdown';
$tab[24]['right'] = 'own_ticket';
$tab[70]['table'] = 'glpi_users';
$tab[70]['field'] = 'name';
$tab[70]['name'] = __('User');
$tab[70]['datatype'] = 'dropdown';
$tab[70]['right'] = 'all';
Tout est dans le linkfield qui est spécifié pour l'élément 24. Par défaut ce
champ de liaison (ce que vous appelé colonne) est calculé automatiquement à
partir du nom de la table (glpi_users -> users_id). Pour l'élément 24 on le
force à users_id_tech qui est le 2eme champ de liaison vers glpi_users.
Ceci est vrai pour une liaison simple. Pour une liaison plus complexe il faut
utilisé un autre parmètre "joinparam" pour spécifier la jointure plus complexe
à utiliser.
Cordialement,
Julien Dombre
Le 13/05/2014 22:11, Yannick MOLINET a écrit :
Bonsoir,
J’ai un problème avec le fonctionnement des jointures pour les commandes Search.
La table de mon plugin contient plusieurs colonnes contenant des id
utilisateurs et je ne peux donc pas utiliser les jointures par défaut pour
effectuer les liaisons avec la table glpi_users.
Je voudrais donc savoir comment je peux spécifier le nom de la colonne source
dans la table de mon plugin ?
Merci,
Yannick
_______________________________________________
Glpi-dev mailing list
[email protected]<mailto:[email protected]>
https://mail.gna.org/listinfo/glpi-dev
_______________________________________________
Glpi-dev mailing list
[email protected]
https://mail.gna.org/listinfo/glpi-dev