Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/MySQ/ajax] Zwrotne przesłanie zmiennych do formularza
Forum PHP.pl > Forum > PHP
Przemo75
Witam.
Po wyselekcjonowaniu wyników zapytania z "potrójnej" wyszukiwarki (bez przeładowania strony) i wyborze jednego z nich, wynik z rozszerzonym opisem wyświetlony jest na nowej stronie.
Niestety po kliknięciu przycisku WSTECZ w przeglądarce, strona z wyszukiwarką traci ustawienia, jakie zostały wybrane do wyświetlenia wyników.
Do zwrotnego przesłania parametrów zastosowałem funkcję $_SESSION, ale niestety nie bardzo wiem, jak to "podpiąć" pod wyszukiwarkę.

Wyszukiwarka:
  1. <div class="select-box">
  2. <div class="page-header">
  3. <label>Marka :</label>
  4. <select name="marka" class="marka">
  5. <option value="" selected="selected">---Marka---</option>
  6. <?php
  7. include_once 'get_marka.php';
  8. ?>
  9.  
  10. <label>Model :</label>
  11. <select name="model" class="model">
  12. <option value="" selected="selected">---Model---</option>
  13.  
  14. <label>Rocznik :</label>
  15. <select name="rocznik" class="rocznik">
  16. <option value="" selected="selected">---Rocznik---</option>
  17. </div>
  18. </div>
  19. <div class="" id="display">
  20. <!-- Tutaj wyświetlone są wyniki z wyszukiwarki -->
  21. </div>

Plik get_marka.php (analogicznie są zrobione get_model.php i get_rocznik.php)
  1. <?php
  2. var_dump($_SESSION);
  3. ?>
  4. <?php
  5. $stmt=$DB_con->prepare("SELECT marka FROM haki2 GROUP BY marka");
  6. $stmt->execute();
  7. echo "Akcja=" . $action ."\n";
  8. while($row=$stmt->fetch(PDO::FETCH_ASSOC))
  9. {
  10. $marka = $row['marka'];
  11. ?>
  12. <option value="<?php echo $marka; ?>"><?php echo $marka; ?></option>
  13. <?php
  14. }
  15. ?>

Plik js_haki.js odpowiedzialny za obsługę formularza
[JAVASCRIPT] pobierz, plaintext
  1. $(document).ready(function()
  2. {
  3. // function to get all records from table
  4. function getAll()
  5. {
  6. $.ajax
  7. ({
  8. url: 'pokaz_haki.php',
  9. data: 'action=showAll',
  10. cache: false,
  11. success: function(r)
  12. {
  13. $("#display").html(r);
  14. }
  15. });
  16. }
  17.  
  18. getAll();
  19. // function to get all records from table
  20.  
  21.  
  22. $('body').on('click','img.marka_auta',function()
  23. {
  24. var id = $(this).attr("alt");
  25. $('body').find('select.marka').val(id);
  26. $(".marka").trigger('change');
  27. });
  28.  
  29.  
  30. $('body').on('click','div.model_auta',function()
  31. {
  32. var id = $(this).html();
  33. $('body').find('select.model').val(id);
  34. $(".model").trigger('change');
  35. });
  36.  
  37.  
  38. $('body').on('click','div.rocznik_auta',function()
  39. {
  40. var id = $(this).html();
  41. $('body').find('select.rocznik').val(id);
  42. $(".rocznik").trigger('change');
  43. });
  44.  
  45.  
  46. $(".marka").change(function()
  47. {
  48. var id=$(this).val();
  49. var marka = $('body').find('select.marka').val();
  50. var dataString = 'id='+ id + '&action=marka' + '&marka=' + marka;
  51. $.ajax
  52. ({
  53. type: "POST",
  54. url: "get_model.php",
  55. data: dataString,
  56. cache: false,
  57. success: function(html)
  58. {
  59. $(".model").html(html);
  60. }
  61. });
  62.  
  63. $.ajax
  64. ({
  65. type: "POST",
  66. url: "pokaz_haki.php",
  67. data: dataString,
  68. cache: false,
  69. success: function(r)
  70. {
  71. $("#display").html(r);
  72. }
  73. });
  74. });
  75.  
  76.  
  77. $(".model").change(function()
  78. {
  79. var id=$(this).val();
  80. var marka = $('body').find('select.marka').val();
  81. var model = $('body').find('select.model').val();
  82. var dataString = 'id=' + id + '&action=model' + '&marka=' + marka + '&model=' + model;
  83. $.ajax
  84. ({
  85. type: "POST",
  86. url: "get_rocznik.php",
  87. data: dataString,
  88. cache: false,
  89. success: function(html)
  90. {
  91. $(".rocznik").html(html);
  92. }
  93. });
  94.  
  95. $.ajax
  96. ({
  97. type: "POST",
  98. url: "pokaz_haki.php",
  99. data: dataString,
  100. cache: false,
  101. success: function(r)
  102. {
  103. $("#display").html(r);
  104. }
  105. });
  106. });
  107.  
  108.  
  109. $(".rocznik").change(function()
  110. {
  111. var id=$(this).val();
  112. var marka = $('body').find('select.marka').val();
  113. var model = $('body').find('select.model').val();
  114. var rocznik = $('body').find('select.rocznik').val();
  115. var dataString = 'id=' + id + '&action=rocznik' + '&marka=' + marka + '&model=' + model + '&rocznik=' + rocznik;
  116. $.ajax
  117. ({
  118. type: "POST",
  119. url: "get_rocznik.php",
  120. data: dataString,
  121. cache: false,
  122. success: function(html)
  123. {
  124. $(".links").html(html);
  125. }
  126. });
  127.  
  128. $.ajax
  129. ({
  130. type: "POST",
  131. url: "pokaz_haki.php",
  132. data: dataString,
  133. cache: false,
  134. success: function(r)
  135. {
  136. $("#display").html(r);
  137. }
  138. });
  139. });
  140.  
  141. });
[JAVASCRIPT] pobierz, plaintext
trueblue
W pierwszym <select> zaznaczasz opcję na podstawie zmiennej w sesji, a do dwóch pozostałych zaczytujesz i zaznaczasz na podstawie pozostałych zmiennych.

select1 - zaznaczony na podstawie $id_marka,
select2 - rekordy (modele) wybrane na podstawie $id_marka i zaznaczona opcja na podstawie $id_model
select3 - rekordy (roczniki) wybrane na podstawie $id_model i zaznaczona opcja na podstawie $id_rocznik

Jeśli, którejś zmiennej brak, to zostawiasz zależny od niej i podrzędne selecty puste.
Przemo75
Po WSTECZnym, pole select marki wyświetla ostatnio wybraną markę, ale pozostałe 2 select'y są puste. Poza tym, wyświetla wszystkie marki.
Dla zobrazowania
trueblue
Ale zaczytujesz dane do tych selectów w PHP (nie poprzez Ajax)?
Przemo75
No chyba to jest ze sobą powiązane.
trueblue
No chyba nie. Ajax jest wywoływany przy zmianie wartości w <select>. To co opisałem powinieneś zrobić przy generowaniu zawartości strony.
Od biedy możesz wywoływać zdarzenia wyboru wartości w listach ze skryptu - element.trigger('change').

P.S. Jeszcze lepiej by było gdybyś użył History API, wtedy w adresie URL mógłbyś umieszczać kolejne parametry.
Przemo75
Kurcze, nie znam tego.
Tak się zastanawiam, czy nie pomogła by zmiana przesyłania zmiennych z post na get (3 kroki wyszukiwarki)? Wówczas mógłbym zamienić na "przyjazne linki" i byłoby OK?
trueblue
Nic to nie zmieni, bo przesyłasz dane Ajaxem, czyli strona się nie przeładowuje.
Gdybyś używał wspomnianego History API, to wtedy mógłbyś użyć.

