Struttura Gerarchica

nel database ho una tabella per gestire delle cartelle ( senza che esistano ,infatti uppero tutto nel db ed assegnerò poi un id di cartella ed uno di sotto cartella )

in pratica vorrei creare una select che mi gestisse le cartelle figlie in questo modo :

did   name             child     pid

1   RevokeBB        0           1

2   Skins               1           1

3   Default skin     2           1

quindi ho una dir principale che è revokebb una figlia che è skins e la figlia della figlia che è default skin vorrei che nella select ci fosse:

RevokeBB

--Skins

----Default Skins

come posso fare?

PS : select intesa come <select><option></option></select> :)

 :bye:

inviato 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Il problema è più complesso di quello che sembra. Ti consiglio di leggere questo articolo che ti mostra anche i limiti di questo approccio alle strutture gerarchiche:

http://database.html.it/articoli/leggi/926/le-strutture-gerarchiche-su-database/

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

devo affrontare il problema con l'approccio Modified Preorder Tree Traversal Algorithm ?

la mia struttura di cartelle corrrente è :

CREATE TABLE  `cvs`.`dirs` (
  `did` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(128) NOT NULL default '',
  `child` int(10) unsigned NOT NULL default '0',
  `pid` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`did`)
) ENGINE=MyISAM

quindi dovrei aggiungere due campi e poi eseguire il secondo metodo proposto in quell'articolo?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Devi scegliere tu  :dunno:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

si credo che userò questo metodo , sperando che mi aiuti a risolvere il mio problema :D

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

mi sà che dovrò trovarmi un sistema alternativo :D

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

:(                     function ChildList(){                                                                                                    $query = "SELECT `did`,`name`,`parent`,`node` FROM `dirs` ORDER BY `pid` DESC";                            $exec  = mysql_query($query);                                                              echo '<optgroup label="Crea in">';                                                  while($_RESULT = mysql_fetch_array($exec)){                                                  if($_RESULT['parent'] == 0 && $_RESULT['node'] == 1){                                                     $NODE = TRUE;                                                        $dash = '';                                                        }elseif($_RESULT['parent'] != 0 && $_RESULT['node'] == 0){                                                           $NODE = FALSE;                               $dash = '----';                                                              }elseif($_RESULT['parent'] != 0 && $_RESULT['node'] != 0){                                                                                                $NODE = TRUE;                                  $dash = '--';                                                                    }                                                        echo '<option value="' . $_RESULT['did'] . '">' . $dash . $_RESULT['name'] . '</option>' . "\n\t\t";                                                     }                                                        echo '</optgroup>';

                                                 }

in questo modo sono riuscito a gestire solo:

-CARTELLA

--SOTTOCARTELLA

----ALTRA SOTTO CARTELLA

è limitato :(

vorrei fare un controllo ( ho aggiunto il campo NODE nel db che è 1 o 0; 1 se la cartella è un NODO, 0 se non lo è ) sui nodi e vedere se :

-è nodo o no

-controllare se questo nodo ha cartelle figlio

-controllare se le cartelle figlio hanno sono nodi

ed assegnare un numero di dash ( - ) in questo modo :

principale :

sottodir : --

nodo sottodir : ---

sottocartella nodo : ----

insomma un numero significativo di dash per dare 'profondità' alla struttura di cartelle

help  :-[

CREATE TABLE  `dirs` (
  `did` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(128) NOT NULL default '',
  `parent` int(10) unsigned NOT NULL default '0',
  `pid` int(10) unsigned NOT NULL default '0',
  `node` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`did`)
) ENGINE=MyISAM;

 :bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

gianni ho bisogno di un aiutino :

ho una funzione che dovrebbe estrarre tutti i valori aventi come papà l'id di una cartella e se ne hanno settare l'id del papà (:2funny:) con node=1

come posso fare?

sarebbe una specie di funzione riparatrice

PS: per creare la profondità si potrebbe controllare il valore di NODE in modo da aggiungere 1 al nodo del nodo ex:

cartella nodo 1

----- sotto cartella

-----sottocartella nodo 2

--------sotto cartella

--------sotto cartella nodo 3

--------------sotto cartella

e moltiplicare il numero di dash con quello del nodo :D

se mi riesci ad aiutare a sviluppare una funzione che lo faccia ti sposo :D

e poi magari modificare la funzione che assegna i nodi per assegnare il +1 ai sotto nodi :)

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
modificato 10 anni fa
X 0 X

mi dici se mi puoi aiutare così  nel caso , aspetto?? :P

 :bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

E' una cosa complessa, non sono in grado di aiutarti semplicemente guardando il codice  :dunno:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

come posso fare per farmi aiutare gianni?

posso mandarti il file con le funzioni o cmq mi servirebbe una funzione che guardasse nella tabella   e cerchi tutti i record che sono sotto ad un altro e aggiungere 1 al campo node e salvi :D in modo da poter così gestire la formattazione nell'html :D

una specie di spider per la tabella :

cerca e controlla se PARENT corrisponde all'ID di un record al record incriminato setta NODE+1 ( default 0)

cartella (0)

cartella (0)

cartella (1) - NODO principale

cartella (1) - sotto cartella del nodo

cartella (1) - sotto cartella del nodo

cartella (2) - NODO della sotto cartella ( sotto ci sono sotto cartelle )

cartella (2) - sotto cartella del nodo

cartella (3) - NODO della sotto cartella

cartella (2) - ritorno sopra di una cartella

cartella (2) - sottocartella del nodo 2

cartella (0) - cartella nella root

cartella (0) - cartella nella root

cartella (1) - NODO PRINCIPALE  - no sotto cartelle

così dovrebbe cercare di controllare l'id della cartella genitore e settare il  della cartella figlia a nodegenitore+1

aiutooooooooooooooooooo

sono confuso

stupide strutture gerarchiche

mi serve solo per rendere leggibile la struttura delle cartelle nella pagina

 :bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
modificato 10 anni fa
X 0 X

non ho dormito stanotte ... alle 5 mi sono messo a leggere il mio libro di php

arrivo al capitolo che parla di xml...e mi viene l'idea

dato che DB nn sanno gestire le gerarchie .... non potrei fare uno scriptino che me le salva in un documento xml e poi le riprende oppure usare un documento xml per dare la "forma" alla gerarchia nel database ?

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Dipende dalla dimensione della struttura gerarchica.

Se devi maneggiare moltissimi nodi, con l'approccio basato su database te la cavi sempre con un numero di query limitato. Con un file XML invece sei costretto a leggerlo sempre dall'inizio e se questo è molto grande le prestazioni ne risentono.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

mh si ma su database non so come gestirli , e nel file xml - credo - sia più semplice :) in quanto è già strutturato in nodi allora potrei fare

<root>

  <parent name="layout">

      <child>CSS</child>

       <child>images</child>

     </parent>

    <parent name="includes">

      <child>config</child>

       <child>class</child>

       </parent>

</root>

cmq non credo di dover gestire più di una cinquantina di cartelle quindi le prestazioni non dovrebbero risentirne molto , riusciamo a mettere su uno scriptino che le gestisca in questo modo?

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

be, se sono solo 50 non credo che si verificheranno problemi di prestazioni

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

posso anche gestire

<parent name="hihih">

  <parent name="lol">

      <child>asd</child>

  </parent>

<parent name="aaa">

 <child>aaa</child>ù

</parent>

</parent>

riescirò a gestire le sotto cartelle con xml?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

La struttura dell'XML la decidi tu. Essendo (l'XML) un formato "ad albero" si adatta bene alla struttura del file system.

Poiché sarai tu a dover codificare-decodificare le informazioni all'interno dell'XML ti conviene usare una struttura facile da trattare.

Potenza di PHP5 (e ce ancora chi non è convinto...):

<?php
function ricorsione($it, &$XML) {
   foreach( $it as $file ) {
      if( $file->hasChildren() ) {
         $XML .= "<dir name=\"$file\">\n";
         ricorsione( $file->getChildren(), &$XML);
         $XML .= "</dir>\n";
      }
      else {
         $XML .= "<file>$file</file>\n";
      }
   }
}

$it = new RecursiveDirectoryIterator( 'C:\\percorso\\' );
$XML = '';
ricorsione($it, &$XML);
$XML = "<root>\n$XML</root>";


$xml_ob = simplexml_load_string($XML);
print_r($xml_ob)
?>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

eheheh tanto dovra girare solo sul mio server :D quindi php5 non è un prob.

lo so che è potente :)

grazie

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Gianni secondo te riuscirò a collegare l'id di un file all'id di una cartella ( i file sono nel DB , le cartelle nel file xml )

a me il file xml - per prima cosa - mi server per mostrare le cartelle con la loro gerarchia ,per renderle "capibili" dall'utente, poi magari nel db possono anche essere "piatte" ma basta che ci sono in modo da collegare il file all'id della cartella :D

:D

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
modificato 10 anni fa
X 0 X

Nel DB potresti memorizzare il path di cascun file. Con questo percorso potresti esplorare il file XML.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

