Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nadpisywanie wartości w pliku xml - wartościami z input, Jak to zrobić w czasie rzeczywistym?
Bart123
post 18.05.2014, 23:21:06
Post #1





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Sytuacja jest taka. Mam plik settings.xml, w którym zawarte są ustawienia slidera - typu wysokość, szerokość itp.

Wszystkie te dane wyświetlam na stronie pobierając je z pliku. Wartości, np. Width:600 height:500 wyświetlam w polach input tak jak w formularzu.

I teraz pytanie: Czy istnieje możliwość takiego połączenia pól input z plikiem xml, by w momencie wpisywania nowej wartości np width:1000 zamiast 600, wartość width zmieniała się także w pliku settings.xml?

Bardzo proszę o pomoc.

P.S daleko mi do lenia, dlatego po napisaniu tego pytania, sam staram się znaleźć rozwiązanie. Jeżeli znajdę - powiadomię.

Próbowałem zrobić tak, żeby zmienić najpierw wartość "na siłę", ale nie wypaliło:


foreach($xml->General_Properties ->xpath("$xml->General_Properties->children") as $child ) {
$child->componentWidth->$arr["value"] = '200';
}


A żeby było jeszcze jaśniej: Oto kod, o którym mowa i z którego chciałbym zmieniać wartość value.


<html>
<head>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"
type="text/javascript"></script>

<script>
function ajax(file,wynik){
var xmlhttp;
if (window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById(wynik).innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET",file,true);
xmlhttp.send();
}
</script>


</head>

<?php
$xml=simplexml_load_file($_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml');
$ml = "xml.php";
$wynik = "wynik";


if (!isset($_GET['ajax'])){
echo '<div class="parental">';
echo "<button class='parent' onClick='ajax(\"".$ml."?ajax=1\",\"".$wynik."\")'>General</button>";
echo '<div id="wynik">';
echo '</div>';
echo '</div>';
}
else{
foreach($xml->General_Properties ->children() as $child) { //druk dzieci tylko przy ajaxie
$arr = $child->attributes();
echo $child->getName();
echo "<br><input type='text' name='value' value=" .$arr["value"]."><br>";
}
exit();
}




?>




</html>

Ten post edytował Bart123 19.05.2014, 00:27:35
Go to the top of the page
+Quote Post
daniel1302
post 19.05.2014, 04:59:57
Post #2





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Po przeczytaniu tego artykułu wszystkie twoje niejasności się skończą: http://www.gajdaw.pl/xml/generowanie-xml-w-php/print.html#R6
Go to the top of the page
+Quote Post
Bart123
post 19.05.2014, 12:52:04
Post #3





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


echo "<br><form action='' method='POST'><input type='text' name='value' value='" .$arr["value"]."'/>";
echo "<br><input type='submit' name='button2'/>";

echo "</form><br>";


if (isset($_POST['button2']))

{
$post=$_POST['value'];
$file=$_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml';
$open=fopen($file, 'w+');
fwrite($file, $post);
fclose($file);
}


}



exit();


}




?>


Rozumiem, że tu jest błąd - Was proszę o podpowiedź jaki.

Chcę wysłać nowe wartości z pola input - do pliku xml - zastępując już istniejące, ale to wiadomo. Przypominam, gdyby ktoś np. czytał tylko ostatni wpis.

