Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Jquery] Dynamiczny formularz zamówienia - problem z wysyłką na maila
Forum PHP.pl > Forum > PHP
forageriss
Witam forumowiczów!
Jako że to mój pierwszy temat (i post za razem) z tego miejsca pragnę powitać wszystkich użytkowników forum.
Przechodząc do meritum problemu. Napisałem skrypt formularza zamówienia obuwia (częściowo sam częściowo przerabiając gotowe skrypty i łącząc je w jeden), w którym kolejne linijki do zamówienia par generowane są dynamicznie za pomocą przycisku "+" i w razie potrzeby usuwane (przyciskiem "-"). Utknąłem jednak przy pisaniu systemu wysyłającego całość na maila.
Opis Problemu
Wszystko działa nieźle z tym że jeśli użytkownik zacznie wypełniać formularz doda przykładowo 6 wierszy dla 6 różnych modeli obuwia po czym stwierdzi że rezygnuje z pozycji 3 i 4 to:
Po pierwsze - numeracja porządkowa linijek psuje się i wygląda tak 1 2 5 6 ( z tym akurat mogę żyć
Po drugie - na maila przychodzi mi cos takiego:
1 Nr katalogowy 123 35par
2 Nr katalogowy 1453 35par
3 (Pusty wiersz)
4 (pusty wiersz)
5 Nr katalogowy 123 35par
6 Nr katalogowy 123 35par

Co w przypadku 50 dodanych pozycji może być uciążliwe w odbiorze.
Moje przypuszczenia
Wydaje mi się że problem leży po stronie skryptu php i pętli for która nie pomija pustych rekordów wysłanych za pomocą $_POST lub też numeracji formularza w jquery (numeracja nie zmienia sie wiec pozostaja puste ID które skrypt php próbuje wyciągnąć z tablicy
czego próbowałem
1. Poprawa numeracji pól - fiasco dopisałem do jquery w miejscu :
  1. $("#usunOsobe_" + ii).click(function(){
  2.  
  3. $("#wiersz_" + ii).remove();
  4.  
  5. });

linijke i--; i niby jest ok jezeli ktos usuwa tylko ostatni wiersz a nie któryś ze środka
2. Zapętlenie pętli for pętlą foreach - tutaj zatrzymały mnie umiejętności php :/ po prostu nie umiem tego napisać
3. przerobienie jquery tak żeby minus usuwał tylko ostatnią linijke kodu (patrz ad1) tutaj poległem na funkcji
  1. $('#form tbody tr:last').remove();

u mnie po prostu usuwa wszystkie wiersze tabeli z dynamicznym formularzem zamiast ostatniego

Tytułem zakończenia
Wszystkie proponowane przezemnie rozwiazania doprowadzone do wersji działającej oraz rozwiązania zupełnie inne są jak najbardziej akceptowane i rozumiane przeze mnie jako pomoc za którą szumnie dziękować będę smile.gif


Kod formularza:
  1.  
  2. <script type="text/javascript">
  3.  
  4. $(document).ready(function(){
  5.  
  6. $(".field").change(function(){
  7.  
  8. $(this).css("background-color","#fbffa0");
  9.  
  10. });
  11.  
  12.  
  13.  
  14. var i = 2;
  15.  
  16.  
  17.  
  18. var szablonWiersza = jQuery.format($("#szablon").val());
  19.  
  20.  
  21.  
  22. function dodajWiersz() {
  23.  
  24. var ii = i++;
  25.  
  26. $(szablonWiersza(ii)).appendTo("#form tbody");
  27.  
  28.  
  29.  
  30. $(".field").change(function(){
  31.  
  32. $(this).css("background-color","#fbffa0");});
  33.  
  34.  
  35.  
  36. $("#usunOsobe_" + ii).click(function(){
  37.  
  38. $("#wiersz_" + ii).remove();
  39.  
  40. });
  41.  
  42. }
  43.  
  44.  
  45.  
  46. $("#dodajOsobe").click(dodajWiersz);
  47.  
  48. });
  49.  
  50. </script>
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57. <!-- Szablon wiersza w tabeli -->
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. <textarea id="szablon" style="display:none;" cols="1" rows="1">
  66.  
  67.  
  68.  
  69. <tr id="wiersz_{0}">
  70.  
  71. <td width="57">{0}.</td>
  72.  
  73. <td width="108">
  74. <input type="text" name="id[]" value="{0}" style="display:none;">
  75.  
  76. <input id="katalogowy" class="field" type="text" name="katalogowy[{0}]"></td>
  77.  
  78. <td width="23">
  79.  
  80. <input class="field" size ="3" type="text" name="35[{0}]"></td>
  81.  
  82. <td width="23">
  83.  
  84. <input class="field" size ="3" type="text" name="36[{0}]"></td>
  85.  
  86. <td width="23">
  87.  
  88. <input class="field" size ="3" type="text" name="37[{0}]"></td>
  89.  
  90. <td width="23">
  91.  
  92. <input class="field" size ="3" type="text" name="38[{0}]"></td>
  93.  
  94. <td width="23">
  95.  
  96. <input class="field" size ="3" type="text" name="39[{0}]"></td>
  97.  
  98. <td width="23">
  99.  
  100. <input class="field" size ="3" type="text" name="40[{0}]"></td>
  101.  
  102. <td width="23">
  103.  
  104. <input class="field" size ="3" type="text" name="41[{0}]"></td>
  105.  
  106. <td width="23">
  107.  
  108. <input class="field" size ="3" type="text" name="42[{0}]"></td>
  109.  
  110. <td width="23">
  111.  
  112. <input class="field" size ="3" type="text" name="43[{0}]"></td>
  113.  
  114. <td width="23">
  115.  
  116. <input class="field" size ="3" type="text" name="44[{0}]"></td>
  117.  
  118. <td width="23">
  119.  
  120. <input class="field" size ="3" type="text" name="45[{0}]"></td>
  121.  
  122. <td width="23">
  123.  
  124. <input class="field" size ="3" type="text" name="46[{0}]"></td>
  125.  
  126. <td width="18"><a href="#" id="usunOsobe_{0}" alt="usun">-</a></td>
  127.  
  128. </tr>
  129.  
  130.  
  131.  
  132. <div id="form_container">
  133.  
  134.  
  135.  
  136. <!-- Właœciwa tabela -->
  137.  
  138. <table id="header" border="0" width="800px" cellspacing="0" cellpadding="0">
  139.  
  140. <tr>
  141.  
  142. <td>
  143.  
  144. FORMULARZ ZAMÓWIENIA</td>
  145.  
  146. </tr>
  147.  
  148. <tr>
  149.  
  150. <td>
  151.  
  152. Proszę wpisać numer katalogowy oraz liczbę zamawianych par</td>
  153.  
  154. </tr>
  155. </thead>
  156.  
  157.  
  158.  
  159.  
  160. <form action="parser.php" method="post" id="order_form">
  161.  
  162. <table id="form" border="0" width="800px">
  163.  
  164.  
  165.  
  166. <tr>
  167.  
  168. <th width="57">Lp</th>
  169.  
  170. <th width="108">Nr Katalogowy</th>
  171.  
  172. <th width="23">35</th>
  173.  
  174. <th width="23">36</th>
  175.  
  176. <th width="23">37</th>
  177.  
  178. <th width="23">38</th>
  179.  
  180. <th width="23">39</th>
  181.  
  182. <th width="23">40</th>
  183.  
  184. <th width="23">41</th>
  185.  
  186. <th width="23">42</th>
  187.  
  188. <th width="23">43</th>
  189.  
  190. <th width="23">44</th>
  191.  
  192. <th width="23">45</th>
  193.  
  194. <th width="23">46</th>
  195.  
  196. <th width="18">+/-</th>
  197.  
  198. </tr>
  199.  
  200. </thead>
  201.  
  202.  
  203. <tr>
  204.  
  205. <th colspan="15">
  206.  
  207.  
  208.  
  209. </th>
  210.  
  211. </tr>
  212.  
  213. </tfoot>
  214.  
  215.  
  216. <tr>
  217.  
  218. <td width="57">1.</td>
  219.  
  220. <td width="108">
  221. <input type="text" name="id[]" value="1" style="display:none;">
  222.  
  223. <input "katalogowy" class="field" type="text" name="katalogowy[1]"></td>
  224.  
  225. <td width="23">
  226.  
  227. <input class="field" size ="3" type="text" name="35[1]"></td>
  228.  
  229. <td width="23">
  230.  
  231. <input class="field" size ="3" type="text" name="36[1]"></td>
  232.  
  233. <td width="23">
  234.  
  235. <input class="field" size ="3" type="text" name="37[1]"></td>
  236.  
  237. <td width="23">
  238.  
  239. <input class="field" size ="3" type="text" name="38[1]"></td>
  240.  
  241. <td width="23">
  242.  
  243. <input class="field" size ="3" type="text" name="39[1]"></td>
  244.  
  245. <td width="23">
  246.  
  247. <input class="field" size ="3" type="text" name="40[1]"></td>
  248.  
  249. <td width="23">
  250.  
  251. <input class="field" size ="3" type="text" name="41[1]"></td>
  252.  
  253. <td width="23">
  254.  
  255. <input class="field" size ="3" type="text" name="42[1]"></td>
  256.  
  257. <td width="23">
  258.  
  259. <input class="field" size ="3" type="text" name="43[1]"></td>
  260.  
  261. <td width="23">
  262.  
  263. <input class="field" size ="3" type="text" name="44[1]"></td>
  264.  
  265. <td width="23">
  266.  
  267. <input class="field" size ="3" type="text" name="45[1]"></td>
  268.  
  269. <td width="23">
  270.  
  271. <input class="field" size ="3" type="text" name="46[1]"></td>
  272.  
  273. <td width="18"><a href="#" id="dodajOsobe" alt="dodaj">+</a></td>
  274.  
  275. </tr>
  276.  
  277. </tbody>
  278.  
  279. </table>


kod pliku parser.php (wysylka na maila)
  1. <?php
  2.  
  3. $osoby = array();
  4. $zamowienie['katalogowe'] = $_POST['katalogowy'];
  5. $zamowienie['35'] = $_POST['35'];
  6. $zamowienie['36'] = $_POST['36'];
  7. $zamowienie['37'] = $_POST['37'];
  8. $zamowienie['38'] = $_POST['38'];
  9. $zamowienie['39'] = $_POST['39'];
  10. $zamowienie['40'] = $_POST['40'];
  11. $zamowienie['41'] = $_POST['41'];
  12. $zamowienie['42'] = $_POST['42'];
  13. $zamowienie['43'] = $_POST['43'];
  14. $zamowienie['44'] = $_POST['44'];
  15. $zamowienie['45'] = $_POST['45'];
  16. $zamowienie['46'] = $_POST['46'];
  17. $zamowienie['id'] = $_POST['id'];
  18. $id = max($zamowienie['id']);
  19.  
  20.  
  21. $do = "mojmail@gmail.com";
  22. $email = "mojmail@gmail.com";
  23. $y ="";
  24. for( $x = 1; $x <= $id; $x++ ) { $txt .= $y . '<tr><td>' . $x . '</td><td>' . $zamowienie['katalogowe'][$x] . '</td><td>' . $zamowienie['35'][$x] . '</td><td>' . $zamowienie['36'][$x] . '</td><td>' . $zamowienie['37'][$x] . '</td><td>' . $zamowienie['38'][$x] . '</td><td>' . $zamowienie['39'][$x] . '</td><td>' . $zamowienie['40'][$x] . '</td><td>' . $zamowienie['41'][$x] . '</td><td>' . $zamowienie['42'][$x] . '</td><td>' . $zamowienie['43'][$x] . '</td><td>' . $zamowienie['44'][$x] . '</td><td>' . $zamowienie['45'][$x] . '</td><td>' . $zamowienie['46'][$x] . '</td></tr>'; }
  25. $temat="Nowe zamowienie Pioko.pl";
  26. $header = "MIME-Versio: 1.0r\n"."Content-type: text/html; charset=UTF-8r\n";
  27. $header .= "From: noreply@asd.pl\n";
  28. $header .= "Cc: $emailr\n";
  29. $header .= "Bcc: $emailr\n";
  30. $body = '<html>
  31. <body>
  32. <table border="1" width="500">
  33. <tr>
  34. <td width="18">LP</td>
  35. <td width="95">Nr Katalogowy</td>
  36. <td>35</td>
  37. <td>36</td>
  38. <td>37</td>
  39. <td>38</td>
  40. <td>39</td>
  41. <td>40</td>
  42. <td>41</td>
  43. <td>42</td>
  44. <td>43</td>
  45. <td>44</td>
  46. <td>45</td>
  47. <td>46</td>
  48. </tr>
  49. ' . $txt . '
  50. </table>
  51. </body>
  52. </html>';
  53.  
  54. mail($do, $temat, $body, $header);
  55. ?>


Calosc mozna zobaczyc pod adresem http://scyller9.webd.pl/pantofle/form.html jesli ktos nie boi sie paskudnego cssa smile.gif
vonski
Jest dokładnie tak jak mówisz, czyli w pętli w ogóle nie sprawdzasz czy dany element istnieje w tablicy czy nie. Jak dodam np. 10 wierszy, a potem usunę pierwsze 9 to i tak ID ostatniego będzie równe 10, a co za tym idzie:

  1. $id = max($zamowienie['id']); // tutaj będzie miał $id = 10
  2.  
  3. // ...
  4.  
  5. for( $x = 1; $x <= $id; $x++ ) {


ten for wykona się 10 razy i za każdym razem będzie tworzył nowy wiersz tabeli. Możesz dać warunek np.

  1. if(!empty($_POST['id'][$x])) {
  2. // i tutaj pętla for
  3. }


to powinno rozwiązać problem pustych wierszy w treści maila.
forageriss
Ślicznie Ci dziękuję za pomoc ! Wiedziałem że dzwonią ale nie wiedziałem w którym kościele smile.gif Dla osób o podobnym problemie gotowe rozwiązanie poniżej:

  1. for( $x = 1; $x <= $id; $x++ ) { if(!empty($_POST['katalogowy'][$x])) { $txt .= $y . '<tr><td>' . $x . '</td><td>' . $zamowienie['katalogowe'][$x] . '</td><td>' . $zamowienie['35'][$x] . '</td><td>' . $zamowienie['36'][$x] . '</td><td>' . $zamowienie['37'][$x] . '</td><td>' . $zamowienie['38'][$x] . '</td><td>' . $zamowienie['39'][$x] . '</td><td>' . $zamowienie['40'][$x] . '</td><td>' . $zamowienie['41'][$x] . '</td><td>' . $zamowienie['42'][$x] . '</td><td>' . $zamowienie['43'][$x] . '</td><td>' . $zamowienie['44'][$x] . '</td><td>' . $zamowienie['45'][$x] . '</td><td>' . $zamowienie['46'][$x] . '</td></tr>'; }
  2. }
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.