Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wybrana opcja select i dynamicznie ladowany php
Forum PHP.pl > Forum > XML, AJAX
Jaremilus


Próbuję uzyskać coś takiego jak powyżej (plik register.php dla buddypress), w momencie gdy użytkownik wybierze typ konta pojawia się jego opis po lewej, a także pola dodatkowe na dole. I generalnie od strony funkcjonalności działa na zasadach ogólnych dzięki jquery:

Kod
jQuery.noConflict()
jQuery(document).ready(function(){
    
    ( function ($) {
             $("#field_106").val("Użytkownik");
             $('#typ-fotograf').hide();
             $('#pola-fotograf').hide();
             $('#typ-autor').hide();
             $('#pola-autor').hide();
             $('#typ-uzytkownik').show();
             $('#pola-uzytkownik').show();
    
         $('#field_106').change(function () {
             $('#typ-fotograf').hide();
             $('#pola-fotograf').hide();
             $('#typ-autor').hide();
             $('#pola-autor').hide();
             $('#typ-uzytkownik').hide();
             $('#pola-uzytkownik').hide();
         if (this.options[this.selectedIndex].value == 'Fotograf') {
             $('#typ-fotograf').show();
             $('#pola-fotograf').show();
             var selected_type = 'fotograf';
         }
         if (this.options[this.selectedIndex].value == 'Autor') {
             $('#typ-autor').show();
             $('#pola-autor').show();
             var selected_type = 'autor';
         }
         if (this.options[this.selectedIndex].value == 'Użytkownik') {
             $('#typ-uzytkownik').show();
             $('#pola-uzytkownik').show();
             var selected_type = 'uzytkownik';
         }
     });
        
})(jQuery);
});


Niestety problem pojawia się w momencie wysyłania formularza z powodu błędnej wartości w: input

  1. <?php
  2.  
  3. if(!isset($_POST['selected_type'])) {
  4. $_POST['selected_type'] = 'index';
  5. }
  6.  
  7. switch($_POST['selected_type']){
  8.  
  9. case 'fotograf':
  10. $acc_type_field_id = '104,106,121,122,123';
  11. break;
  12.  
  13. case 'autor':
  14. $acc_type_field_id = '104,106,115,116,117,118';
  15. break;
  16.  
  17. case 'uzytkownik':
  18. $acc_type_field_id = '104,106,115,116,117,118';
  19. break;
  20.  
  21. default:
  22. $acc_type_field_id = '104,106,115,116,117,118';
  23.  
  24. }
  25. ?>


plik register wyglada mniej wiecej tak

- divy ukryty do opisu
- form
- pola A (while) - w moim przypadku lista wyboru
- pola B z innego modułu
- div ukryty pokazujący pola C dla opcji pierwszej (while)
- div ukryty pokazujący C dla opcji drugiej (while)
- div ukryty pokazujący C dla opcji drugiej (while)
- input ukryty z lista id
- submit
- koniec forma

W mojej wersji po prostu pokazuje już załadowane ukryte pola, co powoduje problem z przechwyceniem dobrych id do ukrytego inputa, a to z kolei daje błędne warny w niewypełnionych polach z ukrytych divów. Wtedy pomyślałem własnie o switch, aby wykonać reszte kodu w momencie gdy użytkownik dokona wyboru. Ale nie działa to w ten sposób ponieważ nie potrafię przechwycyć zmiennej z jquery, a cały kod php już się wykonał (załadowana strona). A to na logikę oznacza, że całość kodu musi być przetworzona w jakiś inny sposób, tak by fizycznie w momencie wypełniania formularza był widoczny tylko jeden div z polami C-1 lub C-2 lub C-3 i na bazie tego zwrócona informacja z idkami do inputa.

Jestem laikiem w tym, robię to po omacku, będę wdzięczny za każdą sugestie w rozwiązaniu tego.


EDIT:
zmodyfikowałem SWITCH tak, aby zawierał moje pętle oraz odpowiedniego inputa, da się teraz załadować pola z adresu: ?select_type=cos, czyli pozostało mi podpiąc te akcję do mojego selectboxa, tak by przeładowywał tylko diva C

pytanie więc brzmi czy muszę ten kawałek kodu wywalić do osobnego pliku no i jak podpiąc te akcje do danej opcji z menu?
b4rt3kk
Jeszcze raz, tylko jaśniej, można? Najlepiej z przykładami.
Jaremilus
Cytat
Jeszcze raz, tylko jaśniej, można? Najlepiej z przykładami.


Jaśniej chyba nie potrafię, ale spróbuję.
- wordpress >> buddypress
- moj szablon strony >> pliki szablonów dla buddypressa

Mam trzy pliki registration.php, pola_ladowane.php, addons.js.
W pierwszym znajduje się cały kod wymagany do przetworzenia tego szablonu, w tym drugim mam funkcję (switch) która po otrzymaniu parametru ze zmiennej get ładuje te wybrane (case), w pliku .js mam przypisaną akcję do tego selectboxa, funkcję która pokazuje mi odpowiedniego diva z opisem oraz walidacje dla pól.

--==--

Cały formularz już działa, tj. po wybraniu opcji przeładowuje stronę, zaznacza wybór, ładuje osobne pola i opisy.

Niestety robi to przeładowując całą stronę, a nie za pomocą ajaxa. Gdy próbowałem ładować ajaxem wyłącznie plik.php z wyjętym switchem (tj. kodem odpowiedzialnym za wybrane pola) to pojawiał się fatal z powodu braku zadeklarowanych funkcji w tymże.

