hdonoblepsias Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 (επεξεργασμένο) Καλησπέρα. Έχω φτιάξει μια φορμα που είναι στο επάνω μέρος της σελίδας (γιατί έχω και άλλες φόρμες) Κάπως έτσι <form action="new_comment.php" id="new_comment" name="new_comment" class="form_horizontal" method="post" enctype="multipart/form-data"> <input type="hidden" id="userid" name="userid" value="<?php echo $userid; ?>"> </form> και σε κάποιο σημείο ποιο κάτω έχω τα input. Κάπως έτσι <input type="text" name="comment" id="comment" form="new_comment"> <button type="submit" name="new_comment_btn" id="new_comment_btn" form="new_comment" value="<?php echo $article_id ;?>">Add Comment</button> Στην php με τον παραδοσιακό τρόπο παίρνω τις τιμές από όλα τα πεδία με $_POST. Δηλαδή: $_POST["userid"] ===> π.χ. 4 $_POST["comment"] ===> π.χ. Ωραίο άρθρο $_POST["new_comment_btn"] ===> π.χ. 38 Όταν όμως προσπαθώ να το κάνω με ajax, παίρνω όλες τις τιμές εκτός του button. Πως μπορώ να πάρω και την τιμή του button όταν χρησιμοποιώ ajax? $_POST["userid"] ===> π.χ. 4 $_POST["comment"] ===> π.χ. Ωραίο άρθρο $_POST["new_comment_btn"] ===> NULL To script που χρησιμοποιώ είναι κάπως έτσι: <script> $(document).ready(function(){ $('#new_comment').on('submit', function(e){ e.preventDefault(); $.ajax({ url:"new_comment.php", method:"POST", data:new FormData(this), contentType: false, cache: false, processData:false, success:function(data) { $('#comments).html(data); }); }); }); </script> ======================================================================================= Δεν ξέρω αν είναι σωστό/λάθος ή ο μόνος τρόπος που βάζω τιμή στο button, αλλά εξηγώ παρακάτω γιατί το κάνω. Υ.Γ. Θέλω να βάλω το value στο button γιατί το article_id προκύπτει μετά από λούπα foreach και μόνο έτσι μπορώ να στείλω το εκάστοτε article_id. Δηλαδή σε ένα foreach που φτιάχνω το κάθε row, έστω οτί έχω 4 άρθρα με id 23,56,89,94, όλα τα πεδιά παίρνουν και στέλνουν στην php σαν value την τελευταία τιμή του foreach. Μόνο το κουμπί κρατάει την τιμή του κάθε loop. Δηλαδή σε αυτό το table... <?php foreach($articles as $article){ ?> <tr> <td> <input type="hidden" name="article_id_input" value="<?php echo $article=>article_id; ?>"> </td> <td> <button type="submit" name="new_comment_btn" id="new_comment_btn" form="new_comment" value="<?php echo $article=>article_id; ?>">Add Comment</button> </td> </tr> <?php } ?> Αν πατήσω το κάθε κουμπί θα στείλει στην php Το πρώτο κουμπί article_id_input ===> 94 (δηλαδή λάθος), και new_comment_btn ===> 23(δηλαδή σωστό) Το δευτερο κουμπί article_id_input ===> 94 (δηλαδή λάθος), και new_comment_btn ===> 56(δηλαδή σωστό) Το τρίτο κουμπί article_id_input ===> 94 (δηλαδή λάθος), και new_comment_btn ===> 89(δηλαδή σωστό) Το τέταρτο κουμπί article_id_input ===> 94 (Μονο εδώ σωστό), και new_comment_btn ===> 94(δηλαδή σωστό) Επεξ/σία 17 Ιανουαρίου 2019 από hdonoblepsias
kosnik Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 for starters, η λούπα που κάνεις παράγει πολλαπλά button με το ίδιο id, which is bad.
hdonoblepsias Δημοσ. 17 Ιανουαρίου 2019 Μέλος Δημοσ. 17 Ιανουαρίου 2019 1 ώρα πριν, kosnik είπε for starters, η λούπα που κάνεις παράγει πολλαπλά button με το ίδιο id, which is bad. Έχεις δίκιο. Το δίορθωσα, αλλά και πάλι δεν στέλνει
ktf Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 Δοκίμασε αυτό: Αντί αυτού <button type="submit" name="new_comment_btn" id="new_comment_btn" form="new_comment" value="<?php echo $article_id ;?>">Add Comment</button> Δοκοίμασε αυτό: <input type="hidden" name="new_comment_btn" value="<?php echo $article_id ;?>" /> <button type="submit" id="new_comment_btn" form="new_comment" >Add Comment</button> Επισης κοίταξε να είναι όλα πριν το closing tag </form>
kosnik Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 Το σχόλιο ήταν άσχετο με το actual πρόβλημα που αντιμετωπίζεις. Αν θες να βάλεις id οπωσδήποτε, βαζε new_comment_btn_<?php echo $article->articleId; ?> Στη λούπα που έχεις παραθέσει, βλέπω οτι το input και το button έχουν ίδια values (article id). Σε τι εξυπηρετεί αυτό? Γενικά, βάλε (ίδια) κλάση στα κουμπιά, στο on click του κάθε ένα μάζεψε τα data που θες να στείλεις ( p.x. article id θα ειναι το $(this).val() ) και στειλτα με ajax πίσω. Αφού στο on click θα έχεις πάντα το id του άρθρου, αν στα υπόλοιπα inputs που επαναλαμβανονται λόγω λουπας (π.χ. το input για το comment) έχεις βάλει ids στη λογική <input_name>_<article_id> (π.χ. comment_34 για το αρθρο 34), μπορεις μετα να μαζεψεις οτι θες και να το στειλεις με ajax.
hdonoblepsias Δημοσ. 17 Ιανουαρίου 2019 Μέλος Δημοσ. 17 Ιανουαρίου 2019 2 ώρες πριν, ktf είπε Δοκίμασε αυτό: <input type="hidden" name="new_comment_btn" value="<?php echo $article_id ;?>" /> <button type="submit" id="new_comment_btn" form="new_comment" >Add Comment</button> Έτσι δουλεύει, αλλά όπως είπα και στο παράδειγμα πιο πάνω παίρνει το τελευταίο article_id της λούπας. Σε μη ajax κατάσταση, γίνεται το ίδιο, μόνο το value του κουμπιου παίρνει το εκάστοτε article_id της λόυπας. Αλλά σε ajax δεν στέλνει το value. 2 ώρες πριν, ktf είπε Επισης κοίταξε να είναι όλα πριν το closing tag </form> Επειδή έχω πολλές φόρμες και μία τεράστια, είναι κάπως έτσι. Να υπενθυμίσω οτι όλες δουλεύουν μια χαρά εκτός ajax, και οι φόρμες που καλώ με ajax δουλεύουν, αρκεί να μην χρειάζεται να στείλω value του button οι φόρμες μου είναι καπως ετσι. <form ....... id="forma1".............> ........... </form> <form ....... id="forma2".............> ........... </form> <form ....... id="forma3".............> ........... </form> =================== <form ....... id="KENTRIKI FORMA".............> ........... ............ ............ ........... ........... και σε καποια σημεία που θέλω να εμφανίζονται input που πάνε σε άλλη φόρμα βάζω <input type="text" name="comment" id="comment" form="form1"> <button type="submit" name="new_comment_btn" id="new_comment_btn" form="form1" value="<?php echo $article_id ;?>">Add Comment</button> </form> 2 ώρες πριν, kosnik είπε Το σχόλιο ήταν άσχετο με το actual πρόβλημα που αντιμετωπίζεις. Thanks Αν θες να βάλεις id οπωσδήποτε, βαζε new_comment_btn_<?php echo $article->articleId; ?> Δεν το χρειάζομαι κάπου, το έσβησα το id. Δεν ξέρω γιατί μου έχει μείνει κόλλημα, βάζω id σε όλα τα inputs & buttons Στη λούπα που έχεις παραθέσει, βλέπω οτι το input και το button έχουν ίδια values (article id). Σε τι εξυπηρετεί αυτό? Στο παράδειγμα το έκανα έτσι για να δείξω πιο παραστατικά τι τιμές της λούπας αποθηκευονται αν είναι input το πεδίο και τι τιμές αν είναι button. Στην πραγματικότητα δεν έχω τέτοιο hidden πεδίο. Γενικά, βάλε (ίδια) κλάση στα κουμπιά, στο on click του κάθε ένα μάζεψε τα data που θες να στείλεις ( p.x. article id θα ειναι το $(this).val() ) και στειλτα με ajax πίσω. Αφού στο on click θα έχεις πάντα το id του άρθρου, αν στα υπόλοιπα inputs που επαναλαμβανονται λόγω λουπας (π.χ. το input για το comment) έχεις βάλει ids στη λογική <input_name>_<article_id> (π.χ. comment_34 για το αρθρο 34), μπορεις μετα να μαζεψεις οτι θες και να το στειλεις με ajax. Πως μπορώ να το κάνω αυτό? Λογικά θα αλλάξω στο script το $('#new_comment').on('submit', function(e){ που ενεργοποιείται με submit της φόρμας ε?
kosnik Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 Ναι. Μπορείς να φύγεις λίγο απο τη λογικη form submission (εφοσον θα παιξεις μονο με ajax), βάλε απλά κουμπια (οχι type submit), στο on click εφοσοσν εχεις φροντισει να ορισεις σωστα και διακριτα ids (με βαση το article id) σε ολα τα inputs, μαζευεις όλα τα data που θες και τα στελνεις με ajax. Δλδ δεν θα στειλεις σαν data to new FormData(this) αλλα αυτα που μαζεψες στο on click. Είναι απλά μια προσέγγιση, δεν την παρουσιάζω σαν βέλτιστη αλλα θα δουλέψει μια χαρά.
ktf Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 21 λεπτά πριν, kosnik είπε Ναι. Μπορείς να φύγεις λίγο απο τη λογικη form submission (εφοσον θα παιξεις μονο με ajax), βάλε απλά κουμπια (οχι type submit), στο on click εφοσοσν εχεις φροντισει να ορισεις σωστα και διακριτα ids (με βαση το article id) σε ολα τα inputs, μαζευεις όλα τα data που θες και τα στελνεις με ajax. Δλδ δεν θα στειλεις σαν data to new FormData(this) αλλα αυτα που μαζεψες στο on click. Είναι απλά μια προσέγγιση, δεν την παρουσιάζω σαν βέλτιστη αλλα θα δουλέψει μια χαρά. Βασικά από τα συμφραζόμενα η υπόθεση βρωμάει κακό copy-paste. Είτε πρέπει να χρησιμοποιήσει forms και να ομαδοποιήσει τα δεδομένα του μέσα σε κάθε form, είτε να μην χρησιμοποιήσει καθόλου. Αυτό που έχει τώρα είναι ένας αχταρμάς. Το πιο εύκολο είναι να κάνει κάτι του τύπου: <script> function newComment(user_id, article_id, comment) { $.ajax(...); } </script> <?php foreach($articles as $article):?> ... <button onclick="newComment('<?=$user_id?>', '<?=$article->article_id?>', '<?=$comment?>');">Submit your comment</button> <?php endforeach;?>
kosnik Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 (επεξεργασμένο) Σωστα. Πρώτα όμωςπρέπει να τσιμπίσει το comment το οποίο δεν θα υπάρχει στο page load <script> function newComment(user_id, article_id) { // get the comment from the proper input (e.g. from an input#comment_<article_id>) // if comment not empty make the ajax request $.ajax(...); } </script> <?php foreach($articles as $article):?> ... <button onclick="newComment('<?=$user_id?>', '<?=$article->article_id?>');">Submit your comment</button> <?php endforeach;?> Επεξ/σία 17 Ιανουαρίου 2019 από kosnik
hdonoblepsias Δημοσ. 17 Ιανουαρίου 2019 Μέλος Δημοσ. 17 Ιανουαρίου 2019 1 ώρα πριν, ktf είπε Βασικά από τα συμφραζόμενα η υπόθεση βρωμάει κακό copy-paste. Δικό μου κακό copy paste? Οχι, όλα τα πεδία και τις φόρμες της έφτιαξα απο το μηδέν. Μόνο το js βρήκα έτοιμο. Ο τρόπος που λέτε φαντάζομαι οτι πρέπει να κάνω το script κάπως έτσι σωστά? <script> function newComment(user_id, article_id) { $.ajax({ url:"new_comment.php", method:"POST", data:new FormData(this), contentType: false, cache: false, processData:false, success:function(data) { $('#comments).html(data); }; }); } </script> Στην new_comment.php πώς θα λάβω τα δεδομένα? με $_POST["user_id"] και $_POST["article_id"] ?
ktf Δημοσ. 17 Ιανουαρίου 2019 Δημοσ. 17 Ιανουαρίου 2019 1 ώρα πριν, kosnik είπε Σωστα. Πρώτα όμωςπρέπει να τσιμπίσει το comment το οποίο δεν θα υπάρχει στο page load <script> function newComment(user_id, article_id) { // get the comment from the proper input (e.g. from an input#comment_<article_id>) // if comment not empty make the ajax request $.ajax(...); } </script> <?php foreach($articles as $article):?> ... <button onclick="newComment('<?=$user_id?>', '<?=$article->article_id?>');">Submit your comment</button> <?php endforeach;?> Σωστός. Εκεί πρέπει να παίξει με js selector και μοναδικό id. 4 λεπτά πριν, hdonoblepsias είπε Δικό μου κακό copy paste? Οχι, όλα τα πεδία και τις φόρμες της έφτιαξα απο το μηδέν. Μόνο το js βρήκα έτοιμο. Ο τρόπος που λέτε φαντάζομαι οτι πρέπει να κάνω το script κάπως έτσι σωστά? <script> function newComment(user_id, article_id) { $.ajax({ url:"new_comment.php", method:"POST", data:new FormData(this), contentType: false, cache: false, processData:false, success:function(data) { $('#comments).html(data); }; }); } </script> Στην new_comment.php πώς θα λάβω τα δεδομένα? με $_POST["user_id"] και $_POST["article_id"] ? Το θέμα φίλε μου είναι το εξής, δεν πρέπει να αντιγράφεις κώδικα που δεν καταλαβαίνεις. Βλέπεις την λύση που σου πρωτείνουν, την κατανοείς και μετά αν σε καλύπτει την προσαρμόζεις. Εδώ βλέπω ένα προιόν trial & error. Δεν έχω σκοπό να σε προσβάλω, όλοι κάποτε έτσι ξεκινήσαμε αλλά όσο πιο γρήγορα το πάρεις χαμπάρι τόσο πιο γρήγορα θα πας στο επόμενο κεφάλαιο. Ρωτάς αν στο new_comment θα σου έρθει με POST, γιατί δεν κοιτάς πως τα στέλνεις αντί να μαντεύεις και να ρωτάς άλλους. Googlare το documentation για ότι δεν καταλαβαίνεις, τι είναι αυτό το $.ajax, αυτό το new FormData κτλ. Μόλις διαβάσεις το documentation και για τα 2 θα καταλάβεις τι κάνουν και γιατί αυτό που προσπαθείς να κάνεις δεν έχει συνοχή. Το ζητούμενο δεν είναι μόνο να το κάνεις να δουλέψει, αλλά να μάθεις πως και γιατί και να σου μείνει κάτι. Παραπάνω κώδικα δεν θα σου δώσω γιατί αν δεν τα συνδέσεις πως δουλεύουν μόνος σου, δεν θα σου κάνει το κλικ.
hdonoblepsias Δημοσ. 18 Ιανουαρίου 2019 Μέλος Δημοσ. 18 Ιανουαρίου 2019 20 ώρες πριν, ktf είπε Σωστός. Εκεί πρέπει να παίξει με js selector και μοναδικό id. Το θέμα φίλε μου είναι το εξής, δεν πρέπει να αντιγράφεις κώδικα που δεν καταλαβαίνεις. Βλέπεις την λύση που σου πρωτείνουν, την κατανοείς και μετά αν σε καλύπτει την προσαρμόζεις. Εδώ βλέπω ένα προιόν trial & error. Δεν έχω σκοπό να σε προσβάλω, όλοι κάποτε έτσι ξεκινήσαμε αλλά όσο πιο γρήγορα το πάρεις χαμπάρι τόσο πιο γρήγορα θα πας στο επόμενο κεφάλαιο. Ρωτάς αν στο new_comment θα σου έρθει με POST, γιατί δεν κοιτάς πως τα στέλνεις αντί να μαντεύεις και να ρωτάς άλλους. Googlare το documentation για ότι δεν καταλαβαίνεις, τι είναι αυτό το $.ajax, αυτό το new FormData κτλ. Μόλις διαβάσεις το documentation και για τα 2 θα καταλάβεις τι κάνουν και γιατί αυτό που προσπαθείς να κάνεις δεν έχει συνοχή. Το ζητούμενο δεν είναι μόνο να το κάνεις να δουλέψει, αλλά να μάθεις πως και γιατί και να σου μείνει κάτι. Παραπάνω κώδικα δεν θα σου δώσω γιατί αν δεν τα συνδέσεις πως δουλεύουν μόνος σου, δεν θα σου κάνει το κλικ. Εχεις δικιο, απλα καπως δεν μπορω να καταλαβω τα documentation. Προτιμω απο παραδειγματα κλπ. Επισης εχω αγορασει και μαθημα απο udemy για react. Ισως επρεπε πρωτα να παρω για js ή jquery. Το ευτυχημα ειναι οτι με την βοηθεια σας ανακαλυψα πως μπορει να γινει η δουλεια και χωρις φορμες. Μου δουλεψε μια χαρα αυτο που ηθελα. Κατι τελευταιο, οχι το τροπο, απλα με ενα ναι ή οχι. Στο data της επιστροφης οταν ειναι success, εκτος απο html θελω να επιστρεψω και την τιμη μιας μεταβλητης. Απο οτι ειδα γινεται ΜΟΝΟ με json αυτο;
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα