2013-05-24 4 views
1

Я пытаюсь найти решение чего-то, что я считаю довольно простым? Я бы хотел создать табличную форму для сбора некоторых записей для опроса.Yii multi модель с HAS_MANY Табличная форма

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 отсека, я просто создал для цикла. Что хорошо работает.

Вид: _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, 
    )); 
} 

У меня странное ощущение, что я не могу делать петлю Еогеасп правильно, так как при просмотре массива $ _POST [ «SurveyInspection»] [$ я ] Я возвращаюсь только с двумя записями, когда их должно быть четыре.

Некоторые данные, которые могут быть полезны:

 
PHP version: 5.4.14 
Yii version: 1.1.13 
PostgreSQL version: 9.1.9 

Спасибо любезно :)

ответ

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 + массив + имя + до + обновления + мультимоделей

Примечания: Там еще есть работа, которую нужно сделать на представлении/контроллере (кажется, что он не может выбрать на $ _POST для моих выпадающих списков на второй модели), опубликует, как только я его исправил.

Благодарим за помощь @PeterM и @Ninad за ваш вклад.

1

Насколько мне известно, я думаю, что для проверки и есть обходной проверки по умолчанию, передавая ложную, чтобы сохранить метод (экс : $ model-> save (false)), и u также используют функцию проверки yii. Я думаю, что вы пытаетесь удалить ложный параметр и просто используйте save() для проблемы проверки

+0

@nihad, вы правы, я удалил false, но до сих пор не получаю ожидаемых результатов. – Glicious

+0

Тогда попробуйте код, предложенный PeterM. Ваш цикл foreach не подходит. – Ninad

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 будет цикл каждый элемент.

+0

Спасибо, Питер, я очистил свой foreach, но это не помогло решить мою проблему. – Glicious

Смежные вопросы