YII2 : Hinzufügen von Dynamischen Formular-Felder und deren Validierungen
Ich bin das hinzufügen von dynamischen Formular-Felder onChange der dropdown-Liste. Beide Arten von Feldern aus verschiedenen Modellen und gehen auf die Datenbank in verschiedenen Tabellen. Ich habe bereits definierten Validierungs-Regeln in den Modellen.
Aber die Validierung nicht richtig funktionieren. Mein code ist wie folgt:
Modell :
<?php
namespace common\models;
use Yii;
/**
* This is the model class for table "{{%membership_features}}".
*
* @property integer $id
* @property string $title
* @property string $type
* @property integer $is_new
* @property integer $status
* @property integer $is_deleted
* @property string $created_date
* @property string $modified_date
*
* @property MembershipFeaturesValue[] $membershipFeaturesValues
*/
class MembershipFeatures extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public $value=[];
public static function tableName()
{
return '{{%membership_features}}';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['title', 'type', 'value','is_new', 'status'], 'required'],
['value', 'each', 'rule' => ['integer']],
['value', 'each', 'rule' => ['required']],
[['is_new', 'status', 'value','is_deleted'], 'integer'],
[['created_date', 'modified_date'], 'safe'],
[['title', 'type'], 'string', 'max' => 255]
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'title' => Yii::t('app', 'Title'),
'type' => Yii::t('app', 'is boolean or value'),
'is_new' => Yii::t('app', 'Is New'),
'status' => Yii::t('app', 'Status'),
'is_deleted' => Yii::t('app', 'Is Deleted'),
'created_date' => Yii::t('app', 'Created Date'),
'modified_date' => Yii::t('app', 'Modified Date'),
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getMembershipFeaturesValues()
{
return $this->hasMany(MembershipFeaturesValue::className(), ['feature_id' => 'id']);
}
}
Controller :
<?php
namespace backend\controllers;
use Yii;
use common\models\MembershipFeatures;
use backend\models\MembershipFeaturesSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\Response;
use common\models\MembershipFeaturesValue;
use common\components\Helper;
/**
* MembershipFeaturesController implements the CRUD actions for MembershipFeatures model.
*/
class MembershipFeaturesController extends Controller
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}
/**
* Lists all MembershipFeatures models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new MembershipFeaturesSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single MembershipFeatures model.
* @param integer $id
* @return mixed
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
/**
* Creates a new MembershipFeatures model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$model = new MembershipFeatures();
$membershipPlan = \common\models\MembershipPlan::allPlans();
if(isset($_GET['type'])){
$model->type =$_GET['type'];
}
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return \yii\widgets\ActiveForm::validate($model);
}
if ($model->load(Yii::$app->request->post()) ) {
if( $model->save()){
foreach ($membershipPlan as $key=>$value) {
$feature = new MembershipFeaturesValue();
$feature->feature_id = $model->id;
$feature->plan_id = $key;
$feature->value =$model->value[$key];
$feature->save();
}
}
return $this->redirect(['index']);
}
return $this->render('create', [
'model' => $model,
'membershipPlan'=>$membershipPlan,
]);
}
/**
* Updates an existing MembershipFeatures model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
$membershipPlan = \common\models\MembershipPlan::allPlans();
$model = $this->findModel($id);
$selected = MembershipFeaturesValue::find()->where(['feature_id'=>$model->id])->all();
foreach ($selected as $key => $value) {
$model->value[$value->plan_id]=$value->value;
}
if(isset($_GET['type'])){
$model->type =$_GET['type'];
}
if(Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return \yii\widgets\ActiveForm::validate($model);
}
if ($model->load(Yii::$app->request->post()) ) {
if( $model->save()){
foreach ($membershipPlan as $key=>$value) {
$feature = MembershipFeaturesValue::find()->where(['feature_id'=>$model->id,'plan_id'=>$key])->one();
$feature->value =$model->value[$key];
$feature->save();
}
}
return $this->redirect(['index']);
}
return $this->render('update', [
'model' => $model,
'membershipPlan'=>$membershipPlan,
]);
}
/**
* Deletes an existing MembershipFeatures model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
{
Helper::partialDelete('MembershipFeatures',$id);
return $this->redirect(['index']);
}
/**
* Finds the MembershipFeatures model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return MembershipFeatures the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = MembershipFeatures::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
Form :
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\Pjax;
use yii\helpers\Url;
/* @var $this yii\web\View */
/* @var $model common\models\MembershipFeatures */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="membership-features-form">
<?php $form = ActiveForm::begin([
'enableAjaxValidation' => true,
'enableClientValidation'=>true,
'validateOnSubmit'=>true,
'options' => ['data-pjax'=>true]]); ?>
<?= $form->errorSummary($model); ?>
<?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'type')->dropDownList(['boolean'=>'Boolean','value'=>'Value'],
[
'onchange'=>'
$.pjax.reload({
url: "'.Url::to(['create']).'?type="+$(this).val(),
container: "#pjax-memfeature-form",
timeout: 1000,
});
',
'class'=>'form-control',
'prompt' => 'Select Type Of Value'
]) ?>
<?php Pjax::begin(['id'=>'pjax-memfeature-form','enablePushState'=>false]); ?>
<?php
if($model->type==='boolean'){
foreach ($membershipPlan as $key => $value) {
echo $form->field($model, "value[$key]")->checkbox(array(
'label'=>"$value",
'labelOptions'=>array('style'=>'padding:5px;'),
));
}
}
if($model->type==='value'){
foreach ($membershipPlan as $key => $value) {
echo $form->field($model, "value[$key]")->textInput()->label("$value");
}
}
?>
<?php Pjax::end(); ?>
<?= $form->field($model, 'is_new')->dropDownList(['0'=>'No','1'=>'Yes']) ?>
<?= $form->field($model, 'status')->dropDownList(['1'=>'Active','0'=>'Inactive']) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
<?= Html::a(Yii::t('app', 'Cancel'), ['/membership-features/'], ['class' => 'btn btn-danger']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
Möchte ich bestätigen meine Wert Feld, das dynamisch Hinzugefügt, wenn ich den Typ ändern dropdown mit Pjax.
Bitte guide mich eine richtige Methode für die Validierung dynamisch hinzugefügte Formularfelder.
es kann Ihnen helfen: www.yiiframework.com/doc-2.0/yii-base-dynamicmodel.html
vielen Dank für Ihre schnelle Antwort... ich habe Lesen, aber mein Modell ist nicht dynamisch..eigentlich meine Felder membershipPlan Modell dynamisch Hinzugefügt werden, die in der oben genannten form. Also, pls ausarbeiten, wenn es möglich ist, durch die dynamische Modell-Klasse.
Haben Sie das Problem gelöst ?
vielen Dank für Ihre schnelle Antwort... ich habe Lesen, aber mein Modell ist nicht dynamisch..eigentlich meine Felder membershipPlan Modell dynamisch Hinzugefügt werden, die in der oben genannten form. Also, pls ausarbeiten, wenn es möglich ist, durch die dynamische Modell-Klasse.
Haben Sie das Problem gelöst ?
InformationsquelleAutor WpTricks24 | 2015-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seine seit einem Monat so erraten wurde dieses Problem gelöst aber als Referenz für andere wie mich auf der Suche für das gleiche und zum speichern müssen, um Schritt durch den Rahmen, um die Antwort zu finden, vielleicht versuchen Sie so etwas wie:
Getestet mit Bezug auf clientValidation und nicht mit der oben genannten Frage so gehackt hätten meine Lösung, um hoffentlich beantworten obige Frage.
InformationsquelleAutor Andrew Blake
Das hat nicht ganz funktioniert bei mir musste ich diese hinzufügen, addrow und deleterow Funktionen für meine js. Ich ajax aus, um eine neue Zeile jedes mal dann Spritzen Sie es in den DOM nach der letzten Zeile.
//Hinzufügen der Validierung für die genannten Elemente (ohne val.überprüfen, aber ich hatte eine Validierung nicht ein expression-Fehler) werden die Daten in ein json-Objekt der db Modell kommt aus meiner ajax-controller-action.
Dann zum entfernen der Validierung:
InformationsquelleAutor Pete Henshall
Einfach
Sollten Sie versuchen, diese
Änderungen
w0 in Ihrer form ID
"id": "Kunden-name" in dein input Feld ID
"container": ".Feld-Kunde-name" in Eingabe-Feld-div-container
Klasse
InformationsquelleAutor Yasar Arafath