Incohérence représentation intervallaire table assets

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Problème] Incohérence représentation intervallaire table assets

    Bonjour,

    J'ai découvert il y à peu la notion de représentation intervallaire d'un arbre de données en cherchant à comprendre les champs lft et rgt de la table assets.
    J'ai installé deux versions de joomla 3.4.3, un avec données d'exemple d'apprentissage en fr et l'autre sans données d'exemple.
    De là dans un but d'apprentissage j'ai voulu représenter graphiquement cet arbre a partir de la base de données avec un peu de php/html/css.
    Et là stupeur !!! sur les deux sites j'ai une erreur (ou alors j'ai pas compris) :
    Pour le site sans données d'exemple, j'ai le noeud feuille "com.user.category" au "level" 1 soit au niveau de son noeud parent "com.user".
    Pour le site avec données d'exemple, j'ai le noeud "com_messages" au meme niveau que "com_contact" jusque là normal mais la borne gauche du premier est supérieur a celle du second, et la borne droite du premier inferieure a celle du second !!!! bref ils se superposent dans l'arbre !

    Une image parlant mieux qu'un discours, voici le pb du site avec donnees d'example, les noeuds sont en rgba pour voir la(les) superposition :
    Cliquez sur l'image pour l'afficher en taille normale

Nom : donnees exemple apprentissage.jpg 
Affichages : 1 
Taille : 37,7 Ko 
ID : 1823428

    Mon code en question si vous voulez tester chez vous, à placer sur index.php choisir assets dans le formulaire (je suis pas dev donc indulgence éxigée )
    Code:
    <style type="text/css">
    	.wrapgraph{
    	background:pink;position:relative; overflow:auto;
    	}
    	.noeud{
    	position:absolute; height:199px; top:0; background-color:rgba(1,1,1,0.3); overflow:hidden; border-bottom:solid 1px black;
    	}
    	.nomnoeud{
    	transform-origin:0% 100%;transform: rotate(90deg); white-space:nowrap;
    	}
    	.grille{
    	position:absolute; background-color:white; border-left:solid 1px black; 
    	}
    	.niveau{
    	position:relative; height:200px
    	}
    	.numgrille{
    	position:relative; left:-5px; background-color:white; top:5px; margin:0; font-size:0.5em;
    	}
    </style>
    	
    
    <form method="post" action="index.php">
    	<select name="affichage" size="2">
    	<option value="normal" selected="selected">normal</option>
    	<option value="assets">assets</option>
    	</select>
    	<input type="submit" value="Valider" />
    </form>
    
    <?php if (isset($_POST['affichage']) AND $_POST['affichage'] == "assets") :?>
    	
    	<?php 
    	
    	$zoom=20;
    	
    	$db =& JFactory::getDBO();
    	
    	/////////////////////////////////////////////////////////////////////////////////*toutes les entrées*////////////////////////////////////////////////////////////////////////////
    	$totalquery = $db->getQuery(true);
    	$totalquery->select($db->quoteName(array('name','lft','rgt','level')));
    	$totalquery->from($db->quoteName('#__assets'));
    	$totalquery->order('level ASC');
    	$totalquery->order('lft ASC');
    	$db->setQuery($totalquery);
    	$tout = $db->loadObjectList();
    	
    	////////////////////////////////////////////////////////////////////////////////*nombre d'elements*//////////////////////////////////////////////////////////////////////////////
    	
    	$countelem = $totalquery;
    	$countelem->select('COUNT(*) AS nbrelem');
    	$db->setQuery($countelem);
    	$nbrelemresult = $db->loadObject();
    	$nbrelem = $nbrelemresult->nbrelem;
    	echo "nombre d'éléments : ".$nbrelem.'</br>';
    	
    	///////////////////////////////////////////////////////////////////////////////*le nombre de niveau distincts*/////////////////////////////////////////////////////////////////
    
    	$lvlquery = $totalquery;
    	$lvlquery->select('COUNT(DISTINCT level) AS total');
    	$db->setQuery($lvlquery);
    	$lvlresult = $db->loadObject();
    	$lvlnbr = $lvlresult->total;
    	echo 'nombre de niveaux : '.$lvlnbr.'</br>';
    	
    	/////////////////////////////////////////////////////////////////////////////*root*///////////////////////////////////////////////////////////////////////////////////////////
    	$rootquery = $db->getQuery(true);
    	$rootquery->select($db->quoteName(array('name','lft','rgt','level','title')));
    	$rootquery->from($db->quoteName('#__assets'));
    	$rootquery->where($db->quoteName('name')." = ". $db->quote('root.1'));
    	$db->setQuery($rootquery);
    	$rootnode = $db->loadObject();
    	$rootsize = $rootnode->rgt - $rootnode->lft;
    	?>
    	
    	
    	<div id="wrapgraph" class="wrapgraph">
    	
    	<?php for ($lvl=0; $lvl<$lvlnbr; $lvl++):?>
    	
    		<?php 
    		$queryz = $db->getQuery(true);
    		$queryz->select($db->quoteName(array('name','lft','rgt','level','title')));
    		$queryz->from($db->quoteName('#__assets'));
    		$queryz->where($db->quoteName('level')." = ". $lvl);
    		$queryz->order('lft ASC');
    		$db->setQuery($queryz);
    		$elems = $db->loadObjectList();
    		//var_dump($elems);
    		?>
    	
    		<div id="niveau<?php echo $lvl; ?>" class="niveau">
    		
    			<?php for ($col=0; $col<($rootsize+2); $col++):?>
    				<div class="grille" style="width:<?php echo $zoom-1; ?>px ; height:200px; left:<?php echo $col*$zoom ?>px"></div>
    			<?php endfor; ?>
    	
    			<?php foreach ($elems as $noeud) : ?>
    				<?php $width = ($noeud->rgt - $noeud->lft)*$zoom; ?>
    				<?php $left = $noeud->lft * $zoom; ?>
    				<div id="<?php echo $noeud->name; ?>" class="noeud" title="<?php echo $noeud->name.', borne gauche : '.$noeud->lft.', borne droite : '.$noeud->rgt;?>" style="left:<?php echo $left;?>px; width:<?php echo $width; ?>px;">
    					<p class="nomnoeud" style="margin-left:<?php echo $width/2-8; ?>px;"><?php echo $noeud->title; ?></p>
    				</div>
    			<?php endforeach; ?>
    			
    		</div>
    	
    	<?php endfor; ?>
    	
    	<div style="position:relative">
    	
    		<?php for ($col=0; $col<($rootsize+2); $col++):?>
    			<div class="grille" style="width:<?php echo $zoom-1; ?>px ; height:20px; left:<?php echo $col*$zoom ?>px;">
    			<p class="numgrille"><?php echo $col;?></p>
    			</div>
    		<?php endfor; ?>
    		
    	</div>
    
    	</div>
    	
    <?php endif; ?>

    Donc dès l'instal y'a des soucis dans cette table ou alors il faut que quelqu'un m'explique qlq chose qui a du m'eechapper.
    Si une âme charitable peut m'indiquer comment fonctionne les droits d'accès grâce à cette table je suis preneur aussi.

    Merci


    PS: j'ai reconstruit la base de données via le backend aucune modif...

  • #2
    Re : Incohérence représentation intervallaire table assets

    uP !
    Personne n'a d'idées sur la question ?

    Commentaire


    • #3
      Re : Incohérence représentation intervallaire table assets

      Salut

      Personnelement, je n'ai pas trop compris ton shema, mais c'est aussi un peu normal.
      Les bornes lft et rft.
      Pour qu'un element soit enfant d'un autre et permetre ainsi l'heritage, il faut que le lft enfant soit > lft parent et rgt enfant < rgt parent

      En pratique, chaque fois que tu rajoutes un composant, un groupe, etc... enormement d'indicateurs lft et rgt bougent.

      Du moins, c'est ce que j'ai compris.

      J'espere avoir repondu a ton bp.

      ++
      Wis


      Donc

      Commentaire


      • #4
        Re : Incohérence représentation intervallaire table assets

        Bonjour Wismer et merci de me répondre.

        Alors oui j'ai bien compris le fonctionnement de la représentation,
        Mon schéma et ma manière de l'obtenir n'étant pas assez explicite je vais y remedier :
        En gros je procède par niveau (champ level) et à chaque niveau j'empile les éléments par la droite, en fonction de leur borne gauche de manière croissante !
        Je reposte mon image avec le css un peu modif pour y voir plus clair.



        Ainsi sur mon schéma, on observe bien que com_messages est inclus dans com_contact, ce qui est forcément une erreur, la lft de com contact étant supérieur à celle de com_messages et sa lgt inférieure, com_messages devrait être enfant de com_contact ce qui ne devrait pas être le cas. Et même si ça l'était son niveau (champ level) ne devrait pas être le même...

        Sur mon autre instal sans données d'exemple c'est un autre problème, c'est le noeud "non categorisé" des catégories de notes qui est enfant du noeud com_users qui se trouve au même niveau alors qu'il devrait avoir un level+1 par rapport à com_users etant un enfant de celui ci...

        voici le shéma :

        J'espère que c'est un peu plus clair,
        Donc si dès l'instal de joomla y'a des incohérences, ca va poser bien poser un souci à un moment ou à un autre non ?

        Commentaire

        Annonce

        Réduire
        Aucune annonce pour le moment.

        Partenaire de l'association

        Réduire

        Hébergeur Web PlanetHoster
        Travaille ...
        X