常见PHP框架安装

一文搞定常见的PHP框架的安装。环境的搭建,使用了LNMP1.3一键安装,参考:http://www.webjust.org/archives/460

YII
PHP >= 5.4.0
版本:YII2.0的basic版

Select Code
1
2
composer global require "fxp/composer-asset-plugin:^1.2.0"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic // 被墙

被墙可以使用国内的git源:

// yii2.0 basic版

Select Code
1
git clone https://code.csdn.net/wbo86/yii2_basic.git basic

// yii2.0 advance版

Select Code
1
git clone https://code.csdn.net/wbo86/yii2_advance.git advance

备注:注意YII框架安装后,需要配置服务器的环境才能够使用。请参考:http://www.yiichina.com/doc/guide/2.0/start-installation

ThinkPHP
PHP >= 5.4.0

版本1:thinkphp 3.2

Select Code
1
composer create-project --prefer-dist topthink/thinkphp tp3 // 被墙

被墙,使用国内的git源:

Select Code
1
git clone https://code.csdn.net/topthink2011/ThinkPHP.git tp3

版本2:thinkphp 5

Select Code
1
composer create-project topthink/think tp5 --prefer-dist

Laravel
PHP >= 5.5.9
storage 和 bootstrap/cache 目录必须让服务器有写入权限

国内镜像:https://laravel-china.org/composer

版本1:Laravel 5.3.*

Select Code
1
composer create-project --prefer-dist laravel/laravel lar53 "5.3.*"

版本2:Laravel 5.2.*

Select Code
1
composer create-project --prefer-dist laravel/laravel lar52 "5.2.*"

版本3:Laravel 5.1.*

Select Code
1
composer create-project --prefer-dist laravel/laravel lar51 "5.1.*"

特殊权限设置:

Select Code
1
2
setfacl -R -m u:www:rwx /home/wwwrot/laravel
setfacl -R -m d:www:rwx /home/wwwrot/laravel

备注:此处的“/home/wwwrot/laravel”指的是你的项目的文件夹。

其他管理工具安装:

Nodejs:
http://nodejs.cn/download/

Composer:
http://docs.phpcomposer.com/

LNMP1.3一键安装Linux环境,配置Nginx运行ThinkPHP3.2

你是否遇见过:安装LNMP1.3环境后,运行ThinkPHP 3.2,只能打开首页,不能访问控制器,报404错误。

按照以下3步设置,即可解决。

ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式,系统默认的PATHINFO模式。

LNMP1.3 一键安装完成后,默认支持REWRITE,需要手动开启 PATHINFO。

第1步修改:php.ini文件
位置:/usr/local/php/etc/php.ini

搜索查找到:cgi.fix_pathinfo 配置项,默认为0,修改为1,开启 pathinfo 选项。

如图1:

第2步修改:nginx的配置文件 (笔者使用的是虚拟域名配置文件:/usr/local/nginx/conf/vhost/*.conf)

找到 server 的配置选项:

默认只有 include enable-php.conf,请注释掉;
然后添加一行:include enable-php-pathinfo.conf

如:

Select Code
1
2
3
#error_page   404   /404.html;
#include enable-php.conf;             # 注册这一行
include enable-php-pathinfo.conf;     # 加入这行

如图2:

继续修改,在添加下面配置信息:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
location ~ .php
{
    set $path_info "";
    set $real_script_name $fastcgi_script_name;
    #如果地址与引号内的正则表达式匹配
    if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
    #将文件地址赋值给变量 $real_script_name
    set $real_script_name $1;
    #将文件地址后的参数赋值给变量 $path_info
    set $path_info $2;
    }
    
    #配置fastcgi的一些参数
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $path_info;
}

在Nginx,可以通过在Nginx.conf中配置转发规则实现,解决其他不支持PATHINFO的WEB服务器环境。

#如果请求既不是一个文件,也不是一个目录,则执行一下重写规则

Select Code
1
2
3
4
5
6
7
if (!-e $request_filename)
{
	#地址作为将参数rewrite到index.php上。
	rewrite ^/(.*)$ /index.php/$1;
	#若是子目录则使用下面这句,将subdir改成目录名称即可。
	#rewrite ^/subdir/(.*)$ /subdir/index.php/$1;
}

官方出处:http://document.thinkphp.cn/manual_3_2.html#url_rewrite

第3步:重启LNMP环境,配置生效。

最终效果测试:
1. 去掉了 index.php
2. 可以访问控制器下的方法。
3. U 方法正确。

如图3:

参考:笔者配置文件示例:

Select Code
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
server
    {
        listen 80;
        #listen [::]:80;
        server_name tp32.com;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/tp32.com;

        include other.conf;
        #error_page   404   /404.html;
        #include enable-php.conf;
        include enable-php-pathinfo.conf; #加入这行


        location ~ .php
        {
            set $path_info "";
            set $real_script_name $fastcgi_script_name;
            #如果地址与引号内的正则表达式匹配
            if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
            #将文件地址赋值给变量 $real_script_name
            set $real_script_name $1;
            #将文件地址后的参数赋值给变量 $path_info
            set $path_info $2;
            }
            
            #配置fastcgi的一些参数
            fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
            fastcgi_param SCRIPT_NAME $real_script_name;
            fastcgi_param PATH_INFO $path_info;
        }

        #如果请求既不是一个文件,也不是一个目录,则执行一下重写规则
        if (!-e $request_filename)
        {
            #地址作为将参数rewrite到index.php上。
            rewrite ^/(.*)$ /index.php/$1;
            #若是子目录则使用下面这句,将subdir改成目录名称即可。
            #rewrite ^/subdir/(.*)$ /subdir/index.php/$1;
        }

        access_log  /home/wwwlogs/tp32.com.log;
    }

入口文件index.php

Select Code
1
2
//nginx环境下防止U方法输出错误
define('__APP__', '');

参考:
http://www.thinkphp.cn/topic/3138.html

城市选择器3级联动源码分享及使用方法

1、HTML中调用JS显示3级联动的下拉选项。
https://github.com/webjust/case-study
3_level_city

Select Code
1
2
3
省:<select id="province"></select>
市:<select id="city"></select>
区:<select id="area"></select>

2、JSON格式的城市数据,转换成普通变量array格式,批量导入到数据库。
2016-08-22_211617

city_array

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// $data是存储的JSON格式,转换成数组时,第2个参数必须填写,默认转换成数组对象。
$arr = json_decode($data, true);

$arr2 = array();
// 转换索引
foreach ($arr as $key => $value) {
	$arr2[$key]['data_id'] = $value['id'];
	$arr2[$key]['code'] = $value['code'];
	$arr2[$key]['name'] = $value['name'];
	$arr2[$key]['pid'] = $value['pid'];
}

// 实例化模型对象,批量导入数据到MySQl
D("City")->addAll($arr2);

3、存储到数据库中的地址是value值。(如图所示)
shop_city2

shop_city
4、写函数将地址转换成中文格式。

在送货地址表shop_address中,address_id和customer_id关联,查找当前默认地址。
ER_Cart

Select Code
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
// 根据address_id查找详细的地址
public function findDefaultAddress($address_id)
{
	try{
		$ret = M('address')->where('address_id='.$address_id)->find();
		$address = $this->findCity($ret['province'], $ret['city'], $ret['area']).$ret['address'];
		return $address;
	}catch(Exception $e){
		return $e->getMessage();
	}
}

// 根据value值查找城市
private function findCity($value1, $value2, $value3)
{
	if ($value1 == 0 || $value2 == 0 || $value3 == 0) {
		return '****城市信息缺失****';
	}
	try{
		$address = M("city");
		return $address->where("data_id=".$value1)->getField('name').$address->where("data_id=".$value2)->getField('name').$address->where("data_id=".$value3)->getField('name');
	} catch(Exception $e)
	{
		return $e->getMessage();
	}
	
}

TP中js实现每页显示数量

page_num

1、通过$_GET[‘pnum’]传递每页显示数量。

2、通过JS获取option值,拼接url地址。
var url = “{:U(‘Order/index/’)}”+”?pnum=”+pageNum;

3、JS跳转到url地址,通过$_GET[‘pnum’]传值。

Select Code
1
2
3
4
5
6
// 每页显示多少条
$("#pageOption").change(function(){
    var pageNum = $("#dataTables-example_length option:selected").attr('attr_value');
    var url = "{:U('Order/index/')}"+"?pnum="+pageNum;
    window.location.href = url;
})

4、选项。

Select Code
1
2
3
4
5
6
7
<select class="form-control input-sm" aria-controls="dataTables-example" name="dataTables-example_length" id="pageOption">
    <option value="2" attr_value="2" <if condition="(I('get.pnum') eq 2)">selected="selected"</if>>2</option>
    <option value="10" attr_value="10" <if condition="(I('get.pnum') eq 10)">selected="selected"</if>>10</option>
    <option value="25" attr_value="25" <if condition="(I('get.pnum') eq 25)">selected="selected"</if>>25</option>
    <option value="50" attr_value="50" <if condition="(I('get.pnum') eq 50)">selected="selected"</if>>50</option>
    <option value="100" attr_value="100" <if condition="(I('get.pnum') eq 100)">selected="selected"</if>>100</option>
</select> 条数/页</label>