Ten post edytował Bart123 19.05.2014, 15:05:44
Go to the top of the page
+Quote Post
nospor
post 19.05.2014, 15:59:12
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Musisz wczytać plik XML przy pomocy biblioteki do obslugi XML, np. simpleXML, nastepnie pod wybrany węzeł wpisać wartość z forma, i zapisać ponownie plik jako xml przy pomocy tej biblioteki


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Bart123
post 21.05.2014, 19:28:28
Post #5





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


  1. <head>
  2.  
  3. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"
  4. type="text/javascript"></script>
  5.  
  6. <script>
  7. function ajax(file,wynik){
  8. var xmlhttp;
  9. if (window.XMLHttpRequest){
  10. xmlhttp=new XMLHttpRequest();
  11. }else{
  12. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  13. }
  14. xmlhttp.onreadystatechange=function(){
  15. if (xmlhttp.readyState==4 && xmlhttp.status==200){
  16. document.getElementById(wynik).innerHTML=xmlhttp.responseText;
  17. }
  18. }
  19. xmlhttp.open("GET",file,true);
  20. xmlhttp.send();
  21. }
  22. </script>
  23.  
  24.  
  25. </head>
  26.  
  27. <?php
  28. $xml=simplexml_load_file($_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml');
  29. $ml = "xml.php";
  30. $wynik = "wynik";
  31.  
  32.  
  33. if (!isset($_GET['ajax'])){
  34. echo '<div class="parental">';
  35. echo "<button class='parent' onClick='ajax(\"".$ml."?ajax=1\",\"".$wynik."\")'>General</button>";
  36. echo '<div id="wynik">';
  37. echo '</div>';
  38. echo '</div>';
  39. }
  40. else{
  41. foreach($xml->General_Properties ->children() as $child) { //druk dzieci tylko przy ajaxie
  42. $arr = $child->attributes();
  43. echo $child->getName();
  44.  
  45. echo "<br><form action='' method='POST'><input type='text' name='value' value='" .$arr["value"]."'/>";
  46. echo "<br><input type='submit' name='button2'/>";
  47.  
  48. echo "</form><br>";
  49.  
  50.  
  51. if (isset($_POST['button2']))
  52.  
  53. {
  54. $post=$_POST['value'];
  55. $file=$_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml';
  56. $open=fopen($xml, 'w+');
  57. fwrite($xml, $post);
  58. fclose($xml);
  59. }
  60.  
  61.  
  62. }
  63.  
  64.  
  65.  
  66. exit();
  67.  
  68.  
  69. }
  70.  
  71.  
  72.  
  73.  
  74. ?>
  75.  
  76.  
  77.  
  78.  
  79.  



Plik mam otwarty. Później powinna się wykonać operacja , po czym zamykam plk. Ale nadal nie działa. Walczę z tym już tyle, że sam na to nie wpadnę. Pomóżcie.

Ten post edytował nospor 22.05.2014, 07:36:15
Powód edycji: [nospor]: poprawiam PONOWNIE bbcode
Go to the top of the page
+Quote Post
nospor
post 22.05.2014, 12:50:12
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jak juz pisalem:
Cytat
Musisz wczytać plik XML przy pomocy biblioteki do obslugi XML, np. simpleXML, nastepnie pod wybrany węzeł wpisać wartość z forma, i zapisać ponownie plik jako xml przy pomocy tej biblioteki

Czyli masz tu 3 kroki do zrobienia. Na chwilę obecną jedyne co robisz to krok 1 czyli to:
  1. $xml=simplexml_load_file($_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml');

Zas kroku 2 i 3 nie robisz. Czyli nie przypisujesz danemu węzlowi nowej wartosci ani nie zapisujesz go ponownie jako xml przy pomocy simpleXML.
Zas ten kod:
  1. $post=$_POST['value'];
  2. $file=$_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml';
  3. $open=fopen($xml, 'w+');
  4. fwrite($xml, $post);
  5. fclose($xml);

Nie ma zadnego związku z krokiem 2 i 3

By zapisać zmodyfikowany xml ponownie do pliku, musisz uzyc tej motody
http://pl1.php.net/manual/en/simplexmlelement.asxml.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
timon27
post 22.05.2014, 13:11:11
Post #7





Grupa: Zarejestrowani
Postów: 578
Pomógł: 69
Dołączył: 15.04.2007
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Mam jeszcze pytanko:
czy setting.xml jest wymuszony przez jakieś narzędzie czy sam postanowiłeś tam umieszczać dane?
Bo skoro się często zmienia to logicznie nie powinno go być - te dane powinny być w bazie.
Go to the top of the page
+Quote Post
Bart123
post 22.05.2014, 13:43:50
Post #8





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Na wstępię dziękuje Nospor za wskazówkę.

A teraz odpowiedź na drugie pytanie : Jest to oczywiście plik wymuszony przez slider we flashu. Ja nie tworzyłem tego slidera niestety. Choć chciałbym bardzo sam taki zbudować. Skoro mam jaki mam, to próbuję jakoś usprawnić jego działanie i umożliwić użytkownikowi zmiany z poziomu admina.

Stąd ta cała zabawa.
Go to the top of the page
+Quote Post
Bart123
post 22.05.2014, 13:46:22
Post #9





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


I jeszcze jedno. A w którym miejscu przypisać ten wpis z formularza?

Przyznam się, że to jest moja pierwsza próba zewnętrznego dostępu do pliku xml. Więc staram się czegoś nauczyć przez Wasze wskazówki.

Ten post edytował Bart123 22.05.2014, 13:52:57
Go to the top of the page
+Quote Post
nospor
post 22.05.2014, 13:53:02
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Gdzie przypisac? No tam gdzie masz juz tę wartosc z forma, tuż przed ponownym zapisem do pliku.

Jak modyfikowac węzły XML masz napisane choćby tu:
http://stackoverflow.com/questions/2092172...-with-simplexml
http://stackoverflow.com/questions/4748014...l-node-with-php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Bart123
post 22.05.2014, 14:11:47
Post #11





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Spoko. Widzę i zaraz wypróbuję.
  1. if (isset($_POST['button2']))
  2.  
  3. {
  4.  
  5. // update
  6. $xml->General_Properties->children->$arr["value"] = $_POST["value"];
  7.  
  8. // save the updated document
  9. $xml->asXML($_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml');
  10.  
  11. }
  12.  
  13.  
  14. }
  15.  
  16.  
  17.  
  18. exit();
  19.  



dodałem coś takiego, ale nadal jest źle. Niczego nie zmienia. Coś mi się wydaje, że w update coś źle wpisałem.

  1. <settings>
  2. <General_Properties>
  3. <assets value="images.xml"/>
  4. <componentWidth value="600"/>
  5. <componentHeight value="500"/>
  6. <preloader value="assets/preloaders/comet.swf"/>
  7. <skin value="assets/skins/skin1.xml"/>
  8. <radiusX value="220"/>
  9. <radiusY value="130"/>
  10. <centerX value="300"/>
  11. <centerY value="187"/>
  12. <perspective value="50"/>
  13. <rotationAngle value="0"/>
  14. <rotatioAngleType value="all"/>
  15. <useAlphaEffect value="true"/>
  16. <alphaIntensity value="10"/>
  17. <showCenterImage value="false"/>
  18. <centerImageAlpha value="0.5"/>
  19. <centerImage value="images/logo.png"/>
  20. <centerImageUrl value=""/>
  21. <centerImageUrlTarget value="_blank"/>
  22. <showAbout value="false"/>
  23. <useColorbox value="false"/>
  24. </General_Properties>


A tak wygląda plik xml oczywiście tylko ta część, która mnie interesuje.

Ten post edytował Bart123 22.05.2014, 14:33:02
Go to the top of the page
+Quote Post
nospor
post 22.05.2014, 14:37:21
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zakładam, że <settings> jest głównym węzłem całego XML a nie tylko wybranego przez Ciebie kawałka?

No i poza tym w ogole nie dobierasz się do wezla, jak to mialeś pokazanego w linkach co ci podałem.... jakies bez sensu $arr["value"], jakies children... przejrzales podane przeze mnie linki? Tam masz podany przykladowy XML i jak się dobierac do poszczegolnych węzłów. Masz robić analogicznie a nie wymyslac jakies rzeczy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Bart123
post 22.05.2014, 14:48:26
Post #13





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


nospor - a mógłbyś cofnąć się do poprzednich moich odpowiedzi - choćby do samego pocżatku by wiedzieć skąd się wzięło child w ogóle?

OBJAŚNIAM: Ten kod służy do wyświetlenia całej zawartości XML na stronie, co z resztą działa bezbłędnie.

$ttr oznacza wartość danego dziecka czyli child czyli np. component width jest dzieckiem general settings [parent czyli rodzic]

Każdy child posiada jakąś wartość, a ta wyświetlana jest w input, by można było ją zmienić.

  1. <head>
  2.  
  3. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"
  4. type="text/javascript"></script>
  5.  
  6. <script>
  7. function ajax(file,wynik){
  8. var xmlhttp;
  9. if (window.XMLHttpRequest){
  10. xmlhttp=new XMLHttpRequest();
  11. }else{
  12. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  13. }
  14. xmlhttp.onreadystatechange=function(){
  15. if (xmlhttp.readyState==4 && xmlhttp.status==200){
  16. document.getElementById(wynik).innerHTML=xmlhttp.responseText;
  17. }
  18. }
  19. xmlhttp.open("GET",file,true);
  20. xmlhttp.send();
  21. }
  22. </script>
  23.  
  24.  
  25. </head>
  26.  
  27. <?php
  28. $xml=simplexml_load_file($_SERVER['DOCUMENT_ROOT'] . '/1/wp-content/flashxml/3d-carousel-menu-as3-fx/settings.xml');
  29. $ml = "xml.php";
  30. $wynik = "wynik";
  31.  
  32.  
  33. if (!isset($_GET['ajax'])){
  34. echo '<div class="parental">';
  35. echo "<button class='parent' onClick='ajax(\"".$ml."?ajax=1\",\"".$wynik."\")'>General</button>";
  36. echo '<div id="wynik">';
  37. echo '</div>';
  38. echo '</div>';
  39. }
  40. else{
  41. foreach($xml->General_Properties ->children() as $child) { //druk dzieci tylko przy ajaxie
  42. $arr = $child->attributes();
  43. echo $child->getName();
  44.  
  45. echo "<br><form action='' method='POST'><input type='text' name='value' value='" .$arr["value"]."'/>";
  46. echo "<br><input type='submit' name='button2'/>";
  47.  
  48. echo "</form><br>";
  49.  


I dopiero pod tym ma się znaleźć kod zapsujący wartość w inpucie - jako podmianę wartości w xml. O tak.
Powyższy kod wynika z resztą z podpowiedzi jednego z użytkowników. To nie jest jakiś mój wytwór.


Ten post edytował Bart123 22.05.2014, 15:27:35
Go to the top of the page
+Quote Post
nospor
post 22.05.2014, 14:56:19
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Alez ja to wszystko wiem. Moj poprzedni post jest nadal aktualny. W dalszym ciągu źle się dobierasz do żądanych rzeczy. Ani tu nie jest potrzebne children ani żadne $arr['value']. Przejrzyj jak sie dobierac do poszczegolnych elementow. Podalem ci juz jak.

Jak zas ustawiac atrybuty masz chocby tu
http://stackoverflow.com/questions/2370631...-set-attributes
http://stackoverflow.com/questions/7341904...mplexml-element


A tak w ogole to caly ten kod wyglada kiepsko. Generujesz w petli całą masę formularzy, w zaden sposob nie identyfikujesz czego dotyczy dany forumularz. Potem w tej samej petli robisz zapis, co tez jest bez sensu a to wszystko jeszcze zapisujesz gdy jest AJAX, a wysylajac forma raczej nie ma juz ajaxa, wiec w ogole nie wchodzi nawet do tego kodu


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Bart123
post 22.05.2014, 14:59:24
Post #15





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


No i właśnie po to tu jestem, żeby ktoś kto oczywście znajdzie na to czas - podpowiedział mi konkretnie jak zmienić ten kod by działał sad.gif


Pętli użyłem po to, by nie powtarzać tej samej operacji przy każdym dziecku. Ja wiem, że formularz z przyciskiem wyświetla się za często. Jak zmienię wartości, to i to uporządkuję.

foreach($xml->settings->General_Properties->children() as $child

Przy takim zapisie nic się nie wyświetla - bez settings wyświetla się wszystko.

Dlaczego nie dobieram się jak to nazwałeś, skoro jednak te wartości wszystkie wyświetlają się na stronie. W związku z tym jednak mam do nich dostęp. Nie mogę ich tylko nadpisać.

Szczerze mówiąc ja już się poddaje. Jeżeli ktoś może dokonać zmian w moim kodzie by osiągnąć efekt zapsu do pliku to bardzo proszę. Ja nie mam już siły.

Pozdrawiam.

Ten post edytował Bart123 22.05.2014, 15:31:16
Go to the top of the page
+Quote Post
nospor
post 22.05.2014, 15:39:40
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Dlaczego nie dobieram się jak to nazwałeś, skoro jednak te wartości wszystkie wyświetlają się na stronie. W związku z tym jednak mam do nich dostęp. Nie mogę ich tylko nadpisać.

Ja nie mowie nic o dobieraniu sie do wartosci przy wyswietlaniu.... przy wyswietlaniu masz ok.... Ja mowie caly czas o kawalku modyfikacji danych w xml - tu niestety masz już źle. Odczyt nieznanych tagow to jedno, tam children() jest jak najbardziej ok, bo chcesz pobrac wszystkie dzieci, a modyfikacja znanego wezla, to co innego.
Fakt, Ty nie wiesz jakie węzeł w danej chwili modyfikujesz, bo masz źle przygotowany formularz. Masz też źle zrobiony kawalek z zapisem - nie mowi tu o zlym dostepie do danych, ale ogolnie o zapisie - jest to w zlym miejscu.

Musisz zaczac od poprawnie przygotowanego formularza, dopiero wtedy bedziesz mogl isc dalej.
Musisz zaczac tez od podstaw, co sie dzieje jak wysylasz forma, co sie dzieje jak ajax itp. Tutaj lezysz totalnie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.06.2025 - 11:51