10
votes

Zend forme Modifier et zend_validate_db_norecordexistes

Je construisez lentement mes compétences Zend en construisant des sites Web utilitaires pour mon propre usage. J'utilise Zend Forms et formulaires de validation et j'ai jusqu'à présent été heureux que je comprenais la façon de faire des choses. Cependant, je suis un peu confus avec comment utiliser zend_validate_db_norecordexistes () dans le contexte d'un formulaire d'édition et d'un champ qui correspond à la colonne de base de données qui doit être unique.

Par exemple, en utilisant cette table simple P>

$form = new Form() 
if (is Post) {
    $formData = GetPostData()
    if ($form->isValid($formData)) {
        Update Table with $formData
        Redirect out of here
    } else {
        $form->populate($formData)
    }
} else {
    $RowData = Get Data from Table
    $form->populate($RowData)     <=== This is where I want ('value' => $Value) bound
}


0 commentaires

7 Réponses :


0
votes

Vous pouvez simplement appeler $ Form-> getElement (entrée ') -> supprimerValidator (' zend_validator_db_norecordexistes '); au lieu de fournir l'exclusion.


4 commentaires

@Le gars - qui semblerait vaincre le but de veiller à ce que les données soient uniques avant de faire la mise à jour de la DB pendant le cycle d'édition. Je pense que cela a également pour effet de polluer le contrôleur avec quelque chose qui appartient à la forme.


Ouais, je suis d'accord c'est un peu pirate. Je ne suis en fait pas très heureux de la façon dont Zend_form fonctionne actuellement. Bien que j'utilise toujours une vieille implémentation de style ZF 1.6: P


Guy - je n'ai commencé avec 1,9 en décembre seulement, alors j'apprends toujours des choses - mais des choses comme ça me font partir "hmmmm?"


Surveillez: Supprimer la validation est un danger potentiel pour votre table de base de données. Cela signifie que vous êtes en mesure de mettre à jour un enregistrement de la même valeur qu'un autre enregistrement qui était exactement ce que vous voulez prévenir.



1
votes

Après avoir examiné la réponse écrasante, j'ai décidé que je vais avec un validateur personnalisé


0 commentaires

6
votes

Voici comment ça se fait:

  1. i votre formulaire, vous ajoutez ce validateur (par exemple, champ de messagerie):

    xxx

    1. Ne pas ajouter de message d'erreur personnalisé pour cela puisque cela n'a pas fonctionné pour moi, par exemple:

      xxx

      1. dans votre contrôleur ajoutez ceci:

        xxx

        c'est ça!


0 commentaires

1
votes

1
votes
$form = new Form_Test(array('id'=>$id));

0 commentaires

0
votes

Je viens d'essayer cet exemple pour adresse e-mail code> l'unicité et cela fonctionne parfaitement avec des trucs ci-dessous:

1] sous ma forme: strong> p>

$form->getElement('email')
     ->addValidator('Db_NoRecordExists',
                         false,
                         array('table' => 'guestbook',
                               'field' => 'email',
                               'exclude' => array ('field' => 'id', 'value' => $request->get('id'))));

if ($this->getRequest()->isPost()) {
        if ($form->isValid($request->getPost())) {


0 commentaires

4
votes

Cela fonctionnera également:

$this->addElement('text', 'email', array(
        'label'      => 'Your email address:',
        'required'   => true,
        'filters'    => array('StringTrim'),
        'validators' => array(
            'EmailAddress',
             array('Db_NoRecordExists', true, array(
                    'table' => 'guestbook', 
                    'field' => 'email',
                    'messages' => array(
                        'recordFound' => 'Email already taken'
                    )
                )
            )
        )
    ));


0 commentaires