westdc-zf1/application/default/controllers/AuthorController.php

714 lines
22 KiB
PHP
Raw Normal View History

2012-02-22 12:21:22 +00:00
<?php
/*
@version $Id: AuthorController.php 2012-2-29 15:01 Z
@package author
@copyright Copyright (c) 2012, CAREERI.
@license http://
@link http://
@update 2012-3-1 15:06 李建轩
@update 2012-3-9 17:01 李建轩
*/
2012-02-22 12:21:22 +00:00
class AuthorController extends Zend_Controller_Action
{
private $limit=10;
function preDispatch()
{
$this->view->config = Zend_Registry::get('config');
$this->db=Zend_Registry::get('db');
$this->messenger=$this->_helper->getHelper('FlashMessenger');
$this->view->messages = $this->messenger->getMessages();
}
function indexAction()
{
}
/*
* helpAction() 帮助文档
*
*/
function helpAction(){
}//helpAction()帮助文档
/*
* inauthorAction() 数据申请管理
*
* param string $ac
* param string $keywords
* param string $pr //对离线数据申请的操作
* param string $uuid
*
* return view|ajax-responds
*/
function inauthorAction()
2012-02-22 12:21:22 +00:00
{
$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")
{
$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)) AND a.userid = ?
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 == "searchonline")
{
$keywords = $this->_request->getParam('q');
if(!empty($keywords))
{
$this->view->q = $keywords;
}
$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)) AND a.userid = ? AND (m.title like ? or m.description like ?)
ORDER BY o.id desc";
$sth = $this->db->prepare($sql);
$sth->execute(array($u_id,"%$keywords%","%$keywords%"));
$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")
{
$pr = $this->_request->getParam('pr');
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 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.uuid=? and a.userid=?
order by o.ts_created desc";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid,$u_id));
$row = $sth->fetch();
if($row['datastatus']>4)
{
echo "该申请已经通过并且发放数据";
exit();
}
if($pr=="confrim")
{
$sql = "UPDATE dataorder SET authorpermitted=1 WHERE uuid=?";
$sth = $this->db->prepare($sql);
if($sth->execute(array($uuid)))
{
$btn = $this->createOfflineCtBtn($uuid,'c');
echo ''.$btn.'<script>alert("您已经同意用户的离线数据申请");</script>';
exit();
}else{
echo "<script>alert('处理过程中遇到错误,请刷新页面');</script>";
exit();
}
}
if($pr == "objection")
{
$sql = "UPDATE dataorder SET authorpermitted=-1 WHERE uuid=?";
$sth = $this->db->prepare($sql);
if($sth->execute(array($uuid)))
{
$btn = $this->createOfflineCtBtn($uuid,'o');
echo ''.$btn.'<script>alert("您已经反对用户的离线数据申请");</script>';
exit();
}else{
echo "<script>alert('处理过程中遇到错误,请刷新页面');</script>";
exit();
}
}
}catch(Exception $e)
{
echo "处理中遇到错误,请刷新页面后重试";
exit();
}
}
else
{
$this->_helper->viewRenderer('inauthor-offline');
$select="select distinct(o.*),md.title,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=?
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'],'');}
if($v['authorpermitted']>0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'c');}
if($v['authorpermitted']<0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'o');}
}
$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 == "searchoffline")
{
$keywords = $this->_request->getParam('q');
if(!empty($keywords))
{
$this->view->q = $keywords;
}
$this->_helper->viewRenderer('inauthor-offline');
$select="select distinct(o.*),md.title,md.description,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 (md.title like ? or md.description like ?) and a.userid=?
order by o.ts_created desc";
$sth = $this->db->prepare($select);
$sth->execute(array("%$keywords%","%$keywords%",$u_id));
$rows = $sth->fetchAll();
foreach ($rows as $k=>$v)
{
if($v['authorpermitted']==0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'');}
if($v['authorpermitted']>0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'c');}
if($v['authorpermitted']<0)
{$rows[$k]['btns']=$this->createOfflineCtBtn($v['uuid'],'o');}
}
$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=""){
$urlHref = 'href="javascript:;"';
$baseStyle = "offline-ct-btns box-shadow";
$selectedStyle = "offline-select";
$confrimText = "同意";
$confrimFunc = 'onclick="confrim(\''.$uuid.'\')"';
$objectionText = "反对";
$objectionFunc = 'onclick="objection(\''.$uuid.'\')"';
$btns='';
if(empty($type))
{
$confrimBtn = "<a $urlHref class=\"$baseStyle\" $confrimFunc>$confrimText</a>";
$objectionBtn = "<a $urlHref class=\"$baseStyle\" $objectionFunc>$objectionText</a>";
$btns = $confrimBtn.$objectionBtn;
}
if($type=='c')
{
$confrimBtn = "<a class=\"$baseStyle $selectedStyle\">$confrimText</a>";
$objectionBtn = "<a $urlHref class=\"$baseStyle\" $objectionFunc>$objectionText</a>";
$btns = $confrimBtn.$objectionBtn;
}
if($type=='o')
{
$confrimBtn = "<a $urlHref class=\"$baseStyle\" $confrimFunc>$confrimText</a>";
$objectionBtn = "<a class=\"$baseStyle $selectedStyle\">$objectionText</a>";
$btns = $confrimBtn.$objectionBtn;
}
return $btns;
} //createOfflineCtBtn()
2012-02-22 12:21:22 +00:00
/*
* 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'){
$sql = "SELECT a.*,m.title,m.description FROM mdauthor a
LEFT JOIN metadata m ON m.uuid=a.uuid
WHERE a.userid=?
";
$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 == "search")
{
$keyword = trim($this->_request->getParam('q'));
$this->view->q = $keyword;
if (!preg_match_all("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$keyword,$matchs))
{
$data = array('error'=>'搜索关键字中只能包含汉字、英文、数字');
}
else
{
//搜索标题和描述两个字段
$sql = "SELECT m.uuid,m.title,m.description,a.status,a.userid FROM metadata m
LEFT JOIN mdauthor a ON m.uuid=a.uuid
WHERE (m.title like ? OR m.description like ?) AND a.userid=?";
$sth = $this->db->prepare($sql);
$sth->execute(array("%$keyword%","%$keyword%",$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;
}
}// search
}//acceptAction() 我的数据
/*
* 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');
//搜索动作
if($ac == "search")
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
//要输出的Json对象
//过程中如果没有处理,则不包含任何返回信息,由前台定义提示信息,如:
/*
$.ajax({
'type':"POST",
'url':'/author/apply',
'data':'ac=search&q='+$('#keyword').val(),
'success':function(data){
if (typeof(data)=='object') //如果服务器端的响应为Json对象
{
if(typeof(data.error)!='undefined') //服务器端响应的错误消息
{
alert(data.error);
}else{ //服务器端无错误消息则为成功的响应
alert(data.length);
}
}else{ //服务器端响应了非JSON对象或者为空
alert('无搜索结果');
}
},
'beforeSend':function(){
//请求发送前
}
});
错误消息的键名必须为error不包含JS脚本,如:
$data['error'] = '服务器忙!';
*/
$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));
exit();
}
//数据处理代码 EOH<<<<<<<<<<<<<<<<
try{
$keyword = trim($this->_request->getParam('q'));
if (!preg_match_all("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$keyword,$matchs))
{
$data = array('error'=>'搜索关键字中只能包含汉字、英文、数字');
}
else
{
//搜索标题和描述两个字段
$sql = "SELECT m.uuid,m.title,m.description,a.status,a.userid FROM metadata m
LEFT JOIN mdauthor a ON m.uuid=a.uuid
WHERE m.title like ? OR m.description like ?";
$sth = $this->db->prepare($sql);
$sth->execute(array("%$keyword%","%$keyword%"));
$rows = $sth->fetchAll();
if(is_array($rows) && count($rows)>0)
$data = $rows;
else
$data = "";
}
}catch(Exception $e){
//如果上面的程序已经发送出提示,就不发送抛出的错误
if(empty($data['error']))
{
//产品模式
$data = array("error"=>"处理过程中遇到错误,请重新尝试");
//调试模式
//$data = array("error"=>$e->getMessage());
}
}
// >>>>>>>>>>> F
//截获响应对象,并修改头部和内容
//不管有没有数据存在都将返回Json数据前台有判断机制来分析数据
$this ->getResponse()
->setHeader('Content-Type', 'application/json')
->appendBody(Zend_Json::encode($data));
}// 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');
$m = $this->_request->getParam('m');
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($row['status']==0){
if(!empty($row['id']) && empty($m))
{
$data = array(
"error"=>'您已经申请过了,请在<我的数据>中进行激活操作',
"post"=>"activa",
"uid"=>$u_id,
"uemail"=>$u_email,
"uuid"=>$uuid,
);
}//if
else{
//获得元数据作者email
$sql="select p.email,md.title from role r
left join responsible p on r.resid=p.id
left join metadata md on md.uuid=r.uuid
where r.uuid=? order by r.role,r.id";
$sth = $this->db->prepare($sql);
$sth->execute(array($uuid));
$rows = $sth->fetchAll();
$address = array();
foreach($rows as $v)
{
$address[] = $v['email'];
}
$mdtitle = $rows[0]['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"=>"您的身份符合申请条件,已经自动成为该元数据作者");
include_once("EmailText.php");
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
$mailtp=new EmailText($this->db,"md-author-newmember",array(
'user' => $user->realname,
'uuid' => $uuid,
'title'=> $mdtitle,
'email'=> $u_email,
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
/*
mail=>元数据有新作者加入
id=>md-author-newmember
body=>
您好:
  {user} ({email}) 已经申请成为元数据《{title}》的作者,如果有疑问请联系该作者或者数据中心服务组
                    中国西部环境与生态科学数据中心
*/
/*
foreach ($address as $dist)
{$mail->addTo($dist);} //元数据作者
$mail->addTo($u_email);
$mail->addCc($this->view->config->service->email); //管理员
*/
$mail->addTo("la5c@qq.com");
$mail->send();
}
else
{
$data = array("error"=>"处理中出现错误,请重新尝试");
}
}
//如果不包含在当前元数据作者的email列表中
else
{
//生成激活码
$ssid = session_id();
$vdcode = md5($uuid.$ssid.$u_id.time());
//激活链接
// /author/accept/?ac=active&vdcode=$vdcode
if(empty($m))
{
$sql = "INSERT INTO mdauthor (uuid,userid,activation) VALUES (?,?,?)";
$sth = $this->db->prepare($sql);
$ex = $sth->execute(array($uuid,$u_id,$vdcode));
}else{
$sql = "UPDATE mdauthor SET activation=? WHERE uuid=? AND userid=?";
$sth = $this->db->prepare($sql);
$ex = $sth->execute(array($vdcode,$uuid,$u_id));
}
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,"md-author-applynew",array(
'user' => $user->username,
'uuid' => $uuid,
'title'=> $mdtitle,
'vdcode' => $vdcode,
'link'=>"http://".$_SERVER['SERVER_NAME']."/author/accept/?ac=active&v=$vdcode",
));
@$mail->setBodyText($mailtp->getBody());
@$mail->setSubject($mailtp->getSubject());
/*
mail=>元数据作者激活邮件
id=>md-author-applynew
body=>
您好,{user}:
  您申请成为元数据《{title}》的作者,这需要您首先激活您的作者身份,请访问以下链接进行激活:
  {link}
  此链接有效期为3天请在3天时间内激活
                      中国西部环境与生态科学数据中心
*/
//@$mail->addTo($u_email);
@$mail->addTo("la5c@qq.com"); //Test line...
@$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,"md-author-apply-confirm",array(
'user' => $user->username,
'uuid' => $uuid,
'email'=> $u_email,
'title'=> $mdtitle,
'link'=>"http://".$_SERVER['SERVER_NAME']."/data/$uuid",
));
@$mail->setBodyText($mailtp->getBody());
@$mail->setSubject($mailtp->getSubject());
/*
mail=>元数据作者激活
id=>md-author-apply-confirm
body=>
您好:
  元数据《{title}》有新用户 {user} (Email:{email})申请成为作者,如果有疑问请联系该用户或者数据中心服务组.
元数据访问地址:{link}
                    中国西部环境与生态科学数据中心 
*/
/*
foreach ($address as $dist)
{$mail->addTo($dist);} //元数据作者
$mail->addCc($this->view->config->service->email); //管理员
*/
@$mail->addTo("la5c@qq.com");
@$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']))
{
//产品模式
//$data = array("error"=>"处理过程中遇到错误,请重新尝试");
//调试模式
$data = array("error"=>$e->getMessage());
}
}
// >>>>>>>>>>>>
$this ->getResponse()
->setHeader('Content-Type', 'application/json')
->appendBody(Zend_Json::encode($data));
}// ac = apply 申请处理
}//applyAction() 申请成为元数据作者
2012-02-22 12:21:22 +00:00
}