コード例 #1
0
ファイル: editer_liens.php プロジェクト: nursit/SPIP
/**
 * Traiter le post des informations d'édition de liens
 * 
 * Les formulaires postent dans trois variables ajouter_lien et supprimer_lien
 * et remplacer_lien
 *
 * Les deux premieres peuvent etre de trois formes differentes :
 * ajouter_lien[]="objet1-id1-objet2-id2"
 * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi"
 * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2"
 * Dans ce dernier cas, la valeur ne sera prise en compte
 * que si _request('clenonnumerique') est vrai (submit associe a l'input)
 *
 * remplacer_lien doit etre de la forme
 * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2"
 * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute
 *
 * @param string $a
 * @param string|int $b
 * @param int|string $c
 * @param bool $editable
 * @return array
 */
function formulaires_editer_liens_traiter_dist($a, $b, $c, $editable = true)
{
    $res = array('editable' => $editable ? true : false);
    list($table_source, $objet, $id_objet, $objet_lien) = determine_source_lien_objet($a, $b, $c);
    if (!$table_source or !$objet or !$objet_lien) {
        return $res;
    }
    if (_request('tout_voir')) {
        set_request('recherche', '');
    }
    if (autoriser('modifier', $objet, $id_objet)) {
        // annuler les suppressions du coup d'avant !
        if (_request('annuler_oups') and $oups = _request('_oups') and $oups = unserialize($oups)) {
            $objet_source = objet_type($table_source);
            include_spip('action/editer_liens');
            foreach ($oups as $oup) {
                if ($objet_lien == $objet_source) {
                    objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup);
                } else {
                    objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup);
                }
            }
            # oups ne persiste que pour la derniere action, si suppression
            set_request('_oups');
        }
        $supprimer = _request('supprimer_lien');
        $ajouter = _request('ajouter_lien');
        // il est possible de preciser dans une seule variable un remplacement :
        // remplacer_lien[old][new]
        if ($remplacer = _request('remplacer_lien')) {
            foreach ($remplacer as $k => $v) {
                if ($old = lien_verifier_action($k, '')) {
                    foreach (is_array($v) ? $v : array($v) as $kn => $vn) {
                        if ($new = lien_verifier_action($kn, $vn)) {
                            $supprimer[$old] = 'x';
                            $ajouter[$new] = '+';
                        }
                    }
                }
            }
        }
        if ($supprimer) {
            include_spip('action/editer_liens');
            $oups = array();
            foreach ($supprimer as $k => $v) {
                if ($lien = lien_verifier_action($k, $v)) {
                    $lien = explode("-", $lien);
                    list($objet_source, $ids, $objet_lie, $idl) = $lien;
                    if ($objet_lien == $objet_source) {
                        $oups = array_merge($oups, objet_trouver_liens(array($objet_source => $ids), array($objet_lie => $idl)));
                        objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl));
                    } else {
                        $oups = array_merge($oups, objet_trouver_liens(array($objet_lie => $idl), array($objet_source => $ids)));
                        objet_dissocier(array($objet_lie => $idl), array($objet_source => $ids));
                    }
                }
            }
            set_request('_oups', $oups ? serialize($oups) : null);
        }
        if ($ajouter) {
            $ajout_ok = false;
            include_spip('action/editer_liens');
            foreach ($ajouter as $k => $v) {
                if ($lien = lien_verifier_action($k, $v)) {
                    $ajout_ok = true;
                    list($objet1, $ids, $objet2, $idl) = explode("-", $lien);
                    if ($objet_lien == $objet1) {
                        objet_associer(array($objet1 => $ids), array($objet2 => $idl));
                    } else {
                        objet_associer(array($objet2 => $idl), array($objet1 => $ids));
                    }
                    set_request('id_lien_ajoute', $ids);
                }
            }
            # oups ne persiste que pour la derniere action, si suppression
            # une suppression suivie d'un ajout dans le meme hit est un remplacement
            # non annulable !
            if ($ajout_ok) {
                set_request('_oups');
            }
        }
    }
    return $res;
}
コード例 #2
0
ファイル: editer_liens.php プロジェクト: JLuc/SPIP
/**
 * Traiter le post des informations d'édition de liens
 *
 * Les formulaires peuvent poster dans quatre variables
 * - ajouter_lien et supprimer_lien
 * - remplacer_lien
 * - qualifier_lien
 *
 * Les deux premières peuvent être de trois formes différentes :
 * ajouter_lien[]="objet1-id1-objet2-id2"
 * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi"
 * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2"
 * Dans ce dernier cas, la valeur ne sera prise en compte
 * que si _request('clenonnumerique') est vrai (submit associé a l'input)
 *
 * remplacer_lien doit être de la forme
 * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2"
 * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute
 *
 * qualifier_lien doit être de la forme, et sert en complément de ajouter_lien
 * qualifier_lien[objet1-id1-objet2-id2][role] = array("role1", "autre_role")
 * qualifier_lien[objet1-id1-objet2-id2][valeur] = array("truc", "chose")
 * produira 2 liens chacun avec array("role"=>"role1","valeur"=>"truc") et array("role"=>"autre_role","valeur"=>"chose")
 *
 * @param string $a
 * @param string|int $b
 * @param int|string $c
 * @param array|bool $options
 *    - Si array, tableau d'options
 *    - Si bool : valeur de l'option 'editable' uniquement
 *
 * @return array
 */
function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = array())
{
    // compat avec ancienne signature ou le 4eme argument est $editable
    if (!is_array($options)) {
        $options = array('editable' => $options);
    } elseif (!isset($options['editable'])) {
        $options['editable'] = true;
    }
    $editable = $options['editable'];
    $res = array('editable' => $editable ? true : false);
    list($table_source, $objet, $id_objet, $objet_lien) = determine_source_lien_objet($a, $b, $c);
    if (!$table_source or !$objet or !$objet_lien) {
        return $res;
    }
    if (_request('tout_voir')) {
        set_request('recherche', '');
    }
    include_spip('inc/autoriser');
    if (autoriser('modifier', $objet, $id_objet)) {
        // annuler les suppressions du coup d'avant !
        if (_request('annuler_oups') and $oups = _request('_oups') and $oups = unserialize($oups)) {
            if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", "action", true)) {
                $oups_objets($oups);
            } else {
                $objet_source = objet_type($table_source);
                include_spip('action/editer_liens');
                foreach ($oups as $oup) {
                    if ($objet_lien == $objet_source) {
                        objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup);
                    } else {
                        objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup);
                    }
                }
            }
            # oups ne persiste que pour la derniere action, si suppression
            set_request('_oups');
        }
        $supprimer = _request('supprimer_lien');
        $ajouter = _request('ajouter_lien');
        // il est possible de preciser dans une seule variable un remplacement :
        // remplacer_lien[old][new]
        if ($remplacer = _request('remplacer_lien')) {
            foreach ($remplacer as $k => $v) {
                if ($old = lien_verifier_action($k, '')) {
                    foreach (is_array($v) ? $v : array($v) as $kn => $vn) {
                        if ($new = lien_verifier_action($kn, $vn)) {
                            $supprimer[$old] = 'x';
                            $ajouter[$new] = '+';
                        }
                    }
                }
            }
        }
        if ($supprimer) {
            if ($supprimer_objets = charger_fonction("editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}", "action", true)) {
                $oups = $supprimer_objets($supprimer);
            } else {
                include_spip('action/editer_liens');
                $oups = array();
                foreach ($supprimer as $k => $v) {
                    if ($lien = lien_verifier_action($k, $v)) {
                        $lien = explode("-", $lien);
                        list($objet_source, $ids, $objet_lie, $idl, $role) = $lien;
                        // appliquer une condition sur le rôle si défini ('*' pour tous les roles)
                        $cond = !is_null($role) ? array('role' => $role) : array();
                        if ($objet_lien == $objet_source) {
                            $oups = array_merge($oups, objet_trouver_liens(array($objet_source => $ids), array($objet_lie => $idl), $cond));
                            objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl), $cond);
                        } else {
                            $oups = array_merge($oups, objet_trouver_liens(array($objet_lie => $idl), array($objet_source => $ids), $cond));
                            objet_dissocier(array($objet_lie => $idl), array($objet_source => $ids), $cond);
                        }
                    }
                }
            }
            set_request('_oups', $oups ? serialize($oups) : null);
        }
        if ($ajouter) {
            if ($ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", "action", true)) {
                $ajout_ok = $ajouter_objets($ajouter);
            } else {
                $ajout_ok = false;
                include_spip('action/editer_liens');
                foreach ($ajouter as $k => $v) {
                    if ($lien = lien_verifier_action($k, $v)) {
                        $ajout_ok = true;
                        list($objet1, $ids, $objet2, $idl) = explode("-", $lien);
                        $qualifs = lien_retrouver_qualif($objet_lien, $lien);
                        if ($objet_lien == $objet1) {
                            lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs);
                        } else {
                            lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs);
                        }
                        set_request('id_lien_ajoute', $ids);
                    }
                }
            }
            # oups ne persiste que pour la derniere action, si suppression
            # une suppression suivie d'un ajout dans le meme hit est un remplacement
            # non annulable !
            if ($ajout_ok) {
                set_request('_oups');
            }
        }
    }
    return $res;
}