Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nadpisywanie wartości w pliku xml - wartościami z input
Forum PHP.pl > Forum > PHP
Bart123
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>
daniel1302
Po przeczytaniu tego artykułu wszystkie twoje niejasności się skończą: http://www.gajdaw.pl/xml/generowanie-xml-w-php/print.html#R6
Bart123
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.
nospor
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
Bart123
  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.
nospor
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
timon27
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.
Bart123
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.
Bart123
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.
nospor
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
Bart123
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.
nospor
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
Bart123
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.
nospor
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
Bart123
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.
nospor
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.
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.