'数字(number)', 'text' => '字符(text)', 'radio' => '开关(radio)', 'textarea' => '文本(textarea)', 'select_coll' => '选择采集字段(select)', 'select_val' => '选择固定值(select)', 'select_func' => '选择函数返回值(select)' ); public function releaseCmsAction(){ $mapp=model('ReleaseApp'); if(request()->isPost()){ $is_edit=input('edit'); $name=input('name'); if(empty($name)){ $this->error('请输入发布插件名称'); } if(!$is_edit){ $cms_name=input('cms_name'); $cms_name_custom=input('cms_name_custom'); $identifier=input('identifier'); $copyright=input('copyright'); if(empty($cms_name)){ $this->error('请选择CMS程序'); }elseif($cms_name=='custom'){ if(empty($cms_name_custom)){ $this->error('请输入CMS程序名'); }else{ $cms_name=$cms_name_custom; } } if(!preg_match('/^[a-z][a-z0-9]*$/i', $cms_name)){ $this->error('cms程序名必须由字母或数字组成且首位不能为数字!'); } if(empty($identifier)){ $this->error('请输入插件功能标识'); }elseif(!preg_match('/^[a-z][a-z0-9]*$/i', $identifier)){ $this->error('插件功能标识必须由字母或数字组成且首位不能为数字!'); } if(empty($copyright)){ $this->error('请输入作者版权'); }elseif(!preg_match('/^[a-z][a-z0-9]*$/i', $copyright)){ $this->error('作者版权必须由字母或数字组成且首位不能为数字!'); } $appName=ucfirst(strtolower($cms_name)).ucfirst(strtolower($identifier)).ucfirst(strtolower($copyright)); }else{ $appName=ucfirst(input('app')); } $params=input('params/a'); if(empty($params)||!is_array($params)){ $this->error('请添加参数'); } foreach ($params as $k=>$v){ $params[$k]=json_decode(url_b64decode($v),true); } $this->create_cms_app(array('name'=>$name,'app'=>$appName), $params,$is_edit); }else{ $appName=input('app'); $appName=ucfirst($appName); $config=array(); if($appName){ $cmsData=$mapp->where(array('module'=>'cms','app'=>$appName))->find(); if(!empty($cmsData)){ $config['name']=$cmsData['name']; $config['app']=$appName; if(preg_match('/^([A-Z][a-z0-9]*)([A-Z][a-z0-9]*)([A-Z][a-z0-9]*)$/', $appName,$appInfo)){ $config['is_edit']=true; $config['cms_name']=strtolower($appInfo[1]); $config['identifier']=strtolower($appInfo[2]); $config['copyright']=strtolower($appInfo[3]); $config['app_file']=realpath($mapp->appFileName($appName,'cms')); } $config['params']=array(); $cmsClass=null; $is_old_plugin=false; try { if($mapp->appFileExists($appName,'cms')){ $cmsClass=$mapp->appImportClass($appName,'cms'); }elseif($mapp->oldFileExists($appName,'cms')){ $is_old_plugin=true; $cmsClass=$mapp->oldImportClass($appName,'cms'); } }catch (\Exception $ex){ $cmsClass=null; $this->error($ex->getMessage()); } if(is_array($cmsClass->_params)){ foreach ($cmsClass->_params as $k=>$v){ $param=array( 'key'=>$k, 'require'=>intval($v['require']), 'name'=>$v['name'], ); if($v['tag']=='select'){ if(is_array($v['option'])){ $param['type']='select_val'; $param['select_val']=''; foreach ($v['option'] as $vk=>$vv){ $param['select_val'].=$vk.'='.$vv."\r\n"; } }elseif($v['option']=='function:param_option_fields'){ $param['type']='select_coll'; }elseif(preg_match('/^function:(.+)$/', $v['option'],$select_func)){ $param['type']='select_func'; $param['select_func']=$select_func[1]; } }else{ $param['type']=$v['tag']; } $param['type_name']=self::$typeList[$param['type']]; $config['params'][]=$param; } } } } $GLOBALS['content_header']='开发CMS发布插件 '; $GLOBALS['breadcrumb']=breadcrumb(array('开发工具','开发CMS发布插件')); $this->assign('config',$config); $this->assign('is_old_plugin',$is_old_plugin); return $this->fetch('releaseCms'); } } /*添加参数*/ public function cmsAddParamAction(){ if(request()->isPost()){ $param=input('param/a'); $param=array_array_map('trim', $param); if(empty($param['key'])){ $this->error('请输入变量名'); } if(!preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/',$param['key'])){ $this->error('变量名必须符合php命名规范'); } if(empty($param['name'])){ $this->error('请输入参数名称'); } if(empty($param['type'])){ $this->error('请选择参数类型'); } if($param['type']=='select_func'){ if(!preg_match('/^param_option_[a-zA-Z0-9_]+$/', $param['select_func'])){ $this->error('函数名必须以param_option_开头且符合命名规范'); } }elseif($param['type']=='select_val'){ if(empty($param['select_val'])){ $this->error('请输入选项值'); } } $param['param_json']=json_encode($param); $param['type_name']=self::$typeList[$param['type']]; $this->success('',null,$param); }else{ $objid=input('objid'); $param=input('param','','url_b64decode'); $param=$param?json_decode($param,true):''; $this->assign('objid',$objid); $this->assign('param',$param); $this->assign('typeList',self::$typeList); return $this->fetch('cmsAddParam'); } } /*创建cms发布插件*/ public function create_cms_app($appData,$params,$is_edit=false){ if(!preg_match('/^[a-z][a-z0-9]*$/i', $appData['app'])){ $this->error('插件名错误!'); } $appData['app']=ucfirst($appData['app']); $mapp=model('ReleaseApp'); $cmsData=$mapp->where(array('module'=>'cms','app'=>$appData['app']))->find(); if(!$is_edit&&!empty($cmsData)){ $this->error('抱歉,已存在'.$appData['app'].'插件'); } $_params=array(); $newFuncs=array(); $params=empty($params)?array():$params; foreach ($params as $k=>$v){ $pkey=$v['key']; $_params[$pkey]=array( 'name' => $v['name'], 'require'=>intval($v['require']) ); $v['type']=strtolower($v['type']); if(strpos($v['type'], 'select_')===0){ $_params[$pkey]['tag']='select'; }else{ $_params[$pkey]['tag']=$v['type']; } if($v['type']=='select_coll'){ $_params[$pkey]['option']='function:param_option_fields'; }elseif($v['type']=='select_func'){ $_params[$pkey]['option']='function:'.$v['select_func']; $newFuncs[$v['select_func']]=$v['select_func']; }elseif($v['type']=='select_val'){ if(preg_match_all('/[^\r\n]+/', $v['select_val'],$select_val)){ $_params[$pkey]['option']=array(); foreach ($select_val[0] as $slv){ if(strpos($slv,'=')!==false){ list($slv_k,$slv_v)=explode('=', $slv); if(is_null($slv_k)){ $slv_k=$slv_v; } $_params[$pkey]['option'][$slv_k]=$slv_v; }else{ $_params[$pkey]['option'][$slv]=$slv; } } } } } $cmsClass=null; $is_old_plugin=false; try { if($mapp->appFileExists($appData['app'],'cms')){ $cmsClass=$mapp->appImportClass($appData['app'],'cms'); }elseif($mapp->oldFileExists($appData['app'],'cms')){ $is_old_plugin=true; $cmsClass=$mapp->oldImportClass($appData['app'],'cms'); } }catch (\Exception $ex){ $cmsClass=null; $this->error($ex->getMessage()); } $existsFuncs=array(); if(!empty($cmsClass)){ $existsFuncs=get_class_methods($cmsClass); } $_params=var_export($_params,true); $_params=preg_replace_callback('/^\s*/m', function($matches){ $returnStr="\t"; for($i=0;$i<(strlen($matches[0])/2);$i++){ $returnStr.="\t"; } return $returnStr; }, $_params); $_params=preg_replace('/\s+array\s*\(/i', ' array (', $_params); $funcPhp=''; foreach ($newFuncs as $v){ if(!in_array($v,$existsFuncs)){ $funcPhp.="\r\n\tpublic function {$v}(){\r\n\t\t/*必须返回键值对数组*/\r\n\t\treturn array();\r\n\t}"; } } if(empty($cmsClass)){ $phpCode=<<db(),可参考thinkphp5的数据库操作 * 参数值列表:\$params,\$params[变量名] 调用参数的值 */ /* * 必须以数组形式返回: * id(必填)表示入库返回的自增id或状态 * target(可选)记录入库的数据位置(发布的网址等) * desc(可选)记录入库的数据位置附加信息 * error(可选)记录入库失败的错误信息 * 入库的信息可在“已采集数据”中查看 */ return array('id'=>0,'target'=>'','desc'=>'','error'=>''); } } ?> EOF; }else{ $phpCode=null; if($is_old_plugin){ $phpCode=$mapp->oldFileCode($appData['app'],'cms'); $phpCode=preg_replace('/\bthinkphp\s*\d+(\.\d+){0,1}/i', 'thinkphp5', $phpCode); $phpCode=preg_replace('/\bnamespace\s+Release\\\Cms\;/i', 'namespace plugin\\release\\cms;', $phpCode); $phpCode=preg_replace('/\bclass\s+(\w+)Cms\s+extends\s+BaseCms\b/i', "class \\1 extends BaseCms", $phpCode); }else{ $phpCode=file_get_contents($mapp->appFileName($appData['app'],'cms')); } $phpCode=preg_replace('/public\s*\$_params\s*\=[\s\S]+?\)\s*;/i', 'public $_params ='.$_params.';', $phpCode); if(!empty($funcPhp)){ if(preg_match('/namespace[^\r\n]+?\{/', $phpCode)){ $phpCode=preg_replace('/\}\s*\}\s*\?\>/',"\r\n".$funcPhp."\t\r\n}\r\n}\r\n?>",$phpCode); }else{ $phpCode=preg_replace('/\}\s*\?\>/',"\r\n".$funcPhp."\r\n}\r\n?>",$phpCode); } } } if(!empty($phpCode)){ $success=$mapp->addCms(array('app'=>$appData['app'],'name'=>$appData['name']),$phpCode); if($success){ $this->success('创建成功','Develop/releaseCms?app='.$appData['app']); }else{ $this->error('创建失败'); } }else{ $this->error('代码错误'); } } }