Esempio n. 1
0
/**
 * 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;
}