Hei!
Jos jollakin olisi valmis koodi seuraavaan, otan mielelläni vastaan.
Haluaisin saada kerhomme kotisivuille sivun, jota pystyisi muokkaamaan myös toisilla tunnuksilla. Tarkoituksena on, että sponsorimme pystyisi päivittämään tarjouslistaansa ilman, että voi käpälöidä muita tiedostoja. Tällä hetkellä lista on vielä pdf-muodossa, mutta vaihdan html:ään, mikäli alla mainittu siis onnistuu.
Sivusto on Louhen palvelimilla, ja selvitin asian - järjestelmään ei ole mahdollista luoda toisia tunnuksia. Tästä syystä haenkin erillistä koodia, jolla pystyy antamaan muokkausmahdollisuuden - tavalla tai toisella, mutta jotenkin. FTP, suora avaus ja tallentaminen tms. Itse olen php:stä vielä melko pihalla, tosin luulen ettei muillekaan ole kovin helppo toteutettava?
Siis yhtä tiedostoa pitäisi pystyä muokkaamaan?
<?php $tiedosto = "muokattava.html"; $salasana = "kissa2"; if (isset($_POST["data"])) { $data = $_POST["data"]; if (isset($_POST["salasana"]) && $_POST["salasana"] == $salasana) { file_put_contents($tiedosto, $data); $tallennettu = true; } else { $tallennettu = false; } } else { $tallennettu = null; $data = @file_get_contents($tiedosto); } ?> <!DOCTYPE html> <html lang="fi"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Tiedoston <?php echo htmlspecialchars($tiedosto); ?> muokkaus</title> </head> <body> <h1>Tiedoston <?php echo htmlspecialchars($tiedosto); ?> muokkaus</h1> <p>Tällä sivulla voit muokata tiedostoa. Tiedoston kuuluu olla HTML-muodossa.</p> <form id="lomake" action="#lomake" method="post"> <?php if ($tallennettu === true) { echo "<p>Tallennus onnistui!</p>"; } elseif ($tallennettu === false) { echo "<p>Salasana meni väärin, yritä uudestaan!</p>"; } ?> <p><textarea name="data" rows="20" cols="80"><?php echo htmlspecialchars($data); ?></textarea></p> <p> <label>Salasana: <input type="password" name="salasana" /></label> <button type="submit">Lähetä</button> </p> </form> </body> </html>
Numis97 kirjoitti:
tosin luulen ettei muillekaan ole kovin helppo toteutettava?
Katso viestien kellonaikoja ja korjaa käsitystäsi. Tuossa ajassa luin viestisi, kirjoitin koodin tuohon ja varmuuden vuoksi vielä testasinkin sen perusteellisesti.
Eipä voi tosiaan väittää, että php:n saloja olisin omaksunut, mutta eiköhän tämä tästä, kun oppii ymmärtämään mitä funktio tarkoittaa (niitä suluissa olevia juttuja?) ja miten niitä voisi järkevästi käyttää.
Kiitos kuitenkin paljon selvästä ohjeesta, Metabolix! Sain toimimaan ensimmäisellä kerralla, joka on harvinaista :)
Miksiköhän alkoi yhtäkkiä lisäämään kauttaviivoja? Esim. fonttia ei saa säädeltyä, kun heti tallennuksen jälkeen lisää fonttikoon ympärille /-merkit. Homman nimi näkyy lähdekoodissa..
Aja tuloste stripslashes() funkkarin läpi. (En jaksanut tarkistaa oikeinkirjoitusta)
Palvelimella on ilmeisesti käytössä magic_quotes_gpc. Tätä ei kannata korjailla purkkaviritelmillä (kuten ankzilla ehdotti), vaan koko homma kannattaa hoitaa kerralla pois.
Jos pääset muokkaamaan PHP:n asetuksia (tiedostoa php.ini), ota asetus magic_quotes_gpc pois käytöstä. Muuten lisää jokaisen sivun alkuun (fiksusti tietenkin includella) täällä esiintyvä undoMagicQuotes-koodi.
Muuten: kommenttimerkinnässä on kummassakin päässä kaksi viivaa: <!-- kommentti -->
.
stripslashes() -koodipätkän lisääminen php-osuuteen ei auttanut, lisää viivoja yhä. Ei myöskään löytynyt php.ini:ä, joku muu .ini kyllä oli.
Metabolix: Mitä tarkoitit joka sivun alkuun lisättävällä koodilla? Muokattavien sivujen alkuun tai muokkaussivun alkuun lisättävää? Mikä pätkä kyseinen tarkalleen on, esiintyy koodeissa paljon?
Pahoittelen kyselytulvaa, funktioiden sun muiden toimintaa / perusteita en siis ole vielä omannut.. :(
Siis lisää seuraava koodi jokaisen PHP-tiedoston alkuun:
<?php if (!function_exists("undoMagicQuotes") && get_magic_quotes_gpc()) { function undoMagicQuotes($array, $topLevel = true) { $newArray = array(); foreach($array as $key => $value) { if (!$topLevel) { $key = stripslashes($key); } if (is_array($value)) { $newArray[$key] = undoMagicQuotes($value, false); } else { $newArray[$key] = stripslashes($value); } } return $newArray; } $_GET = undoMagicQuotes($_GET); $_POST = undoMagicQuotes($_POST); $_COOKIE = undoMagicQuotes($_COOKIE); $_REQUEST = undoMagicQuotes($_REQUEST); } if (get_magic_quotes_runtime()) { set_magic_quotes_runtime(0); }
Voit tallentaa koodin vaikka tiedostoon undomagicquotes.php ja hakea sen includella jokaisessa PHP-tiedostossa.
Mutta, nyt on kyse yhdestä ainoasta html-tiedostosta. Pitääkö koodi siis laittaa sen muokkaustiedoston alkuun, vai?
Muutkin sivut ovat kyllä php-muodossa includen käytön takia, mutta ongelmia ei ole. En siis näe syytä alkaa jokaisen tiedoston alkuun koodia laittamaan, includella tai muuten.
Kyllä, nimenomaan muokkaustiedostoon. Siellähän sitä dataa käsitellään. Ongelma on kaikissa GET-, POST- ja COOKIE-kohdissa, ja tuo koodi korjaa ne kaikki kerralla.
Hmm, nyt ei sitä muokattavaa sivua muuttele lähetyksen jälkeen. Mutta, kyllä mokoma vieläkin laatikkoon lisäilee ylimääräistä, jotka joutuu ottamaan pois aina kun alkaa muokkaamaan :(
Edit: ei kun ei.. Pieni hetki :)'
Toinen edit: Ohjelma lisää viivoja laatikkoon, kun käy toisella sivulla. Eivät tosiaan häiritse lopputuloksen kannalta, mutta muokkaajalle harmillisia :(
Kolmas: Öö.. Eihän tuo muokkaudu ollenkaan, vaikka salasana olisi oikein!
Nyt säädät kyllä jotain ihan omiasi. Mitäpä jos aloittaisit koko homman alusta? Laita tiedoston alkuun tuo jälkimmäinen koodi (undoMagicQuotes-jutut) ja sen perään muokkaussivun koodi. Sitten vaihda koodin alusta muokattavan tiedoston nimi ja salasana sopiviksi.
Nyt toimii. Mutta ainakin yritti vielä äsken lisäillä ylimääräistä.
Kiitos joka tapauksessa, auttaa paljon!
Aihe on jo aika vanha, joten et voi enää vastata siihen.