Musiałem zrozumieć jak to wszystko jest ładowane, jak działa i... odpuściłem, ponieważ ładowanie w tym wypadku całego pliku drugi raz (de facto pliku szablonu modułu buddypress), a nie tylko tej części odpowiadającej za zmianę pól mija się z celem, podobnie jak redeklaracja funkcji - te są też ładowane w specyficzny sposób do pliku szablonu.

Mimo to sporo się nauczyłem
- poprawiłem kod tj. w switch mam już tylko wyłącznie kod z polami a nie jak na początku tylko ideki.

  1. <?php // FIELDS BASED ON SELECTED ACCOUNT TYPE ?>
  2.  
  3. <?php
  4. if(!isset($_GET['wybrany_typ'])) {
  5. $_GET['wybrany_typ'] = 'index';
  6. }
  7.  
  8. switch($_GET['wybrany_typ']){
  9.  
  10. case 'Fotograf':
  11. ?>
  12.  
  13. <?php if ( bp_is_active( 'xprofile' ) ) : if ( bp_has_profile( array( 'profile_group_id' => 15, 'exclude_fields' => '115, 116, 117, 118, 129, 142', 'fetch_field_data' => false ) ) ) : while ( bp_profile_groups() ) : bp_the_profile_group(); ?>
  14.  
  15. <?php while ( bp_profile_fields() ) : bp_the_profile_field(); ?>
  16.  
  17. <div<?php bp_field_css_class( 'editfield' ); ?>>
  18.  
  19. <?php include get_template_directory() . '/community/members/register-raw-fields.php'; ?>
  20.  
  21. </div>
  22.  
  23. <?php endwhile; ?>
  24.  
  25. <input type="hidden" name="signup_profile_field_ids" id="signup_profile_field_ids" value="<?php echo $first_group_ids; ?><?php bp_the_profile_field_ids(); ?>" />
  26.  
  27. <?php endwhile; endif; endif; ?>
  28.  
  29. <?php break;


- poprawiłem jsa

Kod
(function(){
  function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null
  }
  ( function ($) {
      $('#typ-fotograf').hide();
      $('#typ-autor').hide();
      $('#typ-uzytkownik').hide();
      $('#typ-powitanie').show();
      var val = getURLParameter('wybrany_typ');
      $('#field_106').val(val);
          if ( val == 'Fotograf' ) {
              $('#typ-artysta').show();
              $('#typ-powitanie').hide();
          }
          if ( val == 'Autor' ) {
              $('#typ-autor').show();
              $('#typ-powitanie').hide();
          }
          if ( val == 'Użytkownik' ) {
              $('#typ-uzytkownik').show();
              $('#typ-powitanie').hide();
          }    
      $('#field_106').change(function () {
          if (this.options[this.selectedIndex].value == 'Fotograf') {
              window.location.href= '?wybrany_typ=' + 'Fotograf';
          }
          if (this.options[this.selectedIndex].value == 'Autor') {
              window.location.href= '?wybrany_typ=' + 'Autor';
          }
          if (this.options[this.selectedIndex].value == 'Użytkownik') {
              window.location.href= '?wybrany_typ=' + 'Użytkownik';
          }
          if (this.options[this.selectedIndex].value == '') {
              $('#typ-powitanie').show();
              $('#typ-fotograf').hide();
              $('#typ-autor').hide();
              $('#typ-uzytkownik').hide();
          }
      });
  })(jQuery);
});


- dodałem walidacje dla pól

  1. function field_validation() {
  2.  
  3. global $bp;
  4.  
  5. if ( empty( $_POST['field_106'] ) )
  6. $bp->signup->errors['field_106'] = __( 'Wybierz preferowany typ konta', 'fv' );
  7.  
  8. if ( !isset( $_POST['field_106'] ) ) {
  9. $_POST['field_106'] = 'index';
  10. }
  11. // dodac walidacje imie, nazwisko, email, login
  12. switch($_POST['field_106']){
  13.  
  14. case 'Fotograf':
  15.  
  16. $spr_nazwa = $_POST['field_121'];
  17. if (preg_match('/[^A-Za-z0-9\. -]/', $spr_nazwa) ) {
  18. $bp->signup->errors['field_121'] = __( 'Nazwa nie może zawierać znaków specjalnych', 'fv' );
  19. }
  20. elseif (strlen($spr_nazwa) >= 4 ^ strlen($spr_nazwa) <= 25 ) {
  21. $bp->signup->errors['field_121'] = __( 'Podaj nazwę artysty lub grupy (od 4 do 25 znaków)', 'fv' );
  22. }
  23. elseif ((strlen(trim($spr_nazwa)) != strlen($spr_nazwa)) && (strlen(trim($spr_nazwa)) == 0)) {
  24. $bp->signup->errors['field_121'] = __( 'Nazwa nie może zawierać samych spacji', 'fv' );
  25. }
  26.  
  27. if ( empty( $_POST['field_122'] ) )
  28. $bp->signup->errors['field_122'] = __( 'Wybierz datę rozpoczęcia działalności scenicznej', 'fv' );
  29.  
  30. if ( empty( $_POST['field_123'] ) )
  31. $bp->signup->errors['field_123'] = __( 'Wybierz typ artysty', 'fv' );
  32.  
  33. if ( empty( $_POST['field_104'] ) )
  34. $bp->signup->errors['field_104'] = __( 'Zaakceptuj regulamin', 'fv' );
  35.  
  36. break;
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.