view->config = Zend_Registry::get('config');
$this->db=Zend_Registry::get('db');
$this->messenger=$this->_helper->getHelper('FlashMessenger');
$this->view->messages = $this->messenger->getMessages();
$this->view->theme = new Theme();
$this->view->pageID = "author-".$this->_request->getActionName();
}
function indexAction()
{
$this->view->pageID = "author-index";
$archives=new Archive($this->db);
$this->view->item=$archives->getOneArchive('数据作者介绍','help');
}
/*
* helpAction() 帮助文档
*
*/
function helpAction(){
$this->view->pageID = "author-help";
}//helpAction()帮助文档
/*
* inauthorAction() 数据申请管理
*
* param string $ac
* param string $keywords
* param string $pr //对离线数据申请的操作
* param string $uuid
*
* return view|ajax-responds
*/
function inauthorAction()
{
$ac = $this->_request->getParam("ac");
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
$u_email = $user->email;
}
if(empty($ac) || $ac=="online" || $ac == "searchonline")
{
$sql = "SELECT o.id,o.userid,o.unit,o.username,o.ts_created,o.project,m.title,m.uuid FROM onlineapp as o
LEFT JOIN metadata as m ON o.uuid=m.uuid
LEFT JOIN mdauthor as a ON a.uuid=o.uuid
WHERE (o.id in (SELECT distinct(onlineappid) from dataorder where status>=0)) AND a.userid = ? AND a.status=1";
if ($ac=="searchonline")
{
$keywords = $this->_request->getParam('q');
if(!empty($keywords))
$this->view->q = $keywords;
$search=new SimpleSearch($keywords);
$where=$search->sql_expr(array("m.title","m.description"));
$sql.=' and '.$where;
}
$sql.=" ORDER BY o.id desc";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}//在线申请记录
if($ac == "offline" || $ac=="searchoffline")
{
$pr = $this->_request->getParam('pr');
$oid = $this->_request->getParam('oid');
$pdf = $this->_request->getParam('pdf');
if(!empty($pr))
{
try{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid = $this->_request->getParam('uuid');
if(!preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
echo "参数有误!";exit();
}
//如果用户已经下载过了,就无法在更改对数据申请的意见
$sql = "select md.title,d.uuid,d.status as datastatus,d.authorpermitted from dataorder d
left join offlineapp o on o.id=d.offlineappid
left join metadata md on md.uuid=d.uuid
left join mdauthor a on a.uuid=d.uuid
where o.ts_approved is null and o.pdflink is not null
and d.uuid=? and a.userid=? and d.id=? AND a.status=1
order by o.ts_created desc";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid,$u_id,$oid));
$row = $sth->fetch();
if($row['datastatus']>4)
{
echo "该申请已经通过并且发放数据";
exit();
}
else if (empty($row) || $row['datastatus']!=4)
{
echo "该数据申请存在问题,请联系数据中心!";
exit();
}
//同意用户下载
if($pr=="confirm")
{
$sql = "UPDATE dataorder SET authorpermitted=1 WHERE uuid=? and id=?";
$sth = $this->db->prepare($sql);
if($sth->execute(array($uuid,$oid)))
{
//发送相关邮件给数据中心服务人员
$sql="select m.title,a.username from dataorder o left join metadata m on o.uuid=m.uuid left join offlineapp a on o.offlineappid=a.id where o.id=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($oid));
$row = $sth->fetch();
$mail = new WestdcMailer($this->view->config->smtp);
$mailtp=new EmailText($this->db,'offline-author-yes',array('user'=>$row['username'],'data'=>$row['title'],'email'=>$u_email));
$mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
$mail->addTo($this->view->config->service->email,'时空三极环境大数据平台服务组');
$mail->send();
$btn = $this->createOfflineCtBtn($uuid,'c',$oid);
echo ''.$btn.'';
exit();
}else{
echo "";
exit();
}
}
//反对用户下载
if($pr == "objection")
{
$sql = "UPDATE dataorder SET authorpermitted=-1 WHERE uuid=? AND id=?";
$sth = $this->db->prepare($sql);
if($sth->execute(array($uuid,$oid)))
{
$btn = $this->createOfflineCtBtn($uuid,'o',$oid);
echo ''.$btn.'';
exit();
}else{
echo "";
exit();
}
}
}catch(Exception $e)
{
echo "处理中遇到错误,请刷新页面后重试";
exit();
}
}
else if (!empty($pdf))
{
$sql="select o.pdflink from dataorder d left join offlineapp o on d.offlineappid=o.id
left join mdauthor m on d.uuid=m.uuid
where d.id=? and m.userid=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($pdf,$u_id));
$row = $sth->fetch();
$content=file_get_contents($this->view->config->offline->savepath."/".$row['pdflink']);
header("Content-Disposition: inline; filename=".$row['pdflink']);
header("Content-Type:application/pdf");
echo $content;
die(); // do not change current html output
}
else
{
$this->_helper->viewRenderer('inauthor-offline');
$select="select distinct(o.*),md.title,d.id as doid,d.uuid,d.status as datastatus,d.authorpermitted from offlineapp o
left join dataorder d on o.id=d.offlineappid
left join metadata md on md.uuid=d.uuid
left join mdauthor a on a.uuid=d.uuid
where o.ts_approved is null and o.pdflink is not null and d.status=4 and a.userid=? AND a.status=1 ";
if($ac == "searchoffline")
{
$keywords = $this->_request->getParam('q');
if(!empty($keywords))
$this->view->q = $keywords;
$search=new SimpleSearch($keywords);
$where=$search->sql_expr(array("md.title","md.description"));
$select.=' and '.$where;
}
$select.=" order by o.ts_created desc";
$sth = $this->db->prepare($select);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
foreach ($rows as $k=>$v)
{
if($v['authorpermitted']==0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'',$v['doid']);}
if($v['authorpermitted']>0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'c',$v['doid']);}
if($v['authorpermitted']<0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'o',$v['doid']);}
}
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}
}//离线申请
//按数据显示
if($ac == 'datalist' || $ac == "searchdata")
{
$uuid = $this->_request->getParam('uuid');
if(!empty($uuid))
{
$this->_helper->viewRenderer('view-dataoreder');
if(preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
$sql = "select md.title,d.id as doid,d.uuid,d.authorpermitted,d.status
,offa.id as offa_id,offa.username as offa_name,offa.unit as offa_unit,offa.email as offa_email,offa.project as offa_project,date(offa.ts_created) as offa_tscreated
,ona.id as ona_id,ona.username as ona_name,ona.unit as ona_unit,ona.email as ona_email,ona.project as ona_project, date(ona.ts_created) as ona_tscreated
from dataorder d
left join metadata md on md.uuid=d.uuid
left join mdauthor a on a.uuid=d.uuid
LEFT JOIN offlineapp offa on offa.id=d.offlineappid
LEFT JOIN onlineapp ona on ona.id=d.onlineappid
WHERE (offa.id IS NOT NULL OR ona.id IS NOT NULL) AND a.status=1 and d.status>=0
AND d.uuid=? AND a.userid=?
ORDER BY d.ts_created DESC";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid,$u_id));
$rows = $sth->fetchAll();
@$this->view->mdtitle=$rows[0]['title'];
foreach ($rows as $k=>$v)
{
if($v['authorpermitted']==0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'',$v['doid']);}
if($v['authorpermitted']>0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'c',$v['doid']);}
if($v['authorpermitted']<0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'o',$v['doid']);}
}
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}else{
$this->view->error = "参数有误";
}
}else{
$this->_helper->viewRenderer('inauthor-datalist');
$sql = "select md.title,d.uuid,count(md.id) as c from dataorder d
left join metadata md on md.uuid=d.uuid
left join mdauthor a on a.uuid=d.uuid
where a.status=1 AND a.userid=? ";
if($ac == "searchdata")
{
$keywords = $this->_request->getParam('q');
if(!empty($keywords))
$this->view->q = $keywords;
$search=new SimpleSearch($keywords);
$where=$search->sql_expr(array("md.title","md.description"));
$sql.=' and '.$where;
}
$sql.=" GROUP BY md.title,d.uuid";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}
}//按数据显示
} // inauthorAction() 数据申请管理
/*
* createOfflineCtBtn() 创建离线申请记录的操作按钮
*
*/
function createOfflineCtBtn($uuid, $type="",$oid){
$urlHref = 'href="javascript:;"';
$baseStyle = "btn box-shadow";
$selectedStyle = "disabled";
$confrimText = "同意";
$confrimFunc = 'onclick="confirm(\''.$uuid.'\',\''.$oid.'\')"';
$objectionText = "反对";
$objectionFunc = 'onclick="objection(\''.$uuid.'\',\''.$oid.'\')"';
$btns='';
if(empty($type))
{
$confrimBtn = "$confrimText";
$objectionBtn = "$objectionText";
$btns = $confrimBtn.$objectionBtn;
}
if($type=='c')
{
$confrimBtn = "$confrimText";
$objectionBtn = "$objectionText";
$btns = $confrimBtn.$objectionBtn;
}
if($type=='o')
{
$confrimBtn = "$confrimText";
$objectionBtn = "$objectionText";
$btns = $confrimBtn.$objectionBtn;
}
return $btns;
} //createOfflineCtBtn()
/*
* acceptAction() 我的数据
*
* param string $ac // list|search
* param string $keyword
*
* return view
*/
function acceptAction()
{
$ac = $this->_request->getParam("ac");
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
$u_email = $user->email;
}
//列表
if(empty($ac) || $ac=='list' || $ac=='search'){
$sql = "SELECT a.*,m.title,m.description,g.id as gid,mds.status as mdstatus,gen.id as genid FROM normalmetadata m
LEFT JOIN mdauthor a ON m.uuid=a.uuid
LEFT JOIN geonetworkmetadata g on m.uuid=g.uuid
left join en.geonetworkmetadata gen on m.uuid=gen.uuid
LEFT JOIN mdstatus mds ON m.uuid=mds.uuid
WHERE a.userid=? AND a.status>=0 ";
if ($ac=='search')
{
$key = trim($this->_request->getParam('q'));
$this->view->q = $key;
$search=new SimpleSearch($key);
$where=$search->sql_expr(array("m.title","m.description"));
$sql.=' and '.$where;
}
$sql.=" ORDER BY a.status DESC,a.id DESC";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(5);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}//list
//激活数据作者
if($ac == "active")
{
$this->_helper->viewRenderer('accept-active');
$vdcode = $this->_request->getParam('v');
$this->view->v = $vdcode;
try{
$sql = "SELECT a.id,a.activation,a.ts_created,a.ts_activated,md.title,a.uuid,u.id as userid,u.realname,u.email FROM mdauthor a
LEFT JOIN metadata md ON a.uuid=md.uuid
LEFT JOIN users u ON a.userid=u.id
WHERE a.activation=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($vdcode));
$row = $sth->fetch();
if(empty($row['id']))
{
$this->view->info='此激活码无效';
}else{
if(empty($row['ts_activated']))
{
$sql = "UPDATE mdauthor SET ts_activated=?,status=? WHERE activation=?";
$sth = $this->db->prepare($sql);
$ex = $sth->execute(array('now()',1,$vdcode));
if($ex)
{
include_once("EmailText.php");
$this->author_first($row['uuid'],$row['userid']);
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
$mailtp=new EmailText($this->db,"author-new",array(
'user' => $row['realname'],
'uuid' => $row['uuid'],
'title'=> $row['title'],
'email'=> $row['email'],
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
//获得元数据作者email
/* 不需要给这些人发通知邮件
$info = $this->getEmail($uuid,1);
$address = $info['addrs'];
foreach($address as $v)
{
$mail->addTo($v);
}*/
$mail->addTo($row['email']);
$mail->addCc($this->view->config->service->email); //管理员
}else{
$mail->addTo($this->debug_email);
}
$mail->send();
$this->view->info = '激活成功
点击这里进入我的数据页面查看';
}else
{
$this->view->info = "激活中遇到问题,请重试";
}
}else
{
$this->view->info='此激活码已经失效';
}
}
}catch(Exception $e){
if($this->debug==0)
{
$this->view->info = "处理中遇到错误,请重新尝试";
}else{
$this->view->info = $e->getMessage();
}
}
}//激活数据作者
//拒绝激活
if($ac == "lock")
{
$this->_helper->viewRenderer('accept-active');
$vdcode = $this->_request->getParam('v');
$this->view->v = $vdcode;
try{
$sql = "SELECT a.id,a.activation,a.ts_created,a.ts_activated,md.title,a.uuid,u.realname,u.email FROM mdauthor a
LEFT JOIN metadata md ON a.uuid=md.uuid
LEFT JOIN users u ON a.userid=u.id
WHERE a.activation=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($vdcode));
$row = $sth->fetch();
if(empty($row['id']))
{
$this->view->info='此激活码无效';
}else{
if(empty($row['ts_activated']))
{
$sql = "UPDATE mdauthor SET ts_activated=?,status=? WHERE activation=?";
$sth = $this->db->prepare($sql);
$ex = $sth->execute(array('now()',-1,$vdcode));
if($ex)
{
include_once("EmailText.php");
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
$mailtp=new EmailText($this->db,"author-deny",array(
'user' => $row['realname'],
'uuid' => $row['uuid'],
'title'=> $row['title'],
'email'=> $row['email'],
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($row['email']);
$mail->addCc($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
$mail->send();
$this->view->info = '该申请已被拒绝,点击这里进入我的数据页面查看';
}else
{
$this->view->info = "激活中遇到问题,请重试";
}
}else
{
$this->view->info='此激活码已经失效';
}
}
}catch(Exception $e){
if($this->debug==0)
{
$this->view->info = "处理中遇到错误,请重新尝试";
}else{
$this->view->info = $e->getMessage();
}
}
}//否认激活
}//acceptAction() 我的数据
/*
*
* getEmail() 获取数据所有者电子邮箱地址
*
* param string $uuid //UUID
* param int $level //输出信息等级
* 0 => 输出所有Email地址
* 1 => 输出数据权限等级最高的Email地址 (def)
*
* return array()
*/
function getEmail($uuid,$level=1)
{
//需要定义角色,防止程序流程出错
$addrs = array();
$addrs['resourceProvider'] = array();
$addrs['owner'] = array();
$addrs['pointOfContact'] = array();
$addrs['author'] = array();
$addrs["publisher"] = array();
$sql = 'select r.uuid,p.email,md.title,r.role from normalmetadata md
LEFT JOIN role r ON md.uuid=r.uuid
left join responsible p on r.resid=p.id
WHERE r.uuid=? AND p.email IS NOT NULL AND p.email!=?
GROUP BY r.uuid,p.email,md.title,r.role';
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid,''));
$rows = $sth->fetchAll();
$addrs['title'] = $rows[0]['title'];
foreach($rows as $k=>$v)
{
//数据资源提供者resourceProvider
if($v['role']=='resourceProvider')
{
$addrs['resourceProvider'][]=$v['email'];
}
//数据资源所有者owner
if($v['role']=='owner')
{
$addrs['owner'][]=$v['email'];
}
//数据联系人pointOfContact
if($v['role']=='pointOfContact')
{
$addrs['pointOfContact'][]=$v['email'];
}
//元数据作者author
if($v['role']== 'author' )
{
$addrs['author'][] = $v['email'];
}
if($v["role"] =="")
{
$addrs["publisher"][] = $v['email'];
}
}
//输出所有email (多维数组)
/*
$addrs['resourceProvider']
$addrs['owner']
$addrs['pointOfContact']
$addrs['author']
*/
if($level == 0)
{
return $addrs;
}
//输出最高优先级的Email
//$addrs['addrs']
if($level == 1)
{
//如果有 数据资源提供者 resourceProvider 就输出他的地址 以此类推
if(count($addrs['resourceProvider'])>0)
{
$addrs['addrs'][] = $addrs['resourceProvider'];
return $addrs;
}
if(count($addrs['owner'])>0)
{
$addrs['addrs'][] = $addrs['owner'];
return $addrs;
}
if(count($addrs['pointOfContact'])>0)
{
$addrs['addrs'][] = $addrs['pointOfContact'];
return $addrs;
}
if(count($addrs['author'])>0)
{
$addrs['addrs'][] = $addrs['author'];
return $addrs;
}
if(count($addrs["publisher"])>0)
{
$addrs['addrs'][] = $addrs["publisher"];
return $addrs;
}
}
}//getEmail 获取数据作者email地址
/*
* applyAction() 申请成为元数据作者
*
* param string $ac //动作 search|apply
* param string $q //搜索关键词
* param string $uuid //数据的UUID
*
* return view|ajax|json
*
* 调试搜索结果:
* /author/apply?ac=apply&uuid=816ecd28-ba88-464b-a83a-341440f536ef
*/
function applyAction()
{
$ac = $this->_request->getParam('ac');
include_once('helper/view.php');
$this->view->id=view::User('id');
if($ac == "mydata")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$email = view::User('email');
$realname=view::User('realname');
$sql = "SELECT distinct m.uuid,m.title,m.description,a.status,a.userid FROM normalmetadata m
LEFT JOIN mdauthor a ON m.uuid=a.uuid
LEFT JOIN role r ON r.uuid=m.uuid
LEFT JOIN responsible re ON r.resid = re.id
WHERE r.role in ('originator','resourceProvider','pointOfContact','owner') and (re.email LIKE '%$email%' or re.individual='$realname')";
$rs = $this->db->query($sql);
$this->jsonexit($rs->fetchAll());
return true;
}//首页
//搜索动作
if($ac == "search")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = "";
//防止通过其它方式访问,先判断是否是登录用户,如果不是,抛出消息后强制用户退出
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
}else{
$data = array("error"=>"请先登录");
$this ->getResponse()
->setHeader('Content-Type', 'application/json')
->appendBody(Zend_Json::encode($data));
return true;
}
//数据处理代码 EOH<<<<<<<<<<<<<<<<
try{
$keyword = trim($this->_request->getParam('q'));
if (strlen(trim($keyword))<3)
$data = array('error'=>'搜索关键字过短');
else if (!preg_match_all("/^[\x{4e00}-\x{9fa5}A-Za-z0-9\s_]+$/u",$keyword,$matchs))
{
$data = array('error'=>'搜索关键字中只能包含汉字、英文、数字');
}
else
{
//搜索标题和描述两个字段
$sql = "SELECT m.uuid,m.title,m.description,a.status,a.userid FROM normalmetadata m
LEFT JOIN mdauthor a ON m.uuid=a.uuid
WHERE ";
$search=new SimpleSearch($keyword);
$where=$search->sql_expr(array("m.title","m.description"));
$sql.=$where;
$sth = $this->db->prepare($sql);
$sth->execute();
$rows = $sth->fetchAll();
if(is_array($rows) && count($rows)>0)
$data = $rows;
else
$data = "";
}
}catch(Exception $e){
if(empty($data['error']))
{
if($this->debug==0)
{
$data = array("error"=>"处理过程中遇到错误,请重新尝试");
}else{
$data = array("error"=>$e->getMessage());
}
}
}
$this->jsonexit($data);
return true;
}// search
/****************
申请动作
****************/
if($ac == "apply")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = "";
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
$u_email = $user->email;
}
//处理部分<<<<<<<<<<
try{
$uuid = $this->_request->getParam('uuid');
if(preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
//判断该用户是否已经申请过或者是否已经是该元数据作者
$sql="SELECT id,status FROM mdauthor WHERE uuid=? AND userid=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid,$u_id));
$row = $sth->fetch();
//如果已经是元数据作者,从流程中直接退出程序
if(!empty($row['id']) && $row['status']==1)
{
$data = array("error"=>"您目前已经是该数据作者,不需要再申请");
}
//如果已经遭到明确拒绝,则不允许用户再次申请
if(!empty($row['id']) && $row['status']==-1)
{
$data = array("error"=>"您的申请已经遭到拒绝,不能再申请,有疑问请联系数据中心");
}
//如果已经存在申请,但是没有激活的,返回激活信息
if($row['status']==0){
if(!empty($row['id']) && empty($m))
{
$data = array(
"error"=>'您已经申请过了,如果长时间没有收到回应请联系数据中心',
"post"=>"activa",
"uid"=>$u_id,
"uemail"=>$u_email,
"uuid"=>$uuid,
);
}//if
else{
$info = $this->getEmail($uuid,1);
$address = $info['addrs'];
$mdtitle = $info['title'];
//如果当前用户的email包含在元数据作者email列表中,则直接使其成为元数据作者
if(in_array($u_email,$address))
{
$sql = "INSERT INTO mdauthor (uuid,userid,activation,ts_activated,status) VALUES (?,?,?,?,?)";
$sth = $this->db->prepare($sql);
$ex = $sth->execute(array($uuid,$u_id,'','now()',1));
if($ex)
{
$data = array("error"=>"您的身份符合申请条件,已经自动成为该元数据作者");
$this->author_first($uuid,$u_id);
include_once("EmailText.php");
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
$mailtp=new EmailText($this->db,"author-new",array(
'user' => $user->realname,
'uuid' => $uuid,
'title'=> $mdtitle,
'email'=> $u_email,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
foreach ($address as $dist)
{$mail->addTo($dist);} //元数据作者
$mail->addTo($u_email);
$mail->addCc($this->view->config->service->email); //管理员
}else{
$mail->addTo($this->debug_email);
}
$mail->send();
}
else
{
$data = array("error"=>"处理中出现错误,请重新尝试");
}
}
//如果不包含在当前元数据作者的email列表中
//给数据拥有者发送邮件,使其决定是否同意新加入作者
else
{
//生成激活码
$ssid = session_id();
$vdcode = md5($uuid.$ssid.$u_id.time());
//激活链接
// /author/accept/?ac=active&vdcode=$vdcode
$sql = "INSERT INTO mdauthor (uuid,userid,activation) VALUES (?,?,?)";
$sth = $this->db->prepare($sql);
$ex = $sth->execute(array($uuid,$u_id,$vdcode));
if($ex)
{
//给申请者发送邮件
include_once("EmailText.php");
@$mail=new WestdcMailer($this->view->config->smtp);
@$mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
@$mailtp=new EmailText($this->db,"author-apply",array(
'user' => $user->username,
'uuid' => $uuid,
'email'=> $user->email,
//元数据标题
'title'=> $mdtitle,
));
@$mail->setBodyText($mailtp->getBody());
@$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
@$mail->addTo($user->email);
}else{
@$mail->addTo($this->debug_email);
}
@$mail->send();
unset($mail);
unset($mailtp);
//给元数据作者以及管理员发送邮件
@$mail=new WestdcMailer($this->view->config->smtp);
@$mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
@$mailtp=new EmailText($this->db,"author-apply-confirm",array(
'user' => $user->username,
'uuid' => $uuid,
'email'=> $u_email,
'title'=> $mdtitle,
'link'=>"http://".$_SERVER['SERVER_NAME']."/data/$uuid",
//验证码
'vdcode' => $vdcode,
//激活链接
'active'=>"http://".$_SERVER['SERVER_NAME']."/author/accept/?ac=active&v=$vdcode",
//不同意激活的链接
'lock'=>"http://".$_SERVER['SERVER_NAME']."/author/accept/?ac=lock&v=$vdcode",
));
@$mail->setBodyText($mailtp->getBody());
@$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$sql = "SELECT u.email FROM mdauthor a
LEFT JOIN users u ON u.id=a.userid
WHERE a.uuid=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid));
$mlist = $sth->fetchAll();
if(count($mlist)>0)
{
foreach($mlist as $v)
{
$mail->addTo($v['email']);
}
}//mdauthor中已经注册的用户
else{
foreach ($address as $dist)
{
$mail->addTo($dist);
}
}//元数据作者
$mail->addCc($this->view->config->service->email); //管理员
}else{
@$mail->addTo($this->debug_email);
}
@$mail->send();
$data = array("error"=>"您的申请已收到,请耐心等待回应");
}else{
$data = array("error"=>"服务器可能在忙,请重试。");
}//激活码记录
}//不是确认的元数据作者
}//empty($row['id'])
}// status == 0
//调试输出结果
//$data = array('addr'=>$address,'uemail'=>$u_email);
}
else
{
$data = array('error'=>'参数出错,请按照正确的访问方式申请');
}
}catch(Exception $e){
if(empty($data['error']))
{
if($this->debug==0)
{
$data = array("error"=>"处理过程中遇到错误,请重新尝试");
}else{
$data = array("error"=>$e->getMessage());
}
}
}
// >>>>>>>>>>>>
$this ->getResponse()
->setHeader('Content-Type', 'application/json')
->appendBody(Zend_Json::encode($data));
}// ac = apply 申请处理
}//applyAction() 申请成为元数据作者
/*
* commentAction() 数据反馈
*
* param string $ac 动作
* param string $uuid 元数据UUID
* param int $page 页数
*
* return view
*/
function commentAction()
{
$ac = $this->_request->getParam('ac');
$uuid = $this->_getParam('uuid');
$reply = $this->_getParam('reply');
$replylist = $this->_getParam('replylist');
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
}
if(empty($ac)|| $ac=='list')
{
$sql = "SELECT md.title,md.uuid,count(c.id) as c FROM comments c
LEFT JOIN metadata md ON md.uuid=c.uuid
LEFT JOIN mdauthor a ON md.uuid=a.uuid
WHERE md.title IS NOT NULL AND a.userid=? AND a.status=1 AND c.reply=0
GROUP BY md.title,md.uuid
";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(15);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}
if($ac=="view")
{
$uuid = $this->_request->getParam('uuid');
if(preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
$sql = "SELECT c.id,c.author,c.email,c.url,c.ts_created,c.content,m.title,c.uuid FROM comments c
LEFT JOIN mdauthor a ON a.uuid=c.uuid
left join metadata m on m.uuid=c.uuid
WHERE c.uuid=? AND a.userid=? AND a.status=1 AND c.reply=0
ORDER BY ts_created DESC";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid,$u_id));
$rows = $sth->fetchAll();
@$this->view->mdtitle=$rows[0]['title'];
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}
$this->_helper->viewRenderer('comment-list');
}
if($ac == "listall")
{
$sql = "SELECT md.title,c.author,c.email,c.url,c.ts_created,c.content FROM comments c
LEFT JOIN mdauthor a ON a.uuid=c.uuid
LEFT JOIN normalmetadata md ON md.uuid=c.uuid
WHERE a.userid=? AND a.status=1 AND c.reply=0
ORDER BY ts_created DESC";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
$this->_helper->viewRenderer('comment-listall');
}
if($reply)
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$body = $this->_getParam('content');
if(empty($body))
{
$data = array('error'=>"请输入回复内容");
$this->jsonexit($data);
return true;
}
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$uid = $user->id;
$email = $user->email;
}
$sql = "SELECT md.title,c.id,c.author,c.email,c.url,c.ts_created,c.content FROM comments c
LEFT JOIN mdauthor a ON a.uuid=c.uuid
LEFT JOIN normalmetadata md ON md.uuid=c.uuid
WHERE a.userid=? AND a.status=1 AND c.reply=0 AND c.id=?
ORDER BY ts_created DESC";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id,$reply));
$row = $sth->fetch();
if(empty($row['id']))
{
$data = array('error'=>"回复失败,您没有权限进行此操作");
$this->jsonexit($data);
return true;
}
$ipaddr = $_SERVER['REMOTE_ADDR'];
$sql = "INSERT INTO comments (uuid,author,reply,userid,content,email,ip) VALUES (?,?,?,?,?,?,?)";
$sth = $this->db->prepare($sql);
$rs = $sth->execute(array($uuid,$user->username,$reply,$uid,$body,$email,$ipaddr));
if($rs)
{
$data = array('status'=>1,'msg'=>'回复成功!');
$this->jsonexit($data);
return true;
}else{
$data = array('error'=>"回复失败,请重试");
$this->jsonexit($data);
return true;
}
return true;
}
if($replylist)
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$sql = "SELECT cr.id,cr.content as body,cr.reply,u.username,cr.ts_created FROM comments cr
LEFT JOIN users u ON cr.userid=u.id WHERE cr.reply=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($replylist));
$rows = $sth->fetchAll();
$this->jsonexit($rows);
return true;
}
}// commentAction() 数据反馈
/*
* newsAction() 数据新闻
*
* param string $ac
*
*
*/
function newsAction(){
$ac = $this->_request->getParam('ac');
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
}
$News = new Archive($this->db);
$category = new ArchiveCategory($this->db);
//新闻列表
if(empty($ac) || $ac=="list")
{
$keyword = $this->_request->getParam('q');
$uuid = $this->_request->getParam('uuid');
$wheresql = array();
$join = "";
if(!empty($keyword))
{
$this->view->q = $keyword;
$search = new SimpleSearch($keyword);
$wheresql[] = $search->sql_expr(array("arc.title","arc.description"));
}
if(!empty($uuid) && preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
$wheresql[] = " ct.uuid='$uuid' ";
}
$wheresql[] = " c.code='".$category->DataNewsCode."' ";
$wheresql[] = " ct.uuid IS NOT NULL ";
$wheresql[] = " arc.userid=$u_id";
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(" AND ",$wheresql);
}
$sql = "SELECT arc.id,arc.title,arc.description,arc.ts_published
,c.id as cid,u.realname
,count(arc.id) as datacount
FROM ".$News->tbl_archives." arc
LEFT JOIN ".$News->tbl_catalog." ct ON arc.id=ct.aid
LEFT JOIN ".$News->tbl_categorys." c ON ct.cid=c.id
LEFT JOIN users u ON arc.userid=u.id
$wheresql
GROUP BY arc.id,c.id,u.realname
ORDER BY arc.ts_published DESC";
$sth = $this->db->prepare($sql);
$sth->execute();
$rows = $sth->fetchAll();
foreach($rows as $k=>$v)
{
$arcinfo = $News->getArchiveUrlByCid($v['id'],$v['cid']);
$rows[$k]['url'] = $arcinfo['archive_url'];
}
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}
//新闻发布
if($ac == "add")
{
$this->_helper->viewRenderer('news-add');
$sql = "SELECT md.title,md.uuid FROM metadata md
LEFT JOIN mdauthor a ON a.uuid = md.uuid
WHERE a.userid=? AND a.status=1
";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$this->view->md = $rows;
}// $ac == add
//新闻编辑
if($ac == "edit")
{
$this->_helper->viewRenderer('news-edit');
$aid = (int)$this->_request->getParam('aid');
if(empty($aid) || !is_numeric($aid))
{
$this->_redirect('/error/error');
}
$sql = "SELECT arc.* FROM ".$News->tbl_archives." arc
WHERE id=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($aid));
$row = $sth->fetch();
$keywords = $News->GetTags($aid);
$row['keywords'] = join(",",$keywords);
$this->view->info = $row;
$sql = "SELECT md.title,md.uuid FROM metadata md
LEFT JOIN mdauthor a ON a.uuid = md.uuid
WHERE a.userid=? AND a.status=1
";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$this->view->md = $rows;
$sql = "SELECT md.uuid,md.title FROM ar_catalog ct
LEFT JOIN metadata md ON ct.uuid=md.uuid
WHERE ct.aid=$aid";
$sth = $this->db->query($sql);
$rows = $sth->fetchAll();
$this->view->thismd = $rows;
}//$ac == "edit"
//新闻发布的ajax动作
if($ac =="addnews")
{
try{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = array();
$aid = $this->_request->getParam('aid');
$data['title'] = trim($this->_request->getParam('title'));
$data['keyword'] = trim($this->_request->getParam('keyword'));
$data['body'] = trim($this->_request->getParam('body'));
$uuid = $this->_request->getParam('uuid');
//对参数进行预处理
foreach($data as $k=>$v)
{
$data[$k]=preg_replace("#]*)>(.*)#i","",$v);
$data[$k]=preg_replace("##i","",$v);
$data[$k]=preg_replace("##i","",$v);
$data[$k]=str_replace("\"","“",$v);
$data[$k]=str_replace("\'","‘",$v);
}
$msg = array();
// 合法性判断
if(mb_strlen($data['title'],"utf-8")<3)
{
$msg['status'] = 0;
$msg['error'] = '标题太短,请重新填写';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
if(mb_strlen($data['title'],"utf-8")>60)
{
$msg['status'] = 0;
$msg['error'] = '标题太长,请重新填写';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
if(empty($uuid))
{
$msg['status'] = 0;
$msg['error'] = '请选择对应数据';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
if(mb_strlen($data['keyword'],"utf-8")<4)
{
$msg['status'] = 0;
$msg['error'] = '关键词太短,请重新填写';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
if(mb_strlen($data['keyword'],"utf-8")>40)
{
$msg['status'] = 0;
$msg['error'] = '关键词太长,请重新填写';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
if(mb_strlen($data['body'],"utf-8")<40)
{
$msg['status'] = 0;
$msg['error'] = '新闻内容太短,请重新填写';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
if(is_array($uuid))
{
if(count($uuid)<1)
{
$msg['status'] = 0;
$msg['error'] = '参数错误,请重试';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
foreach($uuid as $v)
{
if(!preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$v))
{
$msg['status'] = 0;
$msg['error'] = '参数错误,请重试';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
}
}
else if(!preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
$msg['status'] = 0;
$msg['error'] = '参数错误,请重试';
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
//获得描述
//删除段落及html标记
$data['description'] = mb_substr(preg_replace(array("/<(.*)>|<(.*) \/>/i","/\s/i"),array(""," "),$data['body']),0,450,"UTF-8");
//默认填充数据
$data['source'] = "时空三极环境大数据平台";
$data['userid'] = $u_id;
$keyword = str_replace(",",",",$data['keyword']);
$data['ts_published'] = date("Y-m-d H:i:s",time());
$data['is_pub'] = true;
$data['image'] = "";
unset($data['keyword']);
$dataNewsCategory = $category->GetOne('datanews');
$dataNewsCategoryID = $dataNewsCategory['id'];
//新闻添加
if(empty($aid))
{
$newAid = $News->addArchive($data,$dataNewsCategoryID,$keyword,$uuid);
//添加成功
if($newAid>0)
{
$msg['status'] = 1;
$msg['outstring'] = "新闻添加成功";
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
//添加失败
}else{
$msg['status'] = 0;
$msg['error'] = "新闻添加失败,请重试";
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
}//新闻添加 end -->
//新闻修改
else
{
if($u_id != $News->getArchiveField($aid,"userid"))
{
$msg['status'] = 0;
$msg['outstring'] = "新闻编辑失败,您没有权限";
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
$updated = $News->updateArchive($aid,$data,$dataNewsCategoryID,$keyword,$uuid);
if($updated)
{
$msg['status'] = 1;
$msg['outstring'] = "新闻编辑成功";
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}else{
$msg['status'] = 0;
$msg['outstring'] = "新闻编辑失败,请重试";
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
}//新闻修改 end -->
}catch(Exception $e){
if($this->debug==0)
{
$msg['status'] = 0;
if(empty($aid))
{$msg['error'] = "新闻添加失败,请重试";}
else
{$msg['error'] = "新闻编辑失败,请重试";}
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}else{
$msg['status'] = 0;
$msg['error'] = "新闻添加/编辑失败,请重试:".$e->getMessage();
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($msg));
return true;
}
}//catch end
}//$ac = 'newsadd' endif;
if($ac == "del")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$aid = $this->_getParam('aid');
if(!is_numeric($aid))
{
$this->jsonexit(array("error"=>"参数错误"));
return true;
}
$News = new Archive($this->db);
if($u_id != $News->getArchiveField($aid,"userid"))
{
$this->jsonexit(array("error"=>"您没有权限"));
return true;
}
if($News->DeleteArchives($aid))
{
$this->jsonexit(array("deleted"=>$aid));
return true;
}else{
$this->jsonexit(array("error"=>"删除失败",'aid'=>$aid));
return true;
}
}
}//newsAction() 数据新闻
function viewauthorsAction(){
$this->_helper->viewRenderer('view-authors');
$uuid = $this->_request->getParam('uuid');
if(preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
$sql = "SELECT u.realname,u.unit,u.email,m.title,m.description FROM normalmetadata m
LEFT JOIN mdauthor a ON m.uuid=a.uuid
LEFT JOIN users u ON u.id=a.userid
WHERE a.status>=0 AND m.uuid=? AND a.status=1
ORDER BY a.status DESC,a.id DESC";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid));
$rows = $sth->fetchAll(PDO::FETCH_BOTH);
include_once("helper/view.php");
view::addPaginator($rows,$this->view,$this->_request);
$this->view->datas = $rows;
}else{
$this->view->error = "参数有误";
}
}
/*
* versionAction() 版本控制
*
*
*/
function versionAction()
{
$ac = $this->_request->getParam('ac');
$uuid = $this->_request->getParam('uuid');
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
}
//查看单条数据的所有版本
if (!empty($uuid) && empty($ac))
{
//view the versions of the data
$sql = "SELECT md.title,md.uuid,v.ts_created,v.changelog,v.userid,v.id,u.username,u.realname FROM mdversion v
LEFT JOIN metadata md ON md.uuid=v.uuid
LEFT JOIN mdauthor a ON md.uuid=a.uuid
left join users u on v.userid=u.id
WHERE md.title IS NOT NULL AND a.userid=? and v.uuid=? AND a.status=1
order by v.ts_created desc
";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id,$uuid));
$rows = $sth->fetchAll();
@$this->view->mdtitle=$rows[0]['title'];
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(15);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}
//查看所有版本列表
else if((empty($ac) && empty($uuid))|| $ac=='list')
{
$sql = "SELECT md.title,md.uuid,v.ts_created,v.changelog,v.userid,v.id,u.username,u.realname FROM mdversion v
LEFT JOIN metadata md ON md.uuid=v.uuid
LEFT JOIN mdauthor a ON md.uuid=a.uuid
left join users u on v.userid=u.id
WHERE md.title IS NOT NULL AND a.userid=? AND a.status=1
order by v.ts_created desc
";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(15);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
}
//按数据浏览
else if($ac=="bydata")
{
$keywords = $this->_request->getParam('q');
if(!empty($keywords))
$this->view->q = $keywords;
$sql = "SELECT md.title,md.uuid,count(v.id) as c FROM mdversion v
LEFT JOIN metadata md ON md.uuid=v.uuid
LEFT JOIN mdauthor a ON md.uuid=a.uuid
WHERE md.title IS NOT NULL AND a.userid=? AND a.status=1";
if(!empty($keywords))
{
$search=new SimpleSearch($keywords);
$where=$search->sql_expr(array("md.title","md.description"));
$sql.=' and '.$where;
}
$sql.=" group by md.uuid,md.title";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id));
$rows = $sth->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
$this->view->paginator=$paginator;
$this->_helper->viewRenderer('version-bydata');
}
//删除某个版本
else if($ac=="delete")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = "";
try{
$id = $this->_request->getParam('id');
if(empty($id) || !is_numeric($id))
{
$data = array("error"=>"参数错误");
$this->jsonexit($data);
return true;
}
$sql = "DELETE FROM mdversion v
USING mdauthor a
WHERE v.uuid=a.uuid and v.id=? AND a.userid=? AND a.status=1";
$sth = $this->db->prepare($sql);
$ex = $sth -> execute(array($id,$u_id));
if($ex)
{
$data = array("deleted"=>$id,"error"=>$this->alertbox('ok','删除成功'));
$this->jsonexit($data);
return true;
}else{
$data = array("error"=>$this->alertbox('error','删除失败,请确认权限后重试'));
$this->jsonexit($data);
return true;
}
}catch(Exception $e) {
$msg = "删除失败,请确认权限后重试";
if($this->debug>0)
{$msg .= $e->getMessage();}
$data = array("error"=>$this->alertbox('error',$msg));
$this->jsonexit($data);
return true;
}
}
//恢复到geonetwork
else if($ac == "restore")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = "";
try{
$id = $this->_request->getParam('id');
if(empty($id) || !is_numeric($id))
{
$data = array("error"=>"参数错误");
$this->jsonexit($data);
return true;
}
$this->wdb=Zend_Db::factory($this->view->config->geonetwork);
$sql = "SELECT v.xml,v.uuid FROM mdversion v
LEFT JOIN mdauthor a ON a.uuid=v.uuid
WHERE v.id=? AND a.userid=? AND a.status=1";
$sth = $this->db->prepare($sql);
$sth ->execute(array($id,$u_id));
$row = $sth->fetch();
$sql = "SELECT data FROM metadata WHERE uuid=?";
$sth = $this->wdb->prepare($sql);
$sth ->execute(array($row['uuid']));
$row_geo = $sth->fetch();
if($row['xml']==$row_geo['data'])
{
$data = array("error"=>$this->alertbox('warning','无须恢复,元数据相同'));
$this->jsonexit($data);
return true;
}
$sql = "UPDATE metadata SET data=? WHERE uuid=?";
$sth = $this->wdb->prepare($sql);
$ex = $sth ->execute(array($row['xml'],$row['uuid']));
if($ex)
{
$data = array("error"=>$this->alertbox('ok','恢复成功'));
$this->jsonexit($data);
return true;
}else{
$data = array("error"=>$this->alertbox('error','恢复失败,请确认权限后重试'));
$this->jsonexit($data);
return true;
}
}catch(Exception $e) {
$msg = "恢复失败,请确认权限后重试";
if($this->debug>0)
{$msg .= $e->getMessage();}
$data = array("error"=>$this->alertbox('error',$msg));
$this->jsonexit($data);
return true;
}
}
//发布到评审
else if($ac == "commit")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = "";
try{
$id = $this->_request->getParam('id');
if(empty($id) || !is_numeric($id))
{
$data = array("error"=>"参数错误");
$this->jsonexit($data);
return true;
}
$changelog = $this->_request->getParam('changelog');
if(empty($changelog))
{
$data = array("error"=>$this->alertbox('warning','请输入变更信息'));
$this->jsonexit($data);
return true;
}
// 1. 权限认定
$sql="select a.* from mdauthor a left join mdversion v on a.uuid=v.uuid
where a.status=1 and a.userid=? and v.id=?";
$sth=$this->db->prepare($sql);
$sth->execute(array($u_id,$id));
$row=$sth->fetch();
if (empty($row))
{
$data = array("error"=>'无权限修改数据');
$this->jsonexit($data);
return true;
}
// 2. 保存变化记录 save changelog & userid
$sql = "UPDATE mdversion SET changelog=?,userid=? WHERE id=?";
$this->db->query($sql,array($changelog,$u_id,$id));
// 3. 获取数据评审状态
$sql = "SELECT s.*,v.xml,m.title FROM mdstatus s left join mdversion v on s.uuid=v.uuid
left join metadata m on s.uuid=m.uuid WHERE v.id=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($id));
$row = $sth->fetch();
//update search document
$search=new Search();
//create search view in xunsearch
//$sql="select m.uuid,m.title,m.description,x.data,array_to_string(ARRAY( SELECT keyword.keyword FROM keyword WHERE keyword.id = m.id), ', '::text) AS keyword from normalmetadata m left join xml x on m.id=x.id where m.uuid=?";
$sql="select * from xunsearch where uuid=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($row['uuid']));
$data = $sth->fetch();
$search->update($data);
if (empty($row)) //无对应记录
{
$sql="select m.id from metadata m left join mdversion v on m.uuid=v.uuid where v.id=?";
$sth=$this->db->prepare($sql);
$sth->execute(array($id));
$mrow=$sth->fetch();
if (empty($mrow)) //说明是新数据
{
//导入元数据
$iso=new ISO19115();
@$iso->loadXML($row['xml']);
if ($iso->validate())
{
$data=array("error"=>"元数据导入过程中发现错误。
".implode("
",$iso->error));
$this->jsonexit($data);
return true;
}
@$iso->saveDB($this->db);
//进入评审库
$sql="insert into mdstatus (uuid,status,userid) select uuid,0,? from mdversion where id=?";
$this->db->query($sql,array($u_id,$id));
//email to admin
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"metadata-new-admin",array(
'user' => $user->username,
'uuid' => $iso->uuid,
'email'=> $user->email,
//元数据标题
'title'=> $iso->resTitle,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
$mail->send();
unset($mail);
unset($mailtp);
//email to author
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"metadata-new-author",array(
'user' => $user->username,
'uuid' => $iso->uuid,
'email'=> $user->email,
//元数据标题
'title'=> $iso->resTitle,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($user->email);
$mail->addCc($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
@$mail->send();
$data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功提交,请等待数据中心进一步处理!'));
$this->jsonexit($data);
return true;
} else { //说明是已发布的数据且数据不存在评审信息
//同步元数据
$iso=new ISO19115();
@$iso->loadXML($row['xml']);
if ($iso->validate())
{
$data=array("error"=>"元数据导入过程中发现错误。
".implode("
",$iso->error));
$this->jsonexit($data);
return true;
}
@$iso->saveDB($this->db);
//移除中间版本
$sql="delete from mdversion where uuid in (select uuid from mdversion where id=?) and changelog is null";
$this->db->query($sql,array($id));
//修改评审状态为发布,且由其提交的用户进行管理
$sql="insert into mdstatus (uuid,status,userid) select uuid,6,? from mdversion where id=?";
$this->db->query($sql,array($u_id,$id));
//email to admin & author
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"metadata-release",array(
'user' => $user->username,
'uuid' => $row['uuid'],
'email'=> $user->email,
//元数据标题
'title'=> $row['title'],
'changelog'=>$changelog,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($this->view->config->service->email);
//$mail->addCc($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
@$mail->send();
$data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功发布!'));
$this->jsonexit($data);
return true;
}
}
else if ($row['status']==-1 || $row['status']==0 || $row['status']==1) //取消发布的数据,初始状态,已接收
{
//同步元数据
$iso=new ISO19115();
@$iso->loadXML($row['xml']);
if ($iso->validate())
{
$data=array("error"=>"元数据导入过程中发现错误。
".implode("
",$iso->error));
$this->jsonexit($data);
return true;
}
@$iso->saveDB($this->db);
//email to admin
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"version-commit-admin",array(
'user' => $user->username,
'uuid' => $row['uuid'],
'email'=> $user->email,
//元数据标题
'title'=> $row['title'],
'changelog'=>$changelog,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
$mail->send();
unset($mail);
unset($mailtp);
//email to author
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"version-commit-author",array(
'user' => $user->username,
'uuid' => $row['uuid'],
'email'=> $user->email,
//元数据标题
'title'=> $row['title'],
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($user->email);
$mail->addCc($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
@$mail->send();
$data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功提交并同步,请等待数据中心进一步处理!'));
$this->jsonexit($data);
return true;
}
else if ($row['status']==2 || $row['status']==3 || $row['status']==4)//已发送过外审邮件,需由编辑告知变化信息
{
//同步元数据
$iso=new ISO19115();
@$iso->loadXML($row['xml']);
//email to admin
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"version-commit-admin",array(
'user' => $user->username,
'uuid' => $row['uuid'],
'email'=> $user->email,
//元数据标题
'title'=> $row['title'],
'changelog'=>$changelog,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
$mail->send();
unset($mail);
unset($mailtp);
//email to author
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"version-commit-author",array(
'user' => $user->username,
'uuid' => $row['uuid'],
'email'=> $user->email,
//元数据标题
'title'=> $row['title'],
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($user->email);
$mail->addCc($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
@$mail->send();
//email to experts
$sql="select u.username,u.email from mdexpertreview e left join users u on e.id=u.id where e.status in (0,1) and e.uuid=?";
$sth = $this->db->prepare($sql);
$sth->execute(array($row['uuid']));
$experts = $sth->fetchAll();
unset($mail);
unset($mailtp);
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"version-commit-expert",array(
'user' => $user->username,
'uuid' => $row['uuid'],
'email'=> $user->email,
//元数据标题
'title'=> $row['title'],
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
$filecontent=file_get_contents("http://" . $_SERVER['HTTP_HOST'].'/service/doc/uuid/'.$row['uuid']);
$mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, $row['title'].'.doc');
$filecontent=file_get_contents("http://" . $_SERVER['HTTP_HOST'].'/service/pdf/uuid/'.$row['uuid']);
$mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, $row['title'].'.pdf');
if($this->debug==0)
{
foreach ($experts as $expert) $mail->addTo($expert['email']);
$mail->addCc($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
@$mail->send();
$data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功提交,请等待数据中心进一步处理!'));
$this->jsonexit($data);
return true;
}
else if ($row['status']>=5)//数据已经发布,再次修改后将只通知管理员,保留发布状态
{
//同步元数据
$iso=new ISO19115();
@$iso->loadXML($row['xml']);
if ($iso->validate())
{
$data=array("error"=>"元数据导入过程中发现错误。
".implode("
",$iso->error));
$this->jsonexit($data);
return true;
}
@$iso->saveDB($this->db);
//移除中间版本
$sql="delete from mdversion where uuid in (select uuid from mdversion where id=?) and changelog is null";
$this->db->query($sql,array($id));
//email to admin & author
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'数据中心服务组');
$mailtp=new EmailText($this->db,"metadata-release",array(
'user' => $user->username,
'uuid' => $row['uuid'],
'email'=> $user->email,
//元数据标题
'title'=> $row['title'],
'changelog'=>$changelog,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
if($this->debug==0)
{
$mail->addTo($this->view->config->service->email);
//$mail->addCc($this->view->config->service->email);
}else{
$mail->addTo($this->debug_email);
}
@$mail->send();
$data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功发布!'));
$this->jsonexit($data);
return true;
}
}catch(Exception $e) {
$msg = "提交失败,请确认权限后重试";
if($this->debug>0)
{$msg .= $e->getMessage();}
$data = array("error"=>$this->alertbox('error',$msg));
$this->jsonexit($data);
return true;
}
}//发布到评审
//与前一个版本对比
else if($ac == "diff")
{
$this->_helper->viewRenderer('version-diff');
$id = $this->_request->getParam('id');
if(empty($id) || !is_numeric($id))
{
$this->view->error = "参数错误";
return true;
}
$sql = "SELECT v.uuid,md.title FROM mdversion v
LEFT JOIN mdauthor a ON a.uuid=v.uuid
LEFT JOIN metadata md ON v.uuid=md.uuid
WHERE v.id=? AND a.userid=? AND a.status=1";
$sth = $this->db->prepare($sql);
$sth -> execute(array($id,$u_id));
$row = $sth->fetch();
$sql = "SELECT v.* FROM mdversion v
WHERE v.uuid=? AND v.id<=?
ORDER BY v.ts_created DESC
LIMIT ?";
$sth = $this->db->prepare($sql);
$sth -> execute(array($row['uuid'],$id,2));
$rows = $sth->fetchAll();
if(count($rows)<2)
{
$this->view->error = "对比失败:之前没有版本可以对比";
return true;
}
$this->view->info = $row;
$this->view->data = $rows;
}
}// versionAction() 数据版本管理
//新建元数据
function newdataAction()
{
$ac = $this->_request->getParam('ac');
$id = $this->_request->getParam('id');
$this->wdb=Zend_Db::factory($this->view->config->geonetwork);
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
}
//在geonetwork中查看单条数据
if (!empty($id) && empty($ac))
{
$this->view->url='metadata.show?id='.$id;
$this->_helper->viewRenderer('newdata-view');
}
//查看属于自己的所有的未提交数据列表
else if((empty($ac) && empty($uuid))|| $ac=='list')
{
$sql = "SELECT (regexp_matches(gn.data,'
".implode("
",$iso->error));
$this->jsonexit($data);
return true;
}
// 保存数据作者信息
$sql="insert into mdauthor (uuid,userid,ts_activated,status) select ?,?,now(),1 where not exists (select id from mdauthor where uuid=? and userid=?)";
$this->db->query($sql,array($row['uuid'],$u_id,$row['uuid'],$u_id));
// 2. 保存变化记录 save changelog & userid for the latest version
$sql = "UPDATE mdversion SET changelog=?,userid=? WHERE id in (select id from mdversion where uuid=? order by ts_created desc limit 1)";
$this->db->query($sql,array($changelog,$u_id,$row['uuid']));
file_get_contents("http://ftp.poles.ac.cn/proftp_upload.php?uuid=".$row['uuid']."&filelist=1");
// 3. 保存数据评审状态
//导入元数据
@$iso->saveDB($this->db);
//进入评审库
$sql="insert into mdstatus (uuid,status,userid) select ?,0,? where not exists (select id from mdstatus where uuid=? and userid=?)";
$this->db->query($sql,array($row['uuid'],$u_id,$row['uuid'],$u_id));
//email to admin
// $mail=new WestdcMailer($this->view->config->smtp);
// $mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
// $mailtp=new EmailText($this->db,"metadata-new-admin",array(
// 'user' => $user->username,
// 'uuid' => $iso->uuid,
// 'email'=> $user->email,
// //元数据标题
// 'title'=> $iso->resTitle,
// ));
// $mail->setBodyText($mailtp->getBody());
// $mail->setSubject($mailtp->getSubject());
// if($this->debug==0)
// {
// $mail->addTo($this->view->config->service->email);
// }else{
// $mail->addTo($this->debug_email);
// }
// $mail->send();
//
// unset($mail);
// unset($mailtp);
//email to author
// $mail=new WestdcMailer($this->view->config->smtp);
// $mail->setFrom($this->view->config->service->email,'时空三极环境大数据平台服务组');
// $mailtp=new EmailText($this->db,"metadata-new-author",array(
// 'user' => $user->username,
// 'uuid' => $iso->uuid,
// 'email'=> $user->email,
// //元数据标题
// 'title'=> $iso->resTitle,
// ));
// $mail->setBodyText($mailtp->getBody());
// $mail->setSubject($mailtp->getSubject());
// if($this->debug==0)
// {
// $mail->addTo($user->email);
// $mail->addCc($this->view->config->service->email);
// }else{
// $mail->addTo($this->debug_email);
// }
// @$mail->send();
$data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功提交,请等待数据中心进一步处理!'));
$this->jsonexit($data);
return true;
}catch(Exception $e) {
$msg = "提交失败,请确认权限后重试";
if($this->debug>0)
{$msg .= $e->getMessage();}
$data = array("error"=>$this->alertbox('error',$msg));
$this->jsonexit($data);
return true;
}
}
//FTP
else if($ac == "ftp")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid = $this->_getParam('uuid');
$this->view->uuid = $uuid;
if(empty($uuid) || !preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
$data = array(
'error'=>"参数错误"
);
$this->jsonexit($data);
return true;
}
//安全检查: uuid必须是当前用户且为新建数据
$sql="select * from geonetworkmetadata where uuid=? and uuid not in (select uuid from metadata) and owner=?";
$sth=$this->db->prepare($sql);
$sth->execute(array($uuid,$u_id));
$row=$sth->fetch();
if (empty($row))
{
$data = array(
'error'=>"参数错误"
);
$this->jsonexit($data);
return true;
}
//ftp 用户名
$uname = 'westdc'.$u_id.'upload';
//ftp路径
$homedir = "/disk4/sanji/upload/".$uuid."/";
//ftp用户表
$ftptable=' pureftp ';//ftp2.westgis.ac.cn
$uid = 1002;
$gid = 1002;
$sql = "SELECT * FROM $ftptable WHERE userid='$uname' ORDER BY pkid DESC";
$sth = $this->db->prepare($sql);
$sth->execute();
$row = $sth->fetch();
//create directory for upload
//server is not localhost, so we need a trick
//$old=umask(0);
//@mkdir($homedir,0777);
//umask($old);
$page=file_get_contents('http://ftp.poles.ac.cn/proftp_upload.php?uuid='.$uuid);
if (!empty($page)) die($page);//there are errors in visit ftp page
if(!empty($row['pkid']))
{
if(preg_match("/.*".$uuid.".*/",$row['homedir']))
{
$data = array(
'statu'=>1,
'user'=>$row['userid'],
'passwd'=>$row['passwd']
);
$this->jsonexit($data);
return true;
}else{
$passwd = $this->genRandomString(16);
//$sql = "UPDATE proftpusers SET passwd=?,uid=?,gid=?,homedir=? WHERE userid=?";
//$sth = $this->db->prepare($sql);
//$rs = $sth->execute(array($passwd,$uid,$gid,$homedir,$uname));
$sql="update ".$ftptable." SET passwd='".$passwd."',uid=".$uid.",gid=".$gid.",homedir='".$homedir."' WHERE userid='".$uname."'";
$rs=$this->db->query($sql);
if($rs)
{
$data = array(
'statu'=>1,
'user'=>$uname,
'passwd'=>$passwd
);
$this->jsonexit($data);
return true;
}else{
$data = array(
'error'=>"FTP信息更新失败,请重试"
);
$this->jsonexit($data);
return true;
}
}
}
else{
$passwd = $this->genRandomString(16);
//$sql = "INSERT INTO proftpusers (userid,passwd,uid,gid,homedir) VALUES (?,?,?,?,?)";
//$sth = $this->db->prepare($sql);
//$rs = $sth->execute(array($uname,$passwd,$uid,$gid,$homedir));
$sql="insert into ".$ftptable." (userid,passwd,uid,gid,homedir) values('".$uname."','".$passwd."',".$uid.",".$gid.",'".$homedir."')";
$rs=$this->db->query($sql);
if($rs)
{
$data = array(
'statu'=>1,
'user'=>$uname,
'passwd'=>$passwd
);
$this->jsonexit($data);
return true;
}else{
$data = array(
'error'=>"FTP信息更新失败,请重试"
);
$this->jsonexit($data);
return true;
}
}//end if
}//ftp
}
//新建元数据
//文献管理
function literatureAction()
{
$this->view->ac= $ac = $this->_request->getParam('ac');
$this->view->uuid = $uuid = $this->_request->getParam('uuid');
$id = (int)$this->_request->getParam('id');
$keyword = $this->view->q = trim($this->_getParam('q'));
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$u_id = $user->id;
}
//安全考虑
if (!empty($uuid) && !viewAssist::isUuid($uuid)) die();
//include_once("helper/view.php");
include_once("data/Author.php");
$reference = new Reference();
if(!empty($keyword))
{
$reference->keyword = $keyword;
}
$this->view->reference = $reference;
$this->view->page = $this->_getParam('page');
$this->view->pagelimit = 10;
//文献首页:逐数据浏览
if(empty($ac) && empty($uuid))
{
$this->view->referenceType = $reference->referenceType();
viewAssist::addPaginator($reference->getReferencesByAuthor($u_id),$this, $this->view->pagelimit);
return true;
}
//逐文献浏览
else if ($ac=="byliter")
{
$this->_helper->viewRenderer('literature-byliter');
viewAssist::addPaginator($reference->getReferencesByAuthor($u_id,1,0),$this, $this->view->pagelimit);
return true;
}
//浏览数据的文献
else if (!empty($uuid) && empty($ac))
{
$this->view->referenceType = $reference->referenceType();
if (empty($keyword))
{
$this->_helper->viewRenderer('literature-viewdata');
viewAssist::addPaginator($reference->getReferencesByAuthorUUID($u_id,$uuid,0),$this, $this->view->pagelimit);
} else {
$this->_helper->viewRenderer('literature-refsearch');
$sql="select title from metadata where uuid='$uuid'";
$rs=$this->db->fetchRow($sql);
$this->view->mdtitle=$rs['title'];
viewAssist::addPaginator($reference->fetchReferencesWithUUID($uuid),$this, $this->view->pagelimit);
}
return true;
}
//浏览作者的所有施引文献
else if ($ac=="cited")
{
$this->view->referenceType = $reference->referenceType();
$this->_helper->viewRenderer('literature-cited');
viewAssist::addPaginator($reference->getReferencesByAuthor($u_id,1,1),$this, $this->view->pagelimit);
return true;
}
//修改排序
else if($ac == "order")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$order = (int)$this->_getParam('order');
if(empty($id))
{
$this->jsonexit(array('error'=>'参数错误'));
return true;
}
if(empty($order))
{
$this->jsonexit(array('error'=>'请输入排序数字,除0以外'));
return true;
}
$s = $reference->changeOrderByAuthor($u_id,$id,$order);
if($s !== true)
{
$this->jsonexit(array('error'=>'出现错误'));
return true;
}else{
$this->jsonexit(array('success'=>'修改成功!'));
return true;
}
}
//移除文献对应关系
else if($ac == "remove")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
if(empty($uuid) || !is_numeric($id))
{
$this->jsonexit(array("error"=>"参数错误"));
return true;
}
$ex=$reference->removeReferenceByAuthor($u_id,$id);
if($ex)
{
$this->jsonexit(array("remove"=>$id.$uuidå));
return true;
}else{
$this->jsonexit(array("error"=>$this->alertbox('error','移除失败,请确认权限后重试')));
return true;
}
}
//添加数据文献对应关系
else if($ac == "insert")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$order = (int)$this->_getParam('order');
if(empty($id))
{
$this->jsonexit(array('error'=>'参数错误'));
return true;
}
if(empty($order))
{
$this->jsonexit(array('error'=>'请输入排序数字,除0以外'));
return true;
}
$s = $reference->insertMdrefByAuthor($u_id,$id,$uuid,$order);
if($s !== true)
{
$this->jsonexit(array('error'=>'出现错误'));
return true;
}else{
$this->jsonexit(array('success'=>'修改成功!'));
return true;
}
}
//添加文献信息
else if($ac == "add")
{
$submit = $this->_request->getParam('submit');
if(!empty($submit))
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = "";
try{
$ref=$this->_request->getParam('ref');
$reftype=(int)$this->_request->getParam('reftype');
$url = $this->_request->getParam('url');
$attid = (int)$this->_request->getParam('attid');
$order=(int)$this->_request->getParam('order_input');
if(empty($uuid) || empty($ref) || !is_numeric($reftype))
{
$data = array("error"=>"参数错误");
$this->jsonexit($data);
return true;
}
$sql="select * from mdauthor where status=1 and userid=$u_id and uuid='$uuid'";
$rs=$this->db->fetchRow($sql);
if (!$rs)
{
$data = array("error"=>$this->alertbox('warning','您不是该数据作者,无法添加对应文献信息。'));
$this->jsonexit($data);
return true;
}
$sql="select id from reference where reference=?";
$sth = $this->db->prepare($sql);
$sth->execute(array(trim($ref)));
$row = $sth->fetch();
if(empty($row['id']))
{
$sql="insert into reference (reference,attid) values(?,?)";
$sth = $this->db->prepare($sql);
$sth->execute(array(trim($ref),$attid));
$sql="select id from reference where reference=?";
$sth = $this->db->prepare($sql);
$sth->execute(array(trim($ref)));
$row = $sth->fetch();
}
$sql="insert into mdref (uuid,refid,reftype,place) values(?,?,?,?)";
$sth = $this->db->prepare($sql);
$ex=$sth->execute(array($uuid,$row['id'],0,$order));
if($ex)
{
$data = array("commited"=>1,"error"=>$this->alertbox('ok','成功添加文献!'));
$this->jsonexit($data);
return true;
}else{
$data = array("error"=>$this->alertbox('error','提交失败,请确认权限后重试'));
$this->jsonexit($data);
return true;
}
}catch(Exception $e) {
$msg = "提交失败,您提交的数据可能已经存在";
if($this->debug>0)
{$msg .= $e->getMessage();}
$data = array("error"=>$this->alertbox('error',$msg));
$this->jsonexit($data);
return true;
}
}else{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer('literature-add');
$this->view->uuid = $this->_request->getParam('uuid');
}
}//添加文献
//文献附件上传
else if($ac=='upload')
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
try{
$files=new files();
$msg = $files -> upload($this->view->config->upload,$_FILES['Filedata'],'literature');
if(empty($msg['error']))
{
$msg['error']="";
$filename = $msg['db_path'];
$filesize = $msg['file_size'];
$filedesc = $this->_request->getParam('filedesc');
$filetype = $msg['file_type'];
$realname = $msg['realname'];
$sql = "insert into attachments (filename,filetype,filedesc,userid,filesize,realname) values ('$filename','$filetype','$filedesc','$u_id','$filesize','$realname') RETURNING id";
$sth = $this->db->prepare($sql);
$sth->execute();
$att = $sth->fetch(PDO::FETCH_ASSOC);
$msg['attid'] = $attid = $att['id'];
$msg['html'] = $realname.'['. round($filesize/1024,2) .' kb]
"; print_r($body); echo ""; return true; }// 元数据处理 }//metadata() public function fundAction() { //$this->_helper->layout->setLayout('administry'); $ac = $this->_getParam('ac'); $submit = $this->_getParam('submit'); include_once("data/Fund.php"); include_once("helper/view.php"); $fund = new Fund($this->db); $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $user = $auth->getIdentity(); $uid = $user->id; }else{ exit("请重新登录"); } if($ac=='index' || empty($ac)) { $uuid = $this->_getParam('uuid'); $this->view->q=$this->_getParam('q'); if(empty($uuid)) { $rows = $fund->fetch("",true,0,$this->_getParam('q')); view::addPaginator($rows,$this->view,$this->_request); }else{ include('data/Metadata.php'); $md = new Metadata($this->db); $this->view->md = $md->view($uuid); $rows = $fund->fetch($uuid); view::addPaginator($rows,$this->view,$this->_request); } return true; } if($ac == 'data') { $this->_helper->viewRenderer('fund-data'); $this->view->q = $q = $this->_getParam('q'); $rows = $fund->fetchFromData(true,$uid,$q); view::addPaginator($rows,$this->view,$this->_request); return true; } if($ac == 'dataview') { $this->_helper->viewRenderer('fund-data-view'); $this->view->q = $q = $this->_getParam('q'); $id = $this->_getParam('id'); $this->view->fund = $fund->view($id); $rows = $fund->fetchFromData($id,$uid,$q); view::addPaginator($rows,$this->view,$this->_request); return true; } if($ac == "add") { $this->_helper->viewRenderer('fund-add'); $uuid = $this->_getParam('uuid'); if(!empty($uuid)) { include('data/Metadata.php'); $md = new Metadata($this->db); $this->view->md = $md->view($uuid); } if(!empty($submit)) { $data = $fund->_getParams($this->_request); $data['userid'] = $uid; if(empty($uuid)) { $s = $fund->add($data); }else{ $s = $fund->add($data,$uuid); } if($s == true) { $this->view->AlertType = "alert-success"; $this->view->msg = "添加成功!"; $this->view->jump_url = "/author/fund/"; return true; }else{ $this->view->data = $data; $this->view->error = "添加失败,请重试"; return true; } } return true; }//add if($ac == "edit") { $this->_helper->viewRenderer('fund-add'); $id = $this->_getParam('id'); if(empty($id)) { $this->view->AlertType = "alert-error"; $this->view->msg = "参数错误"; $this->view->jump_url = "/author/fund/"; } if(!empty($submit)) { $data = $fund->_getParams($this->_request); $data['userid'] = $uid; $state = $fund->update($data,$id,$uid); if( $state == true) { $this->view->AlertType = "alert-success"; $this->view->msg = "修改成功!"; $this->view->jump_url = "/author/fund/"; return true; }else{ $this->view->data = $data; if(is_string($state)) { $this->view->error = $state; }else{ $this->view->error = "修改失败,请重试"; } return true; } }else{ $this->view->data = $fund->view($id); } return true; }//edit if($ac == "del") { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $id = $this->_getParam('id'); if(empty($id)) { $this->jsonexit(array('error'=>'参数错误')); return true; } if($fund->delete($id,$uid) == true) { $this->jsonexit(array('success'=>$id)); return true; }else{ $this->jsonexit(array('error'=>'删除失败')); return true; } }//del if($ac == "formd") { $uuid = $this->_getParam('uuid'); if(empty($uuid)) { $this->view->AlertType = "alert-error"; $this->view->msg = "参数错误"; $this->view->jump_url = "/admin/data/fund/"; } $id = $this->_getParam('id'); $order = $this->_getParam('order'); if(!empty($id)) { if($fund->addToMdfund($uuid,$id,$order)) { $this->view->AlertType = "alert-success"; $this->view->error = "添加成功!可以继续选择并添加"; }else{ $this->view->AlertType = "alert-error"; $this->view->error = "添加失败!该数据可能已被添加"; } } $mfid = $this->_getParam('mfid'); $this->view->q=$this->_getParam('q'); if(!empty($mfid)) { if($fund->changeorder($mfid,$order)) { $this->view->AlertType = "alert-success"; $this->view->error = "排序修改成功!"; }else{ $this->view->AlertType = "alert-error"; $this->view->error = "排序修改失败!"; } $rows = $fund->fetch($uuid,true,0); }else{ $this->view->ct = "ct"; $rows = $fund->fetch($uuid,false,0,$this->_getParam('q')); } include('data/Metadata.php'); $md = new Metadata($this->db); $this->view->md = $md->view($uuid); view::addPaginator($rows,$this->view,$this->_request); return true; }//formd if($ac == "mdfunddel") { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $id = $this->_getParam('id'); if(empty($id)) { $this->jsonexit(array('error'=>'参数错误')); return true; } if($fund->mfdelete($id) == true) { $this->jsonexit(array('success'=>$id)); return true; }else{ $this->jsonexit(array('error'=>'删除失败')); return true; } }//mdfunddel }//fund public function doiAction() { //$this->_helper->layout->setLayout('administry'); $ac = $this->_getParam('ac'); $submit = $this->_getParam('submit'); $uuid = $this->_getParam('uuid'); include_once("data/Doi.php"); $doi = new Doi($this->db); include_once("helper/view.php"); if( empty($ac) || $ac == "index") { $uid = view::User('id'); if(empty($uuid)) { $rows = $doi->fetch($uid); view::addPaginator($rows,$this->view,$this->_request); }else{ $this->_redirect('/author/doi/ac/edit/?uuid='.$uuid); return true; } return true; }//index if($ac == "edit") { $this->_helper->viewRenderer('doi-add'); $id = $this->_getParam('id'); if(empty($uuid) && empty($id)) { view::Msg('alert-error',"参数错误",-1); return false; } if(empty($submit)){ if(!empty($uuid)) { $this->view->uuid = $uuid; $this->view->data = $doi->view($uuid); if(empty($this->view->data)) { include('data/Metadata.php'); $md = new Metadata($this->db); $metadata = $md->view($uuid); $this->view->data = array( 'uuid'=>$uuid, 'title'=>$metadata['title'], 'doi'=>$metadata['doi'], 'url'=>"http://" . $_SERVER['HTTP_HOST'].'/data/'.$uuid, 'publisher'=>'寒区旱区科学数据中心', 'title_en'=>$metadata['title_en'], 'publisher_en'=>'Cold and Arid Regions Science Data Center at Lanzhou', ); }else{ $this->view->data['info'] = $doi->data_process_out($this->view->data); } }else{ $this->view->data = $doi->view($uuid); $this->view->data['info'] = $doi->data_process_out($this->view->data); } }else{ $data = $doi->_getParams($this->_request); $this->view->data = $data; $info = $doi->checkinfo($data['info']); if(!is_array($info)){ $this->view->error = view::Error($info); return true; }else{ $data['info'] = $info; $data['info'] = $doi->sksort($data['info'],"order",SORT_ASC); } $uid = view::User('id'); $state = $doi->update($data,$uuid,$uid); if($state) { $this->view->msg = view::Msg('alert-success',"修改成功!",'/author/doi/uuid/'.$uuid); return false; }else{ $this->view->error = view::Error("修改失败"); return false; } } }//edit if($ac == "del") { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $id = $this->_getParam('id'); if(empty($id)) { $this->jsonexit(array('error'=>'参数错误')); return true; } if($doi->delete($id) == true) { $this->jsonexit(array('success'=>$id)); return true; }else{ $this->jsonexit(array('error'=>'删除失败')); return true; } }//del }//doi /* * jsonexit() 退出并返回json数据 * * param array $data 要返回的JSON数据,可以是任意数组 * * return JSON-response */ public function jsonexit($data){ $this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(Zend_Json::encode($data)); return true; }//jsonexit() 退出并返回json数据 private function genRandomString($len) { $chars = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ); $charsLen = count($chars) - 1; shuffle($chars); // 将数组打乱 $output = ""; for ($i=0; $i<$len; $i++) { $output .= $chars[mt_rand(0, $charsLen)]; } return $output; } //ajax 提示框 public function alertbox($type='',$body){ if($type == "error") { $img = ''; $text = '