Yii2, Kartik DepDrop 更新预选值 [英] Yii2, Kartik DepDrop on update pre selected value

查看:32
本文介绍了Yii2, Kartik DepDrop 更新预选值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有四个依赖的层次结构下拉列表 library >目录 >类别 >主题

我正在使用 kartik depdrop,一切都很好,但在更新时我找不到预选值的任何解决方案.我需要的是在更新时显示预选的值以及所有其他值,以便用户也可以更改选择.

这是我的代码.

_form.php

<div class="catalog-input"><span><strong>库</strong></span><?php echo $form->field($modelDep, 'lesson_name[0]')->dropDownList($libList, ['提示' =>'选择图书馆','id'=''lib-id-1','名称'=>'课程[图书馆]'])->标签(假);?>

<div class="category-input"><span><strong>目录</strong></span><?phpecho $form->field($modelDep, 'lesson_name[1]')->widget(DepDrop::classname(), ['options'=>['id'=>'catalog-id-1', 'name'='=>'Lesson[catalog]'],'插件选项'=>['依赖'=>['lib-id-1'],'placeholder'='选择目录','url'=>Url::to(['/课程/目录'])]])->标签(假);?>

<div class="subject-input"><span><strong>类别</strong></span><?phpecho $form->field($modelDep, 'lesson_name[2]')->widget(DepDrop::classname(), ['options'=>['id'=>'cat-id-1', 'name'='=>'课程[类别]'],'插件选项'=>['depends'=>['catalog-id-1'],'占位符'='选择类别','url'=>Url::to(['/课程/类别'])]])->标签(假);?>

<div class="topic-input"><span><strong>主题</strong></span><?phpecho $form->field($modelDep, 'lesson_name[3]')->widget(DepDrop::classname(), ['options'=>['id'=>'subject-id-1', 'name'='=>'Lesson[fk_subject]'],'插件选项'=>['依赖'=>['cat-id-1'],'占位符'='选择主题','url'=>Url::to(['/课程/主题'])]])->标签(假);?>

控制器

public function actionCatalog() {$out = [];如果(isset($_POST['depdrop_parents'])){$parents = $_POST['depdrop_parents'];如果 ($parents != null) {$lib_id = $parents[0];$out = $this::getCatalogList($lib_id);echo Json::encode(['output'=>$out, 'selected'=>'']);返回;}}echo Json::encode(['output'=>'', 'selected'=>'']);}公共静态函数 getCatalogList($lib_id){$company_name = array_shift((explode(".", $_SERVER['HTTP_HOST'])));$company = \common\models\Company::find()->where(['company_name' => $company_name])->one();$data= \common\models\Catalog::find()->where(['fk_library'=>$lib_id,'fk_company'=>$company->id])->select(['id','catalog_name AS name'])->asArray()->all();返回 $data;}公共函数 actionCategory() {$out = [];如果(isset($_POST['depdrop_parents'])){$parents = $_POST['depdrop_parents'];如果 ($parents != null) {$cat_id = $parents[0];$out = $this::getCategoryList($cat_id);echo Json::encode(['output'=>$out, 'selected'=>'']);返回;}}echo Json::encode(['output'=>'', 'selected'=>'']);}公共静态函数 getCategoryList($cat_id){$company_name = array_shift((explode(".", $_SERVER['HTTP_HOST'])));$company = \common\models\Company::find()->where(['company_name' => $company_name])->one();$data= \common\models\Category::find()->where(['fk_catalog'=>$cat_id,'fk_company'=>$company->id])->select(['id','category_name AS name'])->asArray()->all();返回 $data;}公共函数 actionSubject() {$out = [];如果(isset($_POST['depdrop_parents'])){$parents = $_POST['depdrop_parents'];如果 ($parents != null) {$category_id = $parents[0];$out = $this::getSubjectList($category_id);echo Json::encode(['output'=>$out, 'selected'=>'']);返回;}}echo Json::encode(['output'=>'', 'selected'=>'']);}公共静态函数 getSubjectList($category_id){$company_name = array_shift((explode(".", $_SERVER['HTTP_HOST'])));$company = \common\models\Company::find()->where(['company_name' => $company_name])->one();$data= \common\models\Subject::find()->where(['fk_category'=>$category_id,'fk_company'=>$company->id])->select(['id','subject_name AS name'])->asArray()->all();返回 $data;}

解决方案

前面的 2 个答案有一些答案,但不太清楚如何实现.

kartik 文档页面中,您有关于数据选项的文档,如下所示示例:

'data' =>[2 =>'音乐'],

您可以在控制器中设置默认值,但没有更新的 ID,只有父 ID.在视图中,您肯定会拥有模型中的 id,但并不总是带有描述的字段.

好消息是,您不需要名称来显示默认值,例如仅显示 id:

 $panelBookRights .= $form->field($model, 'primary_agent_id')->widget(DepDrop::classname(), ['数据' =>[$model->primary_agent_id =>'默认'],'选项' =>['id' =>'主要代理ID'],'插件选项' =>['取决于' =>['book-rights_owner_id'],'初始化' =>真的,'占位符' =>'选择...','网址' =>Url::to(['contact/list_primaryagents'])]]);

我把默认值放在那里,但如果 id 在你从控制器加载的列表中,它就可以工作.

I have four dependent drop downs of hierarchy library > catalog > category > subject

I am using kartik depdrop, every thing is working really fine but on update I couldn't find any solution for pre selected values. What I need is to show pre selected values on update with all other values as well so that user can change the selection also.

Here is my code.

_form.php

<div class="inner-addon right-addon">
        <div class="catalog-input">
            <span><strong>Library</strong></span>
            <?php echo $form->field($modelDep, 'lesson_name[0]')->dropDownList($libList, [
                'prompt' => 'Select Library',
                'id'=>'lib-id-1',
                'name'=>'Lesson[library]'
            ])->label(false); ?>
        </div> 
        <div class="category-input">
            <span><strong>Catalog</strong></span>
            <?php
            echo $form->field($modelDep, 'lesson_name[1]')->widget(DepDrop::classname(), [  
                'options'=>['id'=>'catalog-id-1', 'name'=>'Lesson[catalog]'],
                'pluginOptions'=>[
                    'depends'=>['lib-id-1'],
                    'placeholder'=>'Select Catalog',
                    'url'=>Url::to(['/lesson/catalog'])
                ]
            ])->label(false);
            ?>
        </div> 
        <div class="subject-input">
            <span><strong>Category</strong></span>
            <?php
                echo $form->field($modelDep, 'lesson_name[2]')->widget(DepDrop::classname(), [
                    'options'=>['id'=>'cat-id-1', 'name'=>'Lesson[category]'],
                    'pluginOptions'=>[
                        'depends'=>['catalog-id-1'],
                        'placeholder'=>'Select Category',
                        'url'=>Url::to(['/lesson/category'])
                    ]
                ])->label(false);
            ?>
        </div> 
        <div class="topic-input">
            <span><strong>Subject</strong></span>
            <?php
                echo $form->field($modelDep, 'lesson_name[3]')->widget(DepDrop::classname(), [
                    'options'=>['id'=>'subject-id-1', 'name'=>'Lesson[fk_subject]'],
                    'pluginOptions'=>[
                        'depends'=>['cat-id-1'],
                        'placeholder'=>'Select Subject',
                        'url'=>Url::to(['/lesson/subject'])
                    ]
                ])->label(false);
            ?>
        </div> 
    </div>

Controller

public function actionCatalog() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
        $parents = $_POST['depdrop_parents'];
        if ($parents != null) {
            $lib_id = $parents[0];
            $out = $this::getCatalogList($lib_id);
            echo Json::encode(['output'=>$out, 'selected'=>'']);
            return;
        }
    }
    echo Json::encode(['output'=>'', 'selected'=>'']);
}
public static function getCatalogList($lib_id){
    $company_name = array_shift((explode(".", $_SERVER['HTTP_HOST'])));
    $company = \common\models\Company::find()->where(['company_name' => $company_name])->one();
    $data= \common\models\Catalog::find()
       ->where(['fk_library'=>$lib_id,'fk_company'=>$company->id])
       ->select(['id','catalog_name AS name' ])->asArray()->all();
    return $data;
}



public function actionCategory() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
            $parents = $_POST['depdrop_parents'];
            if ($parents != null) {
                $cat_id = $parents[0];
                $out = $this::getCategoryList($cat_id);
                echo Json::encode(['output'=>$out, 'selected'=>'']);
                return;
            }
        }
    echo Json::encode(['output'=>'', 'selected'=>'']);
}
public static function getCategoryList($cat_id){
    $company_name = array_shift((explode(".", $_SERVER['HTTP_HOST'])));
    $company = \common\models\Company::find()->where(['company_name' => $company_name])->one();
    $data= \common\models\Category::find()
       ->where(['fk_catalog'=>$cat_id,'fk_company'=>$company->id])
       ->select(['id','category_name AS name' ])->asArray()->all();
    return $data;
}





public function actionSubject() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
            $parents = $_POST['depdrop_parents'];
            if ($parents != null) {
                $category_id = $parents[0];
                $out = $this::getSubjectList($category_id);
                echo Json::encode(['output'=>$out, 'selected'=>'']);
                return;
            }
        }
    echo Json::encode(['output'=>'', 'selected'=>'']);
}
public static function getSubjectList($category_id){
    $company_name = array_shift((explode(".", $_SERVER['HTTP_HOST'])));
    $company = \common\models\Company::find()->where(['company_name' => $company_name])->one();
    $data= \common\models\Subject::find()
       ->where(['fk_category'=>$category_id,'fk_company'=>$company->id])
       ->select(['id','subject_name AS name' ])->asArray()->all();
    return $data;
}

解决方案

The 2 previous answers have a bit of the answer but not too clear how to implement.

In the kartik documentation page you have documentation about the data option with the following sample:

'data' => [2 => 'Music'], 

You can set the default in your controller but you don't have the updated id there only the parent id. In the view you will have for sure the id in your model but not always the field with the description.

The good thing is that you don't need the name to show the default just the id for example:

    $panelBookRights .= $form->field($model, 'primary_agent_id')->widget(DepDrop::classname(), [
    'data' => [$model->primary_agent_id => 'default'], 
    'options' => ['id' => 'primary-agent-id'],
    'pluginOptions' => [
        'depends' => ['book-rights_owner_id'],
        'initialize' => true,
        'placeholder' => 'Select...',
        'url' => Url::to(['contact/list_primaryagents'])
    ]
]);

I put default there but it works if the id is in the list you load from the controller.

这篇关于Yii2, Kartik DepDrop 更新预选值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
PHP最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