Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> jquery dynamiczne dodawanie pól formularza, dynamiczne nazwy pol formularza
niebieszki
post 2.02.2011, 21:13:30
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.09.2010

Ostrzeżenie: (0%)
-----


Witam mam następujacy problem.

Chciałbym utworzyć formularz dodąjacy dane do bazy. Na wstępie użytkownik ma mozliwość wyboru ile danych wprowadzić. Zdjecie ponizej przedstawia formularz na wstepie:



Za pomocą przycisku "dodaj" dodajemy kolejne pola formularza



wszystko odbywa sie za pomocą kodu jquery:

  1. <script type="text/javascript">
  2. $(document).ready(function() {
  3.  
  4. $('#add').click(function(){
  5. $('#elements .element:first').clone().appendTo($('#elements')).find('input').val('');
  6. return false;
  7. });
  8.  
  9. });


budowa dokumentu html wyglada nastepujaco:

  1. <tr>
  2. <td>Lp</td>
  3. <td>Nazwa</td>
  4. <td>Imie</td>
  5. <td>select</td>
  6. </tr>
  7. </thead>
  8. <tbody id="elements">
  9. <tr class="element">
  10. <td>1</td>
  11. <td><input type="text" name="nazwa" value="" id="nazwa" /></td>
  12. <td><input type="text" name="imie" value="" id="imie" /></td>
  13. <td>
  14. <option value="1">Pozycja 1</option>
  15. <option value="2">Pozycja 2</option>
  16. </select>
  17. </td>
  18. </tr>
  19. </tbody>
  20. <button id="add">Dodaj</button>
  21. <button id="submit">Wyślij</button>


Wszystko by było fajnie tylko nazwy tych wszystkich pól formularza nie są dynamiczne. Oczywiscie wszystkie maja takie same id i name-y podczac 'klonowania'.

Jak zmienic te nazwy dynamicznie podczas klonowania pol formularza? Może ktoś się spotkał z podobnym problemem?
Go to the top of the page
+Quote Post
krowal
post 2.02.2011, 21:58:15
Post #2





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

Ostrzeżenie: (0%)
-----


Zrób sobie zmienną, która będzie się zwiększać przy dodaniu każdego wiersza do formularza, niech to będzie 'x'. Zamiast atrybutu name="nazwa" użyj name="nazwa[x]" i tak z każdym polem. Potem odbierając z $_POST['name'] dostaniesz tablicę zamiast jednej wartości.


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
niebieszki
post 3.02.2011, 09:38:58
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.09.2010

Ostrzeżenie: (0%)
-----


Jasne... tablice zmiennych nie są mi obce, chodzi mi bardziej o to gdzie wytworzyć iteracje tej wartości 'x'.
Przypominam iz tworzone to jest dynamicznie wiec podczas sprawdzania zrodla strony nie wiswietlaja sie te rekordy poza 1 zdefiniowanym na sztywno przez php.

Jakiś pomysł?
Go to the top of the page
+Quote Post
krowal
post 3.02.2011, 14:24:15
Post #4





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

Ostrzeżenie: (0%)
-----


No nie bardzo rozumiem twój problem, robisz sobie globalną zmienną (var x = 0;), która zwiększa się przy każdym wywołaniu add() i umieszczasz ją w atrybucie name wstawianego elementu (el.attr('name', 'name['+(x++)+']')). Wartość atrybutu 'name' każdego inputa wchodzącego w skład nowego rekordu możesz sobie wyciągnąć wycinając z jego wartości część z nawiasami kwadratowymi np za pomocą replace().


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
niebieszki
post 7.02.2011, 19:42:48
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.09.2010

Ostrzeżenie: (0%)
-----


teraz mój kod wygląda następująco. Wszystko zrobiłem tak jak mi radziłeś.

  1. var x = 0;
  2. $('#add').click(function(){
  3. $('#elements .element:first').clone().appendTo($('#elements')).find('input').val('');
  4. $('#nazwa').attr('name', 'nazwa['+(x++)+']');
  5. return false;
  6. });


Problem na jaki teraz napotkałem to taki:

--- przed kliknieceim dodaj----
pierwszy wiersz (name = nazwa[0])

--- pierwsze klikniecie (dodanie kolejnego wiersza) ----
pierwszy wiersz (name = nazwa[1])
drugi wiersz (name = nazwa[1])


--- drugie klikniecie (dodanie kolejnego wiersza) ----
pierwszy wiersz (name = nazwa[2])
drugi wiersz (name = nazwa[1])
trzeci wiersz (name = nazwa[2])

--- trzecie klikniecie (dodanie kolejnego wiersza) ----
pierwszy wiersz (name = nazwa[3])
drugi wiersz (name = nazwa[1])
trzeci wiersz (name = nazwa[2])
czwarty wiersz (name = nazwa[3])

itd.

Wiec mój utworzony za pomocą html-a wiersz (pierwszy bez js) zmienia swoja nazwę zgodnie z tym ostatnio utworzonym. Jak temu zapobiec? tzn aby każdy z nowo utworzonych wierszy miał indywidualną nazwę?
Go to the top of the page
+Quote Post
krowal
post 10.02.2011, 10:40:59
Post #6





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

Ostrzeżenie: (0%)
-----


Zauważ, że za każdym razem tworzysz inputy o tych samych id co jest niedopuszczalne ponieważ w dokumencie nie może być więcej niż 1 elementów o tym samym id. Przy kazdym dodaniu odwołujesz się do elementu o id '#nazwa', JQ wyszukuje pierwszy element z takim id i zmienia mu atrybut name.

Po prostu musisz zmieniać też id nowo stworzonych elementów.

Ten post edytował krowal 10.02.2011, 10:41:25


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
niebieszki
post 11.02.2011, 14:07:12
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.09.2010

Ostrzeżenie: (0%)
-----


no tak... masz racje z tym id... tylko jakim sposobem sklonować wiersz tabeli od razu z nowymi wartościami?
Podczas klonowania tym kodem tworzą się 2 identyczne wiersze o tych samych name i id. Nawet gdy moje id będzie także zmienna tablicową to p sklonowaniu będzie miała taki sam index i podczas próby zmiany tak jak pisałeś zedytuję się element o pierwszym napotkanym id.

Czytałem w dokumentacji jquery o funkcjach appendTo() i clone() i nie widze mozliwości aby zmieniać id podczas wywołania tej funkcji.

Go to the top of the page
+Quote Post
krowal
post 11.02.2011, 16:20:17
Post #8





Grupa: Zarejestrowani
Postów: 561
Pomógł: 72
Dołączył: 15.11.2006

Ostrzeżenie: (0%)
-----


A tak nie zadziała ?
[JAVASCRIPT] pobierz, plaintext
  1. var newRow = $('#elements .element:first').clone();
  2. newRow.find('input[name="nazwa[0]"]').attr('id', 'noweId');
  3. newRow.find('input[name="imie[0]"]').attr('id', 'noweId');
  4. newRow.appendTo($('#elements'));
[JAVASCRIPT] pobierz, plaintext


Ten post edytował krowal 11.02.2011, 16:20:31


--------------------
Nawet świnka może wejść na drzewo kiedy jest chwalona :)
Go to the top of the page
+Quote Post
niebieszki
post 12.02.2011, 18:24:32
Post #9





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 30.09.2010

Ostrzeżenie: (0%)
-----


Super dziękuje bardzo za pomoc. Po kilku zmianach kod docelowy wygląda następująco:
[JAVASCRIPT] pobierz, plaintext
  1. var x = 0;
  2. $('#add').click(function(){
  3. var newRow = $('#elements .element:first').clone();
  4.  
  5. newRow.find('input[name="name[0]"]').attr('id', 'name['+x+']');
  6. newRow.find('input[id="name['+x+']"]').attr('name', 'name['+(x)+']');
  7.  
  8. newRow.find('input').val('');
  9.  
  10. newRow.appendTo($('#elements'));
  11. return false;
  12. });
[JAVASCRIPT] pobierz, plaintext

Nie wiem czy to jest poprawnie... ale działa jak należy smile.gif Jeszcze raz dzięki Krowal za naprowadzenie na rozwiązanie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 18:05