Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Päivitettävä tekstikentä

Sivun loppuun

Vikke [12.10.2013 13:11:08]

#

Hei,

kyselisin kuinka toteuttaa päivitettävän tekstikentän?
Ideana on luoda sivu, jonhon kirjautumalla voi muokata tekstikentän tietoa.

Sivusto toimii yhteisön tietopankkina. Idea on luoda ikään kuin kirja sisältöluottelon kera, johon yhteisön jäsenet pääsevät kirjauduttuaan lisäämään ja muokkaamaan sen silältöä.

Sisältö pitäisi lopuksi voida tulostaa kirjamaisena teoksena.

Eli kyselisin kokeneimmilta onko olemassa, jokin sovellus jossa tämä ominaisuus jo toteutuu? Jos ei, niin miten itse tämän toteuttaisitte?

-Vikke

pistemies [12.10.2013 14:01:43]

#

Millainen olis wordpress, johon useammalla on admin-tunnukset. Kirjoittaminen siinä onnistuu, miten lie tulostuspuolen kanssa...

samip [12.10.2013 14:59:01]

#

Eiköhän tuohon ihan mikä tahansa blogi/wiki-softa taivu.

jukkah [12.10.2013 20:43:52]

#

Google Driven dokumentti

Vikke [12.10.2013 21:51:30]

#

Kiitos hyvistä vinkeistä. Wikialustaan tutustun seuraavaksi ja sitten muihin.

Kysyisin vielä, että kuinka saan yksinkertaisen tekstikentän nettisivulle, jossa on tämän lisäksi tallenna sekä tyhjennä ominaisuudet?

- Vikke

uta [13.10.2013 08:30:59]

#

jukkah kirjoitti:

Google Driven dokumentti

+1. Itse enä näkisi mitään syytä lähtä asentelemaan mitään wikejä tai pressejä, kun Google docs istuu aloittajan ongelmaan täydellisesti. Palvelussa voi luoda dokumentteja ja niitä sitten käpistellä reaaliajassa muiden jäsenten kanssa. Loppuun vielä doc, rtf tai pdf exporttauskin onnistuu mainiosti.

Lebe80 [13.10.2013 12:01:49]

#

Itsekin suosisin Google Driveä (ent. Docs), joka on juuri tarkoitettu monen käyttäjän samanaikaiseen editointiin. Tällöin näkee heti suoraan, kuka muokkaa mitäkin kohtaa, kun taas webipalveluissa (varsinkin yksinkertaisella tekstikentällä) on mahdollista, että kaksi käyttäjää editoi samaa kohtaa samaan aikaan tietämättään.

Vikke [17.10.2013 14:07:48]

#

Kiitos vastauksista! Helpoin tie lienee Google Driven käyttö ja sitten vasta tuo Wiki alusta. Tutkiskelen ja palailen tarvittaessa uusien haasteiden kera.

Minh Truong [24.10.2013 15:41:33]

#

On mahdollista tehdä se PHP file funktioilla. Se on aika yksinkertainen, mutta voit joutua muokkaamaan tiedostojen käyttöoikeuksia (Chmod).

Luodaan ensimmäiseksi HTML lomake (muokkaus.php):

<form method="post" action="kasittely.php">
<textarea name="text" cols="50px" rows="50px"> </textarea>
<input type="submit" name="submit">
</form>

Sen jälkeen luodaan PHP:n avulla käsittelevän tiedoston (kasittely.php):

<?php
$_POST["text"];
$file = fopen ("tiedosto.php", "w"); //Avataan tiedosto, esimerkkinä tiedosto.php, w-tilassa (write)
fwrite ($file, $text); //Kirjoitetaan $text muuttujaa vastaava teksti tiedostoon
fclose ($file) //Suljetaan tiedosto
echo "Tämä teksti " . $text . " on tallennettu";
?>

Ja hieman soveltaen, jos haluat nähdä vanhan tekstin. Laita tämä koodi HTML koodin <textarea> </textarea> sisälle (muokkaus.php):

<?php
$file = fopen ("tiedosto.php", "r"); //avataan tiedosto.php lukutilassa (r=read)
while (!feof($file));
{
echo fgets($file);
}
?>

AJAX (javascript) avulla on mahdollista parantaa koodia.

Lisätietoa on PHP file ja ohjeita löytyy hyvin mm. W3schools.com

Lebe80 [24.10.2013 15:58:23]

#

Minh Truongin esimerkissä vain on juuri niitä ongelmia, jota varten Google Driveä suosittelin. Eli jos moni käyttäjä on editoimassa samaan aikaan, ei tästä ilmoiteta muille muokkaajille mitenkään ja käyttäjät voivat tuhota tietämättään toistensa muokkauksia.

Metabolix [24.10.2013 17:49:54]

#

Minh Truongin esimerkissä on monta muutakin vikaa. Tekstilaatikkoon tulostettava koodi pitäisi käsitellä oikein, jotta lomake ei sokeutuisi HTML-tageista. Attribuutit cols ja rows ovat kokonaislukuja eikä niissä pidä olla mitään px-päätteitä. Tiedostoa käsitellään turhan vaikeasti; voisi käyttää helppoja funktioita file_get_contents ja file_put_contents. Tallennuksen jälkeen jälleen tulostetaan virheellisesti mielivaltaista tekstiä ilman oikeaa muunnosta HTML-koodiksi. Koodista puuttuu myös kokonaan kaikkein tärkein asia eli salasanasuojaus; tuollaisella lomakkeella kuka tahansa voisi kaapata koko palvelimen. Kaiken kukkuraksi lopussa suositellaan w3schools-sivustoa, joka on huono.

Alla on uusi muokkaus.php, josta on korjattu edellä mainitsemani virheet. Lebe80:n mainitsemalle monen käyttäjän ongelmalle ei ole tehty mitään.

<?php
if (isset($_POST["data"])) {
	// $hash = password_hash("kissa2", PASSWORD_DEFAULT);
	$hash = "$2y$10$0SCbYkxTmQDw9aMxWEENxOnyvUqvYBfLDnlRZXk73qL.fzMGNM6PW";
	if (!password_verify($_POST["salasana"], $hash)) {
		header("HTTP/1.1 403 Forbidden");
		die("Väärä salasana!");
	}
	file_put_contents("data.php", $_POST["data"]);
	header("Location: data.php"); // Vastoin standardia, käytä omalla vastuulla.
	die();
}
$data = @file_get_contents("data.php");
$html = htmlspecialchars($data);
?>
<form action="?" method="post">
	<p><textarea name="data" rows="20" cols="80"><?= $html ?></textarea></p>
	<p>Salasana: <input name="salasana" type="password" /></p>
	<p><button type="submit">Tallenna</button></p>
</form>

Minh Truong [25.10.2013 07:58:50]

#

AJAX tarkistajan kannattaa luoda objekti, joka tarkistaa onko useita käyttäjiä samalla sivulla. Tämä kuitenkin rasittaa palvelinta ja nettiyhteyttä palvelimelle turhan paljon. Eli funktio jossa AJAX hakee palvelimelta ja tallentaa heti muokatun tekstin palvelimelle. Näin ei voi tulla päälekkäisiä ongelmia.

The Alchemist [25.10.2013 08:14:45]

#

Eipä tuollainen yksinkertainen ajax-query rasita käytönnössä yhtään. Se ei vaan poista mitään asiaan liittyviä ongelmia, joten se on aika turha.

Lebe80 [25.10.2013 09:58:44]

#

Minh Truong kirjoitti:

AJAX tarkistajan kannattaa luoda objekti, joka tarkistaa onko useita käyttäjiä samalla sivulla. Tämä kuitenkin rasittaa palvelinta ja nettiyhteyttä palvelimelle turhan paljon. Eli funktio jossa AJAX hakee palvelimelta ja tallentaa heti muokatun tekstin palvelimelle. Näin ei voi tulla päälekkäisiä ongelmia.

The Alchemistin kanssa täysin samaa mieltä. Tarkistus ei poista ongelmaa. Eli alkuperäinen viesti kuuluu näin:

lainaus:

Sivusto toimii yhteisön tietopankkina. Idea on luoda ikään kuin kirja sisältöluottelon kera, johon yhteisön jäsenet pääsevät kirjauduttuaan lisäämään ja muokkaamaan sen silältöä.

Sivustolla on siis oletusarvoisesti useampi käyttäjä, ja mikään "jonotuskäytäntö" ei ole ratkaisu, että estettäisiin muokkaus muilta sillä aikaa, kun yksi käyttäjä tekee muokkauksiaan.

Google Driven tekstieditorissa useat käyttäjät voivat muokata samaan aikaan ja tällöin he näkevät ihan toistensa muokkaukset korostetusti lähes reaaliajassa, jolloin päällekkäiset muokkaukset on heti huomattavissa. Lisäksi siis tuettuina yleisimpien tekstinkäsittelysoftien tiedostomuodot, sekä tekstimuotoilut.

The Alchemist [25.10.2013 11:08:01]

#

Perusidea tuollaisessa voisi olla se, että jokainen tallennuskerta luo uuden revision/version, jonka yhteyteen tallennetaan tieto siitä, minkä revision pohjalta se on luotu. Versioinnin tunniste voi olla vaikka aikaleima. Sen jälkeen palvelin välittää kaikille muille saman dokumentin käpistelijöille tiedon uudesta versiosta (version id ja muutokset alkuperäiseen).

Selaimen päässä ajettava sovellus yhdistelee sitten avonaiseen dokumenttiin tehdyt muutokset uusimman version kanssa. Tällöin jokaisella käyttäjällä on aina selaimessaan uusin tietokantaan tallennettu versio. Dokumenttia ei voi tallentaa, jos "parent revision" on vanhempi kuin uusin tietokantaan tallennettu versio.

Tuohon jää edelleen sellainen avoin ongelma, että mitä tapahtuu, jos kaksi käyttäjää yrittää tallentaa dokumentin yht'aikaisesti, jolloin kumpikaan ei ole kerennyt vielä saada toisen tekemiä muutoksia. Yksi helppo ratkaisu olisi kai se, että ensimmäinen hyväksytään ja toiselle lähetetään virheilmoitus, että joku muu tallensi dokumentin ja muutokset pitää tarkistaa.

Ainakaan kaikkiin tilanteisiin ei sovi se, että palvelin vain mergeäisi kaksi toisilleen tuntematonta versiota varmistamatta lopputulosta ihmiskäyttäjältä. En tiedä, miten Googlen dokkareissa tai muissa vastaavissa järjestelmissä rinnakkaisuus on hallittu.

Tällainen sovellus voi vaikuttaa aluksi hyvin yksinkertaiselta, mutta jos palvelusta haluaa saada sellaisen, että käyttäjille jää wtf-olo mahdollisimman harvoin, niin koodia tulee aika paljon ja vähän joutuu suunnittelemaankin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta