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
Millainen olis wordpress, johon useammalla on admin-tunnukset. Kirjoittaminen siinä onnistuu, miten lie tulostuspuolen kanssa...
Eiköhän tuohon ihan mikä tahansa blogi/wiki-softa taivu.
Google Driven dokumentti
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
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.
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.
Kiitos vastauksista! Helpoin tie lienee Google Driven käyttö ja sitten vasta tuo Wiki alusta. Tutkiskelen ja palailen tarvittaessa uusien haasteiden kera.
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
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.
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>
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.
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.