2010-12-30 10 views
6

Completo di novizio PHP qui, quasi tutto il mio lavoro precedente era in ASP.NET. Ora sto lavorando a un progetto PHP, e la prima pietra su cui mi sono imbattuto sta mantenendo i valori attraverso il postback.PHP: best practice per mantenere i valori dei moduli attraverso il postback

Per l'esempio più semplice ma ancora realistico, ho 10 menù a discesa. Non sono ancora catalogabili, poiché questo è il mio prossimo passo. Sono semplici dropdown.

devo tutta la mia pagina sbarrato in un tag. l'evento onclick() per ogni menu a discesa, chiama una funzione javascript che popolerà l'elemento nascosto dei dropdown corrosivi, con il valore selezionato dei menu a discesa. Quindi, al caricamento della pagina, se quel valore nascosto non è vuoto, imposto l'opzione selezionata = quella del mio nascosto.

Questa grande opera per un singolo postback. Tuttavia, quando viene modificato un altro menu a discesa, il primo dropdown originale perde il suo valore, a causa del suo valore nascosto corrosivo che perde anche il suo valore!

Questo mi attira a considerare di usare querystring, o sedute, o ... qualche altra idea.

Qualcuno mi potrebbe puntare nella giusta direzione, su quale opzione è la migliore nella mia situazione? Sono un debuttante di PHP, tuttavia mi viene richiesto di fare cose piuttosto intense per il mio livello di abilità, quindi ho bisogno di qualcosa di flessibile e preferibilmente un po 'facile da usare.

Grazie!

----- ----- modificare

Un po 'più chiarimenti sulla mia domanda :)

Quando dico 'PostBack' mi riferisco alla pagina/modulo di essere presentati. Il controllo viene passato al server e il codice HTML/PHP viene eseguito nuovamente.

Come per i dropdowns & hiddens, il motivo per cui ho usato le variabili nascoste per conservare il "valore selezionato" o "indice selezionato", è così che quando la pagina viene inviata, sono in grado di ridisegnare il menu a discesa con la selezione precedente , invece di tornare al primo indice di default. Quando uso il comando $ _POST [], non riesco a recuperare il menu a discesa per nome, ma sono in grado di recuperare il valore nascosto per nome. Questo è il motivo per cui durante l'evento dropdown-changed, chiamo javascript che imposta il valore selezionato dal menu a discesa nella sua versione corrosiva nascosta.

-------- modifica di nuovo -------- Va bene va bene, vedo che ho bisogno di fare un passo indietro e spiegare l'obiettivo generale :) Mi scuso per non essere molto chiaro per cominciare.

Il mio progetto finale sarebbe una pagina in cui un utente può selezionare un reparto all'interno della nostra azienda, per visualizzare i dati. Una volta selezionato quel dipartimento (da un menu a discesa), visualizzerò più menu a discesa di selezione dati specifici per: colore, dimensione, fornitore, stile, data, numero negozio, ecc ... a questo punto mostrerò anche i dati di vendita per il reparto selezionato. Selezionando qualsiasi colore, dimensione, ecc. Aggiornerò i risultati dei dati di vendita per soddisfare i nuovi criteri

--------- edit ---------- Non riesco a fornire accesso esterno al mio esempio, tuttavia qui è uno sceenshot con l'esplosione. Nell'immagine seguente, l'utente espande il menu a discesa Dipartimento per selezionare un reparto. A questo punto, i dati di vendita sottostanti si aggiornerebbero secondo quel dipartimento. Quindi, l'utente selezionerebbe un'opzione "Raggruppa per" come Store, e la pagina/i dati si aggiornerebbero per visualizzare i dati raggruppati per negozio. Quindi, nel mio esempio, potevano selezionare un colore come il nero e i dati mostrerebbero le vendite per il reparto e il colore selezionati, raggruppati per negozio.

Per fare tutto questo però, la pagina ha la necessità di mantenere il reparto, il colore e le selezioni discesa raggruppamento ogni aggiornamento/pubblicare ...

alt text

+1

Argomento interessante. Eppure dovresti spiegare cosa significa [postback] (http://en.wikipedia.org/wiki/Postback); è un termine ASP, sconosciuto nella terra di PHP. Aggiungi anche maggiori informazioni se hai bisogno di visualizzare nuovamente i menu a discesa o se è sufficiente passare i valori tramite campi modulo nascosti. – mario

+0

perché dovresti avere un campo nascosto separato per memorizzare il valore della selezione? la selezione memorizza il valore di se stesso. sono molto confuso. possiamo vedere qualche codice e avere una spiegazione di ciò che stai cercando di realizzare? – dqhendricks

+0

Potete fornire un collegamento a un esempio dal vivo Riesco a capire il processo esatto – RobertPitt

risposta

4

Non c'è modo nativo per postback automatizzati , si deve echeggiare i dati dalla matrice _POST $ in questo modo:

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

un altro modo per farlo è quello di creare un aiutante modulo che creerà dinamicamente il vostro ecc input per voi, e quindi controllare la matrice postale per la chiave, per 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; 
    } 
} 

e quindi è possibile aggiungere sarà in grado di costruire forme specificando wheather che dovrebbe contenere il valore precedente.

si creerebbe forme in questo modo:

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

obviusly creato il metodo di Singleton getInstance()

Alcuni link che possono aiutare.

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

Dopo l'aggiornamento io so cosa vuoi dire anche pensato che il vostro messaggio è difficile da capire.

Se im destra si vuole effettuare le seguenti operazioni:

  • Mostra un form nella pagina
  • Lasciate che l'utente compila il modulo
  • Quando l'utente fa clic presentare
    • Invia il dati al server tramite Ajax
    • Elaborazione delle informazioni fornite dall'utente
    • Generazione di un nuovo modulo o rigenerare il vecchio modulo con errori
    • Inviare il modulo indietro lungo il tubo alla pagina
    • Rimuovere il vecchio modulo sostituire il vecchio modulo con l'appena generato uno

Se quanto sopra è corretto allora questa non è una caratteristica particolare per PHP ma principalmente basata su javascript

Il modo migliore per ottenere quanto sopra è assicurarsi che l'applicazione sia basata su modelli, quindi nel caricamento iniziale della pagina si mostra il modulo in questo modo:

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

Questo di solito è il modo in cui viene caricata una pagina, quindi al clic si desidera inviare il modulo tramite Ajax, vorrei incorporare jQuery per questo.

forma sarebbe in questo modo:

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

E poi all'interno di jQuery si dovrebbe effettuare le seguenti operazioni:

$(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!!!! 
     } 
    }); 
}); 

All'interno di PHP che analizzare i dati e il processo rep forma dai modelli sezione.

spero che questo aiuti.

+0

ho appena aggiornato il mio post originale con ulteriori dettagli, spero che questo aiuti a spiegare meglio il mio obiettivo. grazie per aver dedicato del tempo per aiutare! – Adam

0

Se ho trovato la tua domanda giusta, penso che il problema sia in realtà con la tua soluzione javascript.

Perché si sta inviando solo il campo selezionato? Ci sono molte forme? Voglio dire, se tutti i menu a discesa sono all'interno di un solo modulo, dovresti inviare il modulo completo quando cambiano gli input, sì, invierai nuovamente il precedente valore di dropdown, ma questo è il modo per ottenere quel valore con $ _POST.

+0

Quindi, invece di avere più oggetti nascosti per contenere il loro valore di dropdown corrosivo. Dovrei avere un singolo oggetto nascosto che contenga tutto l'html dal mio modulo? E poi analizzarlo usando $ _POST [] quando il mio viene inviato/ricaricato, per recuperare i valori selezionati del menu a discesa? Se questo è il caso, potresti mostrarmi un esempio per favore? grazie :) – Adam

+0

Se mostri un po 'di html e javascript, le cose possono diventare più semplici. E quello che stavo dicendo è di elaborare sempre i dati inviati, fare l'output, ma anche controllare tutte le opzioni e utilizzare una soluzione come @RobertPitt. – Dave

0

Sembra che sia necessario ri-generare i campi del modulo, con i giusti valori precompilati.

Per esempio, diciamo che si desidera un menu a discesa in questo modo:

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

Quando si invia il modulo, il valore sarà disponibile per PHP da $ _POST [ "reparto"]. Ora vuoi stampare nuovamente il modulo, con il dipartimento giusto selezionato.

avrete bisogno di una funzione come questa (questo è solo un rapido schizzo):

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>'; 
} 

Faresti chiami quando si desidera visualizzare il menu.Di solito questo è all'interno di un modello HTML:

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

Avrete bisogno di funzioni simili per i campi di testo, campi nascosti, pulsanti radio, ecc .. Alla fine, vi ritroverete con una libreria di funzioni riutilizzabili per l'emissione di campi modulo.

Non dimenticare di utilizzare htmlspecialchars attorno agli attributi o al contenuto di qualsiasi tag HTML, come faccio sopra. Questo è particolarmente importante quando si visualizzano dati immessi dall'utente, per prevenire attacchi XSS, ma dovrebbe essere fatto indipendentemente dalla fonte dei dati.

Problemi correlati