首页 > 编程技术 > php

yii2实现 "上一篇,下一篇" 功能的代码实例

发布时间:2017-7-6 23:51

小编推荐的这篇文章介绍了yii2实现 "上一篇,下一篇" 功能的代码实例,非常实用,有兴趣的同学快来看看吧。

最近做了简答的文章详情页面,需要在页面底部加入上一篇,下一篇 按钮,分析了下,最基本需要有文章的标题和id(作为参数).

开始想的是当前的id加减1,但考虑到如果部分id丢失就不对了,于是分别查询比当前id大和小的记录并且限定为一条,于是有了以下代码。

代码如下,不对的地方请指教.

控制器中

 代码如下 复制代码

//查询上-篇文章

    $prev_article= 你的模型::find()

      ->andFilterWhere(['<','id',$id])

      ->andFilterWhere([其他条件)

      ->orderBy(['id'=> SORT_DESC])

      ->limit(1)

      ->one();

    //查询下-篇文章

    $next_article= 你的模型::find()

      ->andFilterWhere(['>','id',$id])

      ->andFilterWhere(其他条件)

      ->orderBy(['id'=> SORT_ASC])

      ->limit(1)

      ->one();

 

 

    $model['prev_article'] = [

      'url'=> !is_null($prev_article) ? Url::current(['id'=>$prev_article->id]) :'javascript:;',

      'title'=> !is_null($prev_article) ?$prev_article->title :'没有了',

    ];

 

    $model['next_article'] = [

      'url'=> !is_null($next_article) ? Url::current(['id'=>$next_article->id]) :'javascript:;',

      'title'=> !is_null($next_article) ?$next_article->title :'没有了',

    ];

 

    return$this->render('view',

      'model'=>$model,

    );

视图中

 代码如下 复制代码

<divclass="left">

    <p>上一篇:

      <a href="<?=$model['prev_article']['url']?>">

        <?=$model['prev_article']['title']?>

      </a>

    </p>

  </div>

  <divclass="right">

    <p>下一篇:

      <a href="<?=$model['next_article']['url']?>">

        <?=$model['next_article']['title']?>

      </a>

    </p>

  </div>

本文详细介绍了Yii2实现多域名跨域同步登录退出的教程,不会的同学可以参考一下,非常实用

在平台开发过程中,项目分为前台(frontend)www.xxx.com和后台(backend)  yun.xxx.com两部分,绑定两个域名,  我们知道在没有绑定域名的时候前后台可以同步登录和退出,但是绑定域名后就失效了,原因是session的作用域不同了。  两个域名的session作用域都只限制在了自己的域名上,我们的解决办法是将不同二级域名的作用域都改成顶级域名xxx.com。

在common/config/main.PHP里面增加如下代码:

 代码如下复制代码

//跨域session域名配置,获取当前主机名

$host_array=explode('.',$_SERVER["HTTP_HOST"]);

//针对com域名,获取顶级域名

if(count($host_array) == 3) {

  define('DOMAIN',$host_array[1] .'.'.$host_array[2]);

}

//针对com.cn域名

elseif(count($host_array) == 4) {

  define('DOMAIN',$host_array[1] .'.'.$host_array[2].'.'.$host_array[3]);

}

else{

  //echo "本系统不支持本地访问,请配置域名";exit;

}

define('DOMAIN_HOME','www.'. DOMAIN);

define('DOMAIN_YUN','yun.'. DOMAIN);

define('DOMAIN_API','api.'. DOMAIN);

define('DOMAIN_EMAIL','mail.'. DOMAIN);

define('DOMAIN_IMG','img.'. DOMAIN);

修改components部分,改变session作用域

 代码如下复制代码

'user'=> [

      'identityClass'=>'common\models\User',

      'enableAutoLogin'=> true,

      'identityCookie'=> ['name'=>'_identity','httpOnly'=> true,'domain'=>'.'. DOMAIN],

    ],

    'session'=> [

      'cookieParams'=> ['domain'=>'.'. DOMAIN,'lifetime'=> 0],

      'timeout'=> 3600,

    ],

通过上述配置后,多个二级域名间就可以实现同步登录和退出了。

小编推荐的这篇文章介绍了PHP使用preg_split()分割特殊字符(元字符等)的方法分析,非常实用,有兴趣的朋友快来看看吧。

本文实例讲述了PHP使用preg_split()分割特殊字符(元字符等)的方法。分享给大家供大家参考,具体如下:

这里所说的特殊字符就是正则中使用的特殊字符,如: | . + 等

其它的先不说,来个实例:

 代码如下复制代码

$pattern="/[,-\\|\\.]/";

$subject="aaa,bbb,ccc-ddd-eee-fff|ggg|hhh.iii.jjj.kkk";

$spr=preg_split($pattern,$subject);

print_r($spr);

结果:

Array ( [0] => [1] => [2] =>  [3] => [4] => [5] => [6] => [7] => [8] => [9] =>  [10] => [11] => [12] => [13] => [14] => [15] => [16]  => [17] => [18] => [19] => [20] => [21] => [22] =>  [23] => [24] => [25] => [26] => [27] => [28] => [29]  => [30] => [31] => [32] => [33] => [34] => [35] =>  [36] => [37] => [38] => [39] => [40] => [41] => [42]  => [43] => )

很显然,这不是我们想要的结果,郁闷了好一会,才找到是什么原因:

把正则表达式内的特殊字符放到前面就没事了, 也就是

$pattern="/[\\|\\.,-]/";

结果:

Array ( [0] => aaa [1] => bbb [2]  => ccc [3] => ddd [4] => eee [5] => fff [6] => ggg [7]  => hhh [8] => iii [9] => jjj [10] => kkk )

好了,这就是我们要的结果了

总结:当使用正则表达式中的元字符,普通字符进行 [ ]内的多个字符分割的时候,要把待转义的元字符放在前面.

本文详细介绍了用PHP的socket实现客户端到服务端的通信实例详解,非常实用,有兴趣的同学快来看看吧

一、server.php服务端:

 代码如下 复制代码

<?php

error_reporting(E_ALL);

set_time_limit(0);

ob_implicit_flush();

//本地IP

$address='localhost';

//设置用111端口进行通信

$port= 111;

//创建SOCKET

if(($sock= socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {

    echo"socket创建失败原因 ". socket_strerror($sock) ."\n";

}

  

if(($ret= socket_bind($sock,$address,$port)) < 0) {

    echo"创建套接字失败原因 ". socket_strerror($ret) ."\n";

}

//监听

if(($ret= socket_listen($sock, 5)) < 0) {

    echo"监听失败原因 ". socket_strerror($ret) ."\n";

}

do{

  //接收命令 

  if(($msgsock= @socket_accept($sock)) < 0) {

    echo"命令接收失败原因: ". socket_strerror($msgsock) ."\n";

    break;

  }

  $msg="\nPHP Test Server. \n"."用quit,shutdown,sun...等命令测试.\n";

  

  @socket_write($msgsock,$msg,strlen($msg));

  

  do{

    if(false === ($buf= @socket_read($msgsock, 2048, PHP_NORMAL_READ))) {

        echo"socket_read() failed: reason: ". socket_strerror($ret) ."\n";

        break2;

    }

    if(!$buf= trim($buf)) {

        continue;

    }

    if($buf=='quit') {

        break;

    }

    if($buf=='shutdown') {

        socket_close($msgsock);

        break2;

    }

    if($buf=='sun') {

        echo'what are you doing?';

    }

    $talkback="Backinformation : '$buf'.\n";

    socket_write($msgsock,$talkback,strlen($talkback));

    echo"$buf\n";

  }while(true);

  

  socket_close($msgsock);

  

}while(true);

  

socket_close($sock);

?>

二、client.php客户端:

 代码如下 复制代码

<?php

error_reporting(E_ALL);

//端口111

$service_port= 111;

//本地

$address='localhost';

//创建 TCP/IP socket

$socket= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if($socket< 0) {

    echo"socket创建失败原因: ". socket_strerror($socket) ."\n";

}else{

    echo"OK,HE HE.\n";

}

$result= socket_connect($socket,$address,$service_port);

if($result< 0) {

    echo"SOCKET连接失败原因: ($result) ". socket_strerror($result) ."\n";

}else{

    echo"OK.\n";

}

//发送命令

$in="HEAD / HTTP/1.1\r\n";

$in.="Connection: Close\r\n\r\n";

$out='';

echo"Send Command..........";

$in="sun\n";

socket_write($socket,$in,strlen($in));

echo"OK.\n";

echo"Reading Backinformatin:\n\n";

while($out= socket_read($socket, 2048)) {

    echo$out;

}

echo"Close socket........";

socket_close($socket);

echo"OK,He He.\n\n";

?>

这两段代码是简单介绍用PHP实现客户端和服务端的通信

具体操作,在DOS下用PHP命令打开SERVER,处于监听状态..

再打开一个DOS窗口,用PHP命令打开CLIENT,会得到服务端的回应....

标签:[!--infotagslink--]

您可能感兴趣的文章: