这里的想法是使用SCENARIO在两个不同的表中插入参数,首先使用其参数注册客户,然后以一种形式注册属于客户的订单。
我正在发送带有多个参数的表单,其中一些将用于插入使用场景的客户,而其他参数将按顺序使用(我这样做是为了不必创建两个表单)参数已通过POST与csrf一起正确发送。
.col-md-6
.form-group
span.smart-form
input :name=="fieldName('owner_type')" type="hidden" value="trainer"
label.toggle
input :id=="fieldId('owner_type_toggle')" type="checkbox" value="client"
i data-swchon-text="Trainer" data-swchoff-text="Client"
span My Location
span.smart-form style="margin-left: 9px; font-size: 15px; color: #404040;"
input :name=="fieldName('owner_type')" type="hidden" value="client"
span Client (Onsite Training)
这将返回一个数组,说明名称,电子邮件,地址,手机,电话,城市等参数不能留空。
在我的客户模型中:
public function createOrder()
{
//$customer = Customer::find()->where(['email' => $params->email])->limit(1)->asArray()->all();
$customer = new Customer;
$customer->load(Yii::$app->request->post());
$customer->scenario = 'create';
if($customer->validate()){
$customer->save();
vdp($customer);
} else{
vdpd($customer->getErrors());
}
die;
}
答案 0 :(得分:1)
1)createOrder()
应该在控制器中而不是模型中是actionCreateOrder()
。
2)
$customer->load(Yii::$app->request->post());
$customer->scenario = 'create';
if ($customer->validate()) {
...
应该是
$customer->scenario = Customer::SCENARIO_CREATE;
if ($customer->load(Yii::$app->request->post()) && $customer->validate()) { ... }
因为load
方法将加载当前方案的属性,因此在加载模型之前无需运行验证。参见example。
3)为Customer
模型中的属性声明rules。
答案 1 :(得分:1)
控制器
public function actionCreateOrder()
{
$customer = new Customer;
$customer->setScenario(Customer::SCENARIO_CREATE);
if($customer->load(Yii::$app->request->post())
if($customer->save()){
vdp($customer);
} else {
vdpd($customer->getErrors());
}
}
die;
}
模型
const SCENARIO_CREATE = 'create';
public function rules()
{
return [
[['name', 'email', 'address'], 'required', 'on' => self::SCENARIO_CREATE], // Add more required fields on 'create' scenario.
... // some more rules
];
}
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios[self::SCENARIO_CREATE] = ['name', 'email', 'public_place', 'cell_phone', 'phone', 'city', 'cep', 'state', 'neighborhood', 'number', 'complement'];
return $scenarios;
}
答案 2 :(得分:0)
您需要在$scenario
通话之前设置load()
。方案定义了可以由load()
设置的属性,因此您做得太迟了,它无效。试试这个:
$customer = new Customer;
$customer->scenario = 'create';
$customer->load(Yii::$app->request->post());