2016-09-09 24 views
1

我想要一個基於其他模型的下拉列表創建「Feuille de jour」的窗體。窗體(多實例)從其他多個模型的下拉列表Yii2

事實上,我有4個通過id鏈接的表格:「Feuille de jour」表格具有表格「poste FDJ」,「categorie FDJ」和「personnel」中的id。

當我創建「Feuille de jour」時,我希望能夠選擇(在下拉列表中)「poste FDJ」,「categorie FDJ」和「personnel」的名稱,並且在我提交時該表格保存了每個名稱的ID。

現在,當我點擊提交,頁面的再軋但僅此而已......

我知道這是可以保存多個模型的一種形式,我認爲我可以在此啓動,但它不會工作。

form

有人能幫助我嗎?

有我創建功能控制器(即曾與一個 「簡單」 的形式合作),我的觀點:

我機能的研究創造:

public function actionCreate() 
{ 
    $model = new FeuilleDeJourResponsable(); 
    $meteo_prevision = new MeteoPrevision(); 
    $poste_fdj = new PosteFdj(); 
    $categorie_fdj = new CategorieFdj(); 
    $personnel = new Personnel(); 

    if ($model->load(Yii::$app->request->post()) && $meteo_prevision->load(Yii::$app->request->post()) && $poste_fdj->load(Yii::$app->request->post()) && $categorie_fdj->load(Yii::$app->request->post()) && $personnel->load(Yii::$app->request->post()) && FeuilleDeJourResponsable::validateMultiple([$model, $meteo_prevision, $poste_fdj, $categorie_fdj, $personnel])) 
    { 

     $poste_fdj->save(false); 
     $categorie_fdj->save(false); 
     $personnel->save(false); 

     $model->ID_Poste_FDJ = $poste_fdj->ID_Poste_FDJ; // no need for validation rule on user_id as you set it yourself 
     $model->ID_Categorie = $categorie_fdj->ID_Categorie; // no need for validation rule on user_id as you set it yourself 
     $model->Code_Personnel = $personnel->Code_Personnel; // no need for validation rule on user_id as you set it yourself 

     $model->save(false); // skip validation as model is already validated 

     $meteo_prevision->Date_Calendaire = $model->Date_Calendaire; // no need for validation rule on user_id as you set it yourself 
     $meteo_prevision->save(false); 

     return $this->redirect(['feuille_de_jour_responsable/view', 'Date_Calendaire' => $model->Date_Calendaire]); 
    } else { 
     return $this->render('create', [ 
      'feuille_de_jour_responsable' => $model, 
      'meteo_prevision' => $meteo_prevision, 
      'poste_fdj' => $poste_fdj, 
      'categorie_fdj' => $categorie_fdj, 
      'personnel' => $personnel, 
     ]); 
    } 
} 

而我的觀點:

<?php 


$reqNomPoste = 'SELECT Nom_Poste_FDJ,ID_Poste_FDJ FROM poste_fdj'; 
$nomPoste = PosteFdj::findBySql($reqNomPoste) 
->asArray() 
->all(); 

/*$IDPoste = array(); 
$i = 0; 

foreach ($nomPoste["ID_Poste_FDJ"] as $ID) 
{ 
    $i++; 
    $IDPoste = $ID; 
}*/ 
//var_dump($nomPoste); 

$reqNomPersonnel = 'SELECT Nom_Personnel,Code_Personnel FROM personnel'; 
$nomPersonnel = Personnel::findBySql($reqNomPersonnel) 
->asArray() 
->all(); 

//var_dump($nomPersonnel); 

$reqCategorie = 'SELECT Nom,ID_Categorie FROM categorie_fdj'; 
$categorie = CategorieFdj::findBySql($reqCategorie) 
->asArray() 
->all(); 

//var_dump($nomPersonnel); 

$form = ActiveForm::begin(); 

echo FormGrid::widget([ 
    'model'=>$feuille_de_jour_responsable, 
    'form'=>$form, 
    'autoGenerateColumns'=>true, 
    'rows'=>[ 
     [ 
      'attributes'=>[ 
       'ID_Poste_FDJ'=>['type'=>Form::INPUT_DROPDOWN_LIST, 'items'=>PosteFdj::find()->select(['Nom_Poste_FDJ', 'ID_Poste_FDJ'])->indexBy('ID_Poste_FDJ')->column(), 'hint'=>'Choisir Poste'], 
       //::findBySql('SELECT Nom_Poste_FDJ,ID_Poste_FDJ FROM poste_fdj'), 'hint'=>'Choisir Poste'] 
       'Code_Personnel'=>['type'=>Form::INPUT_DROPDOWN_LIST, 'items'=>Personnel::find()->select(['Nom_Personnel', 'Code_Personnel'])->indexBy('Code_Personnel')->column(),'hint'=>'Select Personnel'], 
       'ID_Categorie'=>['type'=>Form::INPUT_DROPDOWN_LIST, 'items'=>CategorieFdj::find()->select(['Nom', 'ID_Categorie'])->indexBy('ID_Categorie')->column(), 'hint'=>'Choisir Categorie'], 
      ] 
     ], 
     [ 
      'attributes'=>[ 
      //'Date_Calendaire'=>['type'=>Form::INPUT_TEXT, 'options'=>['placeholder'=>'Enter username...']], 
      //'Date_Calendaire'=>['type'=>Form::INPUT_WIDGET, 'widgetClass'=>'\kartik\widgets\DatePicker', 'hint'=>'Enter birthday (mm/dd/yyyy)'], 
       'Date_Calendaire'=>['type'=>Form::INPUT_WIDGET, 'widgetClass'=>'\kartik\widgets\DatePicker', 
        'options' => [ 
         'pluginOptions' => [ 
          'todayHighlight' => true, 
          'format' => 'yyyy-mm-dd', 
          'multidate' => true, 
          'multidateSeparator' => ' ; ', 
         ], 
        ], 
        'hint'=>'Select Date', 
       ], 
      ] 
     ], 
     [ 
      'attributes'=>[  
       'actions'=>[ // embed raw HTML content 
        'type'=>Form::INPUT_RAW, 
        'value'=> '<div>' . 
        Html::resetButton('Reset', ['class'=>'btn btn-default']) . ' ' . 
        Html::submitButton('Submit', ['class'=>'btn btn-primary']) . 
        '</div>' 
       ] 
      ], 
     ], 
    ] 
]); 

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

謝謝! =)

編輯:

我與功能並重試從警予創建(我不知道爲什麼,我以前交的嘗試:/)

我funcion創建:

 public function actionCreate() 
    { 

     $feuille_de_jour_responsable = new FeuilleDeJourResponsable(); 


if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $feuille_de_jour_responsable->save()) { 
      return $this->redirect(['view', 'Date_Calendaire' => $feuille_de_jour_responsable->Date_Calendaire, 'ID_Poste_FDJ' => $feuille_de_jour_responsable->ID_Poste_FDJ, 'ID_Categorie' => $feuille_de_jour_responsable->ID_Categorie, 'Code_Personnel' => $feuille_de_jour_responsable->Code_Personnel]); 
     } else { 
      return $this->render('create', [ 
       'feuille_de_jour_responsable' => $feuille_de_jour_responsable, 
      ]); 
     } 
} 


I try to save multiple "Feuille de jour" in same time but it didn't work. 
There is my fuction create now : 

    public function actionCreate() 
    { 
     /* $feuille_de_jour_responsable = new FeuilleDeJourResponsable(); 

     if ($feuille_de_jour_responsable->load(Yii::$app->request->post()) && $feuille_de_jour_responsable->save()) { 
      return $this->redirect(['view', 'Date_Calendaire' => $feuille_de_jour_responsable->Date_Calendaire, 'ID_Poste_FDJ' => $feuille_de_jour_responsable->ID_Poste_FDJ, 'ID_Categorie' => $feuille_de_jour_responsable->ID_Categorie, 'Code_Personnel' => $feuille_de_jour_responsable->Code_Personnel]); 
     } else { 
      return $this->render('create', [ 
       'feuille_de_jour_responsable' => $feuille_de_jour_responsable, 
      ]); 
     }*/ 

     $count = count(Yii::$app->request->post('FeuilleDeJourResponsable', [])); 
     $array_feuille_de_jour_responsable = [new FeuilleDeJourResponsable()]; 

     for($i = 1; $i < $count; $i++) { 
      $array_feuille_de_jour_responsable[] = new FeuilleDeJourResponsable(); 
     } 


     if (FeuilleDeJourResponsable::loadMultiple($array_feuille_de_jour_responsable,Yii::$app->request->post(),"FeuilleDeJourResponsable")) 
     { 
      foreach ($array_feuille_de_jour_responsable as $feuille) 
      { 
       $feuille->save(false); 
      } 
      return $this->redirect('index'); 
      //return $this->redirect(['view', 'Date_Calendaire' => $feuille_de_jour_responsable->Date_Calendaire, 'ID_Poste_FDJ' => $feuille_de_jour_responsable->ID_Poste_FDJ, 'ID_Categorie' => $feuille_de_jour_responsable->ID_Categorie, 'Code_Personnel' => $feuille_de_jour_responsable->Code_Personnel]); 
     } else { 
      return $this->render('create', [ 
       'feuille_de_jour_responsable' => $array_feuille_de_jour_responsable, 
      ]); 
     } 
} 

有了它,我有一個錯誤:「 無效配置 - yii \ base \ InvalidConfigException必須設置'formName'或必須設置從'\ yii \ base \ Model'擴展的有效'model'屬性。

有人有想法嗎?

回答

0

有點亂代碼,我可以說,但有一個你應該知道的一些重要的事情:

  1. 查看文件必須不能直接訪問數據庫。你打破了MVC規則。您需要使用控制器或模型。

說到這個部分:

$reqNomPersonnel = 'SELECT Nom_Personnel,Code_Personnel FROM personnel'; 
$nomPersonnel = Personnel::findBySql($reqNomPersonnel) 
->asArray() 
->all(); 

$reqCategorie = 'SELECT Nom,ID_Categorie FROM categorie_fdj'; 
$categorie = CategorieFdj::findBySql($reqCategorie) 
->asArray() 
->all(); 
  • 錯誤valid 'model' property must be set extending from '\yii\base\Model'."意味着你需要在你的模式擴展yii\base\Model類。
  • 是這樣的:

    use yii\base\Model; 
    
    class Personnel extends Model 
    { 
        // ... 
    } 
    
  • GridView看起來有點奇數。您還沒有在其中包含'dataProvider' => $dataProvider,,並且它has'columns'屬性,而不是'rows'
  • 你應該首先考慮,因爲它們非常重要。修復後,您可能會有一個工作示例,如果沒有,我們可以繼續搜索。

    +0

    謝謝你回答我! 1.我忘了考慮這部分代碼。它用於測試下拉列表。我不再使用它了) 2.我的課程擴展已經開始:「控制器」然後,我不能再擴展一個... 3.我使用[link](http:// demos。 krajee.com/builder-details/form-grid)爲我的表單網格,但我明白,我必須使用表格形式(如[鏈接](http://demos.krajee.com/builder-details/tabular-form? page = 2&per-page = 10)),用'dataProvider'=> $ dataProvider'。 我正在尋找,但我不明白如何使用它。 – Sarah

    +0

    「控制器」應該在Controller類中擴展,在Model類中,你應該擴展我寫的東西('yii \ base \ Model')。對於'dataProvider'使用[本指南](http://www.yiiframework.com/wiki/621/filter-sort-by-calculated-related-fields-in-gridview-yii-2-0/)(其中它從'公共函數搜索($ params){'和所有寫入的內容開始,除了'$ this-> addCondition'之外)。 –

    +0

    我的模型已經擴展了\ yii \ db \ ActiveRecord。我搜索並瞭解dataprovider是什麼,但我認爲我不會爲我想要的工作。我的表單必須爲每個日期(從日期選擇器窗口小部件中選擇)創建一個具有除日期以外的所有相同屬性的新「Feuille de jour」。而且我不知道會創造多少「Feuille de jour」。 事實上,這是一個計劃,當有人是可迴應的,它可以是一個月的2天或一個月的30天。我希望用戶能夠簡單快捷地選擇名稱和服務,然後點擊每個日期似乎都很完美。 – Sarah