1

我一直在试图找到一个我认为相当简单的解决方案?我想做的是创建一个表格来收集一些调查记录。

Table: survey_record
id
meter_id
status_id
create_time
create_user

Table: survey_inspection
id
survey_record_id (FK)
bay_id
bay_usage_id

因此,表survey_inspection HAS_MANY 检查来自survey_record。假设检查员正在对meter_id = 1001 进行调查,那么用户识别仪表的status_id,他们必须填写4 个检查条目,因为1001 有4 个托架。为了生成 4 个托架,我只是创建了一个for循环。哪个工作正常。

查看:_form.php

...
$meter=Meter::model()->findByPk($model->meter_id);
$bays = count($meter->bays); //retrieves the number of inspections required

<?php echo $form->dropDownListRow($model,'status_id',$model->getStatusId(),array('prompt'=>'Select Status ...')); ?>

...
<?php for ($i = 1; $i <= $bays; $i++): ?>

<?php echo $form->textFieldRow($inspection, "[$i]bay_id", array('readonly'=>true, 'value'=>"$i", 'class'=>'span1')); ?>

<?php echo $form->dropDownListRow($inspection, "[$i]bay_usage_id", $inspection->getUsageId(), array('prompt'=>'Bay Status ...') ); ?>   

<?php endfor; ?>
...

但是,当我提交表单时,我只收到两个(不是四个)结果,而且我似乎无法正确显示经过验证的字段。所以这里是著名的控制器文件:SurveyRecordController.php

public function actionCreate($survey_id, $meter_id)
{

    $model=new SurveyRecord;
    $inspection = new SurveyInspection;

    $model->survey_id = (int)$survey_id;
    $model->meter_id  = (int)$meter_id;


    if(isset($_POST['SurveyRecord'], $_POST['SurveyInspection']))
    {
        $model->attributes=$_POST['SurveyRecord'];
        $valid= $model->validate();

            $i=1;
            foreach($_POST['SurveyInspection'][$i] as $inspection)
            {
                $inspection = new SurveyInspection;

                $inspection->bay_id     =$_POST['SurveyInspection'][$i]['bay_id'];
                $inspection->bay_usage_id   =$_POST['SurveyInspection'][$i]['bay_usage_id']; 


                $valid= $inspection->validate() && $valid; 

                echo '<br/><br/><br/><pre>';
                print_r($_POST['SurveyInspection'][$i]);
                echo '</pre>';

                if($valid)
                {
                    if($model->save(false))
                    {
                        $inspection->survey_record_id = $model->id;
                        $inspection->save(false); 
                        $this->redirect(array('/meter')); 
                    }
                }
                $i++;

                //$inspection->attributes=$_POST['SurveyInspection'][$i];

            }


    }

    $this->render('create',array(
        'model'=>$model,
        'inspection'=>$inspection,
    ));
}

我有一种有趣的感觉,我可能没有正确执行foreach循环,因为当我查看数组 $_POST['SurveyInspection'][$i] 时,我只返回了两个条目,而应该有四个条目。

一些可能有用的信息:

PHP版本:5.4.14
Yii 版本:1.1.13
PostgreSQL 版本:9.1.9

非常感谢你 :)

4

3 回答 3

1

据我所知,我认为对于验证,你通过将 false 传递给保存方法(例如:$model->save(false))绕过了默认验证,并且你也在使用 yii 的验证功能。我想你尝试删除 false 参数并使用 save() 来解决验证问题

于 2013-05-24T08:41:40.767 回答
1

foreach 循环是错误的。您可以使其正确且更清洁:

foreach($_POST['SurveyInspection'] as $i => $value)
{
    $inspection = new SurveyInspection;
    $inspection->bay_id     = $value['bay_id'];
    $inspection->bay_usage_id   = $value['bay_usage_id']; 
    ...

$i++不需要,因为foreach将循环每个元素。

于 2013-05-24T10:41:50.443 回答
1

我采取了完全不同的方法,总是欢迎提出宝贵的建议:) 希望这对你们中的一些人有所帮助。

控制器:

public function actionCreate($survey_id, $meter_id)
{

    $bays = $this->getBayCount($meter_id);

    for ($i=1;$i<=$bays;$i++)
    {   
        $model=new SurveyRecord;
        $model->survey_id = (int)$survey_id;
        $model->meter_id  = (int)$meter_id;
        ${'inspection_'.$i} = new SurveyInspection($i);

        if(isset($_POST['SurveyRecord'], $_POST["SurveyInspection"][$i]))
        {
            $model->attributes = $_POST['SurveyRecord'];
            ${'inspection_'.$i}->attributes = $_POST["SurveyInspection"][$i];


            echo '<br/><br/><br/><pre>';
            print_r(${'inspection_'.$i}->attributes);
            echo '</pre>';

        }

    }

    for ($i=1;$i<=$bays;$i++)
    {
        ${'inspection_'.$i} = new SurveyInspection($i);
        $inspection['inspection_'.$i] = ${'inspection_'.$i};
    }

    $this->render('create',array(
    'inspection'=>$inspection,
    'model'=>$model
    )); 

}

看法:

...
<div class="control">
<?php echo $form->dropDownListRow($model,'status_id',$model->getStatusId(),array('prompt'=>'Select Status ...')); ?>

<?php
    $meter=Meter::model()->findByPk($model->meter_id);
    $bays = count($meter->bays);
?>
<?php for ($i=1; $i<=$bays; $i++): ?>
<table>
<tr>
    <td><?php echo $form->textFieldRow($inspection["inspection_$i"], "[$i]bay_id", 
        array('readonly'=>true, 'value'=>"$i", 'class'=>'span1')); ?></td>
    <td><?php echo $form->dropDownListRow($inspection["inspection_$i"], "[$i]bay_usage_id", $inspection["inspection_$i"]->getUsageId(),
        array('prompt'=>'Bay Status ...') ); ?></td>    
</tr>
</table>
<?php endfor; ?>    

</div>
...

信用:http: //yiiblog.info/blog/index.php/post/108/Rename+ACtiveRecord+ $_POST+array's+Name+to+update+multimodels

注意:在视图/控制器上仍有一些工作要做(似乎无法在 $_POST 上选择我在第二个模型上的下拉菜单),一旦我修复它就会发布。

感谢您的帮助 @PeterM 和 @Ninad 的输入。

于 2013-05-27T06:44:14.830 回答