迅睿CMS框架是一款PHP8高性能·简单易用的CMS开源开发框架,基于MIT开源许可协议发布,免费且不限制商业使用,是免费开源的产品,以万端互联为设计理念,支持的微信公众号、小程序、APP客户端、移动端网站、PC网站等多终端式管理系统。
官网的多网站系统,使用火车头采集器,无法获取主站之外的其他站点的分类,无法发布到内容。
切换到其他站点后台,看到有火车头采集插件,然后拷贝了 dayrui,My 2个目录,把插件也拷贝到了其他站点的站点目录,然后返回到火车头采集插件里再测试获取分类,依然获取不到。
插件版权:官方插件插件名称:多网站系统
插件教程:https://www.xunruicms.com/doc/app-423.html
$this->_module_init('news', 222); // news 是模块目录,222是站点id
<?php /** * 火车采集器接口 */ namespace Phpcmf\Controllers; use Phpcmf\Service; use Phpcmf\Table; class Locomotive extends Table { protected $model = "news"; protected $inputip = ''; protected $u_id = 1; public $uid = 1; /** * 构造函数 */ public function __construct(...$params) { if (!defined('APP_LOCOMOTIVE')) exit('入口文件错误'); parent::__construct(...$params); $this->is_data = 1; $config = \Phpcmf\Service::M()->db->table('locomotive_config') ->select('code,random,release,draft,contentupdate,hits_min,hits_max,isshare') ->get()->getResultArray(); $this->share = $config[0]; $this->alone = $config[1]; $this->book = $config[2]; $this->bbs = $config[3]; } public function getCate(){ $auth = $this->share['code']; $this->input = Service::L('input'); if ($this->input->get('auth') != $auth) exit('权限认证失败'); $cate = \Phpcmf\Service::M()->db->table(SITE_ID.'_share_category')->get()->getResultArray(); foreach ($cate as $ca) { if($ca['mid'] != '' && $ca['tid'] == 1 && $ca['child'] == 0){ echo '<h1>'.$ca['name'].'<=>'.$ca['id'].'</h1>'.PHP_EOL; } } } /** * 采集入库 */ public function add() { $auth = $this->share['code']; $draft = $this->share['draft']; $isupdate = $this->share['contentupdate']; $hits_min = $this->share['hits_min']; $hits_max = $this->share['hits_max']; $this->input = Service::L('input'); if ($this->input->get('auth') != $auth) exit('权限认证失败'); if ($this->share['release'] != 1) exit('已关闭发布状态'); $add = array(); $data = $this->input->request('data'); $catename = \Phpcmf\Service::M()->db->table(SITE_ID.'_share_category') ->where('id', (int)$data['catid']) ->get()->getResultArray(); $this->model = $catename[0]['mid']; $this->content_model = \Phpcmf\Service::M('Content', $this->model); $this->_module_init($this->model, SITE_ID, $this->module['share']); if (!$data['catid']) exit('栏目不存在'); if (!$data['catid'] || !$data['title']) exit('数据不完整'); // 按字段来归类 $field = $this->get_cache('module-'.SITE_ID.'-'.$this->model, 'field'); foreach ($field as $t) { $name = $t['fieldname']; try{ //单文件 if ($t['fieldtype'] == "File"){ if ($data[$name]){ $data[$name] = dr_get_file($this->down_file(trim($data[$name]))); } } //多文件 if ($t['fieldtype'] == "Files"){ if (stripos($data[$name],"|") !== false){ $data[$name] .= "|"; } $url_arr = explode("|",$data[$name]); unset($data[$name]); foreach ($url_arr as $k => $v){ $url = trim($v); if (!empty($url)){ $data[$name]['title'][$k] = $url; $data[$name]['file'][$k] = $this->down_file($url); $data[$name]['description'][$k] = ""; } } $data[$name] = json_encode($data[$name]); } if ($t['fieldtype'] == "Image"){ if (stripos($data[$name],"|") !== false){ $data[$name] .= "|"; } $url_arr = explode("|",$data[$name]); unset($data[$name]); foreach ($url_arr as $k => $v){ $url = trim($v); if (!empty($url)){ $data[$name][$k] = $this->down_file($url); } } $data[$name] = json_encode($data[$name]); } if ($t['fieldtype'] == "Images"){ if (stripos($data[$name],"|") !== false){ $data[$name] .= "|"; } $url_arr = explode("|",$data[$name]); unset($data[$name]); foreach ($url_arr as $k => $v){ $url = trim($v); if (!empty($url)){ $data[$name][$k] = $this->down_file($url); } } $data[$name] = json_encode($data[$name]); } if ($t['fieldtype'] == 'Date'){ if ($data[$t['fieldname']]){ $data[$t['fieldname']] = strtotime($data[$t['fieldname']]); } } if ($t['fieldtype'] == 'Time'){ $data[$name] = $data[$name]; } if ($t['fieldtype'] == 'Linkage'){ if ($data[$t['fieldname']]) { $datavalue = explode('>', $data[$t['fieldname']]); $linkage = \Phpcmf\Service::M()->db->table('linkage') ->select('id') ->where('code', $t['setting']['option']['linkage']) ->get()->getResultArray(); if (count($datavalue) > 1){ for($i = 0; $i < count($datavalue)-1; $i++){ $linkagelist = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('name', $datavalue[$i]) ->get()->getResultArray(); $piddata[$i] = $linkagelist[0]['id']; } $arr = array_merge([0],$piddata); $linkagevalue = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('pids',implode(',', $arr)) ->where('name', $datavalue[count($datavalue)-1]) ->get()->getResultArray(); $data[$t['fieldname']] = $linkagevalue[0]['id']; }else{ $linkagelist1 = \Phpcmf\Service::M()->db->table('linkage_data_' . $linkage[0]['id']) ->select('id') ->where('name', $data[$name]) ->get()->getResultArray(); $data[$t['fieldname']] = $linkagelist1[0]['id']; } } } if ($t['fieldtype'] == 'Linkages'){ if ($data[$t['fieldname']]) { $linkdata = explode('|', $data[$t['fieldname']]); $linkage = \Phpcmf\Service::M()->db->table('linkage') ->select('id') ->where('code', $t['setting']['option']['linkage']) ->get()->getResultArray(); $linkid = []; foreach ($linkdata as $key => $ld){ $datavalue = explode('>', $ld); if (count($datavalue) > 1){ for($i = 0; $i < count($datavalue)-1; $i++){ $linkagelist = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('name', $datavalue[$i]) ->get()->getResultArray(); $piddata[$i] = $linkagelist[0]['id']; } $arr = array_merge([0],$piddata); $linkagevalue = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('pids',implode(',', $arr)) ->where('name', $datavalue[count($datavalue)-1]) ->get()->getResultArray(); $linkid[$key] = $linkagevalue[0]['id']; }else{ $linkid = []; foreach ($linkdata as $key => $lk){ $linkagelist = \Phpcmf\Service::M()->db->table('linkage_data_' . $linkage[0]['id']) ->select('id') ->where('name', $lk) ->get()->getResultArray(); $linkid[$key] = $linkagelist[0]['id']; } } } $data[$t['fieldname']] = json_encode($linkid); } } if ($t['fieldtype'] == 'Radio' || $t['fieldtype'] == 'Select'){ $fieldvalue = dr_field_options($t['id']); foreach ($fieldvalue as $key => $fv) { if ($fv === $data[$name]) { $data[$name] = $key; } } } if ($t['fieldtype'] == 'Checkbox'){ if (!empty($data[$name])){ $fieldvalue = dr_field_options($t['id']); $datavalue = explode('|',$data[$name]); $colnum = 0; foreach ($datavalue as $dv){ foreach ($fieldvalue as $key => $fv) { if ($fv === $dv) { $fielddata[$colnum] = $key; $colnum = $colnum+1; } } } } $data[$name] = json_encode($fielddata); } }catch (\Exception $e){ exit('附件下载失败'); } if ($name && isset($data[$name])) { $add[$t['ismain']][$name] = $data[$name]; } } $value = $add[0]['content']; if (preg_match_all("/(src)=([\"|']?)([^ \"'>]+\.(gif|jpg|jpeg|png))\\2/i", $value, $imgs)) { foreach ($imgs[3] as $img) { if (strpos($img, '/api/ueditor/') !== false || strpos($img, '/api/umeditor/') !== false) { continue; } // 下载图片 if (strpos($img, 'http') === 0) { // 正常下载 // 判断域名白名单 $arr = parse_url($img); $domain = $arr['host']; if ($domain) { $sites = WRITEPATH.'config/domain_site.php'; if (isset($sites[$domain])) { // 过滤站点域名 } elseif (strpos(SYS_UPLOAD_URL, $domain) !== false) { // 过滤附件白名单 } else { $zj = 0; $remote = \Phpcmf\Service::C()->get_cache('attachment'); if ($remote) { foreach ($remote as $t) { if (strpos($t['url'], $domain) !== false) { $zj = 1; break; } } } if ($zj == 0) { // 可以下载文件 // 同步模式 // 下载远程文件 $rt1 = \Phpcmf\Service::L('upload')->down_file([ 'url' => $img, 'attachment' => \Phpcmf\Service::M('Attachment')->get_attach_info(intval($field['content']['setting']['option']['attachment'])), ]); if ($rt1['code']) { $att = \Phpcmf\Service::M('Attachment')->save_data($rt1['data'], 'ueditor_down_img'); if ($att['code']) { // 归档成功 $value = str_replace($img, $rt1['data']['url'], $value); $img = $att['code']; } } } } } } // 缩略图 if ($img && !$add[1]['thumb']) { $add[1]['thumb'] = $img; } } } if ($imgs && !$add[1]['thumb']) { $add[1]['thumb'] = $imgs[3][0]; } $add[0]['content'] = $value; if ($this->share['random'] == 1){ $random_user = $this->add_member(); $add[1]['uid'] = $random_user['data']['uid']; $add[1]['author'] =$random_user['data']['username']; }else{ $uid = $this->u_id; $add[1]['uid'] = $uid; $member = dr_member_info($uid); $add[1]['author'] = $member['username']; } $add[1]['catid'] = $data['catid']; $add[1]['status'] = 9; if ( empty($data['hits']) || $data['hits'] < 0 ){ if (empty($hits_min) && $hits_max == 1){ $add[1]['hits'] = 1; }else{ $add[1]['hits'] = random_int($hits_min,$hits_max); } }else{ $add[1]['hits'] = $data['hits']; } $add[1]['inputip'] = \Phpcmf\Service::L('input')->ip_address();; $add[1]['inputtime'] = $add[1]['updatetime'] = SYS_TIME; $this->_init([ 'table' => $this->content_model->mytable, 'field' => $field, 'order_by' => 'id desc', ]); //验证标题重复 if ($isupdate == 1){ $model_data = \Phpcmf\Service::M()->table_site($this->model)->where('title', $add[1]['title'])->getAll(); $data = $this->_Data($model_data[0]['id']); if ($this->content_model->save_content($model_data[0]['id'],$add,$data)) {; exit('更新成功'); } else { exit('入库失败'); } }elseif ($this->content_model->table(SITE_ID.'_'.MOD_DIR)->where('title', $add[1]['title'])->counts()) { echo '重复';exit; }else{ if ($draft == 1){ $add[1]['id'] = 0; $add[1]['content'] = $add[0]['content']; $array['content'] = json_encode($add[1]); $array['cid'] = 0; $array['uid'] = 1; $array['catid'] = $add[1]['catid']; $array['inputtime'] = SYS_TIME; $rel = \Phpcmf\Service::M()->table(SITE_ID.'_'.$this->model.'_draft')->insert($array); if ($rel) { exit('成功'); }else{ exit('入库失败'); } } if ($this->content_model->save_content(0,$add,0)) { $locomotive['catid'] = $catename[0]['id']; $locomotive['name'] = $catename[0]['name']; $locomotive['dirname'] = $catename[0]['dirname']; $locomotive['site'] = SITE_ID; $locomotive['title'] = $add[1]['title']; $locomotive['module'] = 'share'; \Phpcmf\Service::M()->table('locomotive')->insert($locomotive); exit('成功'); } else { exit('入库失败'); } } } public function getAloneCate(){ $auth = $this->alone['code']; $this->input = Service::L('input'); if ($this->input->get('auth') != $auth) exit('权限认证失败'); $module = \Phpcmf\Service::M()->db->table('module')->select('dirname')->get()->getResultArray(); foreach ($module as $mod) { $aloneCate = \Phpcmf\Service::M()->db->table(SITE_ID.'_'.$mod['dirname'].'_category')->select('id,name,child')->get()->getResultArray(); foreach ($aloneCate as $num => $alone) { $aloneCate[$num]['id'] = $mod['dirname'].'-'.$alone['id']; } $Category[] = $aloneCate; } $info = $Category; $array_cate = []; foreach ($info as $key => $value) { foreach ($value as $k => $v) { array_push($array_cate, $v); } } foreach ($array_cate as $ac) { if ($ac['child'] == 0) { echo '<h1>'.$ac['name'].'<=>'.$ac['id'].'</h1>'.PHP_EOL; } } } /** * 采集入库 */ public function addAlone() { $auth = $this->alone['code']; $draft = $this->alone['draft']; $isupdate = $this->alone['contentupdate']; $hits_min = $this->alone['hits_min']; $hits_max = $this->alone['hits_max']; $this->input = Service::L('input'); if ($this->input->get('auth') != $auth) exit('权限认证失败'); if ($this->alone['release'] != 1) exit('已关闭发布状态'); $add = array(); $data = $this->input->request('data'); $cateinfo = explode('-', $data['catid']); $data['catid'] = $cateinfo[1]; $catename = \Phpcmf\Service::M()->db->table(SITE_ID.'_'.$cateinfo[0].'_category') ->where('id', (int)$data['catid']) ->get()->getResultArray(); $this->model = $cateinfo[0]; $this->content_model = \Phpcmf\Service::M('Content', $this->model); $this->_module_init($this->model, SITE_ID, $this->module[$cateinfo[0]]); if (!$data['catid']) exit('栏目不存在'); if (!$data['catid'] || !$data['title']) exit('数据不完整'); // 按字段来归类 $field = $this->get_cache('module-'.SITE_ID.'-'.$this->model, 'field'); foreach ($field as $t) { $name = $t['fieldname']; try{ //单文件 if ($t['fieldtype'] == "File"){ if ($data[$name]){ $data[$name] = dr_get_file($this->down_file(trim($data[$name]))); } } //多文件 if ($t['fieldtype'] == "Files"){ if (stripos($data[$name],"|") !== false){ $data[$name] .= "|"; } $url_arr = explode("|",$data[$name]); unset($data[$name]); foreach ($url_arr as $k => $v){ $url = trim($v); if (!empty($url)){ $data[$name]['title'][$k] = $url; $data[$name]['file'][$k] = $this->down_file($url); $data[$name]['description'][$k] = ""; } } $data[$name] = json_encode($data[$name]); } if ($t['fieldtype'] == "Image"){ if (stripos($data[$name],"|") !== false){ $data[$name] .= "|"; } $url_arr = explode("|",$data[$name]); unset($data[$name]); foreach ($url_arr as $k => $v){ $url = trim($v); if (!empty($url)){ $data[$name][$k] = $this->down_file($url); } } $data[$name] = json_encode($data[$name]); } if ($t['fieldtype'] == "Images"){ if (stripos($data[$name],"|") !== false){ $data[$name] .= "|"; } $url_arr = explode("|",$data[$name]); unset($data[$name]); foreach ($url_arr as $k => $v){ $url = trim($v); if (!empty($url)){ $data[$name][$k] = $this->down_file($url); } } $data[$name] = json_encode($data[$name]); } if ($t['fieldtype'] == 'Date'){ if ($data[$t['fieldname']]){ $data[$t['fieldname']] = strtotime($data[$t['fieldname']]); } } if ($t['fieldtype'] == 'Time'){ $data[$name] = $data[$name]; } if ($t['fieldtype'] == 'Linkage'){ if ($data[$t['fieldname']]) { $datavalue = explode('>', $data[$t['fieldname']]); $linkage = \Phpcmf\Service::M()->db->table('linkage') ->select('id') ->where('code', $t['setting']['option']['linkage']) ->get()->getResultArray(); if (count($datavalue) > 1){ for($i = 0; $i < count($datavalue)-1; $i++){ $linkagelist = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('name', $datavalue[$i]) ->get()->getResultArray(); $piddata[$i] = $linkagelist[0]['id']; } $arr = array_merge([0],$piddata); $linkagevalue = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('pids',implode(',', $arr)) ->where('name', $datavalue[count($datavalue)-1]) ->get()->getResultArray(); $data[$t['fieldname']] = $linkagevalue[0]['id']; }else{ $linkagelist1 = \Phpcmf\Service::M()->db->table('linkage_data_' . $linkage[0]['id']) ->select('id') ->where('name', $data[$name]) ->get()->getResultArray(); $data[$t['fieldname']] = $linkagelist1[0]['id']; } } } if ($t['fieldtype'] == 'Linkages'){ if ($data[$t['fieldname']]) { $linkdata = explode('|', $data[$t['fieldname']]); $linkage = \Phpcmf\Service::M()->db->table('linkage') ->select('id') ->where('code', $t['setting']['option']['linkage']) ->get()->getResultArray(); $linkid = []; foreach ($linkdata as $key => $ld){ $datavalue = explode('>', $ld); if (count($datavalue) > 1){ for($i = 0; $i < count($datavalue)-1; $i++){ $linkagelist = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('name', $datavalue[$i]) ->get()->getResultArray(); $piddata[$i] = $linkagelist[0]['id']; } $arr = array_merge([0],$piddata); $linkagevalue = \Phpcmf\Service::M()->db->table('linkage_data_'.$linkage[0]['id']) ->select('id') ->where('pids',implode(',', $arr)) ->where('name', $datavalue[count($datavalue)-1]) ->get()->getResultArray(); $linkid[$key] = $linkagevalue[0]['id']; }else{ $linkid = []; foreach ($linkdata as $key => $lk){ $linkagelist = \Phpcmf\Service::M()->db->table('linkage_data_' . $linkage[0]['id']) ->select('id') ->where('name', $lk) ->get()->getResultArray(); $linkid[$key] = $linkagelist[0]['id']; } } } $data[$t['fieldname']] = json_encode($linkid); } } if ($t['fieldtype'] == 'Radio' || $t['fieldtype'] == 'Select'){ $fieldvalue = dr_field_options($t['id']); foreach ($fieldvalue as $key => $fv) { if ($fv === $data[$name]) { $data[$name] = $key; } } } if ($t['fieldtype'] == 'Checkbox'){ if (!empty($data[$name])){ $fieldvalue = dr_field_options($t['id']); $datavalue = explode('|',$data[$name]); $colnum = 0; foreach ($datavalue as $dv){ foreach ($fieldvalue as $key => $fv) { if ($fv === $dv) { $fielddata[$colnum] = $key; $colnum = $colnum+1; } } } } $data[$name] = json_encode($fielddata); } }catch (\Exception $e){ exit('附件下载失败'); } if ($name && isset($data[$name])) { $add[$t['ismain']][$name] = $data[$name]; } } $value = $add[0]['content']; if (preg_match_all("/(src)=([\"|']?)([^ \"'>]+\.(gif|jpg|jpeg|png))\\2/i", $value, $imgs)) { foreach ($imgs[3] as $img) { if (strpos($img, '/api/ueditor/') !== false || strpos($img, '/api/umeditor/') !== false) { continue; } // 下载图片 if (strpos($img, 'http') === 0) { // 正常下载 // 判断域名白名单 $arr = parse_url($img); $domain = $arr['host']; if ($domain) { $sites = WRITEPATH.'config/domain_site.php'; if (isset($sites[$domain])) { // 过滤站点域名 } elseif (strpos(SYS_UPLOAD_URL, $domain) !== false) { // 过滤附件白名单 } else { $zj = 0; $remote = \Phpcmf\Service::C()->get_cache('attachment'); if ($remote) { foreach ($remote as $t) { if (strpos($t['url'], $domain) !== false) { $zj = 1; break; } } } if ($zj == 0) { // 可以下载文件 // 同步模式 // 下载远程文件 $rt1 = \Phpcmf\Service::L('upload')->down_file([ 'url' => $img, 'attachment' => \Phpcmf\Service::M('Attachment')->get_attach_info(intval($field['content']['setting']['option']['attachment'])), ]); if ($rt1['code']) { $att = \Phpcmf\Service::M('Attachment')->save_data($rt1['data'], 'ueditor_down_img'); if ($att['code']) { // 归档成功 $value = str_replace($img, $rt1['data']['url'], $value); $img = $att['code']; } } } } } } // 缩略图 if ($img && !$add[1]['thumb']) { $add[1]['thumb'] = $img; } } } if ($imgs && !$add[1]['thumb']) { $add[1]['thumb'] = $imgs[3][0]; } $add[0]['content'] = $value; if ($this->alone['random'] == 1){ $random_user = $this->add_member(); $add[1]['uid'] = $random_user['data']['uid']; $add[1]['author'] =$random_user['data']['username']; }else{ $uid = $this->u_id; $add[1]['uid'] = $uid; $member = dr_member_info($uid); $add[1]['author'] = $member['username']; } $add[1]['catid'] = $data['catid']; $add[1]['status'] = 9; if ( empty($data['hits']) || $data['hits'] < 0 ){ if (empty($hits_min) && $hits_max == 1){ $add[1]['hits'] = 1; }else{ $add[1]['hits'] = random_int($hits_min,$hits_max); } }else{ $add[1]['hits'] = $data['hits']; } if (empty($data['description'])) { $add[1]['description'] = ' '; }else{ $add[1]['description'] = $data['description']; } if ($this->model == 'bbs'){ $add[1]['color'] = ' '; $add[1]['isflag'] = 0; } $add[1]['displayorder'] = 0; $add[1]['inputip'] = \Phpcmf\Service::L('input')->ip_address();; $add[1]['inputtime'] = $add[1]['updatetime'] = SYS_TIME; $this->_init([ 'table' => $this->content_model->mytable, 'field' => $field, 'order_by' => 'id desc', ]); //验证标题重复 if ($isupdate == 1){ $model_data = \Phpcmf\Service::M()->table_site($this->model)->where('title', $add[1]['title'])->getAll(); $data = $this->_Data($model_data[0]['id']); if ($this->content_model->save_content($model_data[0]['id'],$add,$data)) {; exit('更新成功'); } else { exit('入库失败'); } }elseif ($this->content_model->table(SITE_ID.'_'.MOD_DIR)->where('title', $add[1]['title'])->counts()) { echo '重复';exit; }else{ if ($draft == 1){ $add[1]['id'] = 0; $add[1]['content'] = $add[0]['content']; $array['content'] = json_encode($add[1]); $array['cid'] = 0; $array['uid'] = 1; $array['catid'] = $add[1]['catid']; $array['inputtime'] = SYS_TIME; $rel = \Phpcmf\Service::M()->table(SITE_ID.'_'.$this->model.'_draft')->insert($array); if ($rel) { exit('成功'); }else{ exit('入库失败'); } } if ($this->content_model->save_content(0,$add,0)) { $locomotive['catid'] = $catename[0]['id']; $locomotive['name'] = $catename[0]['name']; $locomotive['dirname'] = $catename[0]['dirname']; $locomotive['site'] = SITE_ID; $locomotive['title'] = $add[1]['title']; $locomotive['module'] = 'share'; \Phpcmf\Service::M()->table('locomotive')->insert($locomotive); exit('成功'); } else { exit('入库失败'); } } } ?>