Automatizzazione della gestione degli errori del modulo

1

Non sono sicuro di essere intelligente o di rendere le cose più difficili. Sto lavorando all'interno di un framework MVC personalizzato e all'interno di alcune delle "viste" che contengono moduli sto conservando gli errori di input e di stile come segue:

<form action="submit" method="POST">
<label for="name" class="italic">Name:</label>
<input <?php if (in_array('name', $error)) { echo 'class="form-error"'; } ?> type="text" name="name" value="<?php if (isset($name)) { echo $name; } elseif (isset($valid_user)) { echo $valid_user['name']; } ?>" maxlength="20" required="required" />
<br /><input type="submit" class="submit" value="Update" />

In questo esempio, $valid_user['name'] sarebbe il valore predefinito per i dati esistenti (quando il modulo è stato caricato per la prima volta) e $name sarebbe il valore postato che verrà visualizzato di nuovo qui nel caso in cui ci fosse un errore dell'utente che deve essere riparato.

L'incorporamento di tutti questi valori richiede molto tempo durante la creazione di nuovi moduli, quindi sto cercando di semplificare le cose da solo. Voglio rimanere con una soluzione lato server poiché ritengo che i siti web debbano essere completati da Javascript, non dipendenti da esso. Immagino che probabilmente potrei fare tutto questo dinamicamente usando il DOMDocument di PHP:

$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadHTMLFile($view);
$forms = $dom->getElementsByTagName('form');
$total_forms = $forms->length;

for ($i = 0; $i < $total_forms; $i++) {
    $inputs = $forms->item($i)->getElementsByTagName('input');
    $total_inputs = $inputs->length;

    if ($total_inputs > 0) {
        foreach ($inputs as $input) {
            $type = $input->getAttribute('type');
            switch ($type) {
                case 'text':
                    // check for errors
                    $attr_name = $input->getAttribute('name');
                    if (in_array($attr_name, $error)) {
                        $input->setAttribute('class', 'form-error');
                    }

                    // check for default / posted values
                    if (isset($$attr_name)) {
                        $input->setAttribute('value', $$attr_name);
                    } elseif (isset($_POST[$attr_name])) {
                        $input->setAttribute('value', $_POST[$attr_name]);
                    }
                    break;
            }
        }
    }
}

echo $header;
// remove unwanted tags that are being automatically added
echo preg_replace('~<(?:!DOCTYPE|/?(?:html|body))[^>]*>\s*~i', '', $dom->saveHTML());
echo $footer;

Seguire questo approccio richiederà ovviamente di scrivere un sacco di codice in più, quindi prima di andare avanti sono solo curioso di sapere quali sono le tue opinioni o se ci sono delle potenziali cadute che forse non sto pensando? Sarebbe meglio attenersi al mio approccio originale o ci sono altre soluzioni per renderlo meno noioso?

    
posta mister martin 10.04.2014 - 21:16
fonte

1 risposta

2

La prima cosa che posso suggerirti è eliminare Logic da Markup o sostanzialmente evitare di scrivere la logica in linea nel mark-up. Quindi puoi riscrivere il tuo primo esempio in questo modo:

if ( in_array('name', $error) ) {
    $class = 'form-error';
} else {
    $class = null;
}
// or ...
$class = in_array( 'name', $error ) ? 'form-error' : null;

if ( isset($name) ) {
    $value = $name;
} else if ( isset($valid_user) ) {
    $value = $valid_user['name'];
}

E poi puoi semplicemente riscrivere il mark-up in questo modo, che è molto più semplice:

<input class="<?php echo $class; ?>" value="<?php echo $value; ?>" ...

Se vuoi seguire la seconda strada ti suggerisco di usare Jade al posto della classe DOM di PHP.

Anche a me i due modi sembrano buoni, tuttavia quello successivo potrebbe essere eccessivo.

    
risposta data 10.04.2014 - 21:45
fonte