[ Index ] |
|
Code source de SPIP Agora 1.4 |
1 <?php 2 /***************************************************** 3 * This file is part of Agora, web based content management system. 4 * 5 * Agora is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; version 2 of the License. 8 * 9 * Agora is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details (file "COPYING"). 13 * 14 * Copyright © Arnaud Martin, Antoine Pitrou et Philippe Rivière. 15 * List of authors detailed in "copyright_fr.html" file. 16 * E-mail : agora@sig.premier-ministre.gouv.fr 17 * Web site : http://www.agora.gouv.fr 18 *****************************************************/ 19 // Base class for any business persistence abstraction. 20 // $Id$ 21 22 require_once("PEAR.php"); 23 24 require_once (dirname(__FILE__). "/DBManager.php"); 25 require_once (dirname(__FILE__). "/../date.php"); 26 require_once (dirname(__FILE__). "/parameters.php"); 27 28 if (file_exists(dirname(__FILE__). "/../../mes_options.php")) { 29 require_once (dirname(__FILE__). "/../../mes_options.php"); 30 } 31 else { 32 $GLOBALS['table_prefix'] = 'spip'; 33 } 34 35 if (!file_exists(dirname(__FILE__). "/inc_config_metier.php")) { 36 require_once (dirname(__FILE__). "/inc_config_metier_install.php"); 37 } 38 else { 39 require_once (dirname(__FILE__). "/inc_config_metier.php"); 40 } 41 42 /** 43 * BD_metier is a base class for all business persistence abstraction implementations, and must be 44 * inherited by all such. 45 * @package BD 46 * @author Antoine Angenieux <aangenieux@clever-age.com> 47 * @author Erwan Le Bescond <elebescond@clever-age.com> 48 * @access public 49 */ 50 51 class BD_metier { 52 // {{{ properties 53 54 /** 55 * Parameters instance used for PEAR::DB factory and 56 * Metier subclasses factories. 57 * 58 * @access private 59 */ 60 var $_dbParameters; 61 62 /** 63 * DB options array used for PEAR::DB options. 64 * 65 * @access private 66 */ 67 var $_dbOptions = false; 68 69 /** 70 * DB_NestedSet tehcnical manipulation object 71 * @var DB_NestedSet_DB 72 * @access private 73 */ 74 var $_nestedSet; 75 76 var $nestedset_params = array('id_mot' => 'id', 'id_root' => 'rootid', 'l' => 'l', 'r' => 'r', 77 'streh' => 'norder', 'level_mot' => 'level', 78 /* Correction S.PETIT - omansour*/ 79 'titre' => 'name', 'descriptif' => 'descriptif', 'texte' => 'texte', 'extra' => 'extra', 80 'id_groupe' => 'id_groupe', 'type_mot' => 'type_mot' 81 /* fin correction */ 82 ); 83 84 var $nestedset_node_table; 85 86 var $nestedset_lock_table; 87 88 var $nestedset_sequence_table; 89 90 var $nestedset_secondary_sort = "titre"; 91 92 var $nestedset_debug = false; 93 94 // }}} 95 96 function BD_metier () { 97 $this->nestedset_node_table = $GLOBALS['table_prefix']. "_mots"; 98 $this->nestedset_lock_table = $GLOBALS['table_prefix']. "_lock_mots"; 99 } 100 // {{{ getDbParameters() 101 102 /** 103 * Getter method to retreive the instance Parameters object 104 * 105 * @return DB parameters 106 * @access public 107 */ 108 109 function getDbParameters () { 110 return $this->_dbParameters; 111 } 112 113 // }}} 114 115 // {{{ setDbParameters() 116 117 /** 118 * Setter method to set the instance Parameters object 119 * 120 * @param $dbParameters new DB parameters 121 */ 122 123 function setDbParameters ($dbParameters) { 124 if (strtolower(get_class($dbParameters)) == "bd_parameters") { 125 $this->_dbParameters = $dbParameters; 126 } 127 else { 128 return PEAR::raiseError( 129 "Erreur! le parametre de la methode setDbParameters doit etre un objet de la hierarchie DB_parameters !", 130 null, 131 null, 132 null, 133 null, 134 null, 135 false); 136 } 137 } 138 139 // }}} 140 141 // {{{ getDbParameters() 142 143 /** 144 * Getter method to retreive the instance Options array 145 * 146 * @return array 147 * @access public 148 */ 149 150 function getDbOptions () { 151 return $this->_dbOptions; 152 } 153 154 // }}} 155 156 // {{{ setDbOptions() 157 158 /** 159 * Setter method to set the instance Parameters object 160 * 161 * @param array array of PEAR::DB options 162 */ 163 164 function setDbOptions ($dbOptions) { 165 $this->_dbOptions = $dbOptions; 166 } 167 168 // }}} 169 170 // {{{ _traiteQuery() 171 172 /** 173 * This protected method is used to keep SPIP compatibility. 174 * This is the method where table prefixes must be handled. 175 * 176 * @param $query The SQL query that must be "SPIP"ed 177 * @return String representing the modified SQL query 178 * 179 */ 180 181 /* obsolete maintenant */ 182 183 function _traiteQuery ($query) { 184 if ($GLOBALS['mysql_rappel_connexion']AND $db = $this->_dbParameters->_dbName) { 185 $db = '`' . $db . '`.'; 186 } 187 188 // changer les noms des tables ($table_prefix) 189 if (eregi('[[:space:]](VALUES|WHERE)[[:space:]].*$', $query, $regs)) { 190 $suite = $regs[0]; 191 $query = substr($query, 0, -strlen($suite)); 192 } 193 194 $query = ereg_replace('([[:space:],])' . $GLOBALS['table_prefix']. '_', 195 '\1' . $db . $GLOBALS['table_prefix']. '_', 196 $query). $suite; 197 198 return $query; 199 } 200 201 // }}} 202 203 // {{{ _getDB() 204 205 /** 206 * Protected method used to get an PEAR::DB instance 207 * using the parameters stored in the _dbParameters field 208 * 209 * @return Newly creating PEAR::DB object 210 * according to the instance parameters 211 * @access private 212 */ 213 function &_getDB ($dbParameters = null) { 214 require_once("PEAR.php"); 215 216 if ($dbParameters == null) { 217 $DBManager = &DBManager::getDBManager($this->_dbParameters->getDSN(), $this->_dbOptions); 218 $db = $DBManager->getDB($this->_dbParameters->getDSN(), $this->_dbOptions); 219 } 220 else { 221 $DBManager = &DBManager::getDBManager($dbParameters->getDSN(), $this->_dbOptions); 222 $db = $DBManager->getDB($dbParameters->getDSN(), $this->_dbOptions); 223 } 224 225 return $db; 226 } 227 228 // }}} 229 230 // {{{ _getNestedSetInstance() 231 232 /** 233 * This method returns a configured ready-to-use DB_NestedSet/NestedSet instance 234 * 235 * @access private 236 * @return NestedSet instance 237 */ 238 239 function &_getNestedSetInstance () { 240 $db = &$this->_getDB(); 241 242 $this->nestedset_node_table = $GLOBALS['table_prefix']. "_mots"; 243 $this->nestedset_lock_table = $GLOBALS['table_prefix']. "_lock_mots"; 244 $this->nestedset_sequence_table = $GLOBALS['table_prefix']. "_mots"; 245 246 require_once dirname(__FILE__). "/NestedSetHelper/NestedSet.php"; 247 $nestedSet = &new NestedSetHelper_NestedSet($db, $this->nestedset_params); 248 249 $nestedSet->node_table = &$this->nestedset_node_table; 250 $nestedSet->lock_table = &$this->nestedset_lock_table; 251 $nestedSet->sequence_table = &$this->nestedset_sequence_table; 252 $nestedSet->secondarySort = &$this->nestedset_secondary_sort; 253 $nestedSet->debug = &$this->nestedset_debug; 254 255 return $nestedSet; 256 } 257 258 // }}} 259 260 // {{{ _pearIncluded() 261 262 /** 263 * Protected method used to check whether we are 264 * in the fast pear-less mode. 265 * 266 * @return true if PEAR has been included, false otherwise 267 * @access private 268 */ 269 function _pearIncluded () { 270 if (defined('PEAR_OS')) 271 return true; 272 else 273 return false; 274 } 275 276 // }}} 277 278 // {{{ 279 280 //C"est la copie de la methode de inc_filtres. A voir comment 281 //merger les deux (attention a la difference par rapport a la gestion des metas) 282 // Corrige les caracteres degoutants utilises par les Windozeries 283 function corriger_caracteres ($texte) { 284 static $trans; 285 286 if (!$trans) { 287 // 145,146,180 = simple quote ; 147,148 = double quote ; 150,151 = tiret long 288 $trans['iso-8859-1'] = array(chr(146)=> "'", chr(180)=> "'", chr(147)=> '“', chr(148)=> '”', 289 chr(150)=> '-', chr(151)=> '-', chr(133)=> '...'); 290 $trans['utf-8'] = array(chr(194). chr(146)=> "'", chr(194). chr(180)=> "'", chr(194). chr(147)=> '“', 291 chr(194). chr(148)=> '”', chr(194). chr(150)=> '-', chr(194). chr(151)=> '-', 292 chr(194). chr(133)=> '...'); 293 } 294 /* On utilise le cache des metas */ 295 global $meta; 296 297 if (isset($meta)) { 298 $charset = $meta['charset']; 299 } 300 else { 301 require_once (dirname(__FILE__). "/inc_meta_factory.php"); 302 $metaMetier = &recuperer_instance_meta(); 303 $loadOK = $metaMetier->load('charset'); 304 305 if (PEAR::isError($loadOK)) { 306 die ($loadOK->getMessage()); 307 } 308 $charset = $metaMetier->getValeur(); 309 } 310 311 if (!$trans[$charset]) 312 return $texte; 313 314 if ($GLOBALS['flag_strtr2']) 315 return strtr($texte, $trans[$charset]); 316 317 reset ($trans[$charset]); 318 319 while (list($from, $to) = each($trans[$charset])) 320 $texte = str_replace($from, $to, $texte); 321 322 return $texte; 323 } 324 325 // {{{ 326 327 function corriger_null ($texte) { 328 if (is_null($texte) || $texte == 'NULL') { 329 return ''; 330 } 331 else { 332 return $texte; 333 } 334 } 335 336 // }}} 337 338 // {{{ 339 340 /** Mise à jour en cascade des objets liés à celui-ci lors de changement de statut. 341 */ 342 function updateRelatedObjects () { 343 $rubriqueMetier = &recuperer_instance_rubrique(); 344 345 $parent_rubrique_updated = false; 346 347 // Changement de statut 348 if (count($this->_statutsHisto)) { // le statut a change 349 350 // -- Mise à jour de la rubrique contenant cet objet 351 $rubriqueMetier->load($this->getRubriqueId()); 352 $parent_rubrique_updated = $rubriqueMetier->checkStatutDateAndUpdate($rubriqueMetier->getRubriqueId()); 353 } 354 355 // Changement de date 356 if ((count($this->_datesHisto))and (!$parent_rubrique_updated)) { // la date a changee ... ok on la verifie 357 $rubriqueMetier->load($this->getRubriqueId()); 358 $dateCalcul = $rubriqueMetier->getDateFromRubrique($rubriqueMetier->getRubriqueId()); 359 $dateRubrique = new Date($rubriqueMetier->getDate()); 360 if (Date::compare($dateCalcul, $dateRubrique) != 0) { 361 $rubriqueMetier->setDate($dateCalcul->getDate()); 362 // $rubriqueMetier->update(); 363 $rubriqueMetier->update(); // va enclencher la recursivite 364 } 365 } 366 367 $rubriqueIds = array(); 368 // detection du changement de rubrique pour les objets différents des rubriques 369 $rubriqueIds[] = array(); 370 371 if (isset($this->_rubriqueIdsHisto)) { 372 $rubriqueIds = $this->getRubriqueIdsHisto(); 373 $rubriqueIds[] = $this->getRubriqueId(); 374 } 375 376 $rubriqueIds = array_unique($rubriqueIds); 377 378 // changement de rubriques 379 if (count($rubriqueIds) > 1) { // on a change de rubrique 380 // echo 'on a change de rubrique'; 381 foreach ($rubriqueIds as $rubId) { 382 $update = false; 383 $rubriqueMetier->load($rubId); 384 $update = $rubriqueMetier->checkStatutDateAndUpdate($rubriqueMetier->getRubriqueId()); 385 if ($update) { 386 // $rubriqueMetier->update(); 387 } 388 else { // update du parent mais .... pourquoi ? 389 if ($rubriqueMetier->getParentId() > 0) { 390 $rubriqueMetierParent = &recuperer_instance_rubrique(); 391 $rubriqueMetierParent->load($rubriqueMetier->getParentId()); // charge la rubrique parente 392 $rubriqueMetierParent->checkStatutDateAndUpdate($rubriqueMetier->getParentId()); 393 } 394 } 395 } 396 } 397 398 unset ($rubriqueMetier); 399 } 400 401 // }}} 402 403 // {{{ 404 405 /** Renvoie l'URL vers la page de l'objet 406 * @param bool $edit Url vers la page de consultation ($edit == false) ou d'édition ($edit == true) 407 * @return string 408 * @abstract Cette méthode doit être surchargée dans les classes descendantes de bd_metier. 409 */ 410 function getUrl ($edit = false) { 411 if (get_class($this) == 'bd_metier') { 412 trigger_error('Cette méthode doit être surchargée dans les classes descendantes de bd_metier.', 413 E_WARNING); 414 } 415 } 416 417 // }}} 418 419 // {{{ 420 421 function accept (&$renderer) { 422 $renderer->visit($this); 423 } 424 425 // }}} 426 427 // {{{ getChildObject($objectname) 428 /** 429 * @param string objectname 430 * @return object 431 * @abstract revoie un object métier selon le parametre passé - peut être appelé statiquement 432 */ 433 434 function getChildObject ($objectname) { 435 436 // les articles 437 if (strpos($objectname, 'article') !== false) { 438 include_once (dirname(__FILE__). '/inc_article_factory.php'); 439 $obj = &recuperer_instance_article(); 440 return $obj; 441 } 442 443 // les breves 444 if (strpos($objectname, 'breve') !== false) { 445 include_once (dirname(__FILE__). '/inc_breve_factory.php'); 446 $obj = &recuperer_instance_breve(); 447 return $obj; 448 } 449 450 // les rubriques 451 if (strpos($objectname, 'rubrique') !== false) { 452 include_once (dirname(__FILE__). '/inc_rubrique_factory.php'); 453 $obj = &recuperer_instance_rubrique(); 454 return $obj; 455 } 456 457 // les auteurs 458 if (strpos($objectname, 'auteur') !== false) { 459 include_once (dirname(__FILE__). '/inc_auteur_factory.php'); 460 $obj = &recuperer_instance_auteur(); 461 return $obj; 462 } 463 464 // les mots 465 if (strpos($objectname, 'mot') !== false) { 466 include_once (dirname(__FILE__). '/inc_mot_factory.php'); 467 $obj = &recuperer_instance_mot(); 468 return $obj; 469 } 470 471 // les sites 472 if ((strpos($objectname, 'site') !== false)or (strpos($objectname, 'syndic') !== false)) { 473 include_once (dirname(__FILE__). '/inc_syndic_factory.php'); 474 $obj = &recuperer_instance_syndic(); 475 return $obj; 476 } 477 478 // cas par défaut : 479 return PEAR::raiseError("impossible de créer un objet avec $objectname", null, null, null, null, null, false); 480 } 481 482 // {{{ ImportUpdate() 483 484 /** 485 * Replace one row in DB, used when importing xml data 486 * Called by inc_import.php 487 * @param array $from 488 * @param array $to 489 * @access public 490 * @return Boolean 491 */ 492 493 function ImportUpdate ($type, $from, $to) { 494 $db = &$this->_getDB(); 495 496 if (DB::isError($db)) { 497 spip_log ("Erreur 1 [" . get_class($this). " DB_metier : ImportUpdate()] " . $db->getMessage()); 498 return PEAR::raiseError("[" . get_class($this). " DB_metier : ImportUpdate()] " . $db->getMessage(). "", 499 null, 500 null, 501 null, 502 null, 503 null, 504 false); 505 } 506 507 $query = "REPLACE " . $GLOBALS['table_prefix']. "_$type (" . join(',', 508 $from). ') VALUES (' . join(',', $to). ')'; 509 $result = $db->query($query); 510 511 if (DB::isError($result)) { 512 spip_log 513 ("Erreur 2 [" . get_class( 514 $this). " DB_metier : ImportUpdate()] " . print_r($result, 1). ",query = $query"); 515 return PEAR::raiseError($result->getMessage(), null, null, null, null, null, false); 516 } 517 else { 518 return true; 519 } 520 } 521 // }}} 522 523 // {{{ Insert() 524 525 /** 526 * Insert rows in DB, used when importing xml data 527 * Called by inc_import.php 528 * @param string $from 529 * @param string $to 530 * @access public 531 * @return Boolean 532 * exemple INSERT INTO spip_articles_liens ($id, id_$type_lien) VALUES (1,2),(2,7) 533 */ 534 535 function Insert ($type, $from, $to) { 536 $db = &$this->_getDB(); 537 538 if (DB::isError($db)) { 539 spip_log ("Erreur 1 [" . get_class($this). " DB_metier : Insert()] " . $db->getMessage()); 540 return PEAR::raiseError("[" . get_class($this). " DB_metier : Insert()] " . $db->getMessage(). "", null, 541 null, null, 542 null, null, 543 false); 544 } 545 546 $query = "INSERT INTO " . $GLOBALS['table_prefix']. "_$type $from VALUES $to "; 547 $result = $db->query($query); 548 549 if (DB::isError($result)) { 550 spip_log 551 ("Erreur 2 [" . get_class($this). " DB_metier : Insert()] " . $result->getMessage(). ",query = $query"); 552 return false; 553 } 554 else { 555 return true; 556 } 557 } 558 // }}} 559 // }}} 560 } 561 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sat Feb 24 14:40:03 2007 | par Balluche grâce à PHPXref 0.7 |