Yii2.0 实现三级联动 [ 2.0 版本 ]
view中代码
<?php
use yii\bootstrap\ActiveForm;
/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
?>
<?php $form = ActiveForm::begin(['enableClientValidation' => false]);?>
<?= $form->field($model,'province')->dropDownList($model->getCityList(0),
[
'prompt'=>'--请选择省--',
'onchange'=>'
$(".form-group.field-member-area").hide();
$.post("'.yii::$app->urlManager->createUrl('member/site').'?typeid=1&pid="+$(this).val(),function(data){
$("select#member-city").html(data);
});',
]) ?>
<?= $form->field($model, 'city')->dropDownList($model->getCityList($model->province),
[
'prompt'=>'--请选择市--',
'onchange'=>'
$(".form-group.field-member-area").show();
$.post("'.yii::$app->urlManager->createUrl('member/site').'?typeid=2&pid="+$(this).val(),function(data){
$("select#member-area").html(data);
});',
]) ?>
<?= $form->field($model, 'area')->dropDownList($model->getCityList($model->city),['prompt'=>'--请选择区--',]) ?>
<?php ActiveForm::end();?>
model中添加下面的函数
/**
* @param $pid
* @return array
*/
public function getCityList($pid)
{
$model = City::findAll(array('pid'=>$pid));
return ArrayHelper::map($model, 'id', 'name');
}
控制器中添加下面的代码:
/**
* Function output the site that you selected.
* @param int $pid
* @param int $typeid
*/
public function actionSite($pid, $typeid = 0)
{
$model = new Member();
$model = $model->getCityList($pid);
if($typeid == 1){$aa="--请选择市--";}else if($typeid == 2 && $model){$aa="--请选择区--";}
echo Html::tag('option',$aa, ['value'=>'empty']) ;
foreach($model as $value=>$name)
{
echo Html::tag('option',Html::encode($name),array('value'=>$value));
}
}
City数据库结构:
/*
Navicat MySQL Data Transfer
Source Server : MySQL
Source Server Version : 50624
Source Host : localhost:3306
Source Database : yii2advanced
Target Server Type : MYSQL
Target Server Version : 50624
File Encoding : 65001
Date: 2015-07-13 14:27:12
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for yii2_city
-- ----------------------------
DROP TABLE IF EXISTS `yii2_city`;
CREATE TABLE `yii2_city` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`pid` smallint(5) unsigned NOT NULL DEFAULT '0',
`name` varchar(120) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `parent_id` (`pid`)
) ENGINE=MyISAM AUTO_INCREMENT=3410 DEFAULT CHARSET=utf8;
yx 上海
注册时间:2014-09-11
最后登录:2020-08-03
在线时长:31小时46分
最后登录:2020-08-03
在线时长:31小时46分
- 粉丝22
- 金钱5925
- 威望45
- 积分6685
共 32 条评论
上个效果图更清晰
效果图已加
谢谢楼主分享,已点赞。
感谢评论,已回复,方便以后用到。每次都是学到哪,扔到那,过后就忘了
@yx 按你的办法,为啥联动的js报错了呢
谢谢楼主 已经点赞
不错,谢谢分享
刚好要用,谢楼主分享
非常感谢分享
亲问下 dropDownList() 里面的option 有哪些值可以用?
手册上不是很明朗
标签的属性,比如style,click等。
@yx 发现个错误 $.post() 里面的地址 ? 应该是&
不错 收藏了
new Member()什么意思?
还是不懂调用
这个是你控制器中的模型,比如说你要在用户信息中地址的时候使用三级联动,那这个new Member()就是用户模型。
MAC电脑,为什么程序员都这么土豪。。。。。。。。。
什么意思,这个效果是程序做的,不是mac的浏览器效果
默默点赞!!!支持
正好用到,已点赞。
做下述补充,给需要解决问题的朋友们少走点弯路。
1、其中的member指的是自己的模型名称,如果不用这个名字,上述所有出现member的地方,放置自己模型名称
2、控制器中的site方法中用到了html::tag,请使用命名空间use yii\helpers\Html;否则无法正确输出。
3、view中的那个$model,请自己赋予适当的模型。如 $model = new Member();
第三条 怎么加? 能具体点吗
@忘记唱情歌 你在控制器中将model赋给view视图
我的代码只能出一级联动,我测试了下是view里面的 $model->province 这个没有值,不清楚这个是什么意思?我的字段里也没有province啊
看看 @rovast 的 补充 第二条
@pear2007 和上面那位水友一样,我加入了use yii\helpers\Html; 还是提示没有province 这个元素
@jy02477221 看看我后面的 写的很全
@pear2007 看了,没看懂,我进页面就报模版中没有province 这个元素,是模版代码的问题吗,我少加了什么?
@jy02477221 看不见你的代码 不清楚
class Yii2City extends \yii\db\ActiveRecord
{
public $province; public $city; public $area;
我在
https://github.com/bubifengyun/book-yii2-dev-process
,准备借助yiichina里的教程,编辑成一本书,最后用某高校LaTeX论文模板美化一下,每月或者更长时间发布PDF教程总结,求支持。我想把你的教程录入到这本书里,并记录您的名字及原网址,可否?谢谢啦。
可以的,弄好之后我也学习一下
@yx 你的书什么时候能出来? 我想看看
网站正在最后的试运行阶段,打算下周开始整理笔记。六月底应该可以出来,谢谢关注。
网站正在最后的试运行阶段,打算下周开始整理笔记。六月底应该可以出来,谢谢关注。
求楼主共享下数据...
联动效果出来了,但是无法保存数据,真是怪事。
提示
Bad Request(#400),missing required parameters:pid
我的省市县是三张表,然后我按照你的方法稍微改了一下,没有出来,首先省的id拿不到,不知道为什么,请指教下
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; /* @var $this yii\web\View */ /* @var $model common\models\Member */ /* @var $form yii\widgets\ActiveForm */ ?> <div class="member-form"> <?php $form = ActiveForm::begin(['enableClientValidation' => false ]); ?> <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?> <?php echo $form->field($model, 'province')->textInput(['maxlength' => true]) ?> <?php echo $form->field($model, 'city')->textInput(['maxlength' => true]) ?> <?php // $form->field($model, 'area')->textInput(['maxlength' => true]) ?> <?= $form->field($model,'province')->dropDownList($model->getCityList(0), [ 'prompt'=>'--请选择省--', 'onchange'=>' $(".form-group.field-member-area").hide(); $.post("'.yii::$app->urlManager->createUrl('member/site').'&typeid=1&pid="+$(this).val(),function(data){ $("select#member-city").html(data); });', ]) ?> <?= $form->field($model, 'city')->dropDownList($model->getCityList($model->province), [ 'prompt'=>'--请选择市--', 'onchange'=>' $(".form-group.field-member-area").show(); $.post("'.yii::$app->urlManager->createUrl('member/site').'&typeid=2&pid="+$(this).val(),function(data){ $("select#member-area").html(data); });', ]) ?> <?= $form->field($model, 'area')->dropDownList($model->getCityList($model->city),['prompt'=>'--请选择区--',]) ?> <?= $form->field($model, 'body')->textarea(['rows' => 6]) ?> <div class="form-group"> <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?> </div>
表单
<?php use yii\helpers\Html; use yii\widgets\DetailView; /* @var $this yii\web\View */ /* @var $model common\models\Member */ $this->title = $model->name; $this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Members'), 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; ?> <div class="member-view"> <h1><?= Html::encode($this->title) ?></h1> <p> <?= Html::a(Yii::t('app', 'Update'), ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?> <?= Html::a(Yii::t('app', 'Delete'), ['delete', 'id' => $model->id], [ 'class' => 'btn btn-danger', 'data' => [ 'confirm' => Yii::t('app', 'Are you sure you want to delete this item?'), 'method' => 'post', ], ]) ?> </p> <?= DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'name', 'province', 'city', 'area', 'body:ntext', ], ]) ?> </div>
有了这两个完整的 应该没问题了
-- ---------------------------- -- Table structure for member -- ---------------------------- DROP TABLE IF EXISTS `member`; CREATE TABLE `member` ( `id` int(6) NOT NULL AUTO_INCREMENT, `name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, `province` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, `city` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, `area` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL, `body` text COLLATE utf8_unicode_ci, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- ---------------------------- -- Records of member -- ---------------------------- INSERT INTO `member` VALUES ('1', '昌平旅行社', '1', '2', '3', '昌平旅行社'); INSERT INTO `member` VALUES ('2', '随州旅行社', '1', '2', '3', '随州旅行社随州旅行社随州旅行社我是随州人'); INSERT INTO `member` VALUES ('3', '我的旅行社', '1', '2', '3', '我的旅行社我的旅行社我的旅行社我的旅行社');
我试验用的表也贴出来