/** * Gérer l'ajout dans la condition where du rôle * * On ajoute la condition uniquement si la liaison entre les 2 objets a une colonne de rôle ! * * @param string $objet_source Objet source (qui possède la table de liens) * @param string $objet Objet de destination * @param array $cond * Tableau de conditions where * qui peut avoir un index spécial 'role' définissant le role à appliquer * ou valant '*' pour tous les roles. * @param bool $tous_si_absent * true pour ne pas appliquer une condition sur le rôle s'il n'est pas indiqué * dans la liste des conditions entrantes. Autrement dit, on n'applique * pas de rôle par défaut si aucun n'est défini. * @return array * Liste (Tableau de conditions where complété du role, Colonne du role, role utilisé) **/ function roles_creer_condition_role($objet_source, $objet, $cond, $tous_si_absent = false) { // role par défaut, colonne list($role_defaut, $colonne_role) = roles_trouver_dans_qualif($objet_source, $objet); // chercher d'eventuels rôles transmis $role = isset($cond['role']) ? $cond['role'] : ($tous_si_absent ? '*' : $role_defaut); unset($cond['role']); // cette condition est particuliere... if ($colonne_role) { // on ajoute la condition du role aux autres conditions. if ($role != '*') { $cond[] = "{$colonne_role}=" . sql_quote($role); } } return array($cond, $colonne_role, $role); }
/** * Sous fonction qualification * qui traite les liens pour un objet source dont la clé primaire * et la table de lien sont fournies * * $objets et de la forme * array($objet=>$id_objets,...) * un * pour $id,$objet,$id_objets permet de traiter par lot * * exemple : * $qualif = array('vu'=>'oui'); * * @internal * @param string $objet_source Objet source de l'insertion (celui qui a la table de liaison) * @param string $primary Nom de la clé primaire de cet objet * @param string $table_lien Nom de la table de lien de cet objet * @param int $id Identifiant de l'objet sur lesquels on va insérer des liaisons * @param array $objets Liste des liaisons à faire, de la forme array($objet=>$id_objets) * @param array $qualif * Liste des qualifications à appliquer. * * Si l'objet dispose d'un champ rôle, on extrait des qualifications * le rôle s'il est présent, sinon on applique les qualifications * sur le rôle par défaut. * @return bool|int * Nombre de modifications faites, false si échec. */ function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif) { $echec = null; $ok = 0; if (!$qualif) { return false; } // nettoyer qualif qui peut venir directement d'un objet_trouver_lien : unset($qualif[$primary]); unset($qualif[$objet_source]); if (isset($qualif['objet'])) { unset($qualif[$qualif['objet']]); } unset($qualif['objet']); unset($qualif['id_objet']); foreach ($objets as $objet => $id_objets) { // role, colonne, where par défaut list($role, $colonne_role, $cond) = roles_trouver_dans_qualif($objet_source, $objet, $qualif); $objet = $objet == '*' ? $objet : objet_type($objet); # securite if (!is_array($id_objets) or reset($id_objets) == "NOT") { $id_objets = array($id_objets); } foreach ($id_objets as $id_objet) { $args = array('table_lien' => $table_lien, 'objet_source' => $objet_source, 'id_objet_source' => $id, 'objet' => $objet, 'id_objet' => $id_objet, 'role' => $role, 'colonne_role' => $colonne_role, 'action' => 'modifier'); // Envoyer aux plugins $qualif = pipeline('pre_edition_lien', array('args' => $args, 'data' => $qualif)); $args['id_objet'] = $id_objet; $where = lien_where($primary, $id, $objet, $id_objet, $cond); $e = sql_updateq($table_lien, $qualif, $where); if ($e === false) { $echec = true; } else { // Envoyer aux plugins pipeline('post_edition_lien', array('args' => $args, 'data' => $qualif)); $ok++; } } } return $echec ? false : $ok; }