Newsgroup: it.comp.www.php
Titolo: classi e lettura proprieta' esternamente

Salve a tutti,
sto creando una semplice classe dove, in una proprieta' (var $dati) vorrei 
salvare un'intera rubrica sottoforma di array bidimensionale. Il problema e' 
che non riesco a scriverci: non ottendo alcun errore, quindi la sintassi e' 
corretta, ma forse faccio qualcosa senza-senso o uso male le proprieta'. Non 
arrivo a capire pero' come dovrei usare altrimenti la classe per farle 
salvare i dati internamente.
ecco il codice della classe:
Class Rubrica{
 var $percorso;
 var $data=array();
 function Rubrica($perc){
      $this->percorso=$perc;
 }
 function Leggi_Rubrica(){
      $result=array();
      $fp=fopen($this->percorso,'r');
      if(!$fp){
           echo "Non riesco ad aprire il file!";
           die;
      }
      $row=fgets($fp,4096); //scaritiamo la prima riga
      while(!feof($fp)){
           $row=fgets($fp,4096);
           $campo=explode("|",$row);
           array_push($this->data,$campo);
      }
      fclose($fp);
      return $this->data;
 }
}
e questa e' la pagina php che la richiama:
include 'rubrica.php';
$rub=new Rubrica($percorso='c:\rubrica\test.phb');
$val=$rub->Leggi_Rubrica();
if($opt="del"){
     $rub->Cancella_Contatto($id);
}
if($opt="save"){
     $rub->Scrivi_Rubrica();
}
echo "<form action=\"rubrica.php?opt=save\" method=\"post\">\n";
foreach ($rub->data as $k=>$v){
     echo "\t<input type=\"text\" name=\"name".$k."\" value=\"".$v[0]."\" 
size=30 maxlength=25>";
     echo "<input type=\"text\" name=\"phone".$k."\" value=\"".$v[1]."\" 
size=20>";
     echo "<a href=\"rubrica.php?opt=del&id=".$k."\"><br>\n";
}
echo "</form>";
grazie 1000 per l'aiuto/consigli!
Ciao
Dade 

 foreach ($rub->data as $k=>$v){
Ma come? Prima valorizzi $val e poi non la usi? :-)
Addirittura usi una variabile interna alla classe che forse sarebbe
meglio rendere privata (private $data).
Usa foreach ($val ...).
Il resto del codice mi sembra corretto, anche se dovresti imparare a
scrivere codice più *bello*, più leggibile. :-)
Ciao.
T.


spero che sia possibile cio' che vorrei fare!
Ciao
Dade 

 spero che sia possibile cio' che vorrei fare!
a me funziona: il problema sarà altrove.
Fammi sapere.
T.

 echo "</form>";
Questo form e` sconclusionato: manca un submit e hai degli <a> in mezzo
al form.
Se stai imparando PHP, il tuo "esercizio" si presta benissimo a imparare
come ereditare da Iterator (in PHP5):
http://www.php.net/manual/en/language.oop5.iterations.php
In questo modo puoi rendere privato $data dentro l'oggetto, e definire
una tua interfaccia per foreach.
Inoltre ti presenta una lista lunghissima di input. Io piuttosto farei
una lista (<ul><li>) e per ogni riga un form con modifica/cancella. E`
piu` pesante, ma credo che vada in locale, quindi non dovresti avere
molti problemi.
Strutturerei meglio il tutto, passando l'oggetto in sessione invece di
ricaricarlo a ogni submit, suddividerei in piu` unita` logiche il tutto
(uno per la modifica, uno per la cancellazione, uno per il salvataggio,
ecc.) e farei il load del file solo dopo il salvataggio (e alla prima
connessione).
Inoltre spero (per te :) che nulla altro (persone o software) possano
accedere a quel file mentre ci lavori (comprese due finestre del browser
sul tuo script), altrimenti comincera` a perdere i pezzi senza che te ne
accorgi (finche` non e` troppo tardi).
Cosi` com'e` ora fai prima a editare a mano il file, magari
presentandolo in una textarea...
Bye.
-- 
Alessandro Pellizzari

 wrote:
[CUT]
ops... con l'errore di prima tra = e == mi dev'essere entrato nell'if dove 
richiamo la Scrivi_Rubrica, che mi ha praticamente azzerato il file che 
andavo a leggere... quindi ora che e' tutto ok grazie ai tuoi aggiustamenti, 
si ritrovava a leggere un file vuoto e $rub->dati giustamente non conteneva 
niente...
mi vergogno quasi....
Grazie tantissimo Tristan!
Ciao
Dade 

 mi vergogno quasi....
Ma no... capitano spessissimo errori del genere. :)
T.

 Bye.
ciao e grazie
Dade 

 possibile
Possibile e` possibile, dipende poi come il S.O. lo gestisce.
Il problema di un'applicazione web e` che dovresti lockare il file
quando lo apri e inizi le modifiche, e togliere il lock quando hai
finito, ma se l'utente chiude il browser, rimane il lock e ti tocca
toglierlo a mano.
E` per questo che spesso anche in locale si usano database (SQLite, per
esempio, andrebbe benissimo per il tuo problema, e il supporto e`
incluso in PHP5)
Bye.
-- 
Alessandro Pellizzari

 E` per questo che spesso anche in locale si usano database
Sì, sempre meglio usare i db. :-)
Ciao.
Tristan