【问题标题】:Form (multiple instance) With Dropdown List From Other Multiple Model Yii2带有来自其他多个模型 Yii2 的下拉列表的表单(多实例)
【发布时间】:2016-09-09 11:34:31
【问题描述】:

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

事实上,我有 4 个通过 id 链接的表:表“Feuille de jour”的 id 来自表“poste FDJ”、“categorie FDJ”和“personnel”。

当我创建“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();?>

谢谢! =)

编辑:

我再次尝试使用来自 yii 的函数 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,
            ]);
        }
}

有了它,我有一个错误:“ 无效配置 – yii\base\InvalidConfigException 要么必须设置 'formName',要么必须设置从 '\yii\base\Model' 扩展的有效 'model' 属性。”

有人有想法吗?

【问题讨论】:

    标签: drop-down-menu datepicker yii2


    【解决方案1】:

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

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

    类似:

    use yii\base\Model;
    
    class Personnel extends Model
    {
        // ...
    }
    
    1. 您的GridView 看起来有些奇怪。您没有在其中包含 'dataProvider' =&gt; $dataProvider,has 'columns' 属性,而不是 'rows'

    您应该首先考虑这些,因为它们非常重要。修复后,您可能有一个工作示例,如果没有,我们可以继续搜索。

    【讨论】:

    • 谢谢你回答我! 1. 忘记注释这部分代码了。这是为了测试下拉列表。我不再使用它了;) 2. 我的类已经扩展了一个东西:“Controller”然后,我不能再扩展一个了...... 3. 我使用link 作为我的表单网格,但我知道我必须使用表格形式(如link),带有'dataProvider' =&gt; $dataProvider。我正在搜索,但我还不明白如何使用它。
    • "Controller" 应该在 Controller 类中扩展,在 Model 类中你应该扩展我写的 (yii\base\Model)。对于dataProvider,请使用this guide(以public function search($params) { 开头的所有内容,除了$this-&gt;addCondition)。
    • 我的模型已经扩展了 \yii\db\ActiveRecord。我搜索并了解什么是数据提供者,但我认为我不会为我想要的而工作。我的表单必须为每个日期(从 datepicker 小部件中选择)创建一个新的“Feuille de jour”,除日期外具有所有相同的属性。而且我不知道会创造多少“Feuille de jour”。事实上,这是一个计划设定某人何时负责,它可以是一个月中的 2 天或一个月中的 30 天。而且我希望它对用户来说简单快捷,所以只需选择名称和服务,然后单击每个日期似乎就完美了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多