Jeszcze raz:
1. trigger('change') przy załadowaniu strony na liście 2 i 3,
2. lub wypełnienie list (już w PHP przy generowaniu strony/HTML) na podstawie zapamiętanych w sesji zmiennych.
Przemo75
Zmieniłem wszystkie Select'y na:
  1. <?php
  2. if($marka = $_SESSION['marka']){
  3. ?>
  4. <label>Marka :</label>
  5. <select name="marka" class="marka">
  6. <option value="<?php echo $marka; ?>"><?php echo $marka; ?></option>
  7. <?php
  8. include_once 'get_marka.php';
  9. ?>
  10. <?php
  11. }else{
  12. ?>
  13. <label>Marka :</label>
  14. <select name="marka" class="marka">
  15. <option value="" selected="selected">---Marka---</option>
  16. <?php
  17. include_once 'get_marka.php';
  18. ?>
  19. </select>
  20. <?php
  21. }
  22. ?>
  23.  
  24. <?php
  25. if($model = $_SESSION['model']){
  26. ?>
  27. <label>Model :</label>
  28. <select name="model" class="model">
  29. <option value="<?php echo $model; ?>"><?php echo $model; ?></option>
  30. <?php
  31. }else{
  32. ?>
  33. <label>Model :</label>
  34. <select name="model" class="model">
  35. <option value="" selected="selected">---Model---</option>
  36. </select>
  37. <?php
  38. }
  39. ?>
  40.  
  41. <?php
  42. if($rocznik = $_SESSION['rocznik']){
  43. ?>
  44. <label>Rocznik :</label>
  45. <select name="rocznik" class="rocznik">
  46. <option value="<?php echo $rocznik; ?>"><?php echo $rocznik; ?></option>
  47. <?php
  48. }else{
  49. ?>
  50. <label>Rocznik :</label>
  51. <select name="rocznik" class="rocznik">
  52. <option value="" selected="selected">---Rocznik---</option>
  53. </select>
  54. <?php
  55. }
  56. ?>

Po tej zmianie pierwszy select wyświetla nazwę wybranej wcześniej marki, rocznik również wyświetlony jest w Select, ale zniknął drugi select (model) - wyświetla tylko jego nazwę.
Natomiast zawartość (poniżej wyszukiwarki, w której wyświetlane są wybrane rekordy, jest pusta.

Chyba, że powinienem coś jeszcze zmienić w przywoływanym w ajaxie pliku pokaz_haki.php:
  1. <?php
  2. include('dbconfig.php');
  3. $action = $_REQUEST['action'];
  4.  
  5. if ($action=='showAll')
  6. {
  7. $id = "0";
  8. } else {
  9. $id=$_POST['id'];
  10. }
  11.  
  12. switch(true)
  13. {
  14. case ($action == 'showAll' OR ($action == 'marka' and $id == '')):
  15. default:
  16. $stmt=$DB_con->prepare('SELECT marka FROM haki2 GROUP BY marka');
  17. $stmt->execute();
  18. break;
  19.  
  20. case ($action == 'marka' OR ($action == 'model' and $id == '')):
  21. $marka = $_POST['marka'];
  22. $stmt=$DB_con->prepare('SELECT model FROM haki2 WHERE marka=:marka GROUP BY model ORDER BY model');
  23. $stmt->execute(array(':marka'=>$marka));
  24. break;
  25.  
  26. case ($action == 'model' OR ($action == 'rocznik' and $id == '')):
  27. $marka = $_POST['marka'];
  28. $model=str_replace("\\", "", $_POST['model']);
  29. $stmt=$DB_con->prepare('SELECT rok_produkcji FROM haki2 WHERE model=:model GROUP BY rok_produkcji ORDER BY rok_produkcji');
  30. $stmt->execute(array(':model'=>$model));
  31. break;
  32.  
  33. case ($action == 'rocznik'):
  34. $marka = $_POST['marka'];
  35. $model=str_replace("\\", "", $_POST['model']);
  36. $rocznik=str_replace("\\", "", $_POST['rocznik']);
  37. $stmt=$DB_con->prepare('SELECT * FROM haki2 WHERE model=:model AND rok_produkcji=:rocznik ORDER BY rok_produkcji');
  38. $stmt->execute(array(':model'=>$model, ':rocznik'=>$rocznik));
  39. break;
  40. }
  41. ?>
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.