Salve. Ho letto l'articolo che parla di come gestire la validazione di un form tramite la programmazione ad oggetti (http://freephp.html.it/articoli/view...olo.asp?id=139 )
Tutto bene, ho capito come funziona. Ora vorrei modificarla. In pratica quando viene aggiunto un errore esso viene aggiunto ad un array e poi tutti gli errori vengono mostrati insieme e poi viene mostrato il form in questo modo:

Errore 1
errore 2
errore 3

form

Io voglio fare in modo di mostrare ogni errore sopra al proprio campo.

Di conseguenza invece di far aggiungere il valore all'array senza specificare il nome ($errors[] = $errore vorrei fare in modo di specificare un nome per ogni valore ($errors['nome_campo'] = errore). Il problema è che come ho modificato lo script non funziona! All'array gli errori vengono aggiunti sempre sequenzialmente utilizzando i numeri progressivamente senza assegnare il nome.

Sotto vi posto i due files in questione:

Codice PHP:
// Classe che rappresenta un campo singolo di un form
class FrmField extends AbstrErrHandler
     
{
        
// Le regole da applicare
        
var $rules ;
    
        
// Il valore contenuto dal campo
        
var $val ;
    
        
// Il valore da attribuire di default
        
var $defVal ;
    
        
// L'etichetta del campo
        
var $label ;
    
        
// Il campo è obbligatorio?
        
var $req ;

        
// Costruttore
        
function FrmField($val$label$required$rules = array(), $default '' )
                {   
                   
parent::AbstrErrHandler() ;
                   
$this->rules = &$rules  ;   
                   
$this->label $label ;
                   
$this->req $required ;
          
                   
// Se la variabile non esiste viene settata ad un valore di default
                   
if (!isset($val))
                     {
                        
$val $default ;
                     }
                   
$this->val = &$val ;
                   
$this->defVal $default ;
                }       
    
        function 
validate()
                {
                   
// Se il campo è vuoto
                   
if (empty($this->val))
                     {
                        
// Se è obbligatorio
                        
if ($this->req)
                          {
                             
// Se è obbligatorio settiamo un errore
                             
$this->errors["$this->label"] = sprintf(IS_REQUIRED$this->label) ;
                          }
                        
// Se vuoto e non obbligatorio inutile fare altri controlli e usciamo
                        
return ;   
                     }
//END if empty
        
                // Altrimenti procediamo ai controlli successivi
                
while (list(, $rule) = each($this->rules))
                     {
                        
$rule->check($this->val$this->label) ;
                        if (!
$rule->isValid())
                          {    
                             
$this->errors["$this->label"] = $rule->getError() ;
                             
// In caso di errori ripristina il valore di default al 
                             // posto di quello non corretto
                             
$this->val $this->defVal ;
                             return ;
                          }
                      }
//end while
                
}//end function validate
     
}//end class

// Classe che rappresenta un campo multiplo (es. select multipla) di un form
class FrmFieldSet extends AbstrErrHandler
     
{
        
// L'array di valori contenuti nel fieldset
        
var $val ;
        
        
// Le regole da applicare all'intero fieldset
        
var $fieldSetR ;
    
        
// Le regole da applicare ai singoli valori contenuti
        
var $fieldR ;
    
        
// L'etichetta del fieldset
        
var $label ;
    
        
// Il valore da attribuire di default
        
var $defVal ;
    
        
// Il campo è obbligatorio?
        
var $req ;
    
        function 
FrmFieldSet($sentVals$label$required$fieldSetRules = array(), $fieldRules = array(), $default = array() )
                {
                   
parent::AbstrErrHandler() ;
                   
// Se la variabile non esiste viene settata ad un valore di default
                   
if (!isset($sentVals))
                     {
                        
$sentVals $default ;        
                     }
                   
$this->val = &$sentVals ;
                   
$this->req $required ;
                   
$this->defVal $default ;
                   
$this->label $label ;
                   
$this->fieldSetR = &$fieldSetRules ;
                   
$this->fieldR = &$fieldRules ;
                }
        
        
// Determina se un valore è presente nel fieldset
        
function selected($what)
                {
                   return 
in_array($what$this->val) ;
                }
    
        
// Esegue i controlli sul fieldset
        
function validate()
                {
                   
// Se il campo è vuoto
                   
if (empty($this->val))
                     {
                        
// Se è obbligatorio settiamo un errore
                        
if ($this->req)
                          {
                             
$this->errors["$this->label"] = sprintf(IS_REQUIRED$this->label) ;
                          }
                   
                        
// Se vuoto e non obbligatorio inutile fare altri controlli e usciamo
                        
return ;   
                     }
//END if empty
        
                   // Altrimeti ciclo di controlli sul fieldset nel suo complesso
                   
while (list(, $rule) = each$this->fieldSetR) )
                        {
                           
$rule->check($this->val$this->label) ;
                           if (!
$rule->isValid())
                             {    
                                
$this->errors["$this->label"] = $rule->getError() ;
                                
                                
// In caso di errori ripristina il valore di default al 
                                // posto di quello non corretto
                                
$this->val $this->defVal ;
                                return ;
                             }
                        }
//end while  
                
                   // ciclo di controlli su ogni campo nel fieldset
                   
while (list(, $rule) = each($this->fieldR))
                        {
                           while (list(, 
$field) = each($this->val))
                                {
                                   
$rule->check($field$this->label) ;
                                   if (!
$rule->isValid())
                                     {    
                                        
$this->errors["$this->label"] = $rule->getError() ;
                                        
// Ripristina il valore di default al 
                                        // posto di quello non corretto
                                        
$this->val $this->defVal ;
                                        return ;
                                     }
//END if
                                
//END while2
                        
//END while1 
                
}//end function "validate"
     
}//END class

class CapField extends FrmField
     
{
        function 
CapField($val$label$required$default='')
                {
                   
$rules = array() ;
                   
$rules[] = new PatternRule("/^\d{5}$/") ;
                   
parent::FrmField($val$label$required$rules$default) ;
                }
     }
//end class

class MailField extends FrmField
    
{
       function 
MailField($val$label$required$default='')
               {     
                  
$rules = array() ;   
                  
$rules[] = new PatternRule("/^[a-zA-Z]{1}\w{1,10}[-|.|_]{0,1}\w{0,10}@\w{3,10}\.\w{0,10}-{0,1}\w{0,10}\.{0,1}\w{2,6}$/i") ;
                  
parent::FrmField($val$label$required$rules$default) ;    
               } 
    }
//end class

class PhoneField extends FrmField
     
{
        function 
PhoneField($val$label$required$default='')
                {
                   
$rules = array() ;
                   
$rules[] = new PatternRule("/^\+{0,1}\d{0,4}[-|\\\| |\/]{0,1}\d{3,5}[-|\\\|\/]{0,1}\d{5,10}$/U") ;
                   
parent::FrmField($val$label$required$rules$default) ;    
                }
     }
//end class