我遇到的几乎是这样的:
- 我有一个
create form
,表单包含两个模型的属性 - 我将它们从控制器传递到视图,并添加规则来验证两个模型中的属性
- 但是表单验证没有很好地工作——模型的验证是不起作用
我不知道如何解决这个问题,谢谢你的帮助!
我找到了一篇参考文章——《具有多个模型的复杂表单》,但它是待定的。
这是我的示例代码。
控制器-SiteController.php:
namespace task'controllers;
use yii'web'Controller;
use task'models'Task;
use task'models'Customer;
class Task extends Controller
{
public function actionCreate()
{
$model = new Task;
$customerModel = new Customer;
// load, validate, save ...
return $this->render('create', [
'model' => $model,
'customerModel' => $customerModel
]);
}
}
型号-Task.php,Customer.php:
namespace task'models;
use yii'db'ActiveRecord;
class Task extends AcitveRecord
{
public $title, $published_at;
public function rules()
{
return [
[['title', 'published_at'], 'required'],
['published_at', 'match', 'pattern' => '/patten for time/']
];
}
}
namespace task'models;
use yii'db'ActiveRecord;
class Customer extends ActiveRecord
{
public $name;
public function rules()
{
return [
['name', 'required'],
];
}
}
查看-create.php:
<?php
use yii'helpers'Html;
use yii'widgets'ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'title')->textInput() ?>
<?= $form->field($model, 'publish_at')->textInput() ?>
<?= $form->field($customerModel, 'name')->textInput() ?>
<?= Html::submitButton('submit')?>
<?php ActiveForm::end(); ?>
这可以是一个选项。你可以通过创建一个自定义模型来尝试它,比如ContactForm
,类似这样的东西:
<?php
namespace app'models;
use Yii;
use yii'base'Model;
/**
* CustomModel is the model behind the contact form.
*/
class CustomModel extends Model
{
public $attributeFromModel1;
public $attributeFromModel2;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
// attributeFromModel1, attributeFromModel2 are required
[['attributeFromModel1', 'attributeFromModel2'], 'required'],
// ['email', 'email'],
['attributeFromModel1','YourRule']
// verifyCode needs to be entered correctly
['verifyCode', 'captcha'],
];
}
/**
* @return array customized attribute labels
*/
public function attributeLabels()
{
return [
'atttributeFromModel1' => 'Your Label',
'atttributeFromModel2' => 'Your Label ',
];
}
public function actionUpdate($id)
{
$model = $this->findModel($id);
$customerModel = Customer::findOne($id);
if (!isset($model, $customerModel)) {
throw new NotFoundHttpException("The user was not found.");
}
$model->scenario = 'update';
$customerModel->scenario = 'update';
if ($model->load(Yii::$app->request->post()) && $customerModel->load(Yii::$app->request->post())) {
$isValid = $model->validate();
$isValid = $customerModel->validate() && $isValid;
if ($isValid) {
$model->save(false);
$customerModel->save(false);
return $this->redirect(['view', 'id' => $id]);
}
}
return $this->render('update', [
'model' => $model,
'customerModel' => $customerModel,
]);
}