+function lien_verifier_action($k, $v) {
+ $action = '';
+ if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) {
+ $action = $k;
+ }
+ if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) {
+ if (is_numeric($k)) {
+ $action = $v;
+ }
+ if (_request($k)) {
+ $action = $v;
+ }
+ }
+ // ajout un role null fictif (plus pratique) si pas défini
+ if ($action and count(explode('-', $action)) == 4) {
+ $action .= '-';
+ }
+
+ return $action;
+}
+
+
+/**
+ * Retrouve le ou les qualificatifs postés avec une liaison demandée
+ *
+ * @internal
+ * @param string $objet_lien
+ * objet qui porte le lien
+ * @param string $lien
+ * Action du lien
+ * @return array
+ * Liste des qualifs pour chaque lien. Tableau vide s'il n'y en a pas.
+ **/
+function lien_retrouver_qualif($objet_lien, $lien) {
+ // un role est défini dans la liaison
+ $defs = explode('-', $lien);
+ list($objet1, , $objet2, , $role) = $defs;
+ if ($objet_lien == $objet1) {
+ $colonne_role = roles_colonne($objet1, $objet2);
+ } else {
+ $colonne_role = roles_colonne($objet2, $objet1);
+ }
+
+ // cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut)
+ if ($role) {
+ return array(
+ // un seul lien avec ce role
+ array($colonne_role => $role)
+ );
+ }
+
+ // retrouver les rôles postés pour cette liaison, s'il y en a.
+ $qualifier_lien = _request('qualifier_lien');
+ if (!$qualifier_lien or !is_array($qualifier_lien)) {
+ return array();
+ }
+
+ // pas avec l'action complete (incluant le role)
+ $qualif = array();
+ if ((!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien])
+ and count($defs) == 5
+ ) {
+ // on tente avec l'action sans le role
+ array_pop($defs);
+ $lien = implode('-', $defs);
+ if (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) {
+ $qualif = array();
+ }
+ }
+
+ // $qualif de la forme array(role=>array(...),valeur=>array(...),....)
+ // on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...)
+ $qualifs = array();
+ while (count($qualif)) {
+ $q = array();
+ foreach ($qualif as $att => $values) {
+ if (is_array($values)) {
+ $q[$att] = array_shift($qualif[$att]);
+ if (!count($qualif[$att])) {
+ unset($qualif[$att]);
+ }
+ } else {
+ $q[$att] = $values;
+ unset($qualif[$att]);
+ }
+ }
+ // pas de rôle vide
+ if (!$colonne_role or !isset($q[$colonne_role]) or $q[$colonne_role]) {
+ $qualifs[] = $q;
+ }
+ }
+
+ return $qualifs;
+}
+
+/**
+ * Ajoute les liens demandés en prenant éventuellement en compte le rôle
+ *
+ * Appelle la fonction objet_associer. L'appelle autant de fois qu'il y
+ * a de rôles demandés pour cette liaison.
+ *
+ * @internal
+ * @param string $objet_source Objet source de la liaison (qui a la table de liaison)
+ * @param array|string $ids Identifiants pour l'objet source
+ * @param string $objet_lien Objet à lier
+ * @param array|string $idl Identifiants pour l'objet lié
+ * @param array $qualifs
+ * @return void
+ **/
+function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs) {
+
+ // retrouver la colonne de roles s'il y en a a lier
+ if (is_array($qualifs) and count($qualifs)) {
+ foreach ($qualifs as $qualif) {
+ objet_associer(array($objet_source => $ids), array($objet_lien => $idl), $qualif);
+ }
+ } else {
+ objet_associer(array($objet_source => $ids), array($objet_lien => $idl));