【ThinkPHP6.x框架】(23)tp框架的附加功能

上传

        如果要实现上传功能,首先需要建立一个上传表单,具体如下:

<form action="http://localhost/tp6/public/upload"
                    enctype="multipart/form-data" method="post">
<input type="file" name="image"> 
<input type="submit" value="确定">
</form>

         创建一个控制器upload.php,并使用  Request::file来获取上传数据:

//获取表单的上传数据
$file = Request::file('image');

        使用Filesystem::putfile()方法,来实现上传文件,并写入指定目录,上传后返回的结果$info,可以输出当前上传文件的地址:

//目录在runtime/storage/toppic/时间/文件
$info = Filesystem::putFile('topic', $file);

        如果想更改上传文件的默认配置,在config/filesystem.php中配置:

'root' => app()->getRuntimePath() . 'storage',

        默认规则下,上传的文件是以日期和微秒生成的方式:date,生成的规则还支持另外两种方式:md5和sha1:

$info = Filesystem::putFile('topic', $file, 'md5');

        批量上传,使用  image[]作为名称,并使用  foreach()遍历上传:

<input type="file" name="image[]">
<input type="file" name="image[]"> 
<input type="file" name="image[]">

$files = Request::file('image'); $info = [];
foreach ($files as $file) {
    $info[] = Filesystem::putFile('topic', $file); 
}
dump($info);

         结合之前的验证器,我们写一个针对 upload的独立验证:

//上传图片文件
$file = Request::file('image');
//编写上传规则,必须是上传文件,必须是jpg.png.gif后缀 
$validate = Validate::rule([
    'image'    => 'file|fileExt:jpg,png,gif' 
]);

//得到上传文件和规则比对
$result = $validate->check([ 
    'image'    =>     $file
]);

//通过输出地址,否则输出错误 
if ($result) {
    $info = Filesystem::putFile('topic', $file); 
    dump($info);
} else {
    dump($validate->getError()); 
}

多语言

多语言

        如果要开启多语言切换功能,中间件定义文件middleware.php开启:

// 多语言加载
\think\middleware\LoadLangPack::class,

        配置文件在  config/lang.php文件,默认设置的是zh-cn中文语言:

'zh-hans-cn' => 'zh-cn',

//自动监测的变量为lang
'detect_var'    => 'lang',

        默认应用目录会调用  app\lang目录下的语言包,创建三个:

//错误信息,zh-cn.php 
return [
    'require_name' => '用户名不得为空!', 
    'email_error' => '邮箱地址不正确!',
];

//error message,en-us.php 
return [
    'require_name' => 'The user name cannot be empty!', 
    'email_error'  => 'Incorrect email address!',
];

//エラーメッセージ, ja-jp.php 
return [
    'require_name' => 'ユーザ名は空ではいけません!', 
    'email_error'  => 'メールアドレスが間違っています!',
];

        系统默认会指定:zh-cn这个语言包,我们通过::get()来输出错误信息:

Lang::get('require_name');

//助手函数
lang('require_name');

        通过 URL方式来切换语言,?lang=en-us即可,cookie自动生成,而下一次就算不带?lang=en-us,默认就会执行 cookie的语言包。也可以在配置文件中,设置允许的语言包,默认为空,具体如下:

// 允许的语言列表
'allow_lang_list' => ['zh-cn','en-us','ja-jp'],

        在模版中调用语言信息,可以用{$Think.lang.xxx}:

{$Think.lang.require_name}
{:lang('email_error')}

        可以在配置文件中开启多语言分组,运行使用二维数组来实现语言包定义:

// 是否支持语言分组
'allow_group'    => true, 

'user' => [
    'welcome' => '欢迎光临!', 
    'login' => '登入成功!', 
    'logout' => '退出成功!',
]
Lang::get('user.login');

验证码

        验证码功能不是系统内置的功能了,需要通过  composer引入进来:

composer require topthink/think-captcha   //开启session方可使用

        引入进来之后,我们在模版中,验证一下验证码是否能正常显示:

<div>{:captcha_img()}</div>
<div><img src="{:captcha_src()}" alt="captcha" /></div>

        创建一个模版页面,设置一个验证码和文本框提交比对:

<form action="../code/check" method="post">
    <input type="text" name="code"> 
    <input type="submit" value="验证">
</form>

        使用validate验证器来对验证码进行检测:

//验证码验证规则
$validate = Validate::rule([
    'captcha'  => 'require|captcha' 
]);

//验证码和表单对比
$result = $validate->check([
    'captcha'  => input('post.code') 
]);

if (!$result) {
dump($validate->getError()); 
}

        也可以使用助手函数直接进行判断验证:

if(!captcha_check(input('post.code'))){
    dump('验证失败'); 
}

        验证码的所有配置参数如下,根据需要进行调用:

         配置文件在config/captcha.php中,直接进行参数配置即可:

return [
    //字体大小
    'fontSize'     => 30, 

    //验证码位数
    'length'       => 3, 

    //验证码杂点
    'useNoise'     => false, 
];

         我们可以自定义一个验证器,创建一个verify方法生成:

public function verify()
{
    return Captcha::create('verify'); 
}

// 添加额外的验证码设置 
'verify' => [
    'length'=>3, 
],

// 路由访问验证码
Route::rule('vc', 'Code/verify');

分页

分页功能

        不管是数据库操作还是模型操作,都使用paginate()方法来实现:

//查找user表所有数据,每页显示5条 
return View::fetch('index', [
    'list' => User::paginate(5) 
]);

        创建一个静态模版页面,并使用{volist}标签遍历列表:

<table border="1">
    <tr>
        <th>编号</th> 
        <th>姓名</th> 
        <th>性别</th> 
        <th>邮箱</th> 
        <th>价格</th>
    </tr>
    
    {volist name='list' id='user'} 
    
    <tr>
        <td>{$user.id}</td>
        <td>{$user.username}</td> 
        <td>{$user.gender}</td> 
        <td>{$user.email}</td> 
        <td>{$user.price}</td>
    </tr> 
    {/volist}
</table>

        分页功能还提供了一个固定方式,实现分页按钮,只需要设置相应的CSS即可:

{$list|raw}
<ul class="pagination"> 

.pagination {
    list-style: none; 
    margin: 0;
    padding: 0; }

.pagination li {
    display: inline-block; 
    padding: 20px;
}

        我们可以通过数组来传递多个参数,具体分页参数如下:

$list = User::paginate([ 
    'list_rows' => 4,
    'var_page' => 'page', 
]);

        也可以单独赋值分页的模版变量:

// 获取分页显示
$page = $list->render(); 
{$page|raw}

         也可以单独获取到总记录数量:

$total = $list->total();

        如果你使用模型方式分页,则可以通过获取器修改字段值,而分页本身也可以:

->each(function ($item, $key) {
    $item['gender'] = '【'.$item['gender'].'】'; 
    return $item;
});

        可以限定总记录数,比如,限定总记录数只有10条的页码:

->paginate(5, 10);

        也可以设置分页的页码为简洁分页,就是没有  1,2,3,4这种,只有上下页:

->paginate(5, true);

图像处理

图像处理功能

        图像处理功能不是系统内置的功能了,需要通过composer引入进来:

composer require topthink/think-image

        引入进来之后,首先创建图像处理对象:

$image = Image::open('image.png');

        获得了图像处理对象后,可以得到这张图片的各种属性:

//图片宽度
echo $image->width(); 
//图片高度
echo $image->height(); 
//图片类型
echo $image->type(); 
//图片mime
echo $image->mime(); 
//图片大小
dump($image->size());

        使用crop()方法可以裁剪图片,并使用save()方法保存到指定路径。(可以点击追踪方法内部,参看源码参数,了解更多的传值方法):

//裁剪图片
$image->crop(550,400)->save('crop1.png');

        使用thumb()方法,可以生成缩略图,配合save()把缩略图保存下来。(thumb n. 拇指;(手套的)拇指部分):

//生成缩略图
$image->thumb(500,500)->save('thumb1.png');

        这里要注意一个问题,虽然设置了宽和高,但高度变成了 282,说明是等比例的。可以点击追踪方法内部,第三个参数默认为:$type = self::THUMB_SCALING,而这个常量设置的定义如下:

/* 缩略图相关常量定义*/
const THUMB_SCALING  = 1; //常量,标识缩略图等比例缩放类型
const THUMB_FILLED   = 2; //常量,标识缩略图缩放后填充类型
const THUMB_CENTER   = 3; //常量,标识缩略图居中裁剪类型
...

        使用rotate()方法,可以旋转图片,默认是90度,参数可以设置:

$image->rotate(180)->save('rotate1.png');

        save()方法可以配置的参数除了保存文件名的路径,还有如下所示:save('路径',['类型','质量','是否隔行扫描']),追踪到方法查看:

save($pathname, $type = null, $quality = 80, $interlace = true)

        water()方法,可以给图片增加一个图片水印,默认位置为右下角,可看源码常量:

$image->water('mr.lee.png')->save('water1.png');

        text()方法,可以给图片增加一个文字水印,具体如下:

$image->text('Mr.Lee',getcwd().'/1.ttf',20,'#ffffff')->save('text1.png');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值