表单(多个实例)与其他多个模型的下拉列表Yii2

时间:2016-09-09 11:34:31

标签: drop-down-menu datepicker yii2

我想要一个基于其他模特的下拉列表创建“Feuille de jour”的表单。

事实上,我有4个由id链接的表:表“feuille de jour”的表格中有“poste FDJ”,“categorie FDJ”和“staff”。

当我创建“Feuille de jour”时,我希望能够选择(在下拉列表中)“poste FDJ”,“类别FDJ”和“人员”的名称,当我提交表格,它保存每个名字的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();?>

谢谢! =)

编辑:

我再次尝试使用yii创建的函数(我不知道为什么,我在帖子之前尝试:/)

我的功能创建:

     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'属性。“

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

我可以说一些混乱的代码但是你应该注意一些重要的事情:

  1. 查看文件不得直接访问数据库。你打破了MVC规则。您需要使用控制器或型号。
  2. 谈论这一部分:

    $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();
    
    1. 错误valid 'model' property must be set extending from '\yii\base\Model'."表示您需要在模型中扩展yii\base\Model类。
    2. 类似的东西:

      use yii\base\Model;
      
      class Personnel extends Model
      {
          // ...
      }
      
      1. 你的GridView看起来有点奇怪。您尚未在其中添加'dataProvider' => $dataProvider,及其has 'columns'属性,而不是'rows'
      2. 你应该首先这些,因为它们非常重要。修复后,您可能有一个工作示例,如果没有,我们可以继续搜索。