diff --git a/prive/formulaires/editer_liens.php b/prive/formulaires/editer_liens.php index be86ec1a1c0042ef102aff71115023da4e52764c..f14daa6c76a2977ab19d501572400428f4007d10 100644 --- a/prive/formulaires/editer_liens.php +++ b/prive/formulaires/editer_liens.php @@ -44,14 +44,36 @@ function formulaires_editer_liens_charger_dist($table_source,$objet,$id_objet){ 'recherche'=>'', 'visible'=>0, 'editable'=>autoriser('modifier',$objet,$id_objet), + 'ajouter_lien'=>'', + 'supprimer_lien'=>'', '_oups' => _request('_oups'), ); return $valeurs; } +/** + * Traiter le post des informations d'edition de liens + * Les formulaires postent dans deux variables ajouter_lien et supprimer_lien + * + * Elles peuvent etre chacune 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) + * + * @param string $table_source + * table des objets associes, doit correspondre a une table xxx_liens + * @param string $objet + * objet auquel associer + * @param int $id_objet + * id_objet auquel associer + * @return array + */ function formulaires_editer_liens_traiter_dist($table_source,$objet,$id_objet){ - + $res = array('editable'=>true); + if (_request('tout_voir')) set_request('recherche',''); @@ -72,27 +94,61 @@ function formulaires_editer_liens_traiter_dist($table_source,$objet,$id_objet){ if ($ajouter = _request('ajouter_lien')){ $ajouter_lien = charger_fonction('ajouter_lien','action'); - foreach($ajouter as $lien=>$dummy) - $ajouter_lien($lien); + foreach($ajouter as $k=>$v){ + if ($lien = lien_verifier_action($k,$v)){ + $ajouter_lien($lien); + } + } # 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 ! set_request('_oups'); } if ($supprimer = _request('supprimer_lien')){ include_spip('action/editer_liens'); $oups = array(); - foreach($supprimer as $lien=>$dummy) { - $lien = explode("-",$lien); - list($objet_source,$ids,$objet_lie,$idl) = $lien; - $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)); + + foreach($supprimer as $k=>$v) { + if ($lien = lien_verifier_action($k,$v)){ + $lien = explode("-",$lien); + list($objet_source,$ids,$objet_lie,$idl) = $lien; + $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)); + } } set_request('_oups',$oups?serialize($oups):null); } } - $res = array('editable'=>true); + return $res; } + +/** + * Les formulaires envoient une action dans un tableau ajouter_lien + * ou supprimer_lien + * L'action est de la forme + * objet1-id1-objet2-id2 + * + * L'action peut etre indiquee dans la cle, ou dans la valeur + * Si elle est indiquee dans la valeur, et que la cle est non numerique, + * on ne la prend en compte que si un submit avec la cle a ete envoye + * + * @param <type> $k + * @param <type> $v + * @return <type> + */ +function lien_verifier_action($k,$v){ + if (preg_match(",^\w+-[\w*]+-[\w*]+-[\w*]+,",$k)) + return $k; + if (preg_match(",^\w+-[\w*]+-[\w*]+-[\w*]+,",$v)){ + if (is_numeric($k)) + return $v; + if (_request($k)) + return $v; + } + return ''; +} ?> \ No newline at end of file