Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Formularz wyszukujący i zmieniający tekst w pliku
Forum PHP.pl > Forum > PHP
someone007
Cześć
na wstępie zaznaczę tylko, że szukałem tego rozwiązania zanim zapytałem tutaj. Proszę o przeczytanie

mam problem ponieważ jestem grafikiem, a do swojej pracy potrzebuję wiedzy programistycznej.
Otóż stworzyłem animację zawierającą tekst w html5 (przy pomocy Adobe Animate).
Nie pytajcie czemu, ale potrzebuję w łatwy sposób móc zmienić tekst w tej animacji. Podmieniać tekst będzie osoba, która jest kompletnym laikiem i edytując plik ręcznie z pewnością coś zepsuje.
Dlatego potrzebuję formularza który:
1. poszuka w danym pliku określoną frazę pomiędzy resztą kodu
2. w tej frazie zmieni tekst na ten wprowadzony w polu input formularza

czyli np. treść tego pliku wygląda tak

jakiś kod coś tam coś tam
textdozmiany="jakis tekst"
skrypt znajduje ten tekst i podmienia na ten wprowadzony w formularzu, ale zachowuje resztę kodu
czyli: textdozmiany="podmieniony tekst"

teraz trudność, bo wyrażeń textdozmiany może być więcej niż jedno, dlatego wprowadziłem do pliku komentarze.
Skrypt powinien badać więc warunek

jeśli znalazł wyrażenie "komentarz1" i następnie znalazł textdozmiany to zamienił tekst na wprowadzony w 1 polu formularza
jeśli znalazł komentarz2 to poszukał pierwszy za nim texdozmiany i podmienił tekst na ten wpisany w drugim polu formularza.

Czytałem o operacjach na plikach,
ale przerasta mnie tego typu edycja i połączenie jeszcze tego z formularzem.
Gdyby ktoś był łaskaw podsunąć jakiś kawałek kodu żebym miał jakiś punkt zaczepienia, byłbym wdzięczny.

z góry dzięki
rafkon1990
struktura twojego pliku przypomina format plików INI.
A stąd już prosta droga do edycji tego pliku z formularzu metodami GET/POST (jak wolisz).


// plik konfiguracja.ini
textdozmiany="jakis tekst"
textdozmiany2="jakis tekst 2"


Najpierw odczytujemy aktualną konfigurację
  1. $konfiguracjaNazwaPliku="./konfiguracja.ini"
  2. $konfiguracjaTablica = parse_ini_file($konfiguracjaNazwaPliku);

i dokonujemy zmian
  1. $konfiguracjaTablica ["textdozmiany"] = $_POST["textdozmiany"]; // w tym elemencie tablicy POST powinny znajdować się nowe wartości przesłane z formularza
  2. $konfiguracjaTablica ["textdozmiany2"] = $_POST["textdozmiany2"]; // jak wyżej
  3. // .... dowolna ilość zmian

Teraz potrzeba jedynie zapisać zmienioną tablicę do pliku.
Istnieje tyle rozwiązań, ilu programistów. Oto jedno z rozwiązań zaproponowanych na php.net (nie testowane)
  1. function write_php_ini($array, $file)
  2. {
  3. $res = array();
  4. foreach($array as $key => $val)
  5. {
  6. if(is_array($val))
  7. {
  8. $res[] = "[$key]";
  9. foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
  10. }
  11. else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
  12. }
  13. safefilerewrite($file, implode("\r\n", $res));
  14. }
  15. function safefilerewrite($fileName, $dataToSave)
  16. { if ($fp = fopen($fileName, 'w'))
  17. {
  18. $startTime = microtime();
  19. do
  20. { $canWrite = flock($fp, LOCK_EX);
  21. // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
  22. if(!$canWrite) usleep(round(rand(0, 100)*1000));
  23. } while ((!$canWrite)and((microtime()-$startTime) < 1000));
  24.  
  25. //file was locked so now we can store information
  26. if ($canWrite)
  27. { fwrite($fp, $dataToSave);
  28. flock($fp, LOCK_UN);
  29. }
  30. fclose($fp);
  31. }
  32.  
  33. }

