Wiki
很多分布式锁的做法是,这个做法如果在 setnx 之后执行 expire之前进程意外 crash 或者要重启维护了,这个锁就永远得不到释放了 public function acquire() { $result = $this->redis->setnx($this->name, $this->owner); if ($result === 1 && $this->seconds > 0) { $this->redis->expire($this->name, $this->seconds); } return $result === 1; } 可以通过以下命令实现分布式锁,因为是一条命令所以可以保证原子性 // 原生命令 set name 111 PX 10000 NX return $this->redis->set('name','111',['NX', 'PX' => 10000]);
10月前 喜欢(0) 浏览(791) 评论(0)
Wiki
使用当前路由和GET参数创建URL 生成链接: echo Url::to(['post/view','id'=>100,'src'=>'google']) 打印结果:/index.php?r=post/view&id=100&src=google 去掉 src 参数 echo Url::current(['src' => null]); 打印结果:/index.php?r=post/view&id=100 新加 test 参数 echo Url::current(['test' => 'new']); 打印结果:/index.php?r=post/view&id=100&test=new
2年前 喜欢(0) 浏览(2209) 评论(0)
Wiki
示例如下 Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [ ['test01', 30], ['test02', 20], ['test03', 25], ])->execute();
2年前 喜欢(0) 浏览(4125) 评论(0)
Wiki
1.视图页面直接加载 $css = <<<CSS p {text-indent:5em;} div{width: 500px;} CSS; $this->registerCss($css,['type'=>'text/css'],'test'); $js = <<<JS // console.log('sss'); JS; $this->registerJs($js); 视图页面直接加载css,js文件 $this->registerJsFile('@web/assets/js/site.js'); $this->registerCssFile('@web/assets/css/site.css');
2年前 喜欢(0) 浏览(2399) 评论(0)
Wiki
yii2 Carousel是一个基于JavaScript的图片轮播组件,使用Carousel可以快速的在网站任意位置放置一个图片轮播的效果 先看下效果: 代码如下: <?php echo Carousel::widget([ 'items' => [ // 只有图片的格式 '<img src="http://www.yii-china.com/statics/images/b_1.jpg"/>', // 与上面的效果一致 ['content' => '<img src="http://www.yii-china.com/statics/images/b_1.jpg"/>'], // 包含图片和字幕的格式 [ 'content' => '<img src="http://www.yii-china.com/statics/images/b_1.jpg"/>', 'caption' => '<h4>This is title</h4><p>This is the caption text</p>', //'options' => [...], //配置对应的样式 ], ] ]); ?> 在轮播幻灯片列表。每个数组元素的可配属性 [ // 必要的,轮播的内容(HTML),比如一个图像标签 'content' => '<img src="http://www.yii-china.com/statics/images/b_1.jpg'/> // 可选的,该轮播标题(HTML) 'caption' => '<h4>This is title</h4><p>This is the caption text</p>', // 可选的,轮播样式 'options' => [], ]
2年前 喜欢(0) 浏览(1923) 评论(0)
Wiki
以高级版为例:打开配置文件 /frontend/config/main.php 添加以下配置: return [ ··· 'defaultRoute' => 'topic/index', ··· ]
2年前 喜欢(0) 浏览(2158) 评论(0)
Wiki
事务在程序应用中使用非常广泛,现在提供一个 Yii2 数据库事务使用的简单示例,让大家了解在 Yii2 中如何使用数据库事务 $transaction = Yii::$app->db->beginTransaction(); try { $connection->createCommand($sql1)->execute(); //如果执行失败则抛出错误 if(status == false) throw new \Exception('这里是错误原因'); $connection->createCommand($sql2)->execute(); //只有执行了commit(),对于上面数据库的操作才会真正执行 $transaction->commit(); }catch (Exception $e) { //获取抛出的错误 $error = $e->getMessage(); //操作回滚 $transaction->rollBack(); }
2年前 喜欢(0) 浏览(5327) 评论(0)
Wiki
在views/layouts/main.php 中添加下面的代码: //views/layouts/main.php $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, yii2, Yii中文网, yii教程, yii实战教程']); !isset($this->metaTags['description']) && $this->registerMetaTag(["name" => "description", "content" => 'Yii中文网,零基础学习yii2框架,提供丰富的yii2视频教程和应用实例,以及各种实用扩展推荐,我们旨在学术的互相学习探讨,共同进步!']); 解释一下为什么在 description 加 !isset($this->metaTags['description']),因为不同的页面可能需要设置不同的 description 信息。此处如此设置是在没有 description 的设置页面,默认使用上述的 description 的内容。 举个例子: 我想在文章详情页的描述是文章内容简介,我们就可以在具体的文章详情页添加如下代码: //views/topic/detail.php $this->registerMetaTag(["name" => "description", "content" => '某某文章的简介内容']);
2年前 喜欢(0) 浏览(2348) 评论(0)
Wiki
适用场景:在完成某些操作后,需要在页面进行相应的提示,比如文章保存成功,消息发送失败等 在控制器里面这样写,可以根据实际情况选择相应的类型: 错误消息: \Yii::$app->getSession()->setFlash('error', 'This is the message'); 成功消息: \Yii::$app->getSession()->setFlash('success', 'This is the message'); 提示消息: \Yii::$app->getSession()->setFlash('info', 'This is the message'); 多条消息: \Yii::$app->getSession()->setFlash('error', ['Error 1', 'Error 2']); 演示:
2年前 喜欢(0) 浏览(3128) 评论(0)
Wiki
我们经常会比如博客文章,上一篇/下一篇 这样类似的需求,那么 Yii2 如何实现这样的需求呢? 以获取下一篇记录为例: public function actionView($id) { //下一篇内容获取 $res = Article::find()->where(['>', 'id', $id])->one(); if($res){ $next['url'] = yii\helpers\Url::to(['post/view','id'=>$res->id]); $next['title'] = $res->title; }else{ $next['url'] = '#'; $next['title'] = '没有文章了'; } return $this->render('view', [ 'model' => $this->findModel($id), 'next' => $next ]); } 在对应的页面,渲染获取下一篇的数据。 <div> 下一篇:<a href="<?=$next['url']?>"><?=$next['title']?></a> </div>
2年前 喜欢(0) 浏览(2374) 评论(0)
Wiki
下面是快速打印 SQL 的方法: $query = new Books::find()->where('author=2'); echo $query->createCommand()->sql; 或者用下面的方式也可以: $query->createCommand()->getRawSql()
2年前 喜欢(0) 浏览(2829) 评论(0)
Wiki
Gridview 如何对关联模型的数据做显示、排序、过滤? 您会发现对显示相关模型数据的GridView列进行排序和筛选实现起来很棘手。 正如您所知道的,如果最近一直在使用Yii2,那么有一种新的搜索数据的建议方法,即使用从主要实体模型扩展的对象,并将可搜索属性标记为“.”。那么,我们如何在GridView小部件上排序和过滤相关数据呢? 让我们想象一下下面的关系:一个叫做 “tour” 的模型: /** * @return \yii\db\ActiveQuery */ public function getCountry() { return $this->hasOne(Country::className(), ['id' => 'country_id']); } /** * @return \yii\db\ActiveQuery */ public function getCity() { return $this->hasOne(City::className(), ['id' => 'city_id']); } 我们希望在GridView上显示国家的名称和城市的名称。为了做到这一点,我们对 “tourSearch” 做了以下调整: class TourSearch extends Tour // extends from Tour see? { // add the public attributes that will be used to store the data to be search public $city; public $country; // now set the rules to make those attributes safe public function rules() { return [ // ... more stuff here [['city', 'country'], 'safe'], // ... more stuff here ]; } // ... model continues here 然后,我们配置一下 gredview,以便显示相关数据: // ... more grid configuration here 'columns' => [ // ... more columns configuration here [ 'attribute' => 'city', 'value' => 'city.name' ], [ 'attribute' => 'country', 'value' => 'country.name' ], 如上所述,我们将能够显示数据,但如何排序或筛选?让我们举例说明,这一次让我们关注 “TearSearch” 类的 “search” 方法: public function search($params) { // create ActiveQuery $query = Tour::find(); // Important: lets join the query with our previously mentioned relations // I do not make any other configuration like aliases or whatever, feel free // to investigate that your self $query->joinWith(['city', 'country']); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); // Important: here is how we set up the sorting // The key is the attribute name on our "TourSearch" instance $dataProvider->sort->attributes['city'] = [ // The tables are the ones our relation are configured to // in my case they are prefixed with "tbl_" 'asc' => ['tbl_city.name' => SORT_ASC], 'desc' => ['tbl_city.name' => SORT_DESC], ]; // Lets do the same with country now $dataProvider->sort->attributes['country'] = [ 'asc' => ['tbl_country.name' => SORT_ASC], 'desc' => ['tbl_country.name' => SORT_DESC], ]; // No search? Then return data Provider if (!($this->load($params) && $this->validate())) { return $dataProvider; } // We have to do some search... Lets do some magic $query->andFilterWhere([ //... other searched attributes here ]) // Here we search the attributes of our relations using our previously configured // ones in "TourSearch" ->andFilterWhere(['like', 'tbl_city.name', $this->city]) ->andFilterWhere(['like', 'tbl_country.name', $this->country]); return $dataProvider; } 就是这样了,希望本教程能帮助你找到方向。
2年前 喜欢(0) 浏览(1714) 评论(0)
社区公告
[公告] Yii中文网为优化用户体验进行大版本升级,老版网站会维持一段时间,可以点击顶部"旧版"链接访问旧版网站。
沟通交流

:492175201(技术1群)

:183620600(技术2群)

:291010569(技术3群)

订阅号 | 更多精彩内容推送
本周推荐