Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zmiana kolejności elementów i nazwy dla pola input
mateokr92
post 25.06.2017, 07:14:57
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 25.06.2017

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


Cześć, od razu opiszę co chcę osiągnąć.

Dane wejściowe:
Mam grupę elementów z klasą "box". Każdy taki div zawiera kilka pól formularza (w tym <input> typu radio). Elementy te można sortować (przenosić nad lub pod inne elementy) z wykorzystaniem funkcji sortable z jQuery UI.
Każdy element <input> z danego boxa posiada nazwę w postaci "box-[numerIndeksu][nazwaPola]".
Przed sortowaniem kolejne boxy mają numerIndeksu ustawiony rosnąco, zaczynając od indeksu 0.

Dane wyjściowe:
Po przeniesieniu elementu boksa należy zmienić tak numerIndeksu w nazwie każdego pola <input> aby zachować rosnącą numerację indeksów poczytnając od 0 dla wszystkich kolejnych boxów.


Poniżej zamieszczam kod funkcji, która jest wykonywana po zakończeniu przenoszenia. Oraz układ boxów zaraz po przeniesieniu. Efekt jaki chce osiągnąć, to aby pierwszy box miał indeks [0], drugi boks [1], trzeci [2], itd.

Problem mam z polem typu radio. Muszę uwzględnić sytuacje w której może być że jeden box ma trzy opcje radio, a drugi box ma inną liczbę opcji niż trzy (np. dwie).
Mój kod obecnie w pierwszym boxie przy radio "Option 1" otrzymuje nazwę taką samą jak dla boksa drugiego - najpierw zmienia go na [tmp] a następnie na indeks [1] a powinien mieć indeks [0].

Kod java script:

  1. $(document).ready(function() {
  2. $('.container').find('.box').each(function(idx) {
  3. $(this).find('input').each(function() {
  4. let field = $(this);
  5. let fieldName = field.attr('name');
  6. let mIndex = 0;
  7. let fieldNameMatch = fieldName.match(/(.+)\[(\d+)](.+)/);
  8. let fieldTmp = $('.container').find('[name="' + fieldNameMatch[1] + '[' + idx + ']' + fieldNameMatch[3] + '"]');
  9.  
  10. console.log(field);
  11.  
  12. /* Tmp */
  13. fieldTmp.each(function() {
  14. $(this).attr('name', fieldNameMatch[0].replace(/\[\d+]/, '[tmp]'));
  15. $(this).attr('id', $(this).attr('name').replace(/[\[\]]/g, '#').replace(/\#+/g, '-').replace(/[-]+$/g, ''));
  16. $(this).closest('.field').children('label').attr('for', $(this).attr('id'));
  17. });
  18.  
  19. /* Field */
  20. field.attr('name', fieldNameMatch[0].replace(/\[\d+]/g, function(match, pos, original) {
  21. return mIndex++ === 0 ? '[' + idx + ']' : match;
  22. }));
  23. field.attr('id', field.attr('name').replace(/[\[\]]/g, '#').replace(/\#+/g, '-').replace(/[-]+$/g, ''));
  24. field.closest('.field').children('label').attr('for', field.attr('id'));
  25.  
  26. /* Tmp index */
  27. fieldTmp.each(function() {
  28. $(this).attr('name', fieldNameMatch[0].replace(/\[\w+]/, '[' + fieldNameMatch[2] + ']'));
  29. $(this).attr('id', $(this).attr('name').replace(/[\[\]]/g, '#').replace(/\#+/g, '-').replace(/[-]+$/g, ''));
  30. $(this).closest('.field').children('label').attr('for', $(this).attr('id'));
  31. });
  32.  
  33. });
  34. });
  35. });
  36.  


https://jsfiddle.net/pbLkabhe/4/

Nie za bardzo wiem, czemu tak się dzieje.
Go to the top of the page
+Quote Post
trueblue
post 25.06.2017, 16:13:57
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

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


Bardzo to zagmatwane.
Jeśli masz mało różnych typów pól, tj. w każdym boksie występuje tylko tekstowy input i radio, to wprowadź nazwy na stałe do kodu - czyli aktualna nazwa Cię nie interesuje, wprowadzasz nową, zgodnie z nową numeracją.
Jeśli jest więcej różnych typów pól lub grup pól, to zapisz oryginalną nazwę (bez numeracji) w atrybucie np.: data-original-name, a podczas nowego numerowania pobieraj ją stamtąd.

P.S. Do grupowania pól używa się <fieldset>.


--------------------
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: 25.04.2024 - 02:37