Source for file class.entities.php
Documentation is available at class.entities.php
* LODEL - Logiciel d'Edition ELectronique.
* Home page: http://www.lodel.org
* E-Mail: lodel@lodel.org
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* @author Ghislain Picard
* @copyright 2001-2002, Ghislain Picard, Marin Dacos
* @copyright 2003, Ghislain Picard, Marin Dacos, Luc Santeramo, Nicolas Nutten, Anne Gentil-Beccot
* @copyright 2004, Ghislain Picard, Marin Dacos, Luc Santeramo, Anne Gentil-Beccot, Bruno Cénou
* @copyright 2005, Ghislain Picard, Marin Dacos, Luc Santeramo, Gautier Poupeau, Jean Lamy, Bruno Cénou
* @copyright 2006, Marin Dacos, Luc Santeramo, Bruno Cénou, Jean Lamy, Mikaël Cixous, Sophie Malafosse
* @copyright 2007, Marin Dacos, Bruno Cénou, Sophie Malafosse, Pierre-Alain Mignot
* @licence http://www.gnu.org/copyleft/gpl.html
* @since Fichier ajouté depuis la version 0.8
* @version CVS:$Id: class.entities.php 4006 2007-10-05 11:53:41Z malafosse $
* Classe de logique des entités
* @author Ghislain Picard
* @copyright 2001-2002, Ghislain Picard, Marin Dacos
* @copyright 2003, Ghislain Picard, Marin Dacos, Luc Santeramo, Nicolas Nutten, Anne Gentil-Beccot
* @copyright 2004, Ghislain Picard, Marin Dacos, Luc Santeramo, Anne Gentil-Beccot, Bruno Cénou
* @copyright 2005, Ghislain Picard, Marin Dacos, Luc Santeramo, Gautier Poupeau, Jean Lamy, Bruno Cénou
* @copyright 2006, Marin Dacos, Luc Santeramo, Bruno Cénou, Jean Lamy, Mikaël Cixous, Sophie Malafosse
* @copyright 2007, Marin Dacos, Bruno Cénou, Sophie Malafosse, Pierre-Alain Mignot
* @licence http://www.gnu.org/copyleft/gpl.html
* @since Classe ajouté depuis la version 0.8
* generic equivalent assoc array
$this->Logic("entities");
* @param array &$context le contexte passé par référence
* @param array &$error le tableau des erreurs éventuelles passé par référence
die("EntitiesLogic::viewAction");
* Changement du rang d'un objet
* @param array &$context le contexte passé par référence
* @param array &$error le tableau des erreurs éventuelles passé par référence
$vo = $dao->getById($id,"idparent");
$this->_changeRank($id,$context['dir'], "status<64 AND idparent='". $vo->idparent. "'");
* Ajout d'un nouvel objet ou Edition d'un objet existant
* Cette méthode est abstraite ici. On utilise die() pour simuler le fonctionnement
* d'une méthode abstraite.
* @param array &$context le contexte passé par référence
* @param array &$error le tableau des erreurs éventuelles passé par référence
die("EntitiesLogic::editAction");
* Opérations de masse : suppression massive, publication ou dépublication massive
* @param array &$context le contexte passé par référence
* @param array &$error le tableau des erreurs éventuelles passé par référence
if (!$context['entity']) {
$context['id'] = array();
$context['id'][] = intval($id);
if ($context['delete']) {
} elseif ($context['publish']) {
} elseif ($context['unpublish']) {
* @param array &$context le contexte passé par référence
* @param array &$error le tableau des erreurs éventuelles passé par référence
// get the entities to modify and ancillary information
if (!rightonentity("delete",$context)) die("ERROR: you don't have the right to perform this operation");
$this->_getEntityHierarchy($context['id'],"write","",$ids,$classes,$softprotectedids,$lockids);
die("ERROR: some entities are locked in the family. No operation is allowed");
if (!$context['confirm'] && $softprotectedids) {
$context['softprotectedentities'] = $softprotectedids;
// delete all the entities
$dao->deleteObject($ids);
// delete in the joint table
// delete other relations
// delete the entity from the search_engine table
* Publication ou dépublication d'une entité
* Change le status de l'entité à 1 (publication) ou -1 (dépublication).
* Ne modifie pas les entités dont le status est inférieur ou égal à -8
* @param array &$context le contexte passé par référence
* @param array &$error le tableau des erreurs éventuelles passé par référence
$status = intval ($context['status']);
die ("error in publishAction");
if (!rightonentity ($status > 0 ? 'publish' : 'unpublish', $context)) {
die ("ERROR: you don't have the right to perform this operation");
// get the entities to modify and ancillary information
$access = abs ($status) >= 32 ? 'protect' : 'write';
$this->_getEntityHierarchy($context['id'], $access,"#_TP_entities.status>-8", $ids, $classes, $softprotectedids, $lockedids);
if ($lockedids && $status < 0) {
die("ERROR: some entities are locked in the family. No operation is allowed");
// depublish protected entity ? need confirmation.
if (!$context['confirm'] && $status < 0 && $softprotectedids) {
$context['softprotectedentities'] = $softprotectedids;
return 'unpublish_confirm';
$criteria= " id IN (". join(",", $ids). ')';
// mais attention, il ne faut pas reduire le status quand on publie
$criteria.= " AND status < '$status'";
//mise à jour des entités
$db->execute(lq("UPDATE #_TP_entities SET status=$status WHERE ". $criteria)) or dberror();
// check if the entities have an history field defined
//mise à jour des personnes et entrées liées à ces entités
* Suppressions des relations entre une entité et des persons et des entries
* Dans la table relations, le champ nature = G ou E (G = gens, E=entrées)
* @param array $ids les identifiants numériques des entités
// most of this should be transfered in the entries and persons logic
$result = $db->execute(lq("SELECT idrelation,nature FROM #_TP_relations WHERE $criteria AND nature IN ('G','E')")) or dberror();
$nature = $result->fields['nature'];
$idrelation[$nature][] = $result->fields['idrelation'];
// select all the items not in entities_$table
// those with status<=1 must be deleted
// thise with status> must be depublished
$idlist= join(",",$idrelation[$nature]);
$table= $nature== 'G' ? "persons" : "entries";
$db->execute(lq("DELETE FROM #_TP_relations WHERE idrelation IN (". $idlist. ")")) or dberror();
$result= $db->execute(lq("SELECT id,status FROM #_TP_$table LEFT JOIN #_TP_relations ON id2=id WHERE id1 is NULL")) or dberror();
if (abs($result->fields['status'])== 1) {
$idstodelete[]= $result->fields['id'];
$idstounpublish[]= $result->fields['id'];
$localcontext= array("id"=> $idstodelete,"idrelation"=> $idrelation[$nature]);
$logic->deleteAction($localcontext,$localerror);
// should be in $table dao or logic
$db->execute(lq("UPDATE #_TP_$table SET status=-abs(status) WHERE id IN (". join(",", $idstounpublish). ") AND status>=32")) or dberror();
* Mise à jour du status des objets liées (liaisons 'soft', c'est à dire des personnes
* ou des entrées d'index.
* Lors d'une publication c'est simple, le status des entrées ou personnes liées à l'entité
* est mis à +32 ou +1 suivant si l'entrée ou la personne est permanente.
* Lors d'une dépublication, c'est plus compliqué, il ne faut pas toucher aux entrées qui ont
* publiées par d'autres entités. Ensuite de la même manière le status est mis à -32 ou -1
* @param array les identifiants
* @param integer le status de l'entité concernée ou des entités concernées
$criteria = "id1 IN (". join(",", $ids). ")";
$status = $status > 0 ? 1 : - 1; // dans les tables le status est seulement a +1 ou -1
$result = $db->execute(lq("SELECT id2,nature FROM #_TP_relations WHERE nature IN ('E','G') AND ". $criteria)) or dberror();
$ids[$result->fields['nature']][$result->fields['id2']] = true;
return; // get back, nothing to do
$table = $nature == 'G' ? 'persons' : 'entries';
//------- PUBLISH ---------
// simple : on doit mettre le status à positif : +32 ou +1 si l'entree ou la personne
$db->execute(lq("UPDATE #_TP_$table SET status=abs(status) WHERE id IN ($idlist)")) or dberror();
//------- UNPUBLISH ---------
// plus difficile. On vérifie si les entries ou persons sont attachés à des entités publiées.
$result = $db->execute(lq("SELECT id1,id2 FROM #_TP_relations INNER JOIN #_TP_entities ON id1=id WHERE #_TP_entities.status>0 AND id2 IN (". $idlist. ") AND nature='". $nature. "' GROUP BY id2")) or dberror();
unset ($ids[$nature][$result->fields['id2']]); // remove the id from the list to unpublish
// dépublie les entrées ou personnes qui n'ont pas été publiés par d'autres entités :
$db->execute(lq("UPDATE #_TP_$table SET status=-abs(status) WHERE id IN ($idlist)")) or dberror();
* Récupère une entité et tous ses fils
* Récupère une entité et tous ses fils pour une opération donnée et par accès.
* On obtiens une liste d'identifiant, d'entité protégés et les classes auxquelles elles
* @param integer $id Identifiant de l'entité
* @param string $access l'accès
* @param string $criteria les critères de sélections
* @param array &$ids les identifiants des fils et de l'entité, tableau passé par référence
* @param array &$classes les classes des differentes entités de $ids, tableau passé par
* @param array &$softprotectedids les entités protégés de $ids, tableau passé par référence
* @param array &$lockedids les entités verrouillées de $ids, tableau passé par référence
function _getEntityHierarchy($id, $access, $criteria, &$ids, &$classes, &$softprotectedids, &$lockedids)
// check the rights to $access the current entity
$hasrights= "(1 ". $dao->rightsCriteria($access). ") as hasrights";
// get the central object
$criteria= " AND ". $criteria;
$result = $db->execute(lq("SELECT #_TP_entities.id,#_TP_entities.status,$hasrights,class FROM #_entitiestypesjoin_ WHERE #_TP_entities.id ". sql_in_array($id). $criteria));
$softprotectedids = array();
if (!$result->fields['hasrights']) trigger_error("This object is locked. Please report the bug",E_USER_ERROR);
if ($result->fields['id']> 0) $ids[]= $result->fields['id'];
$classes[$result->fields['class']]= true;
if ($result->fields['status']>= 8) $softprotectedids[]= $result->fields['id'];
if ($result->fields['status']>= 16) $lockedids[]= $result->fields['id'];
// check the rights to delete the sons and get their ids
// criteria to determin if one of the sons is locked
$result = $db->execute(lq("SELECT #_TP_entities.id,#_TP_entities.status,$hasrights,class FROM #_entitiestypesjoin_ INNER JOIN #_TP_relations ON id2=#_TP_entities.id WHERE id1 ". sql_in_array($id). " AND nature='P' ". $criteria)) or dberror();
if (!$result->fields['hasrights']) trigger_error("This object is locked. Please report the bug",E_USER_ERROR);
if ($result->fields['id']> 0) $ids[]= $result->fields['id'];
$classes[$result->fields['class']]= true;
if ($result->fields['status']>= 8) $softprotectedids[]= $result->fields['id'];
if ($result->fields['status']>= 16) $lockedids[]= $result->fields['id'];
function loop_protectedentities($context,$funcname) {
$result= $db->execute(lq("SELECT * FROM #_TP_entities WHERE id ". sql_in_array($context['softprotectedentities']))) or dberror();
// begin{publicfields} automatic generation //
* Retourne la liste des champs publics
|