Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [advajax] problem z assign()
Forum PHP.pl > Forum > XML, AJAX > AJAX
qbejs
Siema exclamation.gif

Mam do Was pytanie, tworze skrypt ma w sobie formularz ( metoda post ) ktory za pomocą assign() odwoluje się do pliku ktory generuje kolejny formularz w ktory znow za pomocą assign() ma wykonać pewne operacje i dodać pewne dane do bazy mysql....mniej więcej wygląda to tak: formularz przesłanie danych za pomocą assign() -> wygenerowanie kolejnego formularza znow przeslanie danych assign() -> dodanie danych bo bazy mysql... Problem pojawia w drugim formularzu, mianowicie mam dodaną tam funkcje wykorzystującą assign po zakończeniu kodu php, jednak nic sie nie dzieje....klikam na wysłanie danych a mnie przeladowuje strone bez zadnego rezultatu a jak patrze w zrodlo kodu to nie ma sladu po funkcji w js...
kossa
Podaj fragment kodu, może wtedy ktoś Tobie pomoże bo nikt na forum nie jest jasnowidzem aby domyślać się co zrobiłeś źle lub gdzie jest błąd w Twoim kodzie.

Łukasz
qbejs
  1. <script type="text/javascript" language="JavaScript" src="advajax.js"></script>
  2. </head>
  3.  
  4. <table align="center">
  5. <tr><td>
  6. <table width="474" height="59" border="0" cellpadding="1" cellspacing="8" align="center">
  7. <tr>
  8. <td colspan=4 bgcolor="#CCCCCC"><div align="center">Wybierz date imprezy oraz klase startową </div></td>
  9. </tr>
  10. <tr>
  11. <td width="474" colspan=4 bgcolor="#CCCCCC">
  12. <center><form id="gen_table" method="post" action="add_points.php"><select name="data" id="data">
  13. <option value="15.04.2007">15.04.2007</option>
  14. <option value="20.05.2007">20.05.2007</option>
  15. <option value="17.06.2007">17.06.2007</option>
  16. <option value="21/22.07.2007">21/22.07.2007</option>
  17. <option value="26.08.2007">26.08.2007</option>
  18. <option value="30.09.2007">30.09.2007</option>
  19. </select>
  20. <select name="klasa" id="klasa">
  21. <option value="junior">junior</option>
  22. <option value="mini">mini </option>
  23. <option value="mini+">mini+</option>
  24. <option value="profi">profi</option>
  25. <option value="turbo">turbo</option>
  26. <option value="diesel">diesel</option>
  27. <option value="turbo+">turbo+</option>
  28. <option value="maxi">maxi</option>
  29. <option value="maxi+">maxi+</option>
  30. <option value="outlaw">outlaw</option>
  31. </select>
  32. <input type="submit" value="Wybierz" /></form></center> </td>
  33. </tr>
  34. </table>
  35.  
  36. <div id="wynik"></div>
  37.  
  38.  
  39. <script type="text/javascript">
  40.  
  41. advAJAX.assign( document.getElementById("gen_table"), {
  42. onLoading : function(obj){
  43. document.getElementById("wynik").innerHTML = '<center><b>Ładowanie danych...</b></center><center><img src="ajax-loader.gif"></center>';
  44. },
  45. onSuccess : function(obj) {
  46. document.getElementById("wynik").innerHTML = obj.responseText;
  47. },
  48. onError: function(obj) {
  49. document.getElementById("wynik").innerHTML = 'Error';
  50. }
  51. });
  52.  
  53.  
  54. advAJAX.assign( document.getElementById("modify_points"), {
  55. onLoading : function(obj){
  56. document.getElementById("wynik").innerHTML = '<center><b>Ładowanie danych...</b></center><center><img src="ajax-loader.gif"></center>';
  57. },
  58. onSuccess : function(obj) {
  59. alert("Dane zostały załadowane");
  60. }
  61. });
  62.  
  63. </td></tr></table>
  64.  
  65. </body>
  66. </html>


Tutaj za pomocą gen_table plik php tworzy mi formularz (modify_points) w ktorym wpisuje dane i chce je przesłać dalej jednak nastepuje przeladowanie w tradycyjny sposob.
Wygląda to tak : wybieram date ( form gen_table )-> zostaje wygenerowany formularz ( modify_points ) w ktorym wpisuje dane --(tu wystepuje blad, nie dziala assign z modify_points)--> przeslanie danych do skryptu z zapytaniem mysql
yaro
proponuje Ci żebyś ikrył ten drugi formularz, a po wybraniu z pierwszego selecta uaktywniasz (pokazujesz) ten ukryty formularz.
qbejs
Cytat(yaro @ 23.03.2007, 20:10:02 ) *
proponuje Ci żebyś ikrył ten drugi formularz, a po wybraniu z pierwszego selecta uaktywniasz (pokazujesz) ten ukryty formularz.


Możesz ciupke jaśniej, w tematyce js i ajax jestem początkujący...Poza tym jeżeli dobrze rozumiem to jak mogę ukryć drugi formularz gdyż plik php który obsługuje pierwszy formularz generuje własnie drugi....Całość wygląda tak że ten formularz z pliku html zacytowanego tu przezemnie w zależnośći od wybranej daty i klasy generuje formularz z rekordami odpowiednimi dla wybranych danych a zatem nie mogę ukryć czegoś co jest generowane dynamicznie. Sprawa dla mnie jest o tyle dziwna że skoro w pliku html zamieściłem metody assign() dla zarówno pierwszego jak i drugiego formularza to dlaczego to nie działa ( skoro w divie sie generuje formularz o odpowiednim id zawartym w stworzonych metodach assign() ).
yaro
OK, już lepiej rozumiem o co Ci chodzi.

Twój problem wynika z tego że advAJAX.assign jest wywoływana przy ładowaniu strony. Funkcja cały czas czuwa nad podanym elementem, tylko że ona na początku go nie ma. Poprostu nie ma takiego formularza więc 'przestaje działać'. A to że tak jest zrobione, to i bardzo dobrze.

Wyjściem z tego jest wsadzenie tego drugiego advAJAX.assign do funkcji a potem dadanie wywołania tej funkcji, jeśli zostały poprawnie pobrane dane (onSuccess)
qbejs
Cytat(yaro @ 24.03.2007, 12:29:12 ) *
OK, już lepiej rozumiem o co Ci chodzi.

Twój problem wynika z tego że advAJAX.assign jest wywoływana przy ładowaniu strony. Funkcja cały czas czuwa nad podanym elementem, tylko że ona na początku go nie ma. Poprostu nie ma takiego formularza więc 'przestaje działać'. A to że tak jest zrobione, to i bardzo dobrze.

Wyjściem z tego jest wsadzenie tego drugiego advAJAX.assign do funkcji a potem dadanie wywołania tej funkcji, jeśli zostały poprawnie pobrane dane (onSuccess)



Ok, już działa i faktycznie to wydaje się logiczne no ale człowiek uczy się na błędach smile.gif Mam jeszcze jedno pytanie, jak zrobić aby w przy tej drugiej metodzie assign("modify_points") przy onSuccess oprocz wyświetlnia komunikatu o wykonaniu polecenia został także wyświetlony formularz generowany przez metode assign("gen_table")
yaro
w drugim assignie zmień w onSuccess: document.getElementById("wynik").innerHTML

document.getElementById(tu jakiś inny div).innerHTML

dane ładuj do innego diva albo zrób coś takeigo:
document.getElementById("wynik").innerHTML += 'bleble';
qbejs
Cytat(yaro @ 24.03.2007, 19:39:17 ) *
w drugim assignie zmień w onSuccess: document.getElementById("wynik").innerHTML

document.getElementById(tu jakiś inny div).innerHTML

dane ładuj do innego diva albo zrób coś takeigo:
document.getElementById("wynik").innerHTML += 'bleble';


Ok, dzieki wielkie za pomoc smile.gif Mam już ( hehe tak mi się wydaje smile.gif ) ostatnie pytanie, mianowicie co jest przyczyną że jak juz pierwszy assign wygeneruje mi form to potem gdy chce np. zmienic wybrane dane to juz nie dziala i przetwarza formularz w tradycyjny sposob.

//EDIT: Problem rozwiązany wystarczyło zmienic z assign na submit smile.gif

A jednak mam pytanie, chce aby dana strona po wygenerowaniu przez formularz odświezala sie co np. 5 sekund...stworzylem taki oto kod jednak coś jest nie tak...

  1. <script type="text/javascript" language="javascript">
  2.  
  3. advAJAX.assign( document.getElementById("gen_results"), {
  4. onLoading : function(obj) {
  5. document.getElementById("wynik").innerHTML = '<center><b>Ladowanie danych...</b></center><center><img src="ajax-loader.gif"> </center>';
  6. },
  7. onSuccess : function(obj) {
  8.  
  9. document.getElementById("wynik").innerHTML = obj.responseText;
  10.  
  11. document.getElementById("wynik").innerHTML = self.setInterval(odswiez();,5000);
  12. },
  13. onError: function(obj) {
  14.  
  15. document.getElementById("wynik").innerHTML = 'Error';
  16. }
  17. });
  18.  
  19. function odswiez() {
  20. advAJAX.get({
  21. url: "gen_results.php",
  22. onSuccess : function(obj) { document.getElementById("wynik").innerHTML = obj.responseText); }
  23. }); }
  24.  
  25.  
yaro
document.getElementById("wynik").innerHTML = self.setInterval(odswiez();,5000); questionmark.gif?

po pierwsze nie przypisuj setInterval do czego kolwiek, bo nie ma po co
a po drugie użyj samo set interval bez tego self
a po trzecie zakończyłeś linie (bo tak to interpretuje parser) po odświez()
po czwarte wystarczy jak zapiszesz setInterval(odswiez, 5000);
SDK
Podpinam się pod ten temat bo mój problem jest podobny, a jednak nieco inny.

Zrobione mam tak: pierwsze wywołanie jest następujące :

Kod
function product_gallery (id) {
     advAJAX.get
     ({
         url : "system/ajax.php",
         parameters : { "ajax_product_gallery" : id },
         onSuccess : function(obj) { document.getElementById("product_gallery").innerHTML = obj.responseText; }
     });
}


Zwraca ona galerię produktu o określonym id. Wszystko działa poprawnie. W ajax.php wykorzystuje XTemplate (http://www.phpxtemplate.org) a zawartość samego template obecnie jest następująca:

Kod
<!-- BEGIN: product_gallery -->
        
         <h3>Galeria produktu</h3>
        
         <!-- BEGIN: images -->
            
             <div class="margin-top-15">
             <img src="{OBRAZEK}" width="150" /> {ID}.{ROZSZERZ} | {DODANO} | {OPIS} | {WEJSC} test
             </div>
            
         <!-- END: images -->
        
         <!-- BEGIN: noimages -->
            
             Dla tego produktu, nie dodano jeszcze fotografii.
            
         <!-- END: noimages -->
        
         <div class="margin-top-15"></div>
         <h3>Dodaj obrazek</h3>
        
         <div id="wynik">
        
         <form id="add_photo" enctype="multipart/form-data" action="dupa.php" method="post">
         <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
         <input type="file" name="obrazek" />
         <input type="submit" value="dodaj" />
         </form>
        
         <script type="text/javascript" language="javascript">
             function add_photo()
             {
                 advAJAX.assign
                 ( document.getElementById("add_photo"),
                 {
                     onLoading : function(obj){
                     document.getElementById("wynik").innerHTML = '<div class=center><b>Ładowanie danych...</b><br/><img src="skins/{PHP.skin}/img/icons/ajax-loader.gif"></div>';
                     },
                     onSuccess : function(obj) {
                     document.getElementById("wynik").innerHTML = obj.responseText;
                     },
                     onError: function(obj) {
                     document.getElementById("wynik").innerHTML = 'Error';
                     }
                 }
                 );
             }
             add_photo();
         </script>
        
         </div>
        
     <!-- END: product_gallery -->


Niestety formularz leci normalnie do action, pomijany jest ajax. Jeżeli natomiast adv.assing dam w poprzednim XTemplate w pliku w którym wywoływana jest metoda advAjax.get, działa poprawnie, ale rozwiązanie mnie nie satysfakcjonuje, chce aby kod odpowiedzialny za dodawanie był w dobrym miejscu, a nie w innym tpl'u, w którym jest zbędny ( ale dziala jeśli w adv.get() onSucc dodam add_photo(); ). Pomyślałem, że może to zadziała, gdy po załadowaniu zainicjowanej metody, którą dam w funkcję wywołam tą funkcję, ale też nic to nie dało.

Może ktoś ma jakiś pomysł ? Pozdrawiam i z góry dziękuję za każdą pomoc.
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.