我正在尝试用Yii建立一个多页表单,但是我对PHP和Yii还很陌生,我想知道写一个多页表单的最佳实践是什么。到目前为止,我计划做的是添加一个名为'step'的隐藏字段,它包含用户在表单中的当前步骤(表单被分为3个步骤/页面)。因此,考虑到这一点,我计划如何处理用户点击控制器中的上一步/下一步按钮:
public function actionCreate()
{
$userModel = new User;
$data['activityModel'] = $activityModel;
$data['userModel'] = $userModel;
if (!empty($_POST['step']))
{
switch $_POST['step']:
case '1':
$this->render('create_step1', $data);
break;
case '2':
$this->render('create_step2', $data);
break;
}else
{
$this->render('create_step1', $data);
}
}
这种方法有意义吗?或者我是不是离题了,在Yii/PHP中有一种更好更优化的方法来做这件事?
谢谢你!
2条答案
按热度按时间p8h8hvxi1#
有几种方法可以解决这个问题。我看到你在Yii论坛上发帖,所以我想你也在那里搜索过,但如果你没有:
我所做的是(只是一个简单的两步ActiveRecord表单)采取一个单一的动作,并根据按钮名称将其划分为条件块,Yii在表单提交时发布(注意:然后,根据点击了哪个按钮,我呈现了正确的表单,并在我的模型上设置了正确的场景以进行验证。
一个隐藏的“step”字段就像检查submitButton名称一样,我可能会将“step”保存到表单状态中,而不是添加一个隐藏字段,但这两种方法都可以。
有些人使用有状态的activeForm属性来保存来自向导中单个步骤的数据,或者您可以使用会话,甚至保存到临时数据库表中。在我下面完全未经测试的示例中,我使用的是有状态表单功能。
下面是一个我对ActiveRecord表单所做的基本操作的示例。它位于“actionCreate”中:
这些表单看起来如下所示:
表格1:
表格二:
希望对大家有帮助!
zzwlnbp82#
Yii提供了一个叫做页面状态的特性来实现像多步骤/多页面表单向导这样的东西。
让我们先看一下Yii文档:
页状态是一个在同一页的POST请求之间保持不变的变量。为了使用持久页状态,表单必须是有状态的,并且是使用{@link CHtml::statefulForm}生成的。
因此,每个步骤/页面的表单都需要是有状态表单。要呈现有状态表单,只需在启动ActiveForm小部件时将
CActiveForm::stateful
属性设置为true
。在控制器中,您可以使用CController::getPageState()
或CController::setPageState()
获取和设置页面状态。因此,如果您的多页表单向导的实现是在没有 AJAX 请求的情况下以传统样式进行的,那么这些基本功能就可以很好地工作。
但是如果您想使用 AJAX 调用来提交步骤数据并显示下一步,Yii的页面状态是不可用的。
为什么?所有的页面状态都是通过HTTP-POST在一个隐藏的输入字段中传输的。输入字段由Yii填充,同时进行所谓的输出处理。输出处理在渲染之后开始,并将替换部分输出。所以Yii的页面状态特性需要输出处理。另一方面, AJAX 响应可能会被它破坏,因为输出处理也可能在输出的开始处添加
<link>
或<script>
标签,以加载所需的JS和CSS文件。最后,我实现了我自己的有状态表单版本,每次需要时,我都可以通过静态函数调用
ActiveFormWidget::getRequestMultiStepData()
来获取有状态数据。注意:我的实现中有一个缺点:所有有状态的数据都需要在表单部件初始化之前收集。2但是我从来没有遇到过这样的问题。3下面是代码: