Ankündigung

Einklappen
Keine Ankündigung bisher.

Zend Form dynamische Validierung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zend Form dynamische Validierung

    Hallo,

    ich habe in einem Zend 1 Projekt eine Form die zwei Bezahlmethoden implementiert, Kreditkarte und Lastschrift. Ich möchte nun, dass wenn der Tab "Kreditkarte" ausgewählt ist, die Felder für Lastschrift nicht mehr validiert werden, bzw umgekehrt genau so

    Das HTML für die Tabs ist mit Bootstrap gebaut:

    HTML-Code:
    <div class="row">
        <div class="col-md-12">
            <ul class="nav nav-tabs" role="tablist">
                <li role="presentation" class="active"><a href="#creditcard" aria-controls="home" role="tab" data-toggle="tab"><strong>Kreditkarte</strong></a></li>
                <li role="presentation"><a href="#debit" aria-controls="profile" role="tab" data-toggle="tab"><strong>Lastschrift</strong></a></li>
            </ul>
            <div class="tab-content">
                <div role="tabpanel" class="tab-pane active" id="creditcard">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            <h2 class="panel-title">Zahlung per Kreditkarte</h2>
                        </div>
                        <div class="panel-body">
                            <div>
                                <?php echo $this->partial(
                                    'partials/checkout/address_form_payment.phtml', [
                                        'form' => $this->form->getSubform(Entertain_Form_UserAddressForm::SUBFORM_PAYMENT),
                                    ]
                                ); ?>
                            </div>
                        </div>
                    </div>
                </div>
                <div role="tabpanel" class="tab-pane" id="debit">
                    <div class="panel panel-default">
                        <div class="panel-heading">
                            <h2 class="panel-title">Zahlung per Lastschrift</h2>
                        </div>
                        <div class="panel-body">
                            <div>
                                <?php echo $this->partial(
                                    'partials/checkout/address_form_debit.phtml', [
                                        'form' => $this->form->getSubform(Entertain_Form_UserAddressForm::SUBFORM_DEBIT),
                                    ]
                                ); ?>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    Die Felder für die Kreditkarte werden über die Funktion 'addPaymentSubform()' erzeugt:
    PHP-Code:
    private function addPaymentSubform()
    {
       
    $subForm = new Zend_Form('payment');
       
    $subForm
          
    ->addElement(
             
    'select''creditcard', [
                
    'label' => 'Ihre Kreditkarte',
                
    'required' => false,
             ]
          )
          ->
    addElement(
             
    'text''cardholder', [
                
    'label' => 'Karteninhaber',
                
    'required' => true,
                
    'validators' => [
                   [
    'StringLength'false, ['max' => 255]],
                ],
             ]
          )
          ->
    addElement(
             
    'text''cardnumber', [
                
    'label' => 'Kartennummer',
                
    'required' => true,
                
    'filters' => [
                   
    'Digits',
                ],
                
    'validators' => [
                   [new 
    Entertain_Service_Validate_CreditCardType()],
                ],
             ]
          )
          ->
    addElement(
             
    'radio''cardtype', [
                
    'label' => 'Kartentyp',
                
    'required' => true,
                
    'multiOptions' => [
                   
    Zend_Validate_CreditCard::VISA => Zend_Validate_CreditCard::VISA,
                   
    Zend_Validate_CreditCard::MASTERCARD => Zend_Validate_CreditCard::MASTERCARD,
                ]
             ]
          )
          ->
    addElement(
             
    'text''cardmonth', [
                
    'label' => 'Gültig bis (Monat/Jahr)',
                
    'required' => true,
                
    'filters' => [
                   
    'Digits',
                ],
                
    'validators' => [
                   [
    'Between'false, ['min' => 1'max' => 12]],
                   [new 
    Entertain_Service_Validate_CreditCardDate()]
                ],
             ]
          )
          ->
    addElement(
             
    'text''cardyear', [
                
    'required' => true,
                
    'filters' => [
                   
    'Digits',
                ],
                
    'validators' => [
                   [
    'Between'false, ['min' => 1000'max' => 9999]],
                   [new 
    Entertain_Service_Validate_CreditCardDate()]
                ],
             ]
          )
          ->
    addElement(
             
    'text''cardsecurity', [
                
    'label' => 'Prüfnummer',
                
    'required' => true,
                
    'filters' => [
                   
    'Digits',
                ],
                
    'validators' => [
                   [
    'StringLength'false, ['min' => 3'max' => 3]],
                ],
             ]
          )
          ->
    addElement(
             
    'checkbox''save_payment_creditcard', [
                
    'label' => 'Kreditkarte sicher speichern',
             ]
          );

       
    $subForm->setIsArray(true);
       
    $this->addSubForm($subForm'payment');

    Die Felder für die Lastschrift werden über die Funktion 'addDebitSubform()' erzeugt:
    PHP-Code:
    private function addDebitSubform()
    {
        
    $subForm = new Zend_Form('debit');
        
    $subForm
            
    ->addElement(
                
    'select''debits', [
                    
    'label' => 'Ihre Bankverbindungen',
                    
    'required' => false,
                ]
            )
            ->
    addElement(
                
    'text''accountholder', [
                    
    'label' => 'Kontoinhaber',
                    
    'required' => true,
                    
    'validators' => [
                        [
    'StringLength'false, ['max' => 255]],
                    ],
                ]
            )
            ->
    addElement(
                
    'text''iban', [
                    
    'label' => 'IBAN Nummer',
                    
    'required' => true,
                    
    'validators' => [
                        [new 
    Zend_Validate_Iban()],
                    ],
                ]
            )
            ->
    addElement(
                
    'hidden''cardtype', [
                    
    'value' => 'debit'
                
    ]
            )
            ->
    addElement(
                
    'checkbox''save_payment_debit', [
                    
    'label' => 'Bankdaten sicher speichern',
                ]
            );

        
    $subForm->setIsArray(true);
        
    $this->addSubForm($subForm'debit');

    z.B. ist das Feld 'cardholder' ein Pflichtfeld, soll es aber nicht mehr sein wenn der Tab "Lastschrift" gewählt ist. Wie kann man das machen?

    Liebe Grüße
    Kerstel


  • #2
    Wieso nutzt Du nicht zwei verschiedene Form tags ?
    Alternativ kannst Du einen eigene validator schreiben,
    https://stackoverflow.com/questions/...a-or-element-b

    Kommentar


    • #3
      Die Idee hatte ich auch schon. Ich will allerdings nur einen Submitbutton.

      Kommentar


      • #4
        Du könntest für deine Sub-Forms eine Klasse von Zend_Form ableiten und dort die IsValid-Methode überschreiben.
        Wenn das Form leer ist gibst du dann einfach true zurück.
        Wenn nicht, dann gibst du parrent:isValid zurück.

        Grüße.

        Kommentar


        • #5
          Hi,

          sorry für mein späte Antwort. Erstmal Danke für die Antworten, die haben mir weiter geholfen. Ich setze nun in der isValid Methode den required Status von Elementen neu, so ganz klappt das aber nicht:

          PHP-Code:
          public function isValid($data)
          {
                 if (
          array_key_exists('debit'$data) &&
                     
          array_key_exists('debits'$data['debit']) &&
                     
          $data['debit']['debits'] > &&
                     
          $this->getSubForm('debit') instanceof Zend_Form)
                 {
                     
          /** @var Zend_Form_Element $element */
                     
          foreach ($this->getSubForm(self::SUBFORM_DEBIT)->getElements() as $element)
                         
          $element->setRequired(false);
                 }

                 return 
          parent::isValid($data);

          Er läuft in die If Bedingung unter den richtigen Vorraussetzungen rein, aber der Status bleibt. Muss ich das Element irgendwie nochmal updaten für die Form?

          LG
          Kerstel


          Kommentar


          • #6
            Ich habs rausgefunden, man muss die Validatoren noch raus nehmen:

            PHP-Code:
              $element->setRequired(false)->setValidators([]); 

            Kommentar

            Lädt...
            X