我在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."]'>";
}
}
答案 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(); ?>