no :D i file sono completamente nel database ... dovrei al max collegare l'id della cartella ad un file in modo da "inserire" ( virtualmente ) i file in quella cartella , spero di essermi spiegato :)

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

mhh pensavo ad una cosa del genere :

file xml con le cartelle per gestire la gerarchia ( insomma per mostrarle con una struttura ad albero )

le cartelle ( id , nome ) nel database

file ( id , data , nome , cartella ) nel database

cioè il file xml dovrà dare "profondità" alla struttura delle cartelle e poi nel file xml metto gli id dei file ( ma mi sembra troppo incasinato )

pensavo a

<parent name="lol">

  <child name="asd">

     <file id="1"></file>

     <file id="2"></file>

   </child>

  <file id="3"></file>

   <parent name="...">

     <child name="fg">

     <file id="5"></file

    </child>

 </parent>

</parent>

così nel file xml metto l'id del file .... ma non mi piace molto mischiare DB e XML ... troppo lavoro per trovare l'id e mostrare il nome ( vero ? )

un'alternativa

[struttura xml]

uno script legge il file xml e aggiorna i dati nella tabella delle cartelle in modo da settare gli id e i parentid come sono settati nel file xml ( sembra la via + ovvia . ma la + complicata ) e così evito di mettere l'id dei file nell'xml

oddio che macellooooo  :P

 :bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

infatti, se metti nel file XML solo l'id del file sarai costretto ogni volta a fare una ricerca per trovare la cartella di appartenenza.

Invece prima ti suggerivo di inserire nel DB, oltre al file vero e proprio, anche l'indicazione del suo percorso. In questo modo hai due vantaggi: sarà facile trovare tutti i file presenti in una cartella (basta una select che specifica il path desiderato), inoltre sarà facile sapere in quale posizione del file XML è presente la cartella di appartenenza (basta infatti fare una explode del path e camminare nel file XML seguendo le cartelle così ottenute, dalla più esterna alla più interna)

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

anche io mi sono trovato in questa situazione però vista all'incontrario (io dovevo nascondere le sottocartelle) e per risolverla ci ho messo circa 2 giornate alla fine è stato semplice: basta aprire e richidere la cartella con un ciclo e associare ad ogni ripetizione un aumento dei '-' in questo modo:

directory

- sottodirectory

-- sottodirectory della sottodirectory

eccetera

e il ciclo non termina fino a che non si esauriscono le directory principali (ovvero quelle messe nel primo blocco del ciclo).

Però c'è un problema, come ti accorgerai nel realizzare ipoteticamente questo script, devi sapere prima quante sono le sottodirectory di ogni cartella...

 :bye:

risposto 10 anni fa
wider
X 0 X

Ehm non riesco a capire bene la faccenda del path ... ( che ottuso porca miseria :2funny: devi aver pazienza ) cioè se file e cartelle sono nel DB che path metto al file?

gliene metto uno falso solo in modo da sapere in quale cartella dovrebbe essere se fossero fuori dal database?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X
gliene metto uno falso solo in modo da sapere in quale cartella dovrebbe essere se fossero fuori dal database?

Si, pensavo proprio a questo. Questo percorso dovrebbe poi essere presente nel file XML, o meglio la struttura del file XML dovrebbe contenere tutti i  percorsi.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

lo creo con simplexml?

quindi dovrebbe venire meglio così :

<parent name="aa" path="/">

 <child name="lol" path="/aa/lol/"></child>

 <child name="l" path="/aa/l/"></child>

  <parent name="oop" path="/aa/oop/">

       <child name="asd" path=''/aa/oop/asd/"></child>

   </parent>

</parent>

così vero?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Sorry : DomXML non simplexml :D

cmq come mi installo domxml? non mi trova le funzioni :( e nn so come installarla

ciao! :bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Nel file XML non c'è bisogno che memorizzi il path poiché è facilmente ricostruibile dai "name"

Puoi usare simplexml!

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

ah ok sul mio libro però non mi riporta la creazione dei file xml con simple xml ma solo con domxml ( che ho installato ma nn so come mai non sono giuste le funzion ??? ) cmq con simple xml è come lavorare con gli array, ogni elemento vale come un array parent[2] accedo al 3^ parent ... insomma di lavora con i foreach ... vero??

nel caso nn riuscissi potresti aiutarmi? appena finisco la skin del forum mi metto a provare e poi se non riesco posto di nuovo.

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Si, per crearlo non puoi usare SimpleXML, puoi usare DOMXML oppure potresti farlo anche "a mano", con una serie di echo.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda