2
votes

I want a form that create a "Feuille de jour" based on dropdownlist from other models.

In fact, I have 4 tables that are linked by id : the table "Feuille de jour" have the id from the tables "poste FDJ", "categorie FDJ" and "personnel".

When I create a "Feuille de jour", I want to be able to select (in a dropdown list) the name of a "poste FDJ", a "categorie FDJ" and a "personnel" and when I submit the form, it save the id of each name.

Now, when I click on submit, the page reroll but nothing more...

I know it's possible to save multiple model in one form, I supposed that I can start on this but it doesn't work.

form

Can someone help me?

There are my create function controller (that had worked with a "simple" form) and my view :

My fuction create:

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,
        ]);
    }
}

And my view :

    <?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();?>

Thank you ! =)

EDIT :

I try again with the function create from yii (I don't know why, I try before post :/ )

My funcion create :

     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,
            ]);
        }
}

With it, I have an error : " Invalid Configuration – yii\base\InvalidConfigException Either the 'formName' has to be set or a valid 'model' property must be set extending from '\yii\base\Model'."

Someone have an idea?

1

1 Answers

0
votes

A little chaotic code I could say but there are a few important things you should be aware of:

  1. View file must not access database directly. You're breaking the MVC rules. You need to use controller or model.

Talking about this part:

$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. The error valid 'model' property must be set extending from '\yii\base\Model'." means that you need to extend yii\base\Model class in your model.

Something like:

use yii\base\Model;

class Personnel extends Model
{
    // ...
}
  1. Your GridView looks somewhat odd. You haven't included 'dataProvider' => $dataProvider, in it and it has 'columns' property, not 'rows'.

You should these first as they are quite important. After fixing, you may have a working example, if not, we can continue searching.