PDA

View Full Version : [Generico] Pagina web che mostra e modifica files su disco


fbcyborg
28-05-2010, 16:55
Salve a tutti,

ho un server Linux sul quale ho la seguente esigenza:
leggere il contenuto di un file, mostrarlo a video, apportarne delle modifiche, renderle permanenti su disco e lanciare uno scriptino in bash.

Sono disposto a usare diversi linguaggi (PHP,Python,Jsp,HTML), però non so bene come cominciare.

Nello specifico, dovrei aprire un file, contenente una lista di URL e mostrarlo a video. Questa lista deve poter essere modificabile, ovvero si devono poter aggiungere/rimuovere URL e una volta fatto questo si deve rendere permanente la modifica su disco. Successivamente, come dicevo prima è necessario che si avvii uno script.

Come potrei fare? Qualcuno mi da degli spunti su come iniziare?

Gremo
29-05-2010, 01:41
Idea buttata così, potrebbero esserci errori.

Per visualizzare/modificare/eliminare righe
- Fai qualche controllo per vedere se il file esiste, è leggibile e scrivibile
- Apri il file leggendo il contenuto di ogni riga in un array
- Dentro un form, cicli l'array e crei un textbox con il contenuto della riga (l'url), un id (magari l'url se univoco) più un pulsante per rimuovere la riga

Per aggiungere:
- Crei un bottone "generale" aggiungi che aggiunge una texbox per inserire un altro url.

Per salvare:
- un pulsante salva per salvare le modifiche, ossia aggiorni il contenuto dell'array con i valori che ti arrivano dalle textbox e riscrivi l'array nel file interamente.

consigli:
- il pulsante per far comparire un textbox io lo farei con javascript modificando il dom. Se fai fare un post, devi fare dei controlli per capire quale pulsante è stato premuto. E inoltre facendo il refresh della pagina, devi prevedere un meccanismo per salvare le altre textbox eventualmente modificate
- il pulsante rimuovi sarà problematico, perchè allo stesso modo dovrai salvare (nella sessione?) eventuali modifiche che l'utente ha fatto altre righe..

Gremo
29-05-2010, 01:44
Scusa ho letto adesso che probabilmente non devi modificare le righe ma solo aggiungere e rimuoverle...:doh: la cosa si fa più semplice cmq :)

Infatti:
- pulsante rimuovi riga fa un post, rimuove dall'array e riscrive l'array nel file
- pulsante aggiungi riga (con relativo textbox) aggiunge nell'array e lo riscrive nel file

Non ti servono pulsanti salva, ma devi tenere in considerazione il caso in cui due utenti modificano questa lista contemporaneamente...

Ciao :)

fbcyborg
29-05-2010, 07:40
Grande, ti ringrazio.
L'idea mi piace.

Appena posso inizio a buttare giù qualche riga di codice. Per quanto riguarda l'accesso concorrente non c'è problema: lo usa una persona sola.

Mentre rispondevo a questo post mi è venuta in mente un'altra idea. Siccome sono molto più ferrato in Java che in altri linguaggi, una Servlet o una JSP, come la vedi?

clockover
29-05-2010, 08:00
Anche GWT magari...

fbcyborg
29-05-2010, 08:04
Google API, mi sembra di capire...
Mmh, no vorrei evitare di usare API di web services esterni in questo caso. :)

cionci
29-05-2010, 10:34
Con PHP si fa in pochi minuti ;)

Gremo
29-05-2010, 12:21
Con PHP si fa in pochi minuti ;)

In ASP.net ancora di meno :asd: :asd:

Curiosità: c'è un modo per capire se il file è già aperto da un altro "utente" e bloccare ogni modifica? O bisogna trovare un escamotage tipo un lock su una tabella?

fbcyborg
29-05-2010, 13:18
ASP.net non lo conosco purtroppo.
PHP lo conosco poco per poterlo fare in pochi minuti!!!

Comunque intanto ho buttato giù qualche riga di codice stupidissima che mi legge il file una riga alla volta:
<?php

$file=fopen("urls","r"); //apre il file "urls"
while (!feof($file)) {
$buffer = fgets($file, 4096);
echo "$buffer"; //riga letta
}
fclose ($file); #chiude il file

?>

L'unica cosa intanto, è che non mi va a capo ogni riga. Anche se metto "\n" attaccato alla variabile buffer non va.

cionci
29-05-2010, 13:30
In ASP.net ancora di meno :asd: :asd:
A parte che ho qualche dubbio su questa affermazione (con questo non voglio dire che php è meglio di Asp.Net, ma sicuramente è più "sbrigativo" per progetti brevi e sopratutto per progetti di questo tipo), ma gli serviva Linux.

cionci
29-05-2010, 13:33
L'unica cosa intanto, è che non mi va a capo ogni riga. Anche se metto "\n" attaccato alla variabile buffer non va.
Per stampare i file metti tutto nel tag <pre> </pre>, oppure sostituisci "\n" con <br />.
Puoi leggere il file in una sola operazione:
http://php.net/manual/en/function.file.php
http://www.php.net/manual/en/function.file-get-contents.php

Gremo
29-05-2010, 13:37
A parte che ho qualche dubbio su questa affermazione (con questo non voglio dire che php è meglio di Asp.Net, ma sicuramente è più "sbrigativo" per progetti brevi e sopratutto per progetti di questo tipo), ma gli serviva Linux.

La curva di apprendimento di php è più breve, per asp ci vuole un pò di più, ma asp ti permette di fare le cose più velocemente se lo sai usare...è risaputo :)

fbcyborg
29-05-2010, 13:44
Per stampare i file metti tutto nel tag <pre> </pre>, oppure sostituisci "\n" con <br />.
Puoi leggere il file in una sola operazione:
http://php.net/manual/en/function.file.php
http://www.php.net/manual/en/function.file-get-contents.php

Sì grazie avevo visto che si può leggere il file in una botta sola. Solo che vorrei poterli trattare separatamente per poterli aggiungere/rimuovere.

cionci
29-05-2010, 13:47
Sì grazie avevo visto che si può leggere il file in una botta sola. Solo che vorrei poterli trattare separatamente per poterli aggiungere/rimuovere.
In che senso ?

cionci
29-05-2010, 13:47
La curva di apprendimento di php è più breve, per asp ci vuole un pò di più, ma asp ti permette di fare le cose più velocemente se lo sai usare...è risaputo :)
Leggi bene quello che ho scritto perché la tua affermazione non è in contrasto con la mia ;)

<%@ Page Language="VB" Debug="true" %>
<script language="VB" runat="server">
Dim Reader As New System.IO.StreamReader(Server.MapPath("Ciao.txt"))
Response.Write(Reader.ReadToEnd())
Reader.Close
</script>

<?= file_get_contents("Ciao.txt") ?>

fbcyborg
29-05-2010, 13:51
In che senso ?
In pratica stavo pensando di caricare la lista di URL (contenuta appunto nel file) dentro un'array. Questo per facilitare l'operazione di aggiunta/rimozione delle righe (ogni riga corrisponde ad un URL). Quindi ogni volta che "do l'OK" o comunque che voglio apportare le modifiche al file, sovrascrivo il contenuto del file con il contenuto dell'array.
Io farei una pagina del genere:
ogni riga un url, con un tasto rimuovi a fianco.
Alla fine, una textbox con tasto aggiungi, che mi aggiorna la pagina con l'URL aggiunto, e in fondo, un bottone salva.

Se c'è bisogno posso pure fare uno schema di come lo vorrei fare.

Gremo
29-05-2010, 13:52
Leggi bene quello che ho scritto perché la tua affermazione non è in contrasto con la mia ;)

Infatti infatti ;) l'avevo solo sottolineato :D

cionci
29-05-2010, 13:54
In pratica stavo pensando di caricare la lista di URL (contenuta appunto nel file) dentro un'array. Questo per facilitare l'operazione di aggiunta/rimozione delle righe (ogni riga corrisponde ad un URL). Quindi ogni volta che "do l'OK" o comunque che voglio apportare le modifiche al file, sovrascrivo il contenuto del file con il contenuto dell'array.

http://php.net/manual/en/function.file.php :D

Gremo
29-05-2010, 13:54
Se c'è bisogno posso pure fare uno schema di come lo vorrei fare.

Quando si tratta di php e pagine complesse per quanto riguarda il flusso di esecuzione ti consiglio di fare appunto i driagrammi di flusso! E' un ottimo modo per documentare il codice...così' tra 2 settimane non impazzisci riguardando la pagina :D

cionci
29-05-2010, 14:01
Per modificare il file: http://php.net/manual/en/function.file-put-contents.php
Fai un implode con tutte le righe rimanenti. Ovviamente devi togliere dal vettore le righe che vuoi rimuovere.
Una cosa del genere:

$content = file("prova.txt");
unset $content[$x]; //rimuovi la riga di indice $x
array_push($content, $new_line."\n"); //aggiunge una riga in fondo
file_put_contents("prova.txt", implode($content));

Gremo
29-05-2010, 15:01
Qualche ideuzza. Per rendere tutto un po' più chiaro io userei qualche semplice oggetto. Non so a che livello di esperienza sei, comunque farei un oggetti "Url" e (php lo supporta?) una lista di url che li contiene estendendo i metodi delle liste. Url potrebbe avere:

Classe Url:

Private Id string
Private string target;

public string getId();
public boolean isValid();
public boolean exists();


in questo modo gestiresti eventuali modifiche future in scioltezza (controllare se un url esiste o se è valido e tanto altro).

Mentre nell'oggetto lista di Url:


public new (string FileName);
public Url getElement(string Id);
public void removeElement(Url url);
public void addElement(Url url);
public void saveContent();

public void sort(); #opzionale
public void removeDuplicates(); #opzionale


Così semplifichi anche la parte di visualizzazione e separi le due cose. In fase di visualizzazione:

# Carichi la lista
Urls myurls = new Urls("Ciao.txt");

#Iteri e crei i pulsanti
for each (Url u in myurls)
{
echo "<input type='text' id ='" . u-> id . "' value='".ud->target."' />;
}




Ovviamente sto parlando in pseudo codice :D ;)

fbcyborg
30-05-2010, 16:10
Dunque non ho per niente esperienza a livello di programmazione ad oggetti in php, ma mi ricorda quello che di solito vedo in Java (con cui ho sicuramente mooolta più dimestichezza).
Dunque, per il momento, dopo aver letto la documentazione segnalata da cionci, ho riscritto le prime righe di codice così:
<?php

$lines = file("urls");
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}

?>
Ora vorrei poter mettere un bottone elimina a fianco ad ogni riga, e magari in testa alla pagina un campo di testo con bottone aggiungi, che mi aggiorna l'array e la pagina stessa, con la lista degli url aggiornati. A questo punto immagino sia necessario anche JavaScript.

cionci
30-05-2010, 16:25
Dipende, se vuoi che la pagina venga ricaricata o meno.
Se non vuoi che venga ricaricata ti serve JavaScript. Se vuoi che venga ricaricata basta mettere un bottone ed andarsi a prendere i valori della form da PHP.

fbcyborg
30-05-2010, 16:33
Dipende. Comunque sì, mi piacerebbe che la pagina si ricaricasse con la lista aggiornata ogni volta, ad ogni operazione di inserimento/rimozione.
Es. Parto con la lista, aggiungo un URL, clicco sul bottone aggiungi, e la pagina si ricarica con la lista aggiornata.
Se voglio rimuovere un URL, clicco sul relativo bottone "rimuovi" affiancato all'url che voglio rimuovere e ricarico la pagina con il nuovo array.

Alla fine di tutto, mi servirebbe un pulsante "applica modifiche" (possibilmente sempre in cima alla pagina per comodità), che scriva su file (appunto con il metodo visto in precedenza) e lanci uno script in bash, presente sul server.

Intanto quello che stavo cercando di fare è di mettere un bottone rimuovi a fianco di ogni URL. Poi mi chiedevo come potrei usarlo per rimuovere dall'array, l'i-esimo url/riga.

Gremo
30-05-2010, 16:38
Dipende. Comunque sì, mi piacerebbe che la pagina si ricaricasse con la lista aggiornata ogni volta, ad ogni operazione di inserimento/rimozione.
Es. Parto con la lista, aggiungo un URL, clicco sul bottone aggiungi, e la pagina si ricarica con la lista aggiornata.
Se voglio rimuovere un URL, clicco sul relativo bottone "rimuovi" affiancato all'url che voglio rimuovere e ricarico la pagina con il nuovo array.

Alla fine di tutto, mi servirebbe un pulsante "applica modifiche" (possibilmente sempre in cima alla pagina per comodità), che scriva su file (appunto con il metodo visto in precedenza) e lanci uno script in bash, presente sul server.


Mettere delle checkbox per permettere l'eliminazione d + elementi? Cmq se vuoi che alla fine di tutto ci sia applica modifiche, devi salvarti l'array nella sessione...


Intanto quello che stavo cercando di fare è di mettere un bottone rimuovi a fianco di ogni URL. Poi mi chiedevo come potrei usarlo per rimuovere dall'array, l'i-esimo url/riga.

Devi studiarti come funzionano le form e come recuperare i valori al post, è di fondamentale importanza saperlo...in qualsiasi linguaggio!

fbcyborg
30-05-2010, 16:40
Sì, alla fine anche delle checkbox vanno bene, anzi, anche meglio direi.
Cavolo, mi sto rendendo conto che forse non ho abbastanza esperienza per fare questa cosa. Sebbene le abbia trattate qualche volta, con le sessioni non ci ho mai lavorato seriamente.

Gremo
30-05-2010, 16:41
PS ovviamente fai tutto con POST anche se non è bellissimo (per gli avvisi del browser, quando torni indietro). Il motivo è abbastanza chiaro...

Gremo
30-05-2010, 16:42
Sì, alla fine anche delle checkbox vanno bene, anzi, anche meglio direi.
Cavolo, mi sto rendendo conto che forse non ho abbastanza esperienza per fare questa cosa. Sebbene le abbia trattate qualche volta, con le sessioni non ci ho mai lavorato seriamente.

Non sono nulla di che, te l'assicuro... è più complesso capire una volta inviata la pagina, quale elemento eliminare..

Ti serve:

<input type="checkbox" name="nome" value="valore">
1 ciclo
la funzione isset
l'array fornito dal server $REQUEST



Con queste 3 cose puoi capire se un checkbox è stato selezionato o meno e agire di conseguenza

cionci
30-05-2010, 17:01
Per poter mettere un pulsante Applica devi anche usare le sessioni, andando a memorizzare il vettore delle righe nella sessione.

fbcyborg
30-05-2010, 18:38
Ok Ok, allora appena posso mi vado a "ripassare" le sessioni! :D Poi possiamo ritornare in argomento! :)

Grazie! ;)