2010-12-30 16 views
6

Kompletny nowicjusz PHP tutaj, prawie wszystkie moje poprzednie prace były w ASP.NET. Obecnie pracuję nad projektem PHP, a pierwszy kamień, na którym natknąłem się, polega na zachowaniu wartości na poczcie zwrotnej.PHP - Najlepszą praktyką do zachowania wartości formularza na poczcie zwrotnej

Dla najprostszego, ale wciąż realistycznego przykładu, mam 10 rozwijanych menu. Nie są jeszcze jeszcze danymi, ponieważ to jest mój następny krok. Są to proste listy rozwijane.

Mam całą stronę zamkniętą w tagu. Zdarzenie onclick() dla każdego menu rozwijanego wywołuje funkcję javascript, która zapełnia ukryty element z ukrytymi elementami, z wybraną wartością rozwijaną. Następnie, po ponownym wczytaniu strony, jeśli ta ukryta wartość nie jest pusta, ustawiam wybraną opcję = opcję ukrytego.

Działa to doskonale w przypadku pojedynczego odświeżenia. Jednak, gdy zmieni się kolejną listę rozwijaną, pierwotny pierwszy spadek straci swoją wartość, ze względu na ukrytą ukrytą wartość, która również traci swoją wartość!

To przyciąga mnie do korzystania z querystringu, sesji lub ... jakiegoś innego pomysłu.

Czy ktoś mógłby wskazać mi właściwy kierunek, która opcja jest najlepsza w mojej sytuacji? Jestem początkującym PHP, jednak jestem zobowiązany do zrobienia czegoś bardzo intensywnego dla mojego poziomu umiejętności, więc potrzebuję czegoś elastycznego i preferibly nieco łatwego w użyciu.

Dzięki!

----- edit -----

Trochę więcej wyjaśnień na moje pytanie :)

Kiedy mówię „odświeżenie” mam na myśli strony/formy składany. Kontrola jest przekazywana z powrotem do serwera, a kod HTML/PHP jest ponownie wykonywany.

Jeśli chodzi o listę rozwijaną & hiddens, powodem, dla którego użyłem ukrytych zmiennych do zachowania "wybranej wartości" lub "wybranego indeksu", jest to, że po przesłaniu strony mogę odświeżyć listę rozwijaną przy poprzednim wyborze zamiast domyślnego powrotu do pierwszego indeksu. Kiedy używam polecenia $ _POST [], nie mogę pobrać menu po nazwie, ale mogę odzyskać ukrytą wartość według nazwy. Właśnie dlatego po zdarzeniu dropdown zmienię javascript, który ustawia wybraną wartość z menu rozwijanego na ukryte.

-------- edytuj ponownie -------- Dobra, widzę, że muszę zrobić krok wstecz i wytłumaczyć ogólny cel :) przepraszam, że nie jestem bardzo jasne na początek.

Mój ostateczny projekt to strona, na której użytkownik może wybrać dział w naszej firmie, aby wyświetlić dane. Po wybraniu tego działu (z menu rozwijanego), wyświetlę bardziej szczegółowe listy wyboru danych dla: koloru, rozmiaru, dostawcy, stylu, daty, sklepu #, itp. ... w tym miejscu również wyświetlam dane sprzedaży dla wybrany dział. Po wybraniu dowolnego koloru, rozmiaru itp. Zaktualizuję wyniki danych o sprzedaży, aby spełnić nowe kryteria:

--------- edycja ---------- Nie mogę podać zewnętrzny dostęp do mojego przykładu, jednak tutaj jest sceenshot z eksplanacją. Na poniższym obrazku użytkownik powinien rozwinąć listę Dział, aby wybrać dział. W tym momencie poniższe dane sprzedaży zostaną odświeżone zgodnie z tym działem. Następnie użytkownik wybrał opcję "Grupuj według", na przykład Store, a strona/dane odświeżyłaby się, wyświetlając dane zgrupowane według magazynu. Następnie w moim przykładzie mogliby wybrać kolor taki jak czarny, a dane pokazywałyby sprzedaż dla wybranego działu i koloru pogrupowane według sklepu.

W tym celu wszystko to jednak, że strona musi zachować dział, kolor, wybór i grupowanie rozwijanych każdy odświeżania/post ...

alt text

+1

Interesujący temat. Powinieneś jednak wyjaśnić, co oznacza [zwrot] (http://en.wikipedia.org/wiki/Postback); jest to termin ASP, nieznany w języku PHP. Dodaj też więcej informacji, jeśli chcesz wyświetlać listy rozwijane lub jeśli przekazanie wartości za pomocą ukrytych pól formularza wystarcza. – mario

+0

dlaczego miałbyś mieć osobne ukryte pole do przechowywania wartości wyboru? select przechowuje wartość samą w sobie. jestem bardzo zmieszany. czy możemy zobaczyć jakiś kod i wyjaśnić, co próbujesz osiągnąć? – dqhendricks

+0

Czy możesz podać link do żywego przykładu Potrafię zrozumieć dokładny proces? – RobertPitt

Odpowiedz

4

Nie ma natywny sposób zautomatyzowanych postbacks , trzeba powtórzyć dane z _POST tablicy $ tak:

<input name="id" value="<?php isset($_POST['id']) ? (int)$_POST['id'] : "" ?>" /> 

Innym sposobem, aby to zrobić jest stworzenie pomocnika formularz, który będzie dynamicznie utworzyć itp wejściowy dla Ciebie, a następnie sprawdzić tablicę post dla klucz, na przykład e xample:

class FormHelper 
{ 
    public function input($name,$type = "text",$default_value = "",$postback = false) 
    { 
     return '<input name="' . $name . '" type="' . $type . 'value="' . $this->_postback($name,$default_value) . '" />'; 
    } 

    //More Methods 


    private function _postback($key,$default = "") 
    { 
     return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : $default; 
    } 
} 

, a następnie można dodać będzie w stanie budować formularze określające, wheather powinien zawierać poprzednią wartość.

byś tworzyć formularze tak:

<form> 
    <?php echo FormHelper::getInstance()->input("id","text","Enter Id",true); ?> 
</form> 

Obviusly stworzenie singleton metodę getInstance()

Niektóre linki, które mogą pomóc.

  1. Form validation using PHP
  2. PHP/CSS Form validation
  3. PHP Form Validation

Po aktualizacji może wiem co masz na myśli nawet, że twój post jest trudne do zrozumienia.

Jeśli im prawo chcesz wykonać następujące czynności:

  • Pokaż formularz na stronie
  • Niech użytkownik wypełnić formularz
  • Gdy użytkownik kliknie złożyć
    • wysłać dane do serwera za pośrednictwem Ajaxa
    • Przetwarzaj informacje dostarczone przez użytkownika
    • Wygeneruj nowy formularz lub zregenerować stary formularz z błędami
    • wysłać formularz z powrotem w dół rury do strony
    • Wyjmij starą formę zastępując starą formę z nowo wygenerowany

Jeśli powyższe jest prawidłowe następnie nie jest to szczególna cecha dla PHP, ale opiera się głównie wokół javascript

najlepszą drogą do osiągnięcia powyższego jest upewnić się, że aplikacja oparta jest szablon, więc w ciągu początkowego ładowania strony pokazać formę tak:

<html> 
    <!-- Head, Meta, Etc--> 
    <body> 
     <?php $this->template->load("templates/forms/specific_form.php"); ?> 
    </body> 
</html> 

To nam zwykle sposób w jaki strona jest ładowana, a następnie na kliknięcie, które chcesz przesłać formularz za pośrednictwem ajax, chciałbym włączyć jQuery do tego.

forma byłaby tak:

<form rel="__postback" ... > 
</form> 

a następnie w ciągu jQuery byłoby wykonać następujące czynności:

$(document).ready(function(){ 
    $("form[rel*=__postback]").each(function(){ 
     var Form = $(this); 

     //Send the form with ajax, bin the __PostbackComplete() 
     function __PostbackComplete(server_data) 
     { 
      //Overwite the form using jQuery LIVE!!!! 
     } 
    }); 
}); 

ciągu PHP byś analizować dane i proces rep formularz z szablonów Sekcja.

mam nadzieję, że to pomoże.

+0

właśnie zaktualizował mój pierwotny post z większą ilością szczegółów, mam nadzieję, że pomoże to lepiej wyjaśnić mój cel. dziękuję za poświęcenie czasu na pomoc! – Adam

0

Jeśli dobrze odpowiem na twoje pytanie, myślę, że problem dotyczy twojego rozwiązania javascript.

Dlaczego wysyłasz tylko wybrane pole? Czy jest wiele form? Chodzi mi o to, że jeśli wszystkie listy rozwijane znajdują się tylko w jednym formularzu, powinieneś wysłać kompletny formularz, gdy dane wejściowe ulegną zmianie, tak, wyślesz poprzednią wartość rozwijaną ponownie, ale to jest sposób na uzyskanie tej wartości za pomocą $ _POST.

+0

Zamiast tego, aby wiele ukrytych obiektów zawierało ich rozwijaną wartość. Powinienem mieć pojedynczy ukryty obiekt, który zawiera cały HTML z mojego formularza? A następnie przeanalizować to za pomocą $ _POST [], gdy mój jest przesyłany/ponownie ładowany, aby pobrać wybrane wartości rozwijane? Jeśli tak, to czy możesz pokazać mi przykład? dziękuję :) – Adam

+0

Jeśli pokażemy trochę twojego html i javascript, rzeczy mogą stać się łatwiejsze. A ja mówiłem, że zawsze przetwarzam zaksięgowane dane, robię wyjście, ale także sprawdzam wszystkie opcje i używam rozwiązania jako @RobertPitt. – Dave

0

Wygląda na to, że wystarczy ponownie wydrukować pola formularza, wprowadzając prawidłowe wartości.

Załóżmy, że chcesz rozwijanej tak:

<select name="department"> 
    <option value="s">Sales</option> 
    <option value="m">Marketing</option> 
</select> 

Po wysłaniu formularza, wartość będzie dostępny dla PHP jako $ _POST [ „dział”]. Teraz chcesz wydrukować formularz ponownie, wybierając właściwy dział.

Musisz funkcji takich jak ten (to tylko szybki szkic):

function outputSelect($name, $values, $currentValue) { 
    echo '<select name="'.htmlspecialchars($name).'">'; 
    foreach ($values as $value => $text) { 
    if ($value === $currentValue) { 
     echo '<option value="'.htmlspecialchars($value).'" selected>'.htmlspecialchars($text).'</option>'; 
    } else { 
     echo '<option value="'.htmlspecialchars($value).'">'.htmlspecialchars($text).'</option>'; 
    } 
    } 
    echo '</select>'; 
} 

by to nazwać, jeśli chcesz, aby wyświetlić menu.Zwykle jest to od wewnątrz szablonu HTML:

<?php outputSelect("department", array("s" => "Sales", "m" => "Marketing"), $_POST["department"]) ?> 

Musisz podobne funkcje dla pól tekstowych, ukrytych pól, przyciski radiowe, itp .. W końcu, będziesz skończyć z biblioteką funkcji wielokrotnego użytku do wyprowadzania pól formularza.

Nie zapomnij użyć htmlspecialchars wokół atrybutów lub treści dowolnego tagu HTML, tak jak powyżej. Jest to szczególnie ważne podczas wyświetlania danych wprowadzanych przez użytkownika, aby zapobiec atakom XSS, ale powinno to być wykonywane niezależnie od źródła danych.

Powiązane problemy