2017-05-29 21 views
1

Mein Problem besteht darin, die Datensätze zu validieren, wenn sie bereits in der Datenbank vorhanden sind. Also habe ich ein offizielles Formular mit dem Gii Generator in yii2 erstellt. Es enthält name_id, position, fname, mname, lname. Wenn der Administrator neue Daten erstellen möchte und diese Daten bereits vorhanden sind, wird eine Popup-Meldung "Diese Daten sind bereits vorhanden" angezeigt. Wie kann ich das erreichen? Irgendwelche Ideen?Yii2 Hinzufügen von Regeln in Modellen, wenn der Datensatz bereits in der Datenbank existiert

Das ist mein Modell:

public function actionCreate() 
{ 
    $model = new Name(); 

    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
     return $this->redirect(['report/create', 'id' => $model->name_id]); 
    } else { 
     return $this->renderAjax('create', [ 
      'model' => $model, 
     ]); 
    } 
} 

Und das ist mein _form:

class Name extends \yii\db\ActiveRecord 
{ 
public static function tableName() 
{ 
    return 'name'; 
} 
public function rules() 
{ 
    return [ 
     [['position', 'fname', 'lname'], 'required'], 
     [['position', 'fname', 'mname', 'lname'], 'string', 'max' => 50], 


    ]; 
} 
public function attributeLabels() 
{ 
    return [ 
     'name_id' => 'Name ID', 
     'position' => 'Position', 
     'fname' => 'First Name', 
     'mname' => 'Middle Name', 
     'lname' => 'Last Name', 
    ]; 
} 
} 

Das ist mein Controller ist

<div class="name-form"> 
<?php yii\widgets\Pjax::begin(['id' => 'sign-up']) ?> 
<?php $form = ActiveForm::begin(['id' => 'form-signup', 'options' => ['data-pjax' => true]]); ?> 

<?= $form->field($model, 'position')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a Position....']) ?> 

<?= $form->field($model, 'fname')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a First Name....']) ?> 

<?= $form->field($model, 'mname')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a Middle Name....']) ?> 

<?= $form->field($model, 'lname')->textInput(['maxlength' => true,'style'=>'width:500px','placeholder' => 'Enter a Last Name....' ]) ?> 

    <div class="form-group"> 
     <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-success','style' => 'padding:10px 60px; width:100%;']) ?> 
    </div> 


<?php ActiveForm::end(); ?> 
<?php yii\widgets\Pjax::end() ?> 

Antwort

-2

Sie können Ihre benutzerdefinierte Validierung, Nehmen Sie eine beliebige Attributnamen und definieren Regel erstellen:

public function rules() 
    { 
     return [ 
      [['position', 'fname', 'lname'], 'required'], 
      [['position', 'fname', 'mname', 'lname'], 'string', 'max' => 50], 
      [['position', 'fname', 'lname'], 'checkUniq'], //add this line 
     ]; 
    } 

-> benutzerdefinierte Funktion in Modell:

public function checkUniq($attribute, $params) 
{ 
    $user = self::find()->where(['fname'=>$this->fname,'lname'=>$this->lname,'position'=>$this->position])->one(); 
    if (isset($user) && $user!=null) 
     $this->addError($attribute, 'User already added.'); 
} 
+0

Danke Master seine Arbeit: D Vielen Dank. –

2

Also gehe ich davon aus Sie wollen ein eindeutiger Validator, können Sie t versuchen sein in Ihrem Modell:

public function rules() 
{ 
    return [ 
     [['position', 'fname', 'lname'], 'required'], 
     [['position', 'fname', 'mname', 'lname'], 'string', 'max' => 50], 
     [['fname','lname'], 'unique', 'targetAttribute' => ['fname', 'lname'], 'message' => 'This data already exists'] 
    ]; 
} 

Die oben genannten Regeln werden die Kombination von fname und lname Attributen einzigartig zu sein, können Sie ändern, was Sie durch das Hinzufügen oder Entfernen von den Feldnamen Attribut oder eine Kombination von Eigenschaften einzigartig sein wollen/Attribute zu den Validierungsregeln.

+0

Danke. Was aber, wenn der Administrator den gleichen Vornamen aber einen anderen Nachnamen eingeben möchte. Zum Beispiel sind die Daten in der Datenbank testposition, testfirstname, testlastname. Der Administrator möchte die gleiche Position und den gleichen Vornamen, aber einen anderen Nachnamen eingeben. Ich habe versucht, du bist Code, aber es scheint fname und lname validiert. –

+0

Sie wollen also auch 'Position' validiert werden? Wie ich bereits erwähnt habe, können Sie der Attributvalidierung einfach 'position' hinzufügen, etwas wie' [['Position','Fname ',' lname '],' unique '] ''. – Nue

+0

Nein, nur fname und lname nur. –

Verwandte Themen