标签 thinkphp 下的文章

ThinkPHP实现微信分享好友转发朋友圈自定义图片和文字的方法,在开始之前呢,我们需要准备好一些东西:

前期准备

  • 认证的公众号,订阅号或者服务号都可以,只要是认证过的就可以。
  • 公众号的AppID和AppSecret,登录微信公众平台,开发—基本配置,就可以看到啦。
  • 设置JSJS接口安全域名,登录微信公众平台,设置—公众号设置—功能设置里,填写就可以了。
  • 官方SDK,我们直接下载案例就可以,下载地址:http://demo.open.weixin.qq.com/jssdk/sample.zip里面包含php、java、nodejs以及python的示例代码。

服务端准备(ThinkPHP)

  • 将刚刚下载的jssdk.php文件重命名为Jssdk.php,然后和access_token.php、jsapi_ticket.php一起放入到ThinkPHP框架的第三方接口扩展目录下(extend/org/wechat/)。
  • 修改Jssdk.php文件

    1. 首先我们需要在构造函数中设置 $this->path = __DIR__ . DS; 即:

      namespace wechat;
      class Jssdk  {
       private $appId;
       private $appSecret;
       private $path;
       public function __construct($appId, $appSecret) {
       $this->appId = $appId;
       $this->appSecret = $appSecret;
       $this->path = __DIR__ . DS;
       }
       ...
      }
    2. get_php_file函数返回值中的$filename改为 $this->path.$filename ,即:

      private function get_php_file($filename) {
        return trim(substr(file_get_contents($this->path.$filename), 15));
      }
    3. 设置token的缓存,修改getAccessToken,加入cache

      private function getAccessToken() {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        // cache('at', ['access_token'=>'sss', 'expire_time' => '123']);
        // $data = json_decode($this->get_php_file("access_token.php"));
        $data = cache('at');
        if ($data['expire_time'] < time()) {
       // 如果是企业号用以下URL获取access_token
       // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
       $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
       $res = json_decode($this->httpGet($url));
       $access_token = $res->access_token;
       if ($access_token) {
         // $data->expire_time = time() + 7000;
         // $data->access_token = $access_token;
         cache('at', ['access_token'=>$access_token, 'expire_time' => time() + 7000]);
         // $this->set_php_file("access_token.php", json_encode($data));
       }
        } else {
       $access_token = $data['access_token'];
        }
        return $access_token;
      }
  • 在控制器里面调用

    1. 导入jssdk, use wechat\Jssdk;
    2. 传给前端

      $jssdk = new Jssdk($AppID, $AppSecret);
      $res = $jssdk->getSignPackage();
      $appId = $res['appId'];
      $timestamp = $res['timestamp'];
      $nonceStr = $res['nonceStr'];
      $signature = $res['signature'];
      $this->assign(
       array(
           'appId'=>$appId,
           'timestamp'=>$timestamp,
           'nonceStr'=>$nonceStr,
           'signature'=>$signature,
       )
      );

      网页端

  • 导入jssdk

    <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
    
  • 设置分享内容

    <script type="text/javascript">
      var title = '分享标题';
      var imgUrl = '分享图片';
      var link = '分享地址';
      var desc = '分享描述';
     
      wx.config({
          debug: false,//开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
          appId: '{$appId}', // 必填,公众号的唯一标识
          timestamp: '{$timestamp}', // 必填,生成签名的时间戳
          nonceStr: '{$nonceStr}', //必填, 生成签名的随机串
          signature: '{$signature}', //必填,签名
          jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareQZone'] //必填, JS接口列表,这里只填写了分享需要的接口
      })
      wx.ready(function () {
          wx.onMenuShareTimeline({
              title: title,
              link: link,
              desc:desc,
              imgUrl: imgUrl,
              success: function() {
                  // 用户确认分享后执行的回调函数
              },
              cancel: function() {
                  // 用户取消分享后执行的回调函数
              }
          });
          wx.onMenuShareAppMessage({
              title: title, // 分享标题
              desc: desc, // 分享描述
              link: link, // 分享链接
              imgUrl: imgUrl, // 分享图标
              type: 'link', // 分享类型,music、video或link,不填默认为link
              dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
              success: function() {
                  // 用户确认分享后执行的回调函数
              },
              cancel: function() {
                  // 用户取消分享后执行的回调函数
              }
          });
      })
    </script>

小编今天在使用MxSrvs运行thinPHP项目的时候,直接把项目目录直接放在了网站根目录里面,发现默认控制器的访问是没有问题的,但是其他的控制器以及直接输入默认的控制器全部显示的事404。后来发现其实是需要配置下的,而且也可以不放在网站根目录里面。
首先点击左侧的配置编辑--》再点击Nginx--》再点击最后一行的加号
1.png

然后就会弹出一个框,然后注入域名,项目名,项目目录就可以了。
2.png

这时候就会生成一个配置文件,然后在配置文件里面加入以下内容(是新弹出来的配置文件里面)

    location /
    {
        index index.php;
        #ThinkPHP REWRITE支持
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?s=$1 last;
            break;
        }
    }

完整的就是

server {
    listen            80;
    server_name        devapi.sunxiaoning.com;
    root            /; # 自己的项目的位置
    #access_log        /; # 自己项目日志的位置
    include            vhosts/_nginx.vhost.fpm;
    location /
    {
        index index.php;
        #ThinkPHP REWRITE支持
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?s=$1 last;
                        # rewrite ^/index.php/(.*)$ /index.php?s=$1 last; # 域名后面有index.php
            break;
        }
    }
}

然后在nginx的配置文件里面的PHP里面加入:

location ~ \.php$ {
            root           /Applications/MxSrvs/www;
            fastcgi_pass   127.0.0.1:10080;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_split_path_info ^(.+\.php)(.*)$;     #增加这一句  
            fastcgi_param PATH_INFO $fastcgi_path_info;    #增加这一句
            include        fastcgi_params;
        }

对于熟悉SEO的小伙伴都很清楚,静态网站的收录以及排名都比较好使。我们使用PHP开发网站的时候一般都使用的是伪静态,有些开源的程序都基本上可以开启伪静态,那么我们自己写的呢,怎么实现呢,小编今天在这里总结下TP3.2实现伪静态。

首先在使用大U方法进行传参的时候不要直接{:U('test')}?id=1这么写,我们要按照手册里面的写法去书写{:U('test',array('id'=>1))},这时候你就会发现直接是.html结尾了。

接下来我们要去除的是index.php

首先我们在网站的根目录里面新建.htaccess这个文件,记得前面有个点哦。然后填上以下内容。

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

再然后我们打开项目的配置文件把URL_MODEL 改为 2,也就是 'URL_MODEL'=>'2'

最后我们就完美实现了。

  1. 首先在项目模块下的Common文件夹内建立function.php文件,这样就可以首先执行这里的函数了。所以在这里判断是否是移动端访问的,判断方法如下:

     function ismobile() {
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE']))
        return true;
    
    //此条摘自TPM智能切换模板引擎,适合TPM开发
    if(isset ($_SERVER['HTTP_CLIENT']) &&'PhoneClient'==$_SERVER['HTTP_CLIENT'])
        return true;
    //如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    if (isset ($_SERVER['HTTP_VIA']))
        //找不到为flase,否则为true
        return stristr($_SERVER['HTTP_VIA'], 'wap') ? true : false;
    //判断手机发送的客户端标志,兼容性有待提高
    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array(
            'nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'
        );
        //从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    //协议法,因为有可能不准确,放到最后判断
    if (isset ($_SERVER['HTTP_ACCEPT'])) {
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
    }
    
  2. 然后再建议一个公共的控制器,里面继承一个公共的控制器,里面设置一个前置方法,判断如果是移动端的就直接显示移动端的主题,然后建立一个主题文件夹Mobile,里面放主题文件。

    class PublicController extends Controller{
    public function _initialize(){
         if (ismobile()) {
            //设置默认默认主题为 Mobile
            C('DEFAULT_V_LAYER','Mobile');
        }
     }
     }
  3. 只需要在使用模板的地方继承公共的控制器就可以了。

     class IndexController extends PublicController {
    public function index(){
         $this->display();
    }
     }

  1. 下载PHPMailer
    下载链接链接:https://pan.baidu.com/s/1C0D_O3aq08naeb6Sfda4ZA 密码:vv65
    最新版的github上也有,不过小编没看懂,只能先用这个版本了。把下载好的包解压之后放在ThinkPHP\Library\Vendor里面。
  2. \Application\Common\Common里面的function.php(如果文件不存在就自己手动进行创建)这个文件里面写入发送邮件的函数。

    /*
    * 发送邮件
    * @param $to string
    * @param $title string
    * @param $content string
    * @return bool
    * */
     function sendMail($to, $title, $content) {
    Vendor('PHPMailer.PHPMailerAutoload');
    $mail = new PHPMailer(); //实例化
    $mail->IsSMTP(); // 启用SMTP
    $mail->Host=C('MAIL_HOST'); //smtp服务器的名称(这里以QQ邮箱为例)
    $mail->SMTPAuth = C('MAIL_SMTPAUTH'); //启用smtp认证
    $mail->Username = C('MAIL_USERNAME'); //发件人邮箱名
    $mail->Password = C('MAIL_PASSWORD') ; //163邮箱发件人授权密码
    $mail->From = C('MAIL_FROM'); //发件人地址(也就是你的邮箱地址)
    $mail->FromName = C('MAIL_FROMNAME'); //发件人姓名
    $mail->AddAddress($to,"尊敬的客户");
    $mail->WordWrap = 50; //设置每行字符长度
    $mail->IsHTML(C('MAIL_ISHTML')); // 是否HTML格式邮件
    $mail->CharSet=C('MAIL_CHARSET'); //设置邮件编码
    $mail->Subject =$title; //邮件主题
    $mail->Body = $content; //邮件内容
    $mail->AltBody = "这是一个纯文本的身体在非营利的HTML电子邮件客户端"; //邮件正文不支持HTML的备用显示
    
    return($mail->Send());
     }

    在配置文件里面写入以下配置

    'MAIL_HOST' =>'smtp.126.com',//smtp服务器的名称
    'MAIL_SMTPAUTH' =>TRUE, //启用smtp认证
    'MAIL_USERNAME' =>'***********@126.com',//发件人的邮箱名
    'MAIL_PASSWORD' =>'**********',//163邮箱发件人授权密码
    'MAIL_FROM' =>'*******@126.com',//发件人邮箱地址
    'MAIL_FROMNAME'=>'小宁博客',//发件人姓名
    'MAIL_CHARSET' =>'utf-8',//设置邮件编码
    'MAIL_ISHTML' =>TRUE // 是否HTML格式邮件
  3. 在控制器里面直接调用局可以了

     SendMail('*******@qq.com',"小宁博客","欢迎来到小宁博客");

注意:可以通过$mail->ErrorInfo来显示错误,如果出现SMTP Error: data not accepted,证明你的测试数据不可以,小编就在这里出现了这样的问题,百度了好久,也没解决,最后发现换了测试数据就可以了,测试数据里面不要出现测试二字。

一个条件的时候,可以直接运用以下方法:

$map['miaoshu'] =array('like','%'.$sp.'%');
$result=M('shangpin')->where($map)->select();

多个查询条件的时候,

$map['spname | miaoshu'] =array('like','%'.$sp.'%');
$result=M('shangpin')->where($map)->select();

第一步:下载Ueditor1.4.3

下载之后重命名为ueditor ,并放到项目的public目录下

第二步:引入

在视图文件里引入一下js文件

<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>//也可以引用本地的
<js file="__ROOT__/Public/Ueditor/ueditor.config.js"/>  
<js file="__ROOT__/Public/Ueditor/ueditor.all.min.js"/>  
<js file="__ROOT__/Public/Ueditor/lang/zh-cn/zh-cn.js"/>  
<script type="text/javascript" charset="utf-8">  
   window.UEDITOR_HOME_URL = "__PUBLIC__/Ueditor/";  
    $(document).ready(function () {  
      UE.getEditor('info', {  
      initialFrameHeight: 500,  
      initialFrameWidth: 1100,  
      serverUrl: "{:U(MODULE_NAME.'/Index/save_info')}"  
    });  
  });    
</script>

在需要编辑器的地方写入以下代码

<textarea name="info" id="info" style="width:1024px;height:500px;"></textarea>  

第三步:控制器

在控制器中放入以下代码

public function save_info(){  
   $ueditor_config = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "",     file_get_contents("./Public/Ueditor/php/config.json")), true);  
        $action = $_GET['action'];  
        switch ($action) {  
            case 'config':  
                $result = json_encode($ueditor_config);  
                break;  
                /* 上传图片 */  
            case 'uploadimage':  
                /* 上传涂鸦 */  
            case 'uploadscrawl':  
                /* 上传视频 */  
            case 'uploadvideo':  
                /* 上传文件 */  
            case 'uploadfile':  
                $upload = new \Think\Upload();  
                $upload->maxSize = 3145728;  
                $upload->rootPath = './Public/Uploads/';  
                $upload->exts = array('jpg', 'gif', 'png', 'jpeg');  
                $info = $upload->upload();  
                if (!$info) {  
                    $result = json_encode(array(  
                            'state' => $upload->getError(),  
                    ));  
                } else {  
                    $url = __ROOT__ . "/Public/Uploads/" . $info["upfile"]["savepath"] . $info["upfile"]['savename'];  
                    $result = json_encode(array(  
                            'url' => $url,  
                            'title' => htmlspecialchars($_POST['pictitle'], ENT_QUOTES),  
                            'original' => $info["upfile"]['name'],  
                            'state' => 'SUCCESS'  
                    ));  
                }  
                break;  
            default:  
                $result = json_encode(array(  
                'state' => '请求地址出错'  
                        ));  
                        break;  
        }  
        /* 输出结果 */  
        if (isset($_GET["callback"])) {  
            if (preg_match("/^[\w_]+$/", $_GET["callback"])) {  
                echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';  
            } else {  
                echo json_encode(array(  
                        'state' => 'callback参数不合法'  
                ));  
            }  
        } else {  
            echo $result;  
        }  
    }  

注意:文件默认目录为"Public/Uploads",如果没有就自己创建,也可以自己修改。

第一步:下载Page.class.php

把下载后的Page.class.php放入ThinkPHP/Extend/Library/ORG/Util/(如果该目录不存在就手动去创建)。

第二步:控制器

 

  $User = M('Goods');//实例化Goods数据对象  Goods是你的表名
  //p是前台传值过来的参数,也就是页码
    if($_GET['p']==NULL){
        $p=1;
    }else{
        $p=$_GET['p'];
    }
    $list = $User->order('id')->page($p.',10')->select();// 查询满足要求的总记录数
    $this->assign('list',$list);// 赋值数据集
    $count = $User->count();
    $Page = new \Think\Page($count,10);
    $show = $Page->show();
    $this->assign('page',$show);
    $this->display();

第三步:视图

<div class="result page">{$page}</div>

第四步:css

引入的样式小编感觉不是很好看,所以进行了一下美化,想要的童鞋可以拿走哦

.page{
    padding-top: 20px;
    padding-bottom: 15px;
    text-align: center;
    clear: both;
}
.num,.current,.prev,.next{
background-color: rgb(255, 255, 255);
border-bottom-color: rgb(226, 226, 226);
border-bottom-style: solid;
border-bottom-width: 0.666667px;
border-image-outset: 0;
border-image-repeat: stretch stretch;
border-image-slice: 100%;
border-image-source: none;
border-image-width: 1;
border-left-color: rgb(226, 226, 226);
border-left-style: solid;
border-left-width: 0.666667px;
border-right-color: rgb(226, 226, 226);
border-right-style: solid;
border-right-width: 0.666667px;
border-top-color: rgb(226, 226, 226);
border-top-style: solid;
border-top-width: 0.666667px;
box-sizing: content-box;
color: rgb(51, 51, 51);
display: inline-block;
font-family: Helvetica Neue, Helvetica, PingFang SC, 微软雅黑, Tahoma, Arial, sans-serif;
font-feature-settings: normal;
font-kerning: auto;
font-language-override: normal;
font-size: 12px;
font-size-adjust: none;
font-stretch: normal;
font-style: normal;
font-variant: normal;
font-variant-alternates: normal;
font-variant-caps: normal;
font-variant-east-asian: normal;
font-variant-ligatures: normal;
font-variant-numeric: normal;
font-variant-position: normal;
font-weight: 400;
height: 28px;
line-height: 28px;
margin-bottom: 5px;
margin-left: 0px;
margin-right: -1px;
margin-top: 0px;
padding-bottom: 0px;
padding-left: 15px;
padding-right: 15px;
padding-top: 0px;
position: relative;
text-align: left;
vertical-align: middle;
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
}
.current{
    background:orange;
}

thinkphp文件上传


该方法已经测试过了,可以正常使用,我用的是用的是ThinkPHP3.2版本写的,如果想自己添加参数的话,请参考ThinkPHP3.2的文档,该方法的原理就是先实现文件的上传,然后获取文件的名字,再用函数获取文件的扩展名(如果想指定扩展名的话,此步骤可以省略,只需要定义新的名字就行)最后调用重命名函数,对文件进行重命名。
首先先写一个前台的表单,用于提交文件

<form action="__URL__/upload" enctype="multipart/form-data" method="post" >
     <input type="text" name="name" />
     <input type="file" name="photo" />
     <input type="submit" value="提交" >
 </form>

下面这个是文件上传函数,实现文件的上传

上传函数


public function upload(){
     $upload = new \Think\Upload();// 实例化上传类
     $oldFN = $_FILES;//获取图片的信息,在后面传给重命名函数
     $upload->maxSize = 3145728 ;// 设置附件上传大小
     $upload->exts = array('jpg', 'gif', 'png', 'jpeg');
                // 设置附件上传类型
     $upload->rootPath = './'; // 设置附件上传根目录
     $upload->savePath = ''; // 设置附件上传(子)目录
     $upload->replace = true;//如果存在同名文件就覆盖
     $upload->autoSub = false;
                //不使用子目录保存上传文件,即上传到指定的文件夹
     $info = $upload->upload();
    $this->renameFile($oldFN['photo']['name'], './');//调用重命名函数
     if(!$info) {// 上传错误提示错误信息
         $this->error($upload->getError());
     }else{// 上传成功
         $this->error('上传成功!');
     }
 }

重命名函数


下面这个是文件重命名函数(重命名为1,2,3)

public function renameFile($oldFN,$path){
    for($i=0;$i<count($oldFN);$i++){
         $extName = substr($oldFN[$i],strrpos($oldFN[$i],'.'));//获取扩展名
         $newName = ($i+1)."$extName";//新的名字
         rename($path.$oldFN[$i],$path.$newName);//重命名
     }
 }

如果有不懂,或者无法正常运行的地方,可以联系我哦。以后我会经常写一些自己的见解,写一些对大家有意义的文章,希望大家多多支持,也希望大家能够多提宝贵的意见。