Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Formularz bez przeladowania strony. Problem z przekazaniem zmiennych.
Forum PHP.pl > Forum > XML, AJAX
fcppl
witam,

Chciałem zrobić prosty formularz bez przeładowania strony za pomocą serialize i wszystko działa OK, ale po wywołaniu skryptu nie przekazuje zmiennej Submit POST -> $_POST['unpublished'] i $_POST['published']

Jeżeli formularz ładuję bezpośrednio z products_success.php te zmienne istnieją i warunki mogą być spełnione.

Problem mam taki jak zrobić żeby te zmienne POST po wywołaniu serialize też istniały?

  1. $(document).ready(function(){
  2. $("#form_add_products").on("submit", function(event){
  3. event.preventDefault();
  4. $.post("products_success.php", $(this).serialize(), function(data){
  5.  
  6. });
  7. });
  8. });
  9.  
  10.  
  11. <form id="form_add_products" method="post" enctype="multipart/form-data">
  12.  
  13. ....
  14.  
  15. <input type="submit" name="published" value="Opublikuj" class="dropdown-item">
  16. <input type="submit" name="unpublished" value="Wycofaj" class="dropdown-item">
  17.  
  18. </form>


  1. echo = $_POST['published'];
  2. echo = $_POST['unpublished'];
  3.  
  4.  
  5. if (isset($_POST['published'])) {
  6.  
  7. echo 'publikuje';
  8.  
  9. }
  10.  
  11. if (isset($_POST['unpublished'])) {
  12.  
  13. echo 'wylaczony';
  14.  
  15. }
nospor
serialize omija buttony.Musisz niestety sam recznie dodac ten button, ktory byl kliniety
trueblue
A "wycofaj" powoduje zapis danych?
fcppl
dzięki za informację. Mogę prosić o jakis przykład jak dodac samemu button ?

Cytat(trueblue @ 10.01.2023, 14:16:53 ) *
A "wycofaj" powoduje zapis danych?


Nie nic się nie dzieje
trueblue
To po co analizować, który przycisk został naciśnięty w PHP.
Przycisk powinien być albo <input type="reset"> albo buttonem z przekierowaniem do innej strony/przeładowaniem (JS).
fcppl
Cytat(trueblue @ 10.01.2023, 14:21:40 ) *
To po co analizować, który przycisk został naciśnięty w PHP.
Przycisk powinien być albo <input type="reset"> albo buttonem z przekierowaniem do innej strony/przeładowaniem (JS).


W moim przypadku mam kilka przyciskow dla przykładu tutaj podałem dwa i wszystko działa OK tylko niestety tak jak sie teraz dowiedziałem serialize nie przenosi ich danych.
nospor
Cytat
Mogę prosić o jakis przykład jak dodac samemu button ?

No normalnie do tablicy ktora zwraca serialize dodajesz kolekjny element

var formData = $(this).serialize();
formData.push({ name: "twoj button", value: "twoja wartosc" });
fcppl
Cytat(nospor @ 10.01.2023, 14:35:32 ) *
No normalnie do tablicy ktora zwraca serialize dodajesz kolekjny element

var formData = $(this).serialize();
formData.push({ name: "twoj button", value: "twoja wartosc" });


wykombinowałem coś takiego ale niestety nie działą, pewnie coś robię zle ale niestety nie wiec jak to ogarnać. Wykonywałem tez rożne inne testy ale wklejam tylko jeden.

  1. $(document).ready(function(){
  2. $("#form_add_products").on("submit", function(event){
  3. event.preventDefault();
  4.  
  5. var formData = $(this).serialize();
  6.  
  7. formData.push({name:"published", value:"Opublikuj"});
  8.  
  9. $.post("products_success.php",
  10.  
  11. formData,
  12.  
  13. function(data){
  14.  
  15. });
  16. });
  17. });
nospor
I czym sie objawia "nie dzialanie" ?
fcppl
Cytat(nospor @ 10.01.2023, 15:21:11 ) *
I czym sie objawia "nie dzialanie" ?


nic się nie dzieje a z konsoli mam bład

  1. products.php?pageno=1:424 Uncaught TypeError: formData.push is not a function
  2. at HTMLFormElement.<anonymous> (products.php?pageno=1:424:15)
  3. at HTMLFormElement.dispatch (jquery-3.5.1.min.js:2:43090)
  4. at v.handle (jquery-3.5.1.min.js:2:41074)
nospor
no to pisz od razu a "nei nie dziala" tongue.gif

co zwraca

console.log(formData);
?

sorki, w moim przykladzie powinno byc
serializeArray()
fcppl
Cytat(nospor @ 10.01.2023, 15:48:08 ) *
no to pisz od razu a "nei nie dziala" tongue.gif

co zwraca

console.log(formData);
?

sorki, w moim przykladzie powinno byc
serializeArray()


Teraz wszystko działa OK, ale mam ostatni problem. Wiem ze to są pytania amatorskie:

Teraz jak kliknę Opublikuj lub Wycofaj zawsze razem mi wywołuje do Post te dwie zmienne. Jak zrobić zeby odpowiednio osobno wywołało jak klikne Opublikuj i osobno Wycofaj?

  1. $(document).ready(function(){
  2. $("#form_add_products").on("submit", function(event){
  3. event.preventDefault();
  4.  
  5. var formData = $(this).serializeArray();
  6.  
  7. formData.push({name:"published", value:"Opublikuj"});
  8. formData.push({name:"unpublished", value:"Wycofaj"});
  9.  
  10. $.post("products_success.php",
  11.  
  12. formData,
  13.  
  14. function(data){
  15.  
  16. });
  17. });
  18. });
nospor
No submit masz dodawac ten ktory sie kliknal a nie na chama pchasz dwa.
Jaki zostal klikniety submit to chyba masz w event a konkretnie w event.target. Sprawdz
fcppl
Cytat(nospor @ 10.01.2023, 16:18:39 ) *
No submit masz dodawac ten ktory sie kliknal a nie na chama pchasz dwa.
Jaki zostal klikniety submit to chyba masz w event a konkretnie w event.target. Sprawdz


Możesz mi podac jakis przykład bo niestety nie wiem jak sie za to zabrać?

nospor
console.log(event.target);

co ci zwraca?
fcppl
Cytat(nospor @ 10.01.2023, 16:42:24 ) *
console.log(event.target);

co ci zwraca?


Podaj link bo jest tego sporo i nie chce wklejac:

https://fcp.vot.pl/k.txt
nospor
hm, to chyba w przypadku ajax musisz podpiac zdarzenia click pod te buttony, zamiast zdarzenie pod wyslanie forma.
Wtedy bedziesz wiedzial jednoznacznie ktory submit kliknieto i tylko jego dodasz

fcppl
Cytat(nospor @ 10.01.2023, 17:20:54 ) *
hm, to chyba w przypadku ajax musisz podpiac zdarzenia click pod te buttony, zamiast zdarzenie pod wyslanie forma.
Wtedy bedziesz wiedzial jednoznacznie ktory submit kliknieto i tylko jego dodasz


tylko jak to zrobic? i znow musze prosic o jakis przyklad.
nospor
No zamiast
$("#form_add_products").on("submit"

masz zrobic


$("TWOJ INPUT").on("click"
fcppl
Cytat(nospor @ 10.01.2023, 17:46:26 ) *
No zamiast
$("#form_add_products").on("submit"

masz zrobic


$("TWOJ INPUT").on("click"


jak zmieniłem tak jak pisales to wtedy formularz nie przekazuje jako Post pol type=hidden smile.gif
nospor
A zmieniles o to
$(this).serializeArray();

by zmiast $(this) bylo wskazanie na formularz?
fcppl
Cytat(nospor @ 10.01.2023, 21:08:15 ) *
A zmieniles o to
$(this).serializeArray();

by zmiast $(this) bylo wskazanie na formularz?


Dzięki za pomoca, teraz mi wszystko działa OK, nie wiem tylko czy jest jakis lepszy (krótszy) zapis skryptu? mi działa taki:

  1. $(document).ready(function(){
  2.  
  3. $("#published").on("click", function(event){
  4.  
  5. event.preventDefault();
  6.  
  7. var formData = $('#form_add_products').serializeArray();
  8. formData.push({name:"published", value:"Opublikuj"});
  9.  
  10. $.post("products_success.php",
  11.  
  12. formData,
  13.  
  14. function(data){
  15.  
  16.  
  17. });
  18. });
  19.  
  20.  
  21. $("#unpublished").on("click", function(event){
  22.  
  23. event.preventDefault();
  24.  
  25. var formData = $('#form_add_products').serializeArray();
  26. formData.push({name:"unpublished", value:"Wycofaj"});
  27.  
  28. $.post("products_success.php",
  29.  
  30. formData,
  31.  
  32. function(data){
  33.  
  34.  
  35. });
  36. });
  37.  
  38. });
nospor
Bardziej mi chodzilo byc to zrobil jeden ON na oba submity

Dodajesz klase dla submit ktore chcesz lapac

<input type="submit" name="published" value="Opublikuj" class="dropdown-item lap-submit">
<input type="submit" name="unpublished" value="Wycofaj" class="dropdown-item lap-submit">

a potem lecisz po tej klasie


$(" lap-submit").on("click", function(event){
 
event.preventDefault();
 
var formData = $('#form_add_products').serializeArray();
formData.push({name:event.target.name, value:event.target.value});
 
$.post("products_success.php",
 
formData,
 
function(data){
 
 
});
});

i event.target bodajze zawiera klikniety submit wiec

formData.push({name:event.target.name, value:event.target.value});

I juz, ale to pisane z palca, sprawdz ten event.target
viking
https://jsfiddle.net/7emn9y14/
fcppl
Dziękuję wszystkim za pomoc już działa idealnie.
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-2024 Invision Power Services, Inc.