Skip to content
Extraits de code Groupes Projets
Valider 614abc23 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

on peut monter l'abstraction d'un niveau supplementaire avec 3 fonctions...

on peut monter l'abstraction d'un niveau supplementaire avec 3 fonctions objet_associer(), objet_dissocier(), et objet_qualifier()
qui peuvent s'appliquer a tout objet possedant une table de laison generique spip_xxx_liens (spip_xxx etant la table principale de l'objet concerne).
Pourra donc s'utiliser pour les auteurs, documents, mots a minima.

On simplifie donc a leur plus simple expressionles 3 fonctions auteur_associer(), auteur_dissocier() et auteur_qualifier()
qui ont tout leur interet pour simplifier la syntaxe d'appel
parent aa990217
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -16,6 +16,7 @@ ecrire/action/documenter.php -text ...@@ -16,6 +16,7 @@ ecrire/action/documenter.php -text
ecrire/action/editer_article.php -text ecrire/action/editer_article.php -text
ecrire/action/editer_auteur.php -text ecrire/action/editer_auteur.php -text
ecrire/action/editer_auteurs.php -text ecrire/action/editer_auteurs.php -text
ecrire/action/editer_liens.php -text
ecrire/action/editer_message.php -text ecrire/action/editer_message.php -text
ecrire/action/editer_rubrique.php -text ecrire/action/editer_rubrique.php -text
ecrire/action/etre_webmestre.php -text ecrire/action/etre_webmestre.php -text
......
...@@ -151,23 +151,8 @@ function auteurs_set($id_auteur, $set = null) { ...@@ -151,23 +151,8 @@ function auteurs_set($id_auteur, $set = null) {
* @return string * @return string
*/ */
function auteur_associer($id_auteur,$objets, $qualif = null){ function auteur_associer($id_auteur,$objets, $qualif = null){
foreach($objets as $objet => $id_objets){ include_spip('action/editer_liens');
if (!is_array($id_objets)) $id_objets = array($id_objets); return objet_associer(array('auteur'=>$id_auteur), $objets, $qualif);
foreach($id_objets as $id_objet) {
if ($id_objet=intval($id_objet)
AND !sql_getfetsel(
'id_auteur',
"spip_auteurs_liens",
array('id_objet='.intval($id_objet), 'objet='.sql_quote($objet), 'id_auteur='.intval($id_auteur))))
{
sql_insertq("spip_auteurs_liens", array('id_objet' => $id_objet, 'objet'=>$objet, 'id_auteur' =>$id_auteur));
}
}
}
if ($qualif)
auteur_qualifier($id_auteur, $objets, $qualif);
return ''; // pas d'erreur
} }
...@@ -193,24 +178,8 @@ function auteur_referent($id_auteur,$c){ ...@@ -193,24 +178,8 @@ function auteur_referent($id_auteur,$c){
* @return string * @return string
*/ */
function auteur_dissocier($id_auteur,$objets){ function auteur_dissocier($id_auteur,$objets){
$retire = array(); include_spip('action/editer_liens');
foreach($objets as $objet => $id_objets){ return objet_dissocier(array('auteur'=>$id_auteur), $objets);
if (!is_array($id_objets)) $id_objets = array($id_objets);
foreach($id_objets as $id_objet) {
$where = array();
if ($id_auteur AND $id_auteur!=='*')
$where[] = "id_auteur=".intval($id_auteur);
if ($objet AND $objet!=='*')
$where[] = "objet=".sql_quote($objet);
if ($id_objet AND $id_objet!=='*')
$where[] = "id_objet=".intval($id_objet);
sql_delete("spip_auteurs_liens", $where);
$retire[] = array('source'=>array('auteur'=>$id_auteur),'lien'=>array($objet=>$id_objet),'type'=>$objet,'id'=>$id_objet);
}
}
pipeline('trig_supprimer_objets_lies',$retire);
return ''; // pas d'erreur
} }
/** /**
...@@ -226,20 +195,8 @@ function auteur_dissocier($id_auteur,$objets){ ...@@ -226,20 +195,8 @@ function auteur_dissocier($id_auteur,$objets){
* @param array $qualif * @param array $qualif
*/ */
function auteur_qualifier($id_auteur,$objets,$qualif){ function auteur_qualifier($id_auteur,$objets,$qualif){
foreach($objets as $objet => $id_objets){ include_spip('action/editer_liens');
if (!is_array($id_objets)) $id_objets = array($id_objets); return objet_dissocier(array('auteur'=>$id_auteur), $objets, $qualif);
foreach($id_objets as $id_objet) {
$where = array();
if ($id_auteur AND $id_auteur!=='*')
$where[] = "id_auteur=".intval($id_auteur);
if ($objet AND $objet!=='*')
$where[] = "objet=".sql_quote($objet);
if ($id_objet AND $id_objet!=='*')
$where[] = "id_objet=".intval($id_objet);
if ($c)
sql_updateq("spip_auteurs_liens",$qualif,$where);
}
}
} }
......
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* API
*/
/**
* Associer un ou des objets a des objets listes
* $objets_source et $objets_lies sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* on peut passer optionnellement une qualification du (des) lien(s) qui sera
* alors appliquee dans la foulee.
* En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
*
* @param array $objets_source
* @param array $objets_lies
* @param array $qualif
* @return string
*/
function objet_associer($objets_source,$objets_lies, $qualif = null){
objet_traiter_laisons('lien_insert',$objets_source,$objets_lies);
if ($qualif)
objet_qualifier($objets_source, $objets, $qualif);
return ''; // pas d'erreur
}
/**
* Dissocier un (ou des) objet(s) des objets listes
* $objets_source et $objets sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* un * pour $objet,$id_objet permet de traiter par lot
* seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
*
*
* @param array $objets_source
* @param array $objets_lies
* @return string
*/
function objet_dissocier($objets_source,$objets_lies){
objet_traiter_laisons('lien_delete',$objets_source,$objets_lies);
return ''; // pas d'erreur
}
/**
* Qualifier le lien entre un (ou des) objet(s) et des objets listes
* $objets_source et $objets sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* un * pour $objet,$id_objet permet de traiter par lot
* seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
*
* @param array $objets_source
* @param array $objets_lies
* @param array $qualif
*/
function objet_qualifier($objets_source,$objets_lies,$qualif){
objet_traiter_laisons('lien_set',$objets_source,$objets_lies,$qualif);
}
/**
* Fonctions techniques
* ne pas les appeler directement
*/
/**
* Fonction generique
* appliquer une operation de liaison entre un ou des objets et des objets listes
* $objets_source et $objets_lies sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* on peut passer optionnellement une qualification du (des) lien(s) qui sera
* alors appliquee dans la foulee.
* En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
*
* @param array $objets_source
* @param array $objets_lies
* @param array $qualif
* @return string
*/
function objet_traiter_laisons($operation,$objets_source,$objets_lies, $set = null){
$trouver_table = charger_fonction('trouver_table','base');
foreach($objets_source as $objet=>$ids){
$table = table_objet_sql($objet);
$primary = id_table_objet($objet);
if ($primary AND $trouver_table($l = $table."_liens")){
if (!is_array($ids)) $ids = array($ids);
foreach($ids as $id) {
$res = $operation($objet,$primary,$l,$id,$objets_lies,$set);
if ($res===false)
spip_log("objet_traiter_laisons [Echec] : $operation sur $objet/$primary/$l/$id");
}
}
}
return ''; // pas d'erreur
}
/**
* Sous fonction insertion
* qui traite les liens pour un objet source dont la cle primaire
* et la table de lien sont fournies
*
* $objets et de la forme
* array($objet=>$id_objets,...)
*
* Retourne le nombre d'insertions realisees
*
* @param string $objet_source
* @param string $primary
* @param sgring $table_lien
* @param int $id
* @param array $objets
* @return int
*/
function lien_insert($objet_source,$primary,$table_lien,$id,$objets) {
if (preg_match(',[^\w],',$primary) OR preg_match(',[^\w],',$table_lien))
return false;
$ins = 0;
foreach($objets as $objet => $id_objets){
if (!is_array($id_objets)) $id_objets = array($id_objets);
foreach($id_objets as $id_objet) {
if ($id_objet=intval($id_objet)
AND !sql_getfetsel(
$primary,
$table_lien,
array('id_objet='.intval($id_objet), 'objet='.sql_quote($objet), $primary.'='.intval($id))))
{
if (sql_insertq($table_lien, array('id_objet' => $id_objet, 'objet'=>$objet, $primary=>$id))!==false);
$ins++;
}
}
}
return $ins;
}
/**
* Sous fonction suppression
* qui traite les liens pour un objet source dont la cle 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
*
* @param string $objet_source
* @param string $primary
* @param sgring $table_lien
* @param int $id
* @param array $objets
* @return int
*/
function lien_delete($objet_source,$primary,$table_lien,$id,$objets){
if (preg_match(',[^\w],',$primary) OR preg_match(',[^\w],',$table_lien))
return false;
$retire = array();
foreach($objets as $objet => $id_objets){
if (!is_array($id_objets)) $id_objets = array($id_objets);
foreach($id_objets as $id_objet) {
$where = array();
if ($id AND $id!=='*')
$where[] = "$primary=".intval($id);
if ($objet AND $objet!=='*')
$where[] = "objet=".sql_quote($objet);
if ($id_objet AND $id_objet!=='*')
$where[] = "id_objet=".intval($id_objet);
sql_delete($table_lien, $where);
$retire[] = array('source'=>array($objet_source=>$id),'lien'=>array($objet=>$id_objet),'type'=>$objet,'id'=>$id_objet);
}
}
pipeline('trig_supprimer_objets_lies',$retire);
return ''; // pas d'erreur
}
/**
* Sous fonction qualification
* qui traite les liens pour un objet source dont la cle 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');
*
* @param string $objet_source
* @param string $primary
* @param sgring $table_lien
* @param int $id
* @param array $objets
* @param array $qualif
*/
function auteur_qualifier($objet_source,$primary,$table_lien,$id,$objets,$qualif){
if (preg_match(',[^\w],',$primary) OR preg_match(',[^\w],',$table_lien))
return false;
foreach($objets as $objet => $id_objets){
if (!is_array($id_objets)) $id_objets = array($id_objets);
foreach($id_objets as $id_objet) {
$where = array();
if ($id AND $id!=='*')
$where[] = "$primary=".intval($id);
if ($objet AND $objet!=='*')
$where[] = "objet=".sql_quote($objet);
if ($id_objet AND $id_objet!=='*')
$where[] = "id_objet=".intval($id_objet);
if ($c)
sql_updateq($table_lien,$qualif,$where);
}
}
}
?>
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter