2017-06-19 35 views
2

我有具有多步骤来定购商品等向导表单的表单...在Yii2中做一个向导表单的最佳方式是什么?

1)I可通过制表面板在一个视图编码,但我怎样才能移动到下一之前验证每个标签一。

2)有人给了我一些建议,根据“actionCreate”来做到这一点,但成功保存后,重定向到填充步骤的下一步,但会有额外的2-3表和模型.. ,但它是工作,看下面的例子:

public function actionShipping($id) 
{ 
    $model = new OrderDeliveryMethod(); 
    $model->order_id = $id; 

    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
     return $this->redirect(['payment', 'id' => $model->id]); 
    } else { 
     return $this->render('shipping', [ 
      'model' => $model, 
     ]); 
    } 
} 

public function actionPayment($id) 
{ 
    $model = new OrderPaymentMethod(); 
    $model->order_id = $id; 

    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
     return $this->redirect(['review', 'id' => $model->id]); 
    } else { 
     return $this->render('payment', [ 
      'model' => $model, 
     ]); 
    } 
} 

public function actionReview($id) 
{ 
    return $this->render('review', [ 
     'model' => $this->findModel($id), 
    ]); 
} 

是否有另一种方式来做到这一点?你可以给我一个例子吗?

回答

0

您可以将一切都在一个表,在一个模型,但改变你的场景即step1, step2, step3..

class User extends ActiveRecord 
{ 
    const SCENARIO_STEP1 = 'step1'; 
    const SCENARIO_STEP2 = 'step2'; 
    ... 

    public function scenarios() 
    { 
     return [ 
      self::SCENARIO_STEP1 => ['attr1', 'attr2'], 
      self::SCENARIO_STEP2 => ['attr3', 'attr4', 'attr5'], 
     ]; 
    } 
    ... 

所以,在第一步骤中,将创建一个向导模式,并设置其方案(为了验证和仅保存针对步骤-1选择的属性)

public function actionStep1() 
{ 
    $model = new OrderWizard(); 
    $model->setScenario(OrderWizard::SCENARIO_STEP1); 

    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
     return $this->redirect(['step-2', 'id' => $model->id]); 
    } else { 
     return $this->render('step-1', [ 
      'model' => $model, 
     ]); 
    } 
} 

,然后在步骤2您获取先前创建的模型,并继续填充并验证其attrubtes,如: 公共职能actionStep1()

public function actionStep2($id) 
{ 
    $model = $this->findModel($id); 
    $model->setScenario(OrderWizard::SCENARIO_STEP2); 

    if ($model->load(Yii::$app->request->post()) && $model->save()) { 
    ... 

..但给定方法(矿你的)有一个缺点,所以如果客户完成了第一步,但是放弃了序列,你的表将被填充大量未完成的数据。 因此,而不是重定向到多个动作,您可以在JS隐藏/显示属性逻辑的​​单页实现向导。

$('#contact-form').yiiActiveForm('validateAttribute', 'contactform-name'); 

而且整个形式:各个表单字段可以使用验证

$('#contact-form').yiiActiveForm('validate', true); 

你可以从下面的链接了解更多信息:Working with ActiveForm via JavaScript

关于在每一步骤隐藏和显示属性,我不确定隐藏的属性是否被验证,但是“禁用”的属性会被跳过。我希望你明白。谢谢!

+0

哦谢谢,我认为使用场景是解决这个问题的好方法。再次感谢 :) – e236286

相关问题