2017-04-16 6 views
-1

Ich habe ein Newsletter-Formular abonniert und versuche eine Fehlermeldung anzuzeigen, wenn die E-Mail bereits in der Datenbank existiert. Hier ist der Code von Subscriber-Modell Subscriber.phpYii2 überprüfen, ob die E-Mail bereits in der Datenbank existiert

<?php 

namespace common\models; 

use yii\db\ActiveRecord; 

class Subscriber extends ActiveRecord 
{ 
    public static function tableName() 
    { 
     return 'subscriber'; 
    } 

    public function rules() 
    { 
     return [ 
      ['email', 'filter', 'filter' => 'trim'], 
      ['email', 'required'], 
      ['email', 'email'], 
      [ 
       'email', 'unique',   
       'message' => 'This email address has already been taken.' 
      ] 
     ]; 
    } 
} 
?> 

-Controller Aktion:

public function actionSubscriber() 
    { 
     $subscriber_model = new Subscriber(); 

     $request = Yii::$app->request; 
     if($request->isAjax && $subscriber_model->load($request->post())){ 
      $subscriber_model->save(); 
     } 
    } 

Code anzeigen:

<?php 
use yii\helpers\Html; 
use yii\bootstrap\ActiveForm; 
use yii\helpers\Url; 
?> 

<h3>Subscribe to Newsletter</h3> 
<?php $form = ActiveForm::begin(['id' => $subscriber_model->formName(), 'action' => ['project/subscriber'], 'enableAjaxValidation' => true]); ?> 
    <div class="input-group"> 
     <?= $form->field($subscriber_model, 'email')->textInput()->label(false); ?>        
     <span class="input-group-btn"> 
      <?php echo Html::submitButton('Sign Up', ['class' => 'btn btn-primary subscribe-btn']); ?> 
     </span>        
    </div> 
<?php ActiveForm::end(); ?> 

<?php 
$script = <<< JS 
    $('#{$subscriber_model->formName()}').on('beforeSubmit', function(e){ 
     var form = $(this); 
     $.post(
      form.attr("action"), 
      form.serialize() 
     ).done(function(data){  
      form.trigger("reset"); 
     }); 
     return false; 
    }); 
JS; 
$this->registerJs($script); 
?> 

Die aktuelle Code-Show "leere E-Mail" und "ungültige E-Mail" -Nachricht, aber die Validierung schlägt fehl einzigartige E-Mail. Bitte sagen Sie mir, was das Problem in meinem Code ist.

+0

Ich denke [this] (http://stackoverflow.com/questions/41205936/yii2-unique-validator-ignored) sollte Ihnen helfen – gmc

+0

Es würde die 'Diese E-Mail-Adresse wurde bereits vergeben.'-Nachricht nach dem Einreichen zurückgeben die Form. Ja, Sie müssen eine AJAX-Anforderung implementieren, die Sie während der Formularvalidierung überprüfen müssen. Es würde jedoch immer noch fehlschlagen, wenn Sie auf "Senden" klicken. –

+0

Bitte zeigen Sie uns Ihre Aktionsfunktion in Ihrem Controller. –

Antwort

0

Sie müssen auch Regeln für Ihr AR-Modell definieren. Ihr Formular-Modell hat seine eigene eingebaute Validierung, ja ... aber die email Regel sagt ihr, dass sie sich Ihr AR-Modell ansehen soll, das keine Regeln hat.

Abgesehen von allem anderen, wenn Sie es brechen, sollte Ihr Subscriber AR-Modell unabhängig vom Form-Modell funktionieren können. Was ist mit CRUD für die Aktualisierung des Abonnenten außerhalb des Formulars? Es muss die Regeln kennen auch :)

<?php 

namespace common\models; 

use yii\db\ActiveRecord; 

class Subscriber extends ActiveRecord 
{ 
    public static function tableName() 
    { 
     return '{{%subscriber}}'; 
    } 

    /** 
    * @inheritdoc 
    */ 
    public function rules() 
    { 
     return [ 
      ['email', 'filter', 'filter' => 'trim'], 
      ['email', 'required'], 
      ['email', 'email'], 
      [ 
       'email', 'unique', 
       'targetClass' => '\common\models\Subscriber',   
       'message' => 'This email address has already been taken.' 
      ] 
     ]; 
    } 
} 
?> 

Die {{%subscriber}} ist für unterstützte Tabellenpräfixe. Ich ersetze sie immer so, nur für den Fall, dass ich (oder jemand) in der Zukunft Tabellenpräfixe hinzufügt.

targetAttribute wird nicht benötigt, wenn der Spaltenname identisch ist.


bearbeiten

Rewrite Ihre Aktion wie folgt aus:

public function actionSubscriber() 
{ 
    $subscriber_model = new Subscriber(); 

    $request = Yii::$app->request; 
    if($request->isAjax && $subscriber_model->load($request->post()) && $subscriber_model->validate() && $subscriber_model->save()) 
    { 
     // return something here 
    } 
} 

Sind Sie sicher, Ihr einen AJAX-Request aus Ihrer Sicht zu schaffen? Es wird nicht funktionieren, wenn Sie nicht, und Sie haben Ihre Sicht nicht gezeigt. Wenn dies der Fall ist, geben Sie eine entsprechende erfolgreiche AJAX-Antwort zurück. Wenn Sie AJAX nicht verwenden, sollten Sie eine Flash-Erfolgsmeldung erstellen.

+0

Wie Sie gesagt haben, ich habe das SubscribeNewsletterForm-Modell jetzt entfernt, ich benutze nur ein Modell zum Sammeln und Speichern von Benutzereingaben (Subscriber). Ich habe auch den Aktionscode hinzugefügt. Speichern und andere Validierung funktioniert, aber die Nachricht 'Diese E-Mail-Adresse wurde bereits vergeben.' zeigt immer noch nicht. Kannst du bitte meinen Code aktualisieren? – Alex

+0

Versuchen Sie, '' targetClass '=>' \ common \ models \ Subscriber ', 'zum AR-Modell hinzuzufügen. Ich weiß nicht, warum du es entfernt hast. Ich bin nicht positiv, aber ich denke, es ist notwendig, den AR zu Ihrem Vergleich zu erklären. Ich füge es immer ein, da ich denke, dass es eine neue Instanz der Klasse schafft.--- Erstellen Sie aus Ihrer Sicht auch eine AJAX-Anfrage? Es wird nicht laufen, wenn Sie nicht. - Ich habe meinen Code aktualisiert, um die Aktion besser zu zeigen. –

+0

Hallo wade danke für deine Antwort. Ich habe den Ansichtscode hinzugefügt. Wie gesagt, ich kann die E-Mail in der Datenbank speichern und meinen Code anzeigen, wenn eine falsche E-Mail oder nichts in das Eingabefeld eingegeben wurde. Es passiert nur nichts, wenn ich dieselbe E-Mail-ID eingegeben habe, die bereits in der Tabelle existiert. Ich möchte in diesem Fall nur auf der Client-Seite "Diese E-Mail wurde bereits vergeben" einen Fehler anzeigen. Vielen Dank. – Alex

Verwandte Themen