依赖下拉列表yii2。如何做?
我可以在yii2中创建依赖下拉列表吗 我有两张桌子:依赖下拉列表yii2。如何做?,yii2,Yii2,我可以在yii2中创建依赖下拉列表吗 我有两张桌子: 'id','name_country" 'id','name_city','country_id' 在我的模型中有两种方法: public function getCountryList() { $models = NetCountry::find()->asArray()->all(); return ArrayHelper::map($models, 'id', 'country_name'); } 及 我有第一个字段:
'id','name_country"
'id','name_city','country_id'
在我的模型中有两种方法:
public function getCountryList()
{
$models = NetCountry::find()->asArray()->all();
return ArrayHelper::map($models, 'id', 'country_name');
}
及
我有第一个字段:
<?= $form->field($model, 'country')->dropDownList($model->countryList),['id'=>'parent_id'];
第二个呢
<?= $form->field($model, 'city')->dropDownList($model->cityList);
我需要将父节点id“传输”到控制器,并通过AJAX和JSON返回城市列表
我该怎么做?我看到了,但是Yi2呢?使用krajee扩展作为dependent下拉列表 详情在这里 或按照以下说明操作: 通过composer安装扩展:
$ php composer.phar require kartik-v/dependent-dropdown "dev-master"
在你看来:
use kartik\widgets\DepDrop;
// Normal parent select
echo $form->field($model, 'cat')->dropDownList($catList, ['id' => 'cat-id']);
// Dependent Dropdown
echo $form->field($model, 'subcat')->widget(DepDrop::classname(), [
'options' => ['id' => 'subcat-id'],
'pluginOptions' => [
'depends' => ['cat-id'],
'placeholder' => 'Select...',
'url' => Url::to(['/site/subcat'])
]
]);
//控制器
public function actionSubcat() {
$out = [];
if (isset($_POST['depdrop_parents'])) {
$parents = $_POST['depdrop_parents'];
if ($parents != null) {
$cat_id = $parents[0];
$out = self::getSubCatList($cat_id);
// the getSubCatList function will query the database based on the
// cat_id and return an array like below:
// [
// ['id'=>'<sub-cat-id-1>', 'name'=>'<sub-cat-name1>'],
// ['id'=>'<sub-cat_id_2>', 'name'=>'<sub-cat-name2>']
// ]
echo Json::encode(['output'=>$out, 'selected'=>'']);
return;
}
}
echo Json::encode(['output'=>'', 'selected'=>'']);
}
在yii2中创建依赖下拉列表而不使用任何第三方库是非常困难的 非常简单。您必须按照您的要求尝试下面编写的代码。 使用gii为各个表创建模型、视图和控制器 假设有两个像你写的那样的国家和城市。 然后将以下代码写入一个类似控制器的国家/地区的视图文件:
<?php
use yii\helpers\ArrayHelper;
use yii\widgets\ActiveForm;
?>
<div>
<?php
$dataCountry=ArrayHelper::map(\app\models\Country::find()->
asArray()->all(),'id', 'name');
$form = ActiveForm::begin();
echo $form->field($model, 'id')->dropDownList($dataCountry,
['prompt'=>'-Choose a Name-',
'class'=>'adjust',
'onchange'=>'
$.post("'.Yii::$app->urlManager->createUrl('city/lists?id=').
'"+$(this).val(),function( data )
{
$( "select#city" ).html( data );
});
']);
$dataPost=ArrayHelper::map(\app\models\City::find()->
asArray()->all(), 'id', 'city');
echo $form->field($model, 'id')
->dropDownList(
$dataPost,
['id'=>'city',
'class'=>'adjust'
]
);
ActiveForm::end();
?>
</div>
然后在城市的另一个控制器中编写以下代码:
<?php
namespace app\controllers;
class CityController extends \yii\web\Controller
{
public function actionLists($id)
{
//echo "<pre>";print_r($id);die;
$countPosts = \app\models\City::find()
->where(['country_id' => $id])
->count();
$posts = \app\models\City::find()
->where(['country_id' => $id])
->orderBy('id DESC')
->all();
if($countPosts>0){
foreach($posts as $post){
echo "<option value='".$post->id."'>".$post->city."</option>";
}
}
else{
echo "<option>-</option>";
}
}
}
然后运行到url它的工作
编辑:固定url结构。http请求现在可以工作。上述代码工作不正常。行中有一个错误
public function actionLists($id)
{
$posts = SubCategory::find()
->where(['category_id' => $id])
->orderBy('id DESC')
->all();
if($posts){
foreach($posts as $post){
echo "<option value='".$post->id."'>".$post->name."</option>";
}
}
else{
echo "<option>-</option>";
}
}
控制台显示错误:
找不到404:无法解析请求:子类别/列表&id=54
有什么解决办法吗
我的控制器如下所示
<?= $form->field($model, 'category_id')->dropDownList($data,['prompt'=>'-Choose a Category-',
'onchange'=>'
$.get( "'.Url::toRoute('product/catlists').'", { id: $(this).val() } )
.done(function( data )
{
$( "select#product-sub_categoryid" ).html( data );
});
']); ?>
您可以在不使用任何小部件的情况下手动执行此操作: 按如下方式制作activeform:
<?= $form->field($model,'nameofyourmodel')->dropDownList(
[],
[
'prompt' => 'smth',
'id' => 'requester'
]
); ?>
这里是从第一个模型接收id的第二个表单:
public function actionGetoperations()
{
if ($id = Yii::$app->request->post('id')) {
$operationPosts = \app\models\firstmodel::find()
->where(['id' => $id])
->count();
if ($operationPosts > 0) {
$operations = \app\models\secondmodel::find()
->where(['firstmodelid' => $id])
->all();
foreach ($operations as $operation)
echo "<option value='" . $operation->firstmodelid. "'>" . $operation->name . "</option>";
} else
echo "<option>-</option>";
}
}
最后一个操作是在controller中创建一个功能,以匹配2个ID,并将它们发送到您的模型:
如果我从数据库中提取数据,如何编写getSubCatList函数确保您使用了yii\helpers\Json;在控制器和模型中,您可以使用$data=Contact::find->where['parent\u id'=>$id]->选择['id','name']->asArray->all$value=count$data==0?[=>]:$data;返回$value;谢谢正是我想要的。别忘了在您的视图中包含此内容使用yii\helpers\Url;
public function actionCatlists($id)
{
$mymodel = new Product ();
$size = $mymodel->modelGetCategory ( 'product_sub_category',$id );
if($size){
echo '<option value="">Choose Sub category</option>';
foreach($size as $post){
echo "<option value='".$post['id']."'>".$post['name']."</option>";
}
}
else{
echo '<option value="0">Not Specified</option>';
}
}
use yii\helpers\Url;
<?= $form->field($model, 'nameofyourmodel')->dropDownList(
ArrayHelper::map(\app\models\nameofyourmodel::find()->all(), 'id', 'name'),
[
'prompt'=>'smth',
'onchange' => '
$.post(
"' . Url::toRoute('getoperations') . '",
{id: $(this).val()},
function(res){
$("#requester").html(res);
}
);
',
]
); ?>
<?= $form->field($model,'nameofyourmodel')->dropDownList(
[],
[
'prompt' => 'smth',
'id' => 'requester'
]
); ?>
public function actionGetoperations()
{
if ($id = Yii::$app->request->post('id')) {
$operationPosts = \app\models\firstmodel::find()
->where(['id' => $id])
->count();
if ($operationPosts > 0) {
$operations = \app\models\secondmodel::find()
->where(['firstmodelid' => $id])
->all();
foreach ($operations as $operation)
echo "<option value='" . $operation->firstmodelid. "'>" . $operation->name . "</option>";
} else
echo "<option>-</option>";
}
}