No i sama operacja zapisu tablicy
  1. write_php_ini($konfiguracjaTablica, $konfiguracjaNazwaPliku); // zapis do pliku nowych wartości


############################################################################
##### Działający i kompletny kod na prośbę pytającego
  1. <?php
  2.  
  3. # Twoje sekretne hasło - chroni plik konfiguracyjny przed zmianami za pomocą tego skryptu
  4. # podanie prawidłowego hasła umożliwia zmiany
  5. $password = "qwerty";
  6.  
  7. # nazwa pliku konfiguracyjnego INI
  8. $konfiguracjaNazwaPliku = "./konfiguracja.ini";
  9. $konfiguracjaTablica = parse_ini_file($konfiguracjaNazwaPliku);
  10. $message = "";
  11.  
  12. # sprawdzamy czy wysyłane było hasło
  13. if (isset($_REQUEST["password"])) {
  14. $passwordSent = $_REQUEST["password"];
  15. unset($_REQUEST["password"]);
  16. # jeśli hasło prawidłowe
  17. if ($passwordSent === $password) {
  18.  
  19. function write_php_ini($array, $file) {
  20. $res = array ();
  21. foreach ($array as $key => $val) {
  22. if (is_array($val)) {
  23. $res[] = "[$key]";
  24. foreach ($val as $skey => $sval) {
  25. $res[] = "$skey = " . (is_numeric($sval) ? $sval : '"' . $sval . '"');
  26. }
  27. } else {
  28. $res[] = "$key = " . (is_numeric($val) ? $val : '"' . $val . '"');
  29. }
  30. }
  31. safefilerewrite($file, implode("\r\n", $res));
  32. }
  33.  
  34. function safefilerewrite($fileName, $dataToSave) {
  35. $fp = fopen($fileName, 'w');
  36. if ($fp !== FALSE) {
  37. $startTime = microtime();
  38. do {
  39. $canWrite = flock($fp, LOCK_EX);
  40. if (!$canWrite) {
  41. usleep(round(rand(0, 100) * 1000));
  42. }
  43. } while ((!$canWrite)and ( (microtime() - $startTime) < 1000));
  44. if ($canWrite) {
  45. fwrite($fp, $dataToSave);
  46. flock($fp, LOCK_UN);
  47. }
  48. fclose($fp);
  49. }
  50. }
  51. write_php_ini($_REQUEST, $konfiguracjaNazwaPliku); // zapis do pliku nowych wartości
  52. } else {
  53. $message = "<h3 style=\"color: red; text-align: center;\">Nie prawidłowe hasło.</h3>";
  54. }
  55. $konfiguracjaTablica = $_REQUEST;
  56. }
  57.  
  58. # generujemy prosty formularz - dla każdej wartości klucz=wartość pliku INI zostanie wygenerowany input z opisem klucza
  59. $html = "
  60. <html>
  61. <body>
  62. <form method=\"POST\" >
  63. <table style=\"border: 1px solid black; padding: 5px; margin: auto;\">
  64. <tr><td style=\"min-width: 150px;\" colspan=2>$message</td></tr>
  65. ";
  66. foreach ($konfiguracjaTablica as $klucz => $wartosc) {
  67. $html .="<tr><td><label>$klucz</label></td><td><input type=\"text\" name=\"$klucz\" value=\"$wartosc\" /></td></tr>";
  68. }
  69.  
  70. $html .="
  71. <tr><td></td><td><br /></td></tr>
  72. <tr><td><label>Hasło:</label></td><td><input type=\"password\" name=\"password\" value=\"\" /></td></tr>
  73. <tr><td colspan=2><input type=\"submit\" value=\"wyslij\" style=\"min-width: 100px; padding: 5px; margin: 5px; float: right;\" /></td></tr>
  74. </table>
  75. </form>
  76. </body>
  77. </html>
  78. ";
  79.  
  80. # wyświetlenie formularza
  81. echo $html;
  82. ?>


i plik ini znajdujący się na serwerze

textdozmiany1 = "jakis tekst1"
textdozmiany2 = "jakis tekst2"
textdozmiany3 = "jakis tekst3"


Całość do testowania na byethost wraz z zablokowanym dostępem (poza skryptem) do pliku ini
someone007
Po stokroć przeogromne dzięki!

Ostatnie tylko pytanko,

kod pliku który chcę zmienić wygląda tak:
  1. (function (lib, img, cjs, ss) {
  2.  
  3. var p; // shortcut to reference prototypes
  4.  
  5. // library properties:
  6. lib.properties = {
  7. width: 750,
  8. height: 200,
  9. fps: 25,
  10. color: "#FFFFFF",
  11. opacity: 1.00,
  12. manifest: [
  13. {src:"images/db.png?1473760814537", id:"db"}
  14. ]
  15. };
  16.  
  17.  
  18.  
  19. lib.ssMetadata = [];
  20.  
  21.  
  22. // symbols:
  23.  
  24.  
  25.  
  26. (lib.db = function() {
  27. this.initialize(img.db);
  28. }).prototype = p = new cjs.Bitmap();
  29. p.nominalBounds = new cjs.Rectangle(0,0,750,200);
  30.  
  31.  
  32. (lib.Klatkapośrednia2 = function(mode,startPosition,loop) {
  33. this.initialize(mode,startPosition,loop,{});
  34.  
  35. // Warstwa 1
  36. this.text = new cjs.Text("tekst do zmiany", "20px 'Arial'", "#FFFFFF");
  37. this.text.lineHeight = 24;
  38. this.text.lineWidth = 80;
  39. this.text.parent = this;
  40. this.text.setTransform(-39.7,-11.1);
  41.  
  42. this.timeline.addTween(cjs.Tween.get(this.text).wait(1));
  43.  
  44. }).prototype = p = new cjs.MovieClip();
  45. p.nominalBounds = new cjs.Rectangle(-41.7,-13.1,83.5,26.4);
  46.  
  47.  
  48. (lib.Klatkapośrednia1 = function(mode,startPosition,loop) {
  49. this.initialize(mode,startPosition,loop,{});
  50.  
  51. // Warstwa 1
  52. this.text = new cjs.Text("qwerty", "43px 'Arial'", "#FFFFFF");
  53. this.text.lineHeight = 50;
  54. this.text.lineWidth = 175;
  55. this.text.parent = this;
  56. this.text.setTransform(-87.5,-24);
  57.  
  58. this.timeline.addTween(cjs.Tween.get(this.text).wait(1));
  59.  
  60. }).prototype = p = new cjs.MovieClip();
  61. p.nominalBounds = new cjs.Rectangle(-89.5,-26,179,52.1);
  62.  
  63.  
  64. (lib.button = function(mode,startPosition,loop) {
  65. this.initialize(mode,startPosition,loop,{});
  66.  
  67. // Warstwa 1
  68. this.shape = new cjs.Shape();
  69. this.shape.graphics.f().s("#A63100").ss(1,1,1).p("Eg/fgLUMB+/AAAIAAWpMh+/AAAg");
  70. this.shape.setTransform(375,100,0.923,1.379);
  71.  
  72. this.shape_1 = new cjs.Shape();
  73. this.shape_1.graphics.f("#00CC99").s().p("Eg/fALUIAA2oMB+/AAAIAAWog");
  74. this.shape_1.setTransform(375,100,0.923,1.379);
  75.  
  76. this.timeline.addTween(cjs.Tween.get({}).to({state:[]}).to({state:[{t:this.shape_1},{t:this.shape}]},3).wait(1));
  77.  
  78. }).prototype = p = new cjs.MovieClip();
  79. p.nominalBounds = null;
  80.  
  81.  
  82. (lib.rek = function(mode,startPosition,loop) {
  83. this.initialize(mode,startPosition,loop,{});
  84.  
  85. // 750x200
  86. this.instance = new lib.Klatkapośrednia2("synched",0);
  87. this.instance.parent = this;
  88. this.instance.setTransform(374.2,118.6);
  89. this.instance.alpha = 0;
  90. this.instance._off = true;
  91.  
  92. this.timeline.addTween(cjs.Tween.get(this.instance).wait(19).to({_off:false},0).to({alpha:1},8).wait(62));
  93.  
  94. // Reklama
  95. this.instance_1 = new lib.Klatkapośrednia1("synched",0);
  96. this.instance_1.parent = this;
  97. this.instance_1.setTransform(-117,79.4);
  98.  
  99. this.timeline.addTween(cjs.Tween.get(this.instance_1).to({x:378,y:81.4},10,cjs.Ease.get(1)).to({x:373},8,cjs.Ease.get(1)).wait(71));
  100.  
  101. // db.png
  102. this.instance_2 = new lib.db();
  103. this.instance_2.parent = this;
  104.  
  105. this.timeline.addTween(cjs.Tween.get(this.instance_2).wait(89));
  106.  
  107. }).prototype = p = new cjs.MovieClip();
  108. p.nominalBounds = new cjs.Rectangle(-206.5,0,956.5,200);
  109.  
  110.  
  111. // stage content:
  112. (lib.db_750x200_v1 = function(mode,startPosition,loop) {
  113. this.initialize(mode,startPosition,loop,{});
  114.  
  115. // timeline functions:
  116. this.frame_0 = function() {
  117. this.target_button.addEventListener("click", fl_ClickToGoToWebPage);
  118.  
  119. function fl_ClickToGoToWebPage() {
  120. window.open(clickTag, "_blank");
  121. document.removeAllChildren();
  122. document.update();
  123. }
  124.  
  125.  
  126. var parsed = (document.location.href.split('#')[1]||'').split('&');
  127. var params = parsed.reduce(function (params, param) {
  128. var param = param.split('=');
  129. params[param[0]] = decodeURIComponent(param.slice(1).join('='));
  130. return params;
  131. }, {});
  132.  
  133. var clickTag = params.clickTag;
  134.  
  135. /* ustawienie marginesu na 0 powinno być zawsze w pierwszej klatce */
  136. var bodyStyle = document.body.style;
  137. bodyStyle.margin = 0;
  138. bodyStyle.padding = 0;
  139. /* brak tła */
  140. canvas.style.background='transparent';
  141. bodyStyle.background='transparent';
  142. }
  143.  
  144. // actions tween:
  145. this.timeline.addTween(cjs.Tween.get(this).call(this.frame_0).wait(1));
  146.  
  147. // button
  148. this.target_button = new lib.button();
  149. this.target_button.parent = this;
  150. this.target_button.setTransform(406.5,72.5,1,1,0,0,0,406.5,72.5);
  151. new cjs.ButtonHelper(this.target_button, 0, 1, 2, false, new lib.button(), 3);
  152.  
  153. this.timeline.addTween(cjs.Tween.get(this.target_button).wait(1));
  154.  
  155. // Warstwa 1
  156. this.instance = new lib.rek();
  157. this.instance.parent = this;
  158. this.instance.setTransform(375,100,1,1,0,0,0,375,100);
  159.  
  160. this.timeline.addTween(cjs.Tween.get(this.instance).wait(1));
  161.  
  162. }).prototype = p = new cjs.MovieClip();
  163. p.nominalBounds = new cjs.Rectangle(168.5,99,957.5,202);
  164.  
  165. })(lib = lib||{}, images = images||{}, createjs = createjs||{}, ss = ss||{});
  166. var lib, images, createjs, ss;


w liniach zawierających frazę potrzebuję tylko podmieniać TEKST do zmiany
this.text = new cjs.Text("TEKST do zmiany", "20px 'Arial'", "#FFFFFF");

Może coś zrobiłem nie tak, ale Twój skrypt wydaje mi się, że czyści inne dane?
Przepraszam, że jeszcze męczę. Obiecuję więcej już nie "marudzić"
dzięki!
rafkon1990
Skrypt który napisałem we wcześniejszym poście robi dokładnie to co miał robić:
Wszystkie pola input (text) formularza zapisuje do pliku.
Jeżeli chcesz zapisać tylko wybrany/e pole/a to musisz delikatnie modyfikować skrypt.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.