Yii2中动态生成的表单

时间:2015-05-11 22:38:50

标签: php yii2

我在yii2框架中学习编程,我无法找到如何实现特定任务:我想根据收集的数据生成每月统计数据。对于此任务,我需要生成表单,这将对项目和用户的数量保持警惕。例如:

Project 1: 500$
 user1 field (in fields I want to put percentage of above value)
 user2 field
 user3 field

project 2: 1000$
 user2 field
 user3 field

等等。结构方式很容易,并且以序列化形式保存结果,但这样我无法验证(例如,如果给定项目的字段中的值总和超出100%并且是否有错误,在发送表格后,数据将被删除)。 用Yii2可以实现这样的任务吗?

编辑: 目前我以这种方式形成:

控制器:

        $date = "2015-05";
    $model = new Raport();
    $invoices = Faktura::find()->where(['LIKE','paid_date', $date])->all();

$projects = array();

        foreach($invoices as $invoice){
        $id = $invoice->project_id;
        $projects[$id]['faktury'][] = $invoice;
        $projects[$id]['model']= Project::find()->where(['id'=>$invoice->project_id])->one();
        $projects[$id]['value']+= $invoice->value_netto;
        $projects[$id]['users']= '' ;
        $checks = Check::find()->where(['project_id'=>$id])->all();
        if (empty($checks)){
            $projects[$id]['users']=$projects[$id]['model']->users;
        }else {
            foreach ($checks as $check) {
                $projects[$id]['users'][$check->user->id] = $check->user;
            }
        }
    }

视图:

   foreach ($projects as $key => $project) {
    echo"<h2>".$project['model']->name."</h2>";
    echo 'project value: '.$project['value'];
    echo"<p>percentage value:</p>";

  //  echo"<pre>";
    foreach ($project['users'] as $user) {

        echo"<p>".$user->email."</p>";
        echo "<input name='Raport[".$key."][".$user->id."]'>";
    }
}

1 个答案:

答案 0 :(得分:1)

是的,您可能已经以动态方式创建表单,以相同的动态方式创建模型规则。

您要做的事情已在GII生成器中完成。 Gii占用了一些字段(在GII的案例数据库表字段中),它为模型和表单上的字段创建了规则。最后,Gii将这些规则写入模型文件,但您不必这样做,您可以将该数组作为表单的结果返回。对于表单上的字段也是如此,您始终可以拥有

基本上你应该创建一个不像Active https://github.com/yiisoft/yii2-app-advanced/blob/master/frontend/models/ContactForm.php那样的Active Record模型。而不是创建规则功能的方式,你应该基于&#34;其他东西&#34;创建该数组。 (比如您的项目和用户)。您应该创建一个执行验证的函数,并检查%是否高于100并将其与某些字段的验证联系起来。一个简单的例子是

/**
 * @inheritdoc
 */
public function rules()
{
    $rules = [];
    foreach(['p1', 'p2'] as $project) {
        foreach(['u1', 'u2'] as $user) {
            $rules[] = [$project.'_'.$user, "required"];
        }
    }
    return $rules;
}

之后,基于相同的&#34;其他事情&#34;如上所述,您应该创建表单。因为模型和视图使用相同的字段,所以应该都可以正常工作。

示例视图

    <?php $form = ActiveForm::begin(); ?>

    <?php
        foreach(['p1', 'p2'] as $project) {
            foreach(['u1', 'u2'] as $user) {
                echo $form->field($model, $project.'_'.$user)->textInput() 
            }
        }
?>

...................
    <?php ActiveForm::end(); ?>