<?php
namespace app\common\hook;
use app\common\controller\IndexBase;
use think\Db;
class FirstPic extends IndexBase{
public $info=[
//归属接口,必填
'hook_key'=>'template_form_foot,cms_add_end,cms_edit_end,cms_delete_end',
//归属插件,可为空
'plugin_key'=>'',
//开发者
'author'=>'torylf',
//开发者网站
'author_url'=>'',
//功能描述
'about'=>'获取内容页第一张图',
];
public function templateFormFoot(){
if(SHIELD_PLUGINS===true){
return;
} //避免和自己的模块冲突
if(!empty(config('system_dirname'))){
if(!preg_match('/(content\/add)/i',request()->url(true))&&!preg_match('/(content\/edit)/i',request()->url(true))){
return;
}
}
if(strstr(request()->url(),config('admin.filename').'/')||strstr(request()->url(),"member.php/")){
if(request()->action()=='edit'||request()->action()=='add'){
$template=ROOT_PATH.'template/admin_style/default/hook/shield/FPicSwitch.htm';
echo $this->fetch($template);
}
}
}
public function cmsAddEnd($id=0,$data=[]){
if(SHIELD_PLUGINS===true){
return;
} //避免和自己的模块冲突
//增加采集公众号文章的图片
if(strstr(request()->url(),'copynews')){
$data['data']['fpic']=1;
}
if(!$data['data']['ispic']&&$data['data']['fpic']==1){
$pattern="/<img.*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png|\.jpeg].+?))[\'|\"].*?[\/]?>/i";
$f=preg_match($pattern,$data['data']['content'],$img);
if($f){
$tmpname ='';
if(!preg_match("/(\.gif|\.jpg|\.png|\.jpeg)/",$img[1])){
$tmpname = rand(100,10000).time() . '.jpg';
}
}
$url=$img[1];
if($url){
$save_dir=config('upload_path').DS.'thumb'.DS.date('Ymd');
if($tmpname == ''){
$picdir = self::getImage($url, $save_dir);
}else{
//如果获取到了没有后缀名的地址,这里给他传进去一个带后缀类型的参数,否则抓取文件可能会0字节,无法写入
$picdir = self::getImage($url, $save_dir,$tmpname);
}
//防止windows斜杠变成反斜杠存入数据库导致路径不对
$picdir['save_path']=str_replace('\\','/',$picdir['save_path']);
$arr=Db::name(request()->module().'_sort')->where('id',$data['data']['fid'])->find();
if(request()->module() =='mall'&&modules_config('mall')['version_id']=='268'){
$a=Db::name(request()->module().'_content')->where('id',$id)->update([
'picurl'=>$picdir['save_path'],
'ispic'=>1,
]);
}else{
$a=Db::name(request()->module().'_content'.$arr['mid'])->where('id',$id)->update([
'picurl'=>$picdir['save_path'],
'ispic'=>1,
]);
}
}
}
}
public function cmsEditEnd($data=[],$result=[]){
if(SHIELD_PLUGINS===true){
return;
} //避免和自己的模块冲突
if(!$data['ispic']&&$data['fpic']==1){
$pattern="/<img.*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png|\.jpeg].+?))[\'|\"].*?[\/]?>/i";
$f=preg_match($pattern,$data['content'],$img);
if($f){
$tmpname ='';
if(!preg_match("/(\.gif|\.jpg|\.png|\.jpeg)/",$img[1])){
$tmpname = rand(100,10000).time() . '.jpg';
}
}
$url=$img[1];
if($url){
$save_dir=config('upload_path').DS.'thumb'.DS.date('Ymd');
if($tmpname == ''){
$picdir = self::getImage($url, $save_dir);
}else{
//如果获取到了没有后缀名的地址,这里给他传进去一个带后缀类型的参数,否则抓取文件可能会0字节,无法写入
$picdir = self::getImage($url, $save_dir,$tmpname);
}
//$this->error(dump($picdir));
//防止windows斜杠变成反斜杠存入数据库导致路径不对
$picdir['save_path']=str_replace('\\','/',$picdir['save_path']);
$arr=Db::name(request()->module().'_sort')->where('id',$data['fid'])->find();
if(request()->module() =='mall'&&modules_config('mall')['version_id']=='268'){
Db::name(request()->module().'_content')->where('id',$data['id'])->update([
'picurl'=>$picdir['save_path'],
'ispic'=>1,
]);
}else{
Db::name(request()->module().'_content'.$arr['mid'])->where('id',$data['id'])->update([
'picurl'=>$picdir['save_path'],
'ispic'=>1,
]);
}
/*
//调试错误用
$hookerror = '';
$file = config('upload_path'). DS . 'hook.txt';
file_put_contents($file, $hookerror.PHP_EOL,FILE_APPEND);
*/
}
}
}
public function cmsDeleteEnd($info,$module){
if(SHIELD_PLUGINS===true){
return;
} //避免和自己的模块冲突
//删除文章时也删除提取的缩略图
//Db::name('attachment')->where('id',$info['id'])->delete();
$delfile=PUBLIC_PATH.$info['picurl'];
$d=unlink($delfile);
}
/**
*功能:下载远程图片保存到本地
*参数:文件url,保存文件目录,保存文件名称,使用的下载方式
*当保存文件名称为空时则使用远程文件原来的名称
*/
private static function getImage($url,$save_dir='',$filename='',$type=0){
$domain=request()->domain();
if(trim($url)==''){
return ['file_name'=>'','save_path'=>'','error'=>1];
}
if(0==preg_match('/^http[s]{0,1}:\/\//',$url)){
$url=$domain.$url;
//$url= $domain.urldecode($url);
// $url = str_replace('&','&',$url);
}
if(trim($save_dir)==''){
$save_dir='./';
}
if(trim($filename)==''){//保存文件名
$ext=strrchr($url,'.');
if($ext!='.gif'&&$ext!='.jpg'&&$ext!='.png'&&$ext!='.jpeg'){
return ['file_name'=>'','save_path'=>'','error'=>3];
}
$filename=rand(100,10000).time().$ext;
}
if(0!==strrpos($save_dir,'/')){
$save_dir.='/';
}
//创建保存目录
if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
return ['file_name'=>'','save_path'=>'','error'=>5];
}
//获取远程文件所采用的方法
if($type){
$ch=curl_init();
$timeout=5;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
$img=curl_exec($ch);
curl_close($ch);
}else{
ob_start();
readfile($url);
$img=ob_get_contents();
ob_end_clean();
}
//$size=strlen($img);
//文件大小
$fp2=@fopen($save_dir.$filename,'wb');
fwrite($fp2,$img);
fclose($fp2);
unset($img);
$path=str_replace(PUBLIC_PATH,'',$save_dir);
return ['url'=>$url,'file_name'=>$filename,'save_path'=>$path.$filename,'error'=>0];
}
}