/**
* Property Types table class
*/
class mosHPPropTypes extends mosDBTable {
var $id=null;
var $parent=null; // id parent
var $name=null;
var $desc=null;
var $published=null;
var $ordering=null;
var $lft=null; // Borne gauche
var $rgt=null; // Borne droite
function mosHPPropTypes( &$db ) {
$this->mosDBTable( '#__hp_prop_types', 'id', $db );
}
/**
* Ajout d'une catégorie
* -> http://sqlpro.developpez.com/cours/arborescence/#L2.11
* ---------------------------------------------------------------
* [@param] $included=true/false : catégorie incluse ou non
*/
function addType() {
global $database;
# On charge le père:
$parent = new mosHPPropTypes($database);
$parent->load($this->parent);
# Tous les éléments à droite du père(lui compris) sont incrémentés de 2 pour laisser la place à la nouvelle catégorie(cf. http://sqlpro.developpez.com/cours/arborescence/images/SQLtree3.gif)
$this->_db->setQuery("UPDATE #__hp_prop_types SET lft = lft+2 WHERE lft >= $parent->rgt");
if (!$this->_db->query()) {
echo "\n";
return false;
}
$this->_db->setQuery("UPDATE #__hp_prop_types SET rgt = rgt+2 WHERE rgt >= $parent->rgt");
if (!$this->_db->query()) {
echo "\n";
return false;
}
# On insère la catégorie à droite
$this->_db->setQuery("UPDATE #__hp_prop_types SET lft = ".$parent->rgt.", rgt = ".($parent->rgt+1)." WHERE id = $this->id");
if (!$this->_db->query()) {
echo "\n";
return false;
}
$this->lft = $parent->rgt;
$this->rgt = $parent->rgt+1;
return true;
}
/**
* Retourne une liste d'objets de tous les parents
* -> http://sqlpro.developpez.com/cours/arborescence/#L2.7
* ---------------------------------------------------------------
* [@param] $included=true/false : catégorie incluse ou non
* [@param] $order="ASC"/"DESC" : trier la liste par 'lft' croissant/décroissant
*/
function parentsType($included=true, $order=null)
{
if(isset($order))
$order=" ORDER BY lft ".$order;
($included) ? $query="SELECT * FROM #__hp_prop_types WHERE lft <= $this->lft AND rgt >= $this->rgt".$order
: $query="SELECT * FROM #__hp_prop_types WHERE lft < $this->lft AND rgt > $this->rgt".$order;
$this->_db->setQuery($query);
if (!$this->_db->query())
{
echo "\n";
return false;
}
return $this->_db->loadObjectList();
}
/**
* Retourne une liste d'objets de toutes les catégories directement enfants
* ---------------------------------------------------------------
* [@param] $published=1/0 : précision optionnelle quant à l'état(publié/non-publié) des catégories
*/
function childrenType($published=null)
{
if(isset($published))
$where=" AND published=".$published;
$query = "SELECT * FROM #__hp_prop_types WHERE parent=".$this->id."".$where;
$this->_db->setQuery($query);
if (!$this->_db->query())
{
echo "\n";
return false;
}
return $this->_db->loadObjectList();
}
/**
* Retourne une liste d'objets de toutes les catégories enfants
* -> http://sqlpro.developpez.com/cours/arborescence/#L2.5
* ---------------------------------------------------------------
* [@param] $included=true/false : catégorie incluse ou non
* [@param] $published=1/0 : précision optionnelle quant à l'état(publié/non-publié) des catégories
*/
function childrenType_R($included=true, $published=null)
{
if (isset($published))
$where=" AND published=".$published;
($included) ? $query="SELECT * FROM #__hp_prop_types WHERE lft >= $this->lft AND rgt <= $this->rgt".$where
: $query="SELECT * FROM #__hp_prop_types WHERE lft > $this->lft AND rgt < $this->rgt".$where;
$this->_db->setQuery($query);
if (!$this->_db->query())
{
echo "\n";
return false;
}
return $this->_db->loadObjectList();
}
/**
* Nombre de catégories directement enfants
* ---------------------------------------------------------------
* [@param] $published=1/0 : précision optionnelle quant à l'état(publié/non-publié) des catégories
*/
function countChildrenType($published=null)
{
return count($this->childrenType($published));
}
/**
* Nombre de catégories enfants(en Récursif)
* ---------------------------------------------------------------
* [@param] $included=true/false : catégorie incluse ou non
* [@param] $published=1/0 : précision optionnelle quant à l'état(publié/non-publié) des catégories
*/
function countChildrenType_R($included=true, $published=null)
{
return count($this->childrenType_R($included, $published));
}
/**
* Nombre de propriétés
* ---------------------------------------------------------------
* [@param] $published=1/0 : précision optionnelle quant à l'état(publié/non-publié) des propriétés
*/
function countProps($published=null)
{
if(isset($published))
$where=" AND published=".$published;
$this->_db->setQuery("SELECT COUNT(id) FROM #__hp_properties WHERE type=$this->id".$where);
if (!$this->_db->query())
{
echo "\n";
return false;
}
return $this->_db->loadResult();
}
/**
* Nombre de propriétés en Récursif
* ---------------------------------------------------------------
* [@param] $included=true/false : catégorie incluse ou non
* [@param] $published=1/0 : précision optionnelle quant à l'état(publié/non-publié) des propriétés
* [@param] $forced=true/false : forcer le comptage des sous-propriétés au travers d'une catégorie qui n'est pas dans le même état que $published(bon ca n'a pas tellement de sens de forcer le comptage les propriétés dépubliées au travers des catégories publiées mais bon...l'inverse n'est pas vrai, et puis ca fait style d'expliquer des choses qui n'ont pas de sens :p)
*/
function countProps_R($included=true, $published=null, $forced=true)
{
global $database;
$s=0;
foreach($this->childrenType_R($included, $published) as $child)
{
$row = new mosHPPropTypes($database);
$row->load($child->id);
if(!$forced && isset($published))
{ # Afin de ne pas comptabiliser les sous-propriétés d'une catégorie (!$published)ée...
$court_circuit=false;
foreach($row->parentsType() as $parent)
{
# ...On remonte la hiérarchie, voir si aucun de ses parents ne serait (!$published)é
if($parent->published != $published)
{
$court_circuit=true;
break;
}
}
if(!$court_circuit)
$s += $row->countProps($published);
}
else
{
$s += $row->countProps($published);
}
}
return $s;
}
/**
* Suppression d'une catégorie
* -> http://sqlpro.developpez.com/cours/arborescence/#L2.12
* ---------------------------------------------------------------
*/
function deleteType()
{
# On s'assure qu'il s'agit d'une feuille:
if( $this->rgt - $this->lft <= 1 )
{
# On la supprime:
$this->_db->setQuery("DELETE FROM #__hp_prop_types WHERE lft = $this->lft");
if (!$this->_db->query())
{
echo "\n";
return false;
}
# On re-numérote la partie droite de l'arbre:
$this->_db->setQuery("UPDATE #__hp_prop_types SET lft = lft-2 WHERE lft >= $this->lft");
if (!$this->_db->query())
{
echo "\n";
return false;
}
$this->_db->setQuery("UPDATE #__hp_prop_types SET rgt = rgt-2 WHERE rgt >= $this->rgt");
if (!$this->_db->query())
{
echo "\n";
return false;
}
# On supprime les associations liées à cette catégorie:
$this->_db->setQuery("DELETE FROM #__hp_prop_ef2 WHERE type = $this->id");
if (!$this->_db->query())
{
echo "\n";
return false;
}
return true;
}
else
{
return false;
}
}
/***
* Déplacement d'une catégorie vers le parent d'id $cid
*/
function moveType($cid)
{
global $database;
$new_parent = new mosHPPropTypes( $database );
$new_parent->load($cid);
$nbr_subcats=count($this->childrenType_R());
#la largeur du bloc de catégories à déplacer:
$inc=$new_parent->rgt - $this->lft;
# Déplacement vers la droite
if ( $this->rgt < $new_parent->rgt ) {
# En gros: on fait de la place!
# Toutes les catégories à droite du nouveau père(lui compris) sont incrémentées de 2 fois le nombre de sous catégories de la catégorie mouvante pour leur faire la place
$this->_db->setQuery("UPDATE #__hp_prop_types SET lft = lft+".(2*$nbr_subcats)." WHERE lft >= $new_parent->rgt");
$this->_db->query();
$this->_db->setQuery("UPDATE #__hp_prop_types SET rgt = rgt+".(2*$nbr_subcats)." WHERE rgt >= $new_parent->rgt");
$this->_db->query();
# En gros: on déplace!
# on les translate de $inc vers la droite, pour qu'ils soient tout a droite du nouveau parent
$this->_db->setQuery( "UPDATE #__hp_prop_types SET lft = lft + $inc, rgt = rgt + $inc WHERE lft >= $this->lft AND rgt <= $this->rgt" );
$this->_db->query();
# En gros on rebouche!
# on comble le vide créé par le déplacement
$this->_db->setQuery("UPDATE #__hp_prop_types SET lft = lft-".(2*$nbr_subcats)." WHERE lft >= $this->lft");
$this->_db->query();
$this->_db->setQuery("UPDATE #__hp_prop_types SET rgt = rgt-".(2*$nbr_subcats)." WHERE rgt >= $this->rgt");
$this->_db->query();
}
# Déplacement vers la gauche
else
{
# On fait de la place:
$this->_db->setQuery("UPDATE #__hp_prop_types SET lft = lft+".(2*$nbr_subcats)." WHERE lft >= $new_parent->rgt");
$this->_db->query();
$this->_db->setQuery("UPDATE #__hp_prop_types SET rgt = rgt+".(2*$nbr_subcats)." WHERE rgt >= $new_parent->rgt");
$this->_db->query();
# On déplace:
$this->_db->setQuery( "UPDATE #__hp_prop_types SET lft = lft +($inc - ".(2*$nbr_subcats)."), rgt = rgt +($inc - ".(2*$nbr_subcats).") WHERE lft >= ($this->lft + ".(2*$nbr_subcats).") AND rgt <= ($this->rgt + ".(2*$nbr_subcats).")" );
$this->_db->query();
# On rebouche:
$this->_db->setQuery("UPDATE #__hp_prop_types SET lft = lft-".(2*$nbr_subcats)." WHERE lft >= $this->lft + ".(2*$nbr_subcats));
$this->_db->query();
$this->_db->setQuery("UPDATE #__hp_prop_types SET rgt = rgt-".(2*$nbr_subcats)." WHERE rgt >= $this->rgt + ".(2*$nbr_subcats) );
$this->_db->query();
}
}
}