From a7462e49210a9050f4901c53ac0a04d17608a550 Mon Sep 17 00:00:00 2001
From: Li Jianxuan
Date: Wed, 17 Jul 2013 09:53:44 +0000
Subject: [PATCH] =?UTF-8?q?#546=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E7=AF=AE=E6=93=8D=E4=BD=9C=E7=9A=84=E7=9B=B8=E5=85=B3=E7=B1=BB?=
=?UTF-8?q?=EF=BC=8C=E5=88=9D=E6=AD=A5=E6=A8=A1=E5=9D=97=E5=8C=96=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E7=AF=AE=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE=E6=94=B9?=
=?UTF-8?q?=E8=A7=86=E5=9B=BE=E4=B8=AD=E9=93=BE=E6=8E=A5bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../default/controllers/DataController.php | 4185 ++++++++---------
.../default/views/scripts/data/order.phtml | 80 +-
application/models/order/Order.php | 99 +
.../models/order/listener/OrderEvents.php | 7 +
.../models/order/listener/OrderListener.php | 36 +
.../models/order/mount/OrderOperate.php | 117 +
6 files changed, 2384 insertions(+), 2140 deletions(-)
create mode 100644 application/models/order/Order.php
create mode 100644 application/models/order/listener/OrderEvents.php
create mode 100644 application/models/order/listener/OrderListener.php
create mode 100644 application/models/order/mount/OrderOperate.php
diff --git a/application/default/controllers/DataController.php b/application/default/controllers/DataController.php
index 53934e97..82bb0627 100755
--- a/application/default/controllers/DataController.php
+++ b/application/default/controllers/DataController.php
@@ -1,2100 +1,2085 @@
-db=Zend_Registry::get('db');
- $this->view->config = Zend_Registry::get('config');
- $this->messenger=$this->_helper->getHelper('FlashMessenger');
- $this->view->messages = $this->messenger->getMessages();
- $this->view->theme = new Theme();
- $this->view->main_nav_pageID = "data";
-
- $this->view->nav = array(
- array('link'=>'/','title'=>''),
- array('link'=>'/data','title'=>$this->view->config->title->data),
- );
- }
- function indexAction()
- {
- //序列
- $state=$this->db->query('select s.id,s.name,count(*) as count from series s,dataseries d where d.sid=s.id and length(s.name)>2 group by s.id,s.name order by count desc limit 15');
- $this->view->serie=$state->fetchAll();
- //分类
- $state=$this->db->query('select c.code,name,name_zh,count(*) from category c,categorycode cc where c.code=cc.code group by c.code,cc.name,cc.name_zh');
- $this->view->category=$state->fetchAll();
- //关键词
- $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='place' group by keyword order by count desc limit 20");
- $k1=$state->fetchAll();
- $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='theme' group by keyword order by count desc limit 20");
- //$state=$this->db->query("select k.keyword,count(k.keyword) from keyword k left join heihemetadata m on k.id=m.id where k.keytype='theme' and (m.uuid in (select uuid from dataorder group by uuid order by count(uuid) desc limit 20)) group by k.keyword order by count(k.keyword) desc limit 20");
- $k2=$state->fetchAll();
- $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='discipline' group by keyword order by count desc limit 20");
- $k3=$state->fetchAll();
- $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='stratum' group by keyword order by count desc limit 20");
- $k4=$state->fetchAll();
- $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='temporal' group by keyword order by count desc limit 20");
- //$state=$this->db->query("select k.keyword,count(k.keyword) from keyword k left join heihemetadata m on k.id=m.id where k.keytype='temporal' and (m.uuid in (select uuid from dataorder group by uuid order by count(uuid) desc limit 20)) group by k.keyword order by count(k.keyword) desc limit 20");
- $k5=$state->fetchAll();
- $this->view->keywords=array('place'=>$k1,'theme'=>$k2,'discipline'=>$k3,'stratum'=>$k4,'temporal'=>$k5);
- //最新10个入库数据
- $state=$this->db->query('select id,uuid,title from heihemetadata order by id desc limit 10');
- $this->view->metadata = $state->fetchAll();
- //特色数据
-
- //服务
- $l=new mydir($this->view->config->paths->newsletter,"newsletter_*.pdf");
- $this->view->newsletter=$l->getLast();
- $name=basename($this->view->newsletter,'.pdf');
- list(,$this->view->newsletterno)=explode("_",$name);
-
- $this->view->addHelperPath('helper','Zend_View_Helper_');
- $form=new MaillistForm();
- $form->submit->setLabel('输入邮件地址,订阅数据通讯列表');
-
- $this->view->form=$form;
- if ($this->_request->isPost()) {
- //发送邮件
- $formData=$this->_request->getPost();
- if ($form->isValid($formData)) {
- $mail=new WestdcMailer($this->view->config->smtp);
- $mail->setFrom($formData['email']);
- $mail->setBodyText(".");
- $mail->setSubject('subscribe');
- $mail->addTo($this->view->config->reportemail);
- $mail->send();
- $this->messenger->addMessage('订阅成功,请检查您的邮件!');
- $this->_redirect('/data/');
- }
- } else {
- $auth = Zend_Auth::getInstance();
- if ($auth->hasIdentity()) {
- $user=$auth->getIdentity();
- $formData['email']=$user->email;
- $form->populate($formData);
- }
- }
- $searchform=new SearchForm();
- $this->view->searchform=$searchform;
-
- //其他连接
- }
- function onlinelistAction()
- {
- $page=(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $limit=30;
- $offset=$limit*($page-1);
- $state=$this->db->query('select count(*) from heihemetadata where datatype=0');
- $row=$state->fetchAll();
- $sum=$row[0]['count'];
- $select=$this->db->select();
- $select->from('heihemetadata','*')->where('datatype=0')->order('title')->limitPage($page,$limit);
- $this->view->metadata = $this->db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page,$limit);
- }
- function offlinelistAction()
- {
- $page=(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $limit=30;
- $offset=$limit*($page-1);
- $state=$this->db->query('select count(*) from heihemetadata where datatype=1');
- $row=$state->fetchAll();
- $sum=$row[0]['count'];
- $select=$this->db->select();
- $select->from('heihemetadata','*')->where('datatype=1')->order('title')->limitPage($page,$limit);
- $this->view->metadata = $this->db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page,$limit);
- }
- //展示最近20条离线神情记录情况
- function offlineappAction()
- {
- $sql="select * from offlineapp where ts_approved is not null and pdflink<>'' and status>=0 order by ts_created desc limit 20";
- $this->view->rows=$this->db->fetchAll($sql);
- }
- function requestAction()
- {
- $archives=new Archive($this->db);
- $this->view->item=$archives->getOneArchive('如何申请数据','help');
- }
- function submitAction()
- {
- $archives=new Archive($this->db);
- $this->view->item=$archives->getOneArchive('如何发布数据','help');
- }
- function serviceAction()
- {
- }
- function newsletterAction()
- {
- $l=new mydir($this->view->config->paths->newsletter,"newsletter_*.pdf");
- $this->view->newsletters=$l->toArray();
- $this->view->addHelperPath('helper','Zend_View_Helper_');
- rsort($this->view->newsletters);
- $form=new MaillistForm();
- $this->view->form=$form;
- $form->submit->setLabel('输入邮件地址,订阅数据通讯列表');
- if ($this->_request->isPost()) {
- //发送邮件
- $formData=$this->_request->getPost();
- if ($form->isValid($formData)) {
- //$mail=new Zend_Mail('utf-8');
- $mail=new WestdcMailer($this->view->config->smtp);
- $mail->setFrom($formData['email']);
- $mail->setBodyText(".");
- $mail->setSubject('subscribe');
- $mail->addTo($this->view->config->reportemail);
- /*
- $tr=new Zend_Mail_Transport_Smtp($this->view->config->smtp->host,
- array('ssl' => $this->view->config->smtp->ssl,
- 'auth'=>$this->view->config->smtp->auth,
- 'username'=>$this->view->config->smtp->username,
- 'password'=>$this->view->config->smtp->password));
- $mail->send($tr);
- */
- $mail->send();
- $this->messenger->addMessage('订阅成功,请检查您的邮件!');
- $this->_redirect('/data/newsletter');
- }
- } else {
- $auth = Zend_Auth::getInstance();
- if ($auth->hasIdentity()) {
- $user=$auth->getIdentity();
- $formData['email']=$user->email;
- $form->populate($formData);
- }
- }
- }
- function featureAction()
- {
- $sql="select * from datafeature order by id desc";
- $this->view->feature=$this->db->fetchAll($sql);
- }
-
- function datasetcdAction()
- {
- $cd=new DatasetcdTable();
- $this->view->rows=$cd->fetchAll();
- }
- /*
- * 数据浏览
- */
- function browseAction()
- {
- $page=(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $limit=10;
- $offset=$limit*($page-1);
- $state=$this->db->query('select count(*) from metadata');
- $row=$state->fetchAll();
- $sum=$row[0]['count'];
- $select=$this->db->select();
- $select->from('metadata','*')->order('id desc')->limitPage($page,$limit);
- $this->view->metadata = $this->db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page,$limit);
- }
- function tagAction()
- {
- $id = (int)$this->_request->getParam('id');
- $key = $this->_request->getParam('key');
- $keytype = $this->_request->getParam('keytype');
- $page=(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $limit=10;
- $offset=$limit*($page-1);
- $sql='select keyword,count(*),keytype from keyword right join heihemetadata on keyword.id=heihemetadata.id ';
- if (!empty($keytype) && ($keytype=='place' || $keytype=='theme' || $keytype=='discipline'||$keytype=='temporal')) $sql.=" where keytype='".$keytype."'";
- $sql.=' group by keyword,keytype order by keytype,keyword,count desc';
- $state=$this->db->query($sql);
- $this->view->keywords=$state->fetchAll();
-
- if ($id>0 or !empty($key)) {
- if (empty($key)) {
- $where=$this->db->quoteInto('id = ?',$id);
- $row=$md->fetchRow($where);
- $key=$row->name;
- }
- $this->view->codename=$key;
- $sql=$this->db->quoteInto('select count(m.id) from heihemetadata m,keyword k where m.id=k.id and k.keyword=?',$key);
-
- $state=$this->db->query($sql);
- $row=$state->fetchAll();
- $sum=$row[0]['count'];
- $select=$this->db->select();
- $select->from('heihemetadata','*')->join('keyword','heihemetadata.id=keyword.id')->where('keyword.keyword=?',$key)->order('heihemetadata.title')->limitPage($page,$limit);
- //$sql=$db->quoteInto('select m.* from metadata m,keyword k where m.id=k.id and k.keyword=?',$key);
- //$state=$db->query($sql);
- $this->view->metadata=$this->db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page,$limit);
- }
- }
- /*
- * 数据集序列浏览
- */
- function seriesAction()
- {
- $id = $this->_request->getParam('id');
- if (empty($id)) $id=0;
- if (!is_numeric($id))
- {
- $name=$id;
- $id='';
- }
- $keyword=$this->_request->getParam('keyword');
- if (empty($id)) {
- if (!empty($name))
- {
- $where=$this->db->quoteInto('name = ?',$name);
- $row=$this->db->fetchRow("select * from series where ".$where);
- }
- } else {
- $where=$this->db->quoteInto('id = ?',$id);
- $row=$this->db->fetchRow("select * from series where ".$where);
- }
- if (!empty($id) or !empty($name))
- {
- if (!$row) $this->_redirect('/data');
- $id=$row['id'];
- }
- $page=(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $limit=10;
- $offset=$limit*($page-1);
- $state=$this->db->query('select s.id,name,count(*) from series s,dataseries d where d.sid=s.id group by s.id,s.name');
- $this->view->serie=$state->fetchAll();
- if ($id>0) {
- //$where=$this->db->quoteInto('id = ?',$id);
- //$row=$this->db->fetchRow("select * from series where ".$where);
- $this->view->codename=$row['name'];
- if (!empty($keyword))
- {
- $sql='select count(m.id) as count from heihemetadata m,dataseries d,keyword k where m.id=d.id and m.id=k.id and d.sid=? and k.keyword=?';
- $row=$this->db->fetchAll($sql,array($id,$keyword));
- $this->view->codename.="【关键词:".$keyword."】";
- }else{
- $sql='select count(m.id) as count from heihemetadata m,dataseries d where m.id=d.id and d.sid=?';
- $row=$this->db->fetchAll($sql,array($id));
- }
- $sum=$row[0]['count'];
- $select=$this->db->select();
- $select->from('heihemetadata','*')->join('dataseries','heihemetadata.id=dataseries.id')->where('dataseries.sid=?',$id)->order('heihemetadata.title')->limitPage($page,$limit);
- if (!empty($keyword)) $select->join('keyword','keyword.id=heihemetadata.id')->where('keyword.keyword=?',$keyword);
- $this->view->metadata=$this->db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page,$limit);
- //$this->view->showtools=($sum>$page)?true:false;
- //$this->view->form=new SearchForm();
- $sql=$this->db->quoteInto("select keyword,count(*) as count from (select t.keyword,t.id from keyword t left join dataseries d on t.id=d.id where t.keytype='place' and d.sid=?) as f group by keyword order by count desc limit 30",$id);
- $state=$this->db->query($sql);
- $row=$state->fetchAll();
- $this->view->places=$row;
- $this->view->seriesid=$id;
- } else {
- //提供全部数据集序列列表
- }
- }
- /*
- * 分类浏览模式
- */
- function categoryAction()
- {
- $page = $this->_request->getParam('page');
- $code = (int)$this->_request->getParam('code');
- $state=$this->db->query('select c.code,name,name_zh,count(*) from category c,categorycode cc where c.code=cc.code group by c.code,cc.name,cc.name_zh');
- $this->view->category=$state->fetchAll();
- if ($code>0 && $code<20) {
- $where=$this->db->quoteInto('code = ?',$code);
- $row=$this->db->fetchRow("select * from categorycode where ".$where);
- $this->view->codename=(empty($row['name_zh'])?$row['name']:$row['name_zh']);
- $sql='select count(m.id) from heihemetadata m left join category c on m.id=c.id where c.code=?';
- $row=$this->db->fetchRow($sql,array($code));
- $sum=$row['count'];
- $select=$this->db->select();
- $select->from('heihemetadata as m','*')->joinLeft('category as c','m.id=c.id')->where('c.code=?',$code)->order('m.title')->limitPage($page,$this->limit);
- $this->view->metadata=$this->db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page,$this->limit);
- } else {
- //提供全部分类列表
- }
- }
- /*
- * 时间浏览方式
- * todo:实现xml的缓存,基于时间的缓存(每天)?基于元数据修改的缓存,每次导入后都重新生成一次。
- */
- function timelineAction()
- {
- $fn="time1.xml";
- $rows=$this->db->fetchAll("select ts_created from heihemetadata order by ts_created desc limit 1");
- $last_update=strtotime($rows[0]['ts_created']);
- if (!file_exists($fn) || (filemtime($fn)<$last_update))
- {
- $dateformat="M j Y";
- $md = new MetadataTable();
- $db=$md->getAdapter();
- $state=$db->query('select id,uuid,description,title,timebegin,timeend from heihemetadata where timebegin is not null order by timebegin');
- $rows=$state->fetchAll();
- $timexml='';
- foreach($rows as $row) {
- $timexml.='';
- $desc_length=mb_strlen($row['description'],"UTF-8");
- $desc=mb_substr($row['description'],0,($desc_length>300)?300:$desc_length,"UTF-8");
- if ($desc_length>300) $desc.=" ...";
- $timexml.=htmlspecialchars($desc);
- $timexml.="\n";
- }
- $timexml.='';
- $fp=fopen($fn,'w');
- fwrite($fp,$timexml);
- fclose($fp);
- }
- //$this->_helper->layout->disableLayout();
- }
- /*
- * todo:空间浏览
- */
- function mapAction()
- {
- //use json & openlayers?
- $id=(int)$this->_request->getParam('id');
- if ($id>0) $this->view->params="/id/$id";
- }
- /*
- * 产生geojson数据
- */
- function jsonAction()
- {
- $md=new MetadataTable();
- $db=$md->getAdapter();
- $id = (int)$this->_request->getParam('id');
- $where='';
- if (!empty($id)) { $where=' where id='.$id; }
- $sql='select id,uuid,west,south,north,east,title from heihemetadata'.$where;
- $state=$db->query($sql);
- $rows=$state->fetchAll();
- $geomd=new GeoMetaData();
- foreach($rows as $row){
- if ($id)
- $box=new GeoBox($row['west'],$row['south'],$row['east'],$row['north']);
- else
- $box=new GeoBoxLine($row['west'],$row['south'],$row['east'],$row['north']);
- $feature=new Geofeature();
- $feature->id=$row['id'];
- $feature->addProperties('title',$row['title']);
- $feature->addProperties('uuid',$row['uuid']);
- $feature->addProperties('id',$row['id']);
- $feature->geometry=$box;
- $geomd->addFeature($feature);
- }
- $this->_helper->json($geomd);
- }
- /*
- * 时空动态浏览
- */
- function timemapAction()
- {
- $sql='select id,uuid,west,south,north,east,title,timebegin,timeend from heihemetadata where timebegin is not null';
- $this->view->rows=$this->db->fetchAll($sql);
- }
- /*
- * 返回XML源文件
- */
- function xmlAction()
- {
- $uuid=$this->_request->getParam('uuid');
- $row=$this->db->fetchRow("select xml.data from xml left join metadata on xml.id=metadata.id where metadata.uuid=?",array($uuid));
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- $this->getResponse()->setHeader('Content-Type', 'text/xml')
- ->setBody($row['data']);
- }
- function detailAction()
- {
- $id=(int)$this->_request->getParam('id');
- $xml=new XmlTable();
- $db=$xml->getAdapter();
- $where=$db->quoteInto('id=?',$id);
- $order='id desc';
- $row=$xml->fetchRow($where,$order);
- // Load the XML source
- $xml = new DOMDocument;
- $xml->loadXML($row->data);
- $xsl = new DOMDocument;
- $xsl->load($this->view->config->westdc->xsl);
- // Configure the transformer
- $proc = new XSLTProcessor;
- $proc->importStyleSheet($xsl); // attach the xsl rules
- $this->view->xml=$proc->transformToXML($xml);
- //$this->_helper->layout->disableLayout();
- //$this->_helper->viewRenderer->setNoRender();
- //$this->getResponse()->setHeader('Content-Type', 'text/html')
- // ->setBody($proc->transformToXML($xml));
- }
- function feedAction()
- {
- $feedArray = array(
- 'title' => '中国西部环境与生态科学数据中心',
- 'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/feed',
- 'description' => '共享西部计划产生的数据',
- 'language' => 'zh-CN',
- 'charset' => 'utf-8',
- 'published' => time(),
- //'generator' => 'Zend Framework Zend_Feed',
- 'entries' => array()
- );
- $sql="select * from heihemetadata order by ts_created desc";
- $rs=$this->db->fetchAll($sql);
- $feedArray['published']=strtotime($rs[0]['ts_created']);
- foreach($rs as $r)
- {
- $feedArray['entries'][] = array(
- 'title' => $r['title'],
- 'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
- 'guid' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
- //'content'=>$r['description'],
- 'description' => $r['description'],
- 'lastUpdate' => strtotime($r['ts_created'])
- );
- }
- $feed = Zend_Feed::importArray($feedArray,'rss');
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- $feed->send();
- }
- /*
- * todo: search
- */
- function searchAction()
- {
- $this->view->addHelperPath('helper','Zend_View_Helper_');
- $form=new SearchForm();
- $this->view->form=$form;
- //$form->submit->setLabel('快速搜索');
- $key=$this->_request->getParam('q');
- if (!empty($key)) {
- //$formData=$this->_request->getPost();
- //include_once("bcspamblock.php");
- //if ($form->isValid($formData)) {
- $page=@(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $offset=$this->limit*($page-1);
- $search=new Search($key);
- $where=$search->sql_expr(array("title","description"));
- $row=$this->db->fetchAll("select count(*) from heihemetadata where ".$where);
- $sum=$row[0]['count'];
- $sql="select uuid,title,id,description from heihemetadata where ".$where." order by title limit ? offset ?";
- $this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
- $this->view->page=new Pagination($sum,$page,$this->limit);
- $this->view->key=$key;
- }
- }
- /*
- * todo: 高级搜索
- */
- function advancesearchAction()
- {
- $this->view->addHelperPath('helper','Zend_View_Helper_');
- //$form=new SearchForm();
- //$this->view->form=$form;
-
- $md=new MetadataTable();
- $db=$md->getAdapter();
- $page=(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $limit=10;
- $offset=$limit*($page-1);
- $key=$this->_request->getParam('q');
- $n=(int)$this->_request->getParam('n');
- $s=(int)$this->_request->getParam('s');
- $e=(int)$this->_request->getParam('e');
- $w=(int)$this->_request->getParam('w');
- if (!(empty($n) && empty($key))) {
- if (empty($n)) $n=90;
- if (empty($s)) $s=-90;
- if (empty($e)) $e=180;
- if (empty($w)) $w=-180;
- $start=$this->_request->getParam('start');
- $end=$this->_request->getParam('end');
- if (!empty($key)) {
- $sql='select count(*) from heihemetadata where east and west>? and north and south>? and (title ilike ? or description ilike ?)';
- $row=$db->fetchAll($sql,array($e,$w,$n,$s,'%'.$key.'%','%'.$key.'%'));
- } else {
- $sql='select count(*) from heihemetadata where east and west>? and north and south>?';
- $row=$db->fetchAll($sql,array($e,$w,$n,$s));
- }
- $sum=$row[0]['count'];
- $select=$db->select();
- $select->from('heihemetadata','*')->where('east',$e)->where('west>?',$w)->where('north',$n)->where('south>?',$s);
- if (!empty($key)) $select->where('(title ilike ? or description ilike ?)','%'.$key.'%');
- $select->order('title')->limit($limit,$offset);
- $this->view->metadata = $db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page);
- $this->view->key=$key;
- }
- }
- /*
- * 根据id或uuid来查看元数据
- * id为一组数字,uuid为唯一标识符
- */
- function viewAction()
- {
- $id = (int)$this->_request->getParam('id');
- $sql="select m.*,s.status,g.id as gid,t.filename,i.doi as datadoi,i.authors,i.author_en,i.publisher,i.publisher_en, date_part('year',i.ts_published) as publish_year from heihemetadata m left join mdstatus s on m.uuid=s.uuid
- left join thumbnail t on t.id=m.id left join geonetworkmetadata g on m.uuid=g.uuid left join datadoi i on i.uuid=m.uuid where ";
- if (empty($id)) {
- $uuid = $this->_request->getParam('uuid');
- if (empty($uuid)) $this->_redirect('/data');
- $where=$this->db->quoteInto('m.uuid = ?',$uuid);
- } else {
- $where=$this->db->quoteInto('m.id = ?',$id);
- }
- $sql.=$where;
- $this->db->setFetchMode(Zend_Db::FETCH_OBJ);
- $row=$this->db->fetchRow($sql);
- if (!$row) $this->_redirect('/data');
- $id=$row->id;
- $uuid=$row->uuid;
- $this->view->metadata=$row;
- //提前对表格进行预处理
- $wiki=new WikiFormat();
- $this->view->metadata->description=$wiki->parseTable($this->view->escape($row->description));
- //处理外部链接
- $this->view->metadata->description=preg_replace('/\[\s*(http:\/\/.+?)\s+(.*?)\]/m','$2',$this->view->metadata->description);
- $this->view->thumburl='/gndata/'.sprintf('%05d',floor(($row->gid+0.1)/100)*100).'-'.sprintf('%05d',ceil(($row->gid+0.1)/100)*100-1)."/".$row->gid;
- $this->view->thumburl.='/public/'.str_replace('_s.','.',$row->filename);
- if (is_numeric($row->projection))
- {
- $sql="select proj4text from spatial_ref_sys where auth_srid=?";
- $rs=$this->db->fetchRow($sql,array((int)$row->projection));
- if ($rs) $this->view->projection=$rs->proj4text;
- }
-
- $sql = "select * from keyword where id=? order by keytype,ts_created";
- $sth = $this->db->prepare($sql);
- $rs = $sth->execute(array($id));
- $this->view->keys = $sth->fetchAll(PDO::FETCH_BOTH);
-
- $sql='select c.code,cc.name,cc.name_zh from category c,categorycode cc where c.code=cc.code and c.id= ?';
- $state=$this->db->query($sql,array($id));
- $this->view->category=$state->fetchAll();
- $sql='select s.name,s.id from dataseries d, series s where d.sid=s.id and d.id= ?';
- $state=$this->db->query($sql,array($id));
- $this->view->series=$state->fetchAll();
- $sql=$this->db->quoteInto("select count(*) as count from dataorder where uuid=?",$uuid);
- $row=$this->db->fetchRow($sql);
- $this->view->downloaded=$row->count;
- //update the viewed times
- $sql="update mdstat set viewed=viewed+1 where uuid=?";
- $this->db->query($sql,array($uuid));
- $sql=$this->db->quoteInto("select viewed from mdstat where uuid=?",$uuid);
- $row=$this->db->fetchRow($sql);
- $this->view->viewed=$row->viewed;
- //数据文档
- $sql="select linkage from onlineresource where uuid=? and description='数据说明文档'";
- $sql=$this->db->quoteInto($sql,$uuid);
- $row=$this->db->fetchRow($sql);
- if ($row) $this->view->doc=$row->linkage;
- //相关资源
- $sql="select * from onlineresource where uuid=? and (linkage not like '%ftp.westgis%') and name<>'元数据地址'";
- $sql=$this->db->quoteInto($sql,$uuid);
- $this->view->resources=$this->db->fetchAll($sql);
- //建议参考文献
- $sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=? and m.reftype=0 order by m.place";
- $sql=$this->db->quoteInto($sql,$uuid);
- $this->view->ref=$this->db->fetchAll($sql);
- //用户发表文献
- $sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=? and m.reftype=1";
- $sql=$this->db->quoteInto($sql,$uuid);
- $this->view->userref=$this->db->fetchAll($sql);
- //多篇引用形式:hiwater
- $sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=? and m.reftype=3 order by m.place";
- $sql=$this->db->quoteInto($sql,$uuid);
- $this->view->mcitation=$this->db->fetchAll($sql);
- //相关用户
- $sql="select p.email,p.individual,p.organisation,r.role from role r left join responsible p on r.resid=p.id where r.uuid=? order by r.role,r.id";
- $this->view->authors=$this->db->fetchAll($sql,array($uuid));
- //数据限制信息
- $sql="select u.* from uselimit u left join mdlimit m on u.id=m.lid where m.uuid=?";
- $this->view->uselimits=$this->db->fetchAll($sql,array($uuid));
- //相关下载
- $sql = "select d.uuid,count(distinct(d.userid)) as downtimes,m.title from dataorder d left join metadata m on d.uuid=m.uuid where d.userid in (
- select distinct(userid) from dataorder where uuid=? and status in (0,5)
- ) and d.uuid<>? and length(m.title)>2 group by d.uuid,m.title order by count(distinct(d.userid)) desc limit 10;";
- $this->view->downlists = $this->db->fetchAll($sql,array($uuid,$uuid));
- //相关文献
- $sql="select a.*,array_to_string(array(select author from knl_author t where t.item_id=a.item_id order by place asc),'; ') as author from knl_article a where (";
- foreach($this->view->keys as $k)
- {
- if ($k['keytype']=='theme')
- {
- $sql.=" a.title like '%".$k['keyword']."%' or ";
- }
- }
- $sql.=" 1<>1) order by a.ts_created desc limit 10";
- $this->view->literature=$this->db->fetchAll($sql);
- //相关元数据,根据同名关键词实现
- $sql="select distinct(md.uuid),md.title from keyword kw left join heihemetadata md on kw.id=md.id where kw.keyword in (select k.keyword from keyword k left join metadata m on k.id=m.id where m.id=? and k.keytype='theme') and kw.id<>? limit 10";
- $this->view->related=$this->db->fetchAll($sql,array($id,$id));
- //用户下载记录
- $sql = "select o.ts_created,m.uuid,u.realname,u.unit,oa.project as onlineproject, fa.project as offlineproject
- from dataorder as o left join metadata as m on o.uuid = m.uuid left join users as u on o.userid=u.id
- left join onlineapp oa on o.onlineappid=oa.id left join offlineapp fa on o.offlineappid=fa.id
- where m.uuid = '$uuid' and (o.status=0 or o.status=5) and u.realname IS NOT NULL order by o.ts_created desc limit 10";
- $this->view->downhistory=$this->db->fetchAll($sql);
- //数据附件
- $sql = $this->db->quoteInto("select m.id,a.realname from mdattach m left join attachments a on m.id=a.id where m.uuid=?",$uuid);
- $this->view->attachments = $this->db->fetchAll($sql);
- //数据版本
- $sql = "SELECT count(id) as c FROM mdversion WHERE uuid=? AND changelog IS NOT NULL";
- $sth = $this->db->prepare($sql);
- $sth->execute(array($uuid));
- $row = $sth->fetch();
- $this->view->version = $row;
- $archives = new Archive($this->db);
- $data_archives = $archives->getArchiveByUUID($uuid);
- if(!empty($data_archives))
- {
- foreach($data_archives as $k=>$v)
- {
- $data_archives[$k]['url'] = $archives->getArchiveUrlByCid($v['id']);
- }
- }
- $this->view->data_archives = $data_archives;
- //支持项目
- include_once("data/Fund.php");
- $fund = new Fund($this->db);
- $this->view->fund = $fund->fetch($uuid);
-
- //自动跳转
- $sql="select s.* from datasource d left join source s on d.sourceid=s.id where d.uuid=?";
- $row=$this->db->fetchRow($this->db->quoteInto($sql,$uuid));
- $jump=$this->_request->getParam('jump');
- if ($jump=="") $jump=1;//默认跳转
- if (@$row->has_pages && ($jump==1))
- {
- $this->_helper->viewRenderer($row->code.'/view',null,true);
- }
- } //viewAction
-
- /*
- getversionAction() 获取数据版本
- */
- function getversionAction(){
-
- $ac = $this->_getParam('ac');
- $uuid = $this->_getParam('uuid');
-
- if($ac == 'list')
- {
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
-
- $sql = "SELECT v.changelog,v.ts_created,u.username FROM mdversion v
- LEFT JOIN users u ON v.userid=u.id
- WHERE v.uuid=? AND v.changelog IS NOT NULL
- ORDER BY v.ts_created DESC";
-
- $sth = $this->db->prepare($sql);
- $sth->execute(array($uuid));
- $rows = $sth->fetchAll();
-
- if($rows)
- {
- foreach($rows as $k=>$v)
- {
- $rows[$k]['ts_created'] = date("Y-m-d H:i",strtotime($v['ts_created']));
- $rows[$k]['changelog'] = str_replace("\n","
",$v['changelog']);
- }
- $data = array("list"=>$rows);
- $this->jsonexit($data);
- return true;
- }else{
- $data = array("error"=>"处理中出现错误");
- $this->jsonexit($data);
- return true;
- }
- }
-
- }//getversionAction()
-
- function replace($string){
- $patterns = array("/\"/i","/\'/i");
- $replacements = array("“","‘");
- ksort($patterns);
- ksort($replacements);
- return preg_replace($patterns, $replacements, $string);
- }//引号替换
-
-
- function postcommentAction(){
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- try{
- $auth = Zend_Auth::getInstance();
- if($auth->hasIdentity())
- {
- $user = $auth->getIdentity();
- $userid = $user->id;
- }else
- {
- $userid=0;
- }
-
- $author = mb_substr($this->replace(trim($this->_request->getParam('author'))),0,30,'UTF-8');
- $email = mb_substr($this->replace(trim($this->_request->getParam('email'))),0,60,'UTF-8');
- $url = mb_substr($this->replace(trim($this->_request->getParam('url'))),0,60,'UTF-8');
- $content = $this->replace(trim($this->_request->getParam('content')));
- $vdcode = mb_substr($this->replace(trim($this->_request->getParam('vdcode'))),0,4,'UTF-8');
-
- if(empty($author))
- {
- echo "请输入您的名字";
- exit();
- }
-
- if(strlen($author)<3) exit("姓名长度不得少于2个汉字 :)");
-
- if(empty($email))
- {
- echo "请输入您的电子邮箱地址";
- exit();
- }
-
- if(strlen($email)<4) exit("Email长度太短,请填写正确的Email :)");
-
- if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i",$email))
- {
- echo "Email格式不正确";
- exit();
- }
-
- if(strlen($content)<5) exit("评论长度不得少于3个汉字 :)");
-
- if(preg_match("/script/i",$content))
- {
- $content = preg_replace("/script/i","script",$content);
- }
-
- if(preg_match("/<|>/",$content))
- {
- $data=array(
- '<'=>'<',
- '>'=>'>',
- );
-
- $patterns = array();
- $replacements = array();
- foreach($data as $k=>$v)
- {
- $patterns[]='/'.$k.'/i';
- $replacements[]=$v;
- }
- ksort($patterns);
- ksort($replacements);
- $content=preg_replace($patterns, $replacements, $content);
- if(!empty($url))
- {
- $url=preg_replace($patterns, $replacements, $url);
- }
- }
-
- if(preg_match("/script/i",$url))
- {
- $url = preg_replace("/script/i","script",$url);
- }
-
- if(!preg_match("/http:\/\//",$url))
- {
- $url = "http://".$url;
- }
-
- $uuid = trim($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();
- }
-
- if(strtolower($vdcode) != $_SESSION['vdcodes'])
- {
- echo "验证码错误,请重新输入";
- exit();
- }
-
-
- $data = array(
- 'uuid' => $uuid,
- 'uid' => $userid,
- 'author' => $author,
- 'email' => $email,
- 'url' => $url,
- 'ip' => $_SERVER['REMOTE_ADDR'],
- 'content' => $content,
- 'agent' => $_SERVER['HTTP_USER_AGENT'],
- 'type' => 'comment'
- );
-
- $sql = "INSERT INTO comments (author,email,url,ip,content,agent,type,uuid,userid) VALUES (?,?,?,?,?,?,?,?,?)";
- $sth = $this->db->prepare($sql);
- $exec = $sth->execute(array($data['author'],$data['email'],$data['url'],$data['ip'],$data['content'],$data['agent'],$data['type'],$data['uuid'],$data['uid']));
-
- if($exec)
- {
- $sql = "SELECT u.email FROM mdauthor au
- LEFT JOIN users u on au.userid=u.id
- WHERE au.uuid='$uuid'";
- $sth = $this->db->query($sql);
- $rows = $sth->fetchAll();
-
- @$mailtp=new EmailText(
- $this->db,
- 'data-comment-note',
- array(
- 'user' =>$user->username,
- 'uuid' =>$data['uuid'],
- 'title' =>$this->replace(trim($this->_request->getParam('mdtitle'))),
- 'content'=>$content
- )
- );
- @$mail=new WestdcMailer($this->view->config->smtp);
- @$mail->setBodyText($mailtp->getBody());
- @$mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
- @$mail->addTo($this->view->config->service->email);
- if(is_array($rows) && count($rows)>0)
- {
- foreach($rows as $v)
- {
- @$mail->addTo($v['email']);
- }
- }
- @$mail->setSubject($mailtp->getSubject());
- @$mail->send();
- $msg = "用户".$user->username."对元数据《".$this->replace(trim($this->_request->getParam('mdtitle')))."》进行了评论,点击查看";
- include_once("message.php");
- message::post($this->db,0,-1,"收到新数据评论",$msg);
- echo "评论成功";
- exit();
- }else
- {
- echo "评论失败,请重试 :)";
- exit();
- }
- }catch(Exception $e){
- echo "出错了,请稍后再试";
- exit();
- }
- }//ajax评论
-
-
- /*
- * 数据评论,根据UUID读取
- */
- function commentAction()
- {
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- $uuid=$this->_request->getParam('uuid');
- if (empty($uuid)) die();
- $sql="select * from comments where uuid=? AND reply=0 order by id desc";
- $comments=$this->db->fetchAll($sql,array($uuid));
-
- $paginator = Zend_Paginator::factory($comments);
- $paginator->setCurrentPageNumber($this->_getParam('page'));
- $paginator->setItemCountPerPage(5);
- $paginator->setView($this->view);
- Zend_View_Helper_PaginationControl::setDefaultViewPartial('data/pagination_ajax.phtml');
-
- include_once("Avatar.php");
- $avatar = new Avatar();
- if ($paginator)
- {
- foreach($paginator as $c)
- {
- //$author=$this->view->escape($c['author']);
- $sql = "SELECT cr.id,cr.content as body,cr.reply,u.username,cr.ts_created,u.usertype,u.email as email,
- (SELECT au.uuid FROM mdauthor au WHERE au.userid=u.id AND au.uuid='$uuid') as uuid
- FROM comments cr
- LEFT JOIN users u ON cr.userid=u.id
- WHERE cr.reply=?";
- $sth = $this->db->prepare($sql);
- $sth->execute(array($c['id']));
- $replys = $sth->fetchAll();
- $replyhtml = "";
- if(!empty($replys) || count($replys)>0)
- {
- foreach($replys as $v)
- {
- $usertype = "";
- $color = "";
- if($v['usertype'] == "administrator")
- {
- $usertype = "[管理员]";
- $color="#009d00";
- }
- if($v['uuid'] == $uuid)
- {
- $usertype = "[数据作者]";
- $color="#add2e9";
- }
- if(!empty($color))
- {
- $color = 'background:'.$color.';color:#FFFFFF;';
- }
- $img = $avatar->Get($v['email'],48);
- $replyhtml .='
-
- ';
-
- }
- }
-
- $img = $avatar->Get($c['email'],64);
- //$img = '';
-
- $author = $c['author'];
- $author = ($c['url'])?''.$author.'':$author;
- $author = ''.$author."";
- $time = '发表于'.date('Y-m-d H:i:s',strtotime($c['ts_created'])).'';
- print '
-
- ';
- }
- echo ''.$paginator.'
';
- }//else echo "No comments.";
- }//评论列表
-
- /**
- * 判断用户是否填写了申请信息
- * @param string $uuid
- * @param int $userid
- */
- function todownloadAction() {
-
- $this->view->pageID = "account-dataorder";
-
- $this->_helper->viewRenderer('onlineapp-download');
-
- $this->view->uuid = $uuid = $this->_request->getParam('uuid');
-
- $auth = Zend_Auth::getInstance();
- if (!$auth->hasIdentity())
- {
- $this->view->AlertType = "alert-error";
- $this->view->msg = "请先登录您的账户后进行下载,页面将自动跳转";
- $this->view->jump_url = '/account/login/?href=/data/todownload/uuid/'.$uuid;
- return true;
- }
-
- if(empty($uuid))
- {
- $this->view->AlertType = "alert-error";
- $this->view->msg = "参数错误!";
- $this->view->jump_url = "/data";
- return true;
- }
-
- $this->view->projectType = array(
- "请选择项目类型" => "",
- "国家973计划项目课题" => "国家973计划项目课题",
- "国家863计划课题"=>"国家863计划课题",
- "国家级科技支撑课题" => "国家级科技支撑课题",
- "国家级科技重大专项" => "国家级科技重大专项",
- "国家级国家重大工程" => "国家级国家重大工程",
- "国家级国家自然科学基金" => "国家级国家自然科学基金",
- "国际合作项目"=>"国际合作项目",
- "省部级项目" => "省部级项目",
- "其他项目工程" => "其他项目工程",
- );
-
- $userid = Zend_Auth::getInstance()->getIdentity()->id;
-
- $submit = $this->_getParam('submit');
- if(!empty($submit)){
-
- $datas = array();
- $datas['realname'] = $this->_request->getParam('realname');
- $datas['unit'] = $this->_request->getParam('unit');
- $datas['phone'] = $this->_request->getParam('phone');
- $datas['address'] = $this->_request->getParam('address');
- $datas['postcode'] = $this->_request->getParam('postcode');
- $datas['email'] = $this->_request->getParam('email');
- $datas['project'] = $this->_request->getParam('project');
- $datas['project_id'] = $this->_request->getParam('project_id');
- $datas['project_type'] = $this->_request->getParam('project_type');
- $datas['project_title'] = $this->_request->getParam('project_title');
-
- $this->view->info = $datas;
-
- $this->view->AlertType = "alert-error";
-
- foreach($datas as $k=>$v)
- {
- if(empty($v))
- {
- $this->view->error = "每一项内容都需要填写";
- return true;
- }
- }
-
- if(!is_numeric($datas['postcode']))
- {
- $this->view->error = "联系电话和邮政编码请填写数字";
- return true;
- }
-
- if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i",$datas['email']))
- {
- $this->view->error = "请填写正确的email地址";
- return true;
- }
-
- if(mb_strlen($datas['project'],"utf-8")<8)
- {
- $this->view->error = "项目介绍内容不少于8个字符";
- return true;
- }
-
- if(preg_match('/^\d+$/',$datas['project']))
- {
- $this->view->error = "请输入有意义的项目介绍内容";
- return true;
- }
-
- $data = array(
- 'userid' => $userid,
- 'username' => $datas['realname'],
- 'unit' => $datas['unit'],
- 'phone' => $datas['phone'],
- 'address' => $datas['address'],
- 'postcode' => $datas['postcode'],
- 'project' => $datas['project'],
- 'uuid' =>$uuid,
- 'email' =>$datas['email'],
- 'project_id'=>$datas['project_id'],
- 'project_title'=>$datas['project_title'],
- 'project_type'=>$datas['project_type']
- );
-
- if($this->db->insert('onlineapp',$data))
- {
- $select = "select id from onlineapp where userid='$userid' order by id desc";
- $re=$this->db->query($select);
- $row=$re->fetch();
-
- $this->view->AlertType = "alert-success";
- $this->view->jump_url = '/data/download/uuid/'.$uuid.'/onlineappid/'.$row['id'];
- $this->view->msg = "您的信息已经提交成功,可以进行下载。请等待页面自动跳转,view->jump_url."\">或点击这里进入下载页面";
-
- $msg = "用户{$data['username']} 填写了在线数据申请表 查看详细";
- $title = "用户 {$data['username']} 申请了在线下载数据";
- include_once("message.php");
- message::post($this->db,0,-1,$title,$msg);
-
- return true;
- }
- else {
- $this->view->AlertType = "alert-error";
- $this->view->error = "申请失败,请稍后重新尝试";
- $this->view->info = $data;
- return true;
- }
-
- return true;
- }else{
-
- $testsql="select * from onlineapp where userid='$userid' and uuid='$uuid' order by id desc";
- $result=$this->db->query($testsql);
- $rows = $result->fetch();
- if (empty($rows['id']))
- {
- include_once("Users.php");
- $usr = new Users($this->db);
- $this->view->info = $usr->getUserInfo($userid);
- return true;
- }
- else
- {
- $datas['realname'] = $rows['username'];
- $datas['unit'] = $rows['unit'];
- $datas['phone'] = $rows['phone'];
- $datas['address'] = $rows['address'];
- $datas['postcode'] = $rows['postcode'];
- $datas['email'] = $rows['email'];
- $datas['project'] = $rows['project'];
- $datas['project_id'] = $rows['project_id'];
- $datas['project_type'] = $rows['project_type'];
- $datas['project_title'] = $rows['project_title'];
- $this->view->info = $datas;
- return true;
- }
- }
-
- return true;
-
- $userid=Zend_Auth::getInstance()->getIdentity()->id;
-
- $datas = array();
- $submited = $this->_request->getParam('submited');
- $datas['username'] = $this->_request->getParam('username');
- $datas['unit'] = $this->_request->getParam('unit');
- $datas['phone'] = $this->_request->getParam('phone');
- $datas['address'] = $this->_request->getParam('address');
- $datas['postcode'] = $this->_request->getParam('postcode');
- $datas['email'] = $this->_request->getParam('email');
- $datas['project'] = $this->_request->getParam('project');
- $datas['project_id'] = $this->_request->getParam('projectid');
- $datas['project_type'] = $this->_request->getParam('projecttype');
- $datas['project_title'] = $this->_request->getParam('projecttitle');
-
-
-
- $form=$this->creatform($datas);
-
- if (!empty($submited) && $ft==0){
-
- foreach($datas as $k=>$v)
- {
- if($v == '')
- {
- echo $form.'';
- exit();
- }
- }
-
- if(!is_numeric($datas['postcode']))
- {
- echo $form.'';
- exit();
- }
-
- if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i",$datas['email']))
- {
- echo $form.'';
- exit();
- }
-
- if(mb_strlen($datas['project'],"utf-8")<8)
- {
- echo $form.'';
- exit();
- }
-
- if(preg_match('/^\d+$/',$datas['project']))
- {
- echo $form.'';
- exit();
- }
-
- $data = array(
- 'userid' => $userid,
- 'username' => $datas['username'],
- 'unit' => $datas['unit'],
- 'phone' => $datas['phone'],
- 'address' => $datas['address'],
- 'postcode' => $datas['postcode'],
- 'project' => $datas['project'],
- 'uuid' =>$uuid,
- 'email' =>$datas['email'],
- 'project_id'=>$datas['project_id'],
- 'project_title'=>$datas['project_title'],
- 'project_type'=>$datas['project_type']
- );
-
- if($this->db->insert('onlineapp',$data))
- {
- $select = "select id from onlineapp where userid='$userid' order by id desc";
- $re=$this->db->query($select);
- $row=$re->fetch();
- echo "您的信息已经提交成功,可以进行下载。
- 如果页面没有自动跳转,请点击这里进入下载页面
- ";
- $msg = "用户{$data['username']} 填写了在线数据申请表 查看详细";
- $title = "用户 {$data['username']} 申请了在线下载数据";
- include_once("message.php");
- message::post($this->db,0,-1,$title,$msg);
- exit();
- }
- else {
- echo $form.'';
- exit();
- }
-
- }else if( $ft==1 )
- {
- $testsql="select * from onlineapp where userid='$userid' and uuid='$uuid' order by id desc";
- $result=$this->db->query($testsql);
- $rows = $result->fetch();
- if (empty($rows['id']))
- {
- $sql="select * from users where id='$userid'";
- $result=$this->db->query($sql);
- $rows = $result->fetch();
-
- $datas['username'] = $rows['realname'];
- $datas['unit'] = $rows['unit'];
- $datas['phone'] = $rows['phone'];
- $datas['address'] = $rows['address'];
- $datas['postcode'] = $rows['postcode'];
- $datas['email'] = $rows['email'];
- $datas['project'] = $rows['project'];
- $datas['project_id'] = $rows['project_id'];
- $datas['project_type'] = $rows['project_type'];
- $datas['project_title'] = $rows['project_title'];
-
- echo $this->creatform($datas);
- exit();
- }
- else
- {
- $datas['username'] = $rows['username'];
- $datas['unit'] = $rows['unit'];
- $datas['phone'] = $rows['phone'];
- $datas['address'] = $rows['address'];
- $datas['postcode'] = $rows['postcode'];
- $datas['email'] = $rows['email'];
- $datas['project'] = $rows['project'];
- $datas['project_id'] = $rows['project_id'];
- $datas['project_type'] = $rows['project_type'];
- $datas['project_title'] = $rows['project_title'];
-
- echo $this->creatform($datas);
- exit();
- }
- }
-
- }
-
- /*
- * 数据下载,根据UUID进行判断
- * 一次只下载一个数据(一个元数据项)
- */
- function downloadAction()
- {
- $uuid=$this->_request->getParam('uuid');
- $onlineappid=$this->_request->getParam('onlineappid');
- $this->view->pageID = "account-dataorder";
-
- if (empty($uuid)) $this->_redirect('/data');
-
- $auth = Zend_Auth::getInstance();
- if($auth->hasIdentity())
- {
- $user = $auth->getIdentity();
- $userid = $user->id;
- }
-
- $testsql="select id,has_send_mail from onlineapp where userid='$userid' and uuid='$uuid' order by id desc";
- $result=$this->db->query($testsql);
- $rows = $result->fetch();
- $has_send_mail=$rows['has_send_mail'];
- if (empty($rows['id']))
- {
- $this->_redirect('/data/'.$uuid);
- }
- else
- {
- $sql="select onlineappid,id from dataorder where status=0 and userid='$userid' and uuid='$uuid' order by id desc";
- $re=$this->db->query($sql);
- $row=$re->fetch();
- if(empty($row['onlineappid']))
- {
- $data = array(
- 'userid' => $userid,
- 'uuid' => $uuid,
- 'onlineappid'=> $onlineappid,
- 'ts_approved'=>'now()',
- );
- try {$this->db->insert('dataorder',$data);} catch (Exception $e) {}
- }else
- {
- $sql="update dataorder set onlineappid='$onlineappid',ts_approved=now() where id='{$row['id']}'";
- try {$this->db->exec($sql);} catch (Exception $e) {}
- }
- }
-
-
- $sql=$this->db->quoteInto("select * from dataset o left join metadata m on o.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid where s.status>4 and m.datatype=0 and m.uuid=?",$uuid);
- $data=$this->db->fetchRow($sql);
- $updateftp=$updateftp1=false;
- $this->view->md=$data;
- $this->view->userpass=md5('westdc'.rand(1000,9999));
- $this->view->ftptime=date('Y-m-d H:i:s', strtotime('+1 week'));
- $sql=$this->db->quoteInto("select * from ftpuser where userid=?",$userid);
- $row=$this->db->fetchRow($sql);
- $datacount=$row['datacount'];
- if ($data['host']=='ftp.westgis.ac.cn')
- {
- //添加FTP帐号信息以及时间控制信息
- $updateftp=true;
- $g6=new G6ftp();
- $g6->db=$this->db;
- //不进行判断,每个元数据中的下载地址都对应一个虚拟路径
- $path[]=$data['path'];
- $this->view->username='westdc'.$userid;
- $uu=(object)array("id"=>$userid,
- "username"=>$this->view->username,
- "password"=>$this->view->userpass,
- "path"=>$path,
- "maxdata"=>$this->view->config->download->max,
- "time"=>$this->view->ftptime,
- "datacount"=>$datacount);
- if ($g6->createuser($uu)) {
- $this->view->userpass=$g6->pwd;
- $this->view->ftptime=$g6->time;
- } else {
- $this->messenger->addMessage('错误:您正在进行下载的在线数据数已经超过系统允许的最大值,请在下面点击“完成”或“取消”对应的在线数据下载!');
- $this->_redirect('/data/order');
- }
- } elseif ($data['host']=='ftp1.westgis.ac.cn')
- {
- //添加FTP1帐号信息以及时间控制信息
- $proftp=new Proftp();
- $proftp->db=$this->db;
- //proftp离线用户名和g6的用户名稍有不同
- $this->view->username='westdc_'.$userid;
- $uu=(object)array("id"=>$userid,
- "username"=>$this->view->username,
- "password"=>$this->view->userpass,
- "host"=>'ftp1.westgis.ac.cn',
- "param"=>"onlineappid=".$onlineappid,
- "maxdata"=>$this->view->config->download->max,
- "time"=>$this->view->ftptime,
- "datacount"=>$datacount);
- if ($proftp->createuser($uu))
- {
- $this->view->userpass=$proftp->pwd;
- $this->view->ftptime=$proftp->time;
- }
- } elseif ($data['host']=='ftp2.westgis.ac.cn')
- {
- //添加FTP2帐号信息以及时间控制信息
- $proftp=new Pureftp();
- $proftp->db=$this->db;
- $this->view->username='westdc_'.$userid;
- $uu=(object)array("id"=>$userid,
- "username"=>$this->view->username,
- "password"=>$this->view->userpass,
- "host"=>'ftp2.westgis.ac.cn',
- "param"=>"onlineappid=".$onlineappid,
- "maxdata"=>$this->view->config->download->max,
- "time"=>$this->view->ftptime,
- "datacount"=>$datacount);
- if ($proftp->createuser($uu))
- {
- $this->view->userpass=$proftp->pwd;
- $this->view->ftptime=$proftp->time;
- }
- }
- $ftpurl='ftp://'.$this->view->username.'@'.$data['host'];
- if ($data['host']=='ftp.westgis.ac.cn') $ftpurl.=$data['path'];
-
- //设置输出
- //if ($updateftp || $updateftp1) $this->view->userpass=$password;
- $this->view->ftpurl=$ftpurl;
- //更新下载记录
- //todo: 尝试添加一个RULE:若有对应数据存在,则不插入( userid,uuid,status=0,ts_approved:null)
- /*$sql="select * from dataorder where userid=? and uuid=? and status=0 and (ts_approved is null)";
- $u=$this->db->fetchRow($sql,array($userid,$uuid));
- if (empty($u)) {
- $sql="insert into dataorder (userid,uuid,ts_created) values(?,?,now())";
- $this->db->query($sql,array($userid,$uuid));
- }*/
- if (!empty($ftpurl) && !$has_send_mail)
- {
- $data = array(
- "uuid"=>$uuid,
- "title"=>$this->view->md['title']."(".$this->view->md['filesize']."MB)",
- "user"=>$user->username,
- "ftpuser"=>$this->view->username,
- "ftppwd"=>$this->view->userpass,
- "ftptime"=>$this->view->ftptime,
- "ftpurl"=>$this->view->ftpurl,
- "note"=>$updateftp?'BTW:请注意登陆后要手工进入对应的目录!':''
- );
- $mailtp=new EmailText($this->db,'online-download',$data);
- $mail=new WestdcMailer($this->view->config->smtp);
- $mail->setBodyText($mailtp->getBody());
- $mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
- $mail->addTo($user->email);
- $mail->setSubject($mailtp->getSubject());
- @$mail->send();
- $sql="update onlineapp set has_send_mail=true where id=?";
- $sth=$this->db->prepare($sql);
- $sth->execute(array($onlineappid));
- }
- }
- /*
- * 离线申请(可以包括在线数据),在无数据参数时,则显示已有列表
- */
- function orderAction()
- {
- $this->view->pageID = "account-dataorder";
- $uuid=$this->_request->getParam('uuid');
- $del = $this->_request->getParam('del');
- $apply = $this->_request->getParam('apply');
- $finish = $this->_request->getParam('finish');
- $cancel = $this->_request->getParam('cancel');
- $pdf = $this->_request->getParam('pdf');
- $ac = $this->_request->getParam('ac');
- //if (empty($uuid)) $this->_redirect('/data');
- $userid=Zend_Auth::getInstance()->getIdentity()->id;
- include_once("helper/view.php");
- if ($uuid)
- {
- //处理数据入库
- //离线申请的数据不应该重复,因此需要在数据库限制?还是在WEB端限制?
- //在数据库中控制,只保证uuid,userid,status唯一就可以?
- //存在历史遗留问题,原来的数据并不能保证唯一
- //status: 1 开始进入离线申请申请程序中
- // 2 填写并提交离线申请表
- // 3 邮寄离线申请表
- // 4 收到离线申请表
- // 5 处理离线申请表
- // 10:离线申请完成?
- // -1: 取消了在线下载进程
- //首先判断离线申请的数据数量是否超过系统限制
- $sql="select count(*) as datacount from dataorder where (ts_approved is null) and userid=? and status>0 and status<3";
- $r=$this->db->fetchRow($this->db->quoteInto($sql,$userid));
- //保证添加的离线数据申请未申请
- $sql="select count(*) as datacount from dataorder where (ts_approved is null) and userid='$userid' and uuid=? and status in (1,2,3,4)";
- $r1=$this->db->fetchRow($this->db->quoteInto($sql,$uuid));
- //保证添加的离线数据是正式发布的数据
- $sql="select count(*) as mdcount from heihemetadata where uuid=?";
- $r2=$this->db->fetchRow($this->db->quoteInto($sql,$uuid));
- if ($r['datacount']<$this->view->config->download->max && $r1['datacount']<1 && $r2['mdcount']>0) {
- $sql="insert into dataorder (uuid,ts_created,userid,status) values(?,now(),?,?)";
- $this->db->query($sql,array($uuid,$userid,1));
- //成功信息提示
- $sql=$this->db->quoteInto("select title,uuid from metadata where uuid=?",$uuid);
- $this->view->md=$this->db->fetchRow($sql);
- } else {
- if ($r1['datacount']>=1)
- $this->view->msg=view::Msg('alert-error',"错误:您申请的数据已经在数据蓝中!",0);
- elseif ($r2['mdcount']==0)
- $this->view->msg=view::Msg('alert-error',"错误:您申请的数据不存在。",0);
- else
- $this->view->msg=view::Msg('alert-error',"错误:您正在进行的离线申请的数据数已经超过系统允许的最大值,请在完成本次离线申请后再进行操作!",0);
- }
- if (empty($ac)) $ac='offline1';
- } elseif ($del) {
- //删除数据申请
- $sql=$this->db->quoteInto("delete from dataorder where userid=".$userid." and status in (1,2) and id=?",$del);
- $this->db->query($sql);
- $this->_redirect('/data/order');
- } elseif ($apply) {
- if ($apply=='all') {
- $sql=$this->db->quoteInto("update dataorder set status=2 where status=1 and userid=?",$userid);
- $this->db->query($sql);
- } else {
- $sql="update dataorder set status=2 where status=1 and userid=? and id=?";
- $this->db->query($sql,array($userid,(int)$apply));
- }
- if (empty($ac)) $ac='offline2';
- } elseif ($finish) {
- if ($finish=='all') {
- $sql=$this->db->quoteInto("update dataorder set ts_approved=now() where status=0 and userid=?",$userid);
- $this->db->query($sql);
- $sql="update ftpuser set datacount=0 where userid=?";
- $this->db->query($sql,array($userid));
- } else {
- $sql="update dataorder set ts_approved=now() where status=0 and userid=? and id=?";
- $this->db->query($sql,array($userid,(int)$finish));
- $sql="update ftpuser set datacount=datacount-1 where userid=? and datacount>0";
- $this->db->query($sql,array($userid));
- }
- } elseif ($cancel) {
- if ($cancel=='all') {
- $sql=$this->db->quoteInto("update dataorder set ts_approved=now(),status=-1 where status=0 and userid=?",$userid);
- $this->db->query($sql);
- $sql="update ftpuser set datacount=0 where userid=?";
- $this->db->query($sql,array($userid));
- } else {
- $sql="update dataorder set ts_approved=now(),status=-1 where status in (0,1,2) and userid=? and id=?";
- $this->db->query($sql,array($userid,(int)$cancel));
- $sql="update ftpuser set datacount=datacount-1 where userid=? and datacount>0";
- $this->db->query($sql,array($userid));
- }
- if (empty($ac)) $ac='offline2';
- } elseif ($pdf) {
- //生成PDF离线申请文件
- //用户信息可以从SESSION中读取?离线申请信息
- //$sql="select * from users where id=?";
- $sql="select m.title||'('||m.filesize::text||'MB)' as title,m.ts_published,date_part('year',doi.ts_published) as publish_year,m.citation,m.suppinfo,
-array_to_string(ARRAY(
-select r.reference from mdref mr left join reference r on mr.refid=r.id
-where mr.reftype=3 and mr.uuid=d.uuid order by mr.place),'\n'::text) as reference,
-array_to_string(array(
-select fund.fund_type||':'||fund.title||'(编号:'||fund.fund_id||')'
-from fund left join mdfund on fund.id=mdfund.fid where mdfund.uuid=d.uuid),'\n'::text) as fund,
-doi.doi as datadoi,doi.authors,doi.publisher,doi.title as doititle,doi.author_en,doi.publisher_en,doi.title_en
-from dataorder d left join metadata m on d.uuid=m.uuid left join datadoi doi on doi.uuid=d.uuid
-where d.status=2 and d.userid=? order by d.ts_created desc
-";
- $rows=$this->db->fetchAll($sql,array($userid));
- if ($rows) {
- $this->view->data2=$rows;
- $this->view->form=new OfflinePdfForm();
-
- $this->_helper->viewRenderer('pdf');
- if ($this->_request->isPost()) {
- $formData = $this->_request->getPost();
- $datalist='';
- foreach($rows as $i=>$row) $datalist.=($i+1).". ".$row['title'].";";
- $formData['datalist']=$datalist;
- if ($this->view->form->isValid($formData)) {
- if (@$formData['save']) {
- //保存
- //根据pdflink字段,以判断是否已经提交
- //在数据库中创建rules,在更新offlineapp表时同时更新users表中对应的信息
- $sql="select id from offlineapp where userid=? and (pdflink is null or pdflink='') and (ts_approved is null)";
- $row=$this->db->fetchRow($sql,array($userid));
- if ($row) {
- $sql="update offlineapp set username=?,email=?,phone=?,address=?,postcode=?,project=?,unit=?,datalist=?,ts_created=now(),project_type=?,project_id=?,project_title=? where id=?";
- $this->db->query($sql,array($formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$formData['project_type'],$formData['project_id'],$formData['project_title'],$row['id']));
- } else {
- $sql="insert into offlineapp (userid,username,email,phone,address,postcode,project,unit,datalist,project_type,project_id,project_title) values(?,?,?,?,?,?,?,?,?,?,?,?)";
- $this->db->query($sql,array($userid,$formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$formData['project_type'],$formData['project_id'],$formData['project_title']));
- }
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- //生成PDF
- $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join heihemetadata m on d.uuid=m.uuid where d.status=2 and d.userid=?";
- $list=$this->db->fetchAll($sql,array($userid));
- foreach($list as $i=>$row) @$formData['heihelist'].=($i+1).". ".$row['title'].";";
- $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join normalmetadata m on d.uuid=m.uuid where d.uuid not in (select uuid from heihemetadata) and d.status=2 and d.userid=?";
- $list=$this->db->fetchAll($sql,array($userid));
- foreach($list as $i=>$row) @$formData['westdclist'].=($i+1).". ".$row['title'].";";
- $pdf = new ApplicantPDF();
- $pdf->template=$this->view->config->offline->template;
- $pdf->heihetemplate=$this->view->config->offline->heihetemplate;
- $formData['project'].='['.$formData['project_title'].' | '.$formData['project_type'].' | '.$formData['project_id'].']';
- $pdf->data = $formData;
- if (isset($formData['westdclist'])) $pdf->drawWestdc();
- if (isset($formData['heihelist'])) $pdf->drawHeihe();
- $pdf->addRef($rows);
- $pdf->addSecurity($this->view->config->offline->security);
- header("Content-Disposition: inline; filename=westdc-data-apply.pdf");
- header("Content-Type:application/pdf");
- //header("Content-Length: " . strlen($pdfstring));
- echo $pdf->Output('westdc-data-apply.pdf','S');
- die();
- //exit;
- } elseif ($formData['submit']) {
- //提交
- //生成PDF
- $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join heihemetadata m on d.uuid=m.uuid where d.status=2 and d.userid=?";
- $list=$this->db->fetchAll($sql,array($userid));
- foreach($list as $i=>$row) @$formData['heihelist'].=($i+1).". ".$row['title'].";";
- $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join normalmetadata m on d.uuid=m.uuid where d.uuid not in (select uuid from heihemetadata) and d.status=2 and d.userid=?";
- $list=$this->db->fetchAll($sql,array($userid));
- foreach($list as $i=>$row) @$formData['westdclist'].=($i+1).". ".$row['title'].";";
- $pdf = new ApplicantPDF();
- $pdf->template=$this->view->config->offline->template;
- $pdf->heihetemplate=$this->view->config->offline->heihetemplate;
- $pdf->data = $formData;
- $pdf->data['project'].='['.$formData['project_title'].' | '.$formData['project_type'].' | '.$formData['project_id'].']';
- if (isset($formData['westdclist'])) $pdf->drawWestdc();
- if (isset($formData['heihelist'])) $pdf->drawHeihe();
- $pdf->addRef($rows);
- $pdf->addSecurity($this->view->config->offline->security);
- $fn=$formData['realname'].date('YmdHis').".pdf";
- $pdf->Output($this->view->config->offline->savepath."/".$fn, 'F');
-
- //保存到数据库
- $sql="select id from offlineapp where userid=? and pdflink is null and (ts_approved is null)";
- $row=$this->db->fetchRow($sql,array($userid));
- if ($row) {
- $sql="update offlineapp set username=?,email=?,phone=?,address=?,postcode=?,project=?,unit=?,datalist=?,ts_created=now(),pdflink=?,project_type=?,project_id=?,project_title=? where id=?";
- $this->db->query($sql,array($formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$fn,$formData['project_type'],$formData['project_id'],$formData['project_title'],$row['id']));
- } else {
- $sql="insert into offlineapp (userid,username,email,phone,address,postcode,project,unit,datalist,pdflink,project_type,project_id,project_title) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
- $this->db->query($sql,array($userid,$formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$fn,$formData['project_type'],$formData['project_id'],$formData['project_title']));
- $sql="select id from offlineapp where userid=? and pdflink=?";
- $row=$this->db->fetchRow($sql,array($userid,$fn));
- }
- $sql="update dataorder set status=3, offlineappid=? where status=2 and userid=?";
- $this->db->query($sql,array($row['id'],$userid));
-
- //发送用户邮件进行信息提示和说明
- //$mail = new Zend_Mail('utf-8');
- $data = array(
- "user"=>$formData['realname'],
- "datalist"=>str_replace(";","\n",$datalist)
- );
- $mailtp=new EmailText($this->db,'offline-email',$data);
- $mail = new WestdcMailer($this->view->config->smtp);
- $mail->setBodyText($mailtp->getBody());
- $mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
- $mail->addTo($formData['email']);
- $mail->setSubject($mailtp->getSubject());
- $attach=$mail->createAttachment($pdf->Output('applicant','S'));
- $attach->filename='数据申请-'.$formData['realname'].'.pdf';
- $mail->send();
- $this->_helper->viewRenderer('order');
-
- //跳转到/data/order,并提示帮助信息,告知用户已经发送EMAIL
- $this->view->msg=view::Msg('alert-success',"提示信息:您的离线申请已经提交,系统已经发送一封邮件给您,请打印出申请表、签字后扫描为pdf并email给数据中心服务组(仍可以采用邮寄方式),具体信息请参考邮件说明。",0);
- if (empty($ac)) $ac='offline3';
- //$this->_redirect('/data/order');
- }
- }
- } else {
- $sql="select u.* from users u left join offlineapp o on u.id=o.userid where u.id=?";
- $row=$this->db->fetchRow($sql,array($userid));
- /*$row=$ut->fetchRow('id='.$userid);
- $formData['email']=$row->email;
- $formData['phone']=$row->phone;
- $formData['realname']=$row->realname;
- $formData['unit']=$row->unit;
- $formData['address']=$row->address;
- $formData['purpose']=$row->project;
- $formData['id']=$row->id;*/
- $this->view->form->populate($row);
- }
- } else
- $this->view->msg=view::Msg('alert-error',"错误:您还没有提交任何离线申请的数据,或您的数据申请已经提交(等待处理过程中)!",0);
- }
-
- if ($ac=='' || $ac=='online')
- {
- $status='d.status=0 and d.ts_approved is not null';
- $this->view->tabID='order-online';
- } else if ($ac=='offline1') {
- $status='d.status in (1)';
- $this->view->tabID='order-offline1';
- } else if ($ac=='offline2') {
- $status='d.status in (2)';
- $this->view->tabID='order-offline2';
- } else if ($ac=='offline3') {
- $status='d.status in (3,4)';
- $this->view->tabID='order-offline3';
- } else if ($ac=='offline4') {
- $status='d.status in (5)';
- $this->view->tabID='order-offline4';
- }
- //显示已经申请的数据,包括已经提交的申请和未提交的申请,还有已经处理完成的申请,正在进行的在线数据下载
- $sql="select d.*,m.title,m.datatype from dataorder d left join metadata m on d.uuid=m.uuid
- where $status and d.userid=? order by d.status,d.ts_created desc";
- $rows=$this->db->fetchAll($sql,array($userid));
- $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;
- /*foreach($rows as $row) {
- switch ($row['status']){
- case 0:
- $dataorder0[]=$row;
- break;
- case 1:
- $dataorder1[]=$row;
- break;
- case 2:
- case 3:
- case 4:
- $dataorder2[]=$row;
- break;
- case 5:
- $dataorder3[]=$row;
- break;
- default:
- break;
- }
- }
- @$this->view->dataorder0=$dataorder0;
- @$this->view->dataorder1=$dataorder1;
- @$this->view->dataorder2=$dataorder2;
- @$this->view->dataorder3=$dataorder3;*/
- }
- /*
- * 查看数据缩略图
- */
- function thumbAction()
- {
- $page=(int)$this->_request->getParam('page');
- if (empty($page)) $page=1;
- $offset=$this->limit*($page-1);
- $state=$this->db->query("select count(*) from heihemetadata");
- $row=$state->fetchAll();
- $sum=$row[0]['count'];
- $select=$this->db->select();
- $select->from('heihemetadata as m','m.*')
- ->order('m.title desc')->limitPage($page,9);
- $this->view->metadata = $this->db->fetchAll($select);
- $this->view->page=new Pagination($sum,$page,$this->limit);
- }
-
- /*
- *附件下载
- */
- function attachAction(){
-
- $uuid = $this->_request->getParam('uuid');
-
- if(!empty($uuid))
- {
-
- $sql="select * from mdattach m left join attachments a on m.id=a.id where m.uuid='$uuid'";
- $re=$this->db->query($sql);
- $atts = $re->fetch();
-
- if(empty($atts['id']))
- {
- $this->_redirect("/data/$uuid");
- }//没有附件
-
- $auth = Zend_Auth::getInstance();
- if($auth->hasIdentity())
- {
- /*
- $user = $auth->getIdentity();
- $userid = $user->id;
- $sql = "select d.* from dataorder d
- left join users u on u.id=d.userid
- left join metadata m on m.uuid=d.uuid
- where (d.status=5 and d.userid='$userid' and d.uuid='$uuid') or u.usertype='administrator'";
- $re= $this->db->query($sql);
- $row=$re->fetch();
- if(!empty($row['uuid']))
- {
- $this->messenger->addMessage('您没有权限下载该附件');
- $this->_redirect("/data");
- }
- else
- {*/
- //由于涉及多个文件下载,所以将附件添加到zip压缩文件再输出
-
- $sql="select * from mdattach m left join attachments a on m.id=a.id where m.uuid='$uuid'";
- $re=$this->db->query($sql);
- $atts = $re->fetchAll();
-
- $zip = new ZipArchive();
- $url=$this->view->config->upload."tmp/attachments_$uuid.zip";//创建临时文件
- $opened=$zip->open($url, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
- if( $opened !== true ){
- die("cannot open {$url} for writing.");
- }
-
- $updates = array(); //统计被下载的附件ID
-
- foreach ($atts as $k=>$v)
- {
- if (is_file($this->view->config->upload.$v['filename'])) {
- $updates[]=$v['id'];
- $zip->addFile($this->view->config->upload.$v['filename'],'/'.basename($v['filename']));
- }
- }
- $zip->close();
-
- //更新统计
- $ids=join(',',$updates);
- $sql = "update attachments set downtimes=downtimes+1 where id in ($ids)";
- @$this->db->exec($sql);
-
-
- //输出下载
- $content=file_get_contents($url);
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- $this->getResponse()->setHeader('Content-Type', 'application/octet-stream')
- ->setHeader('Content-Disposition','attachment; filename="'.basename($url).'"')
- ->setHeader('Content-Length', strlen($content))
- ->setHeader('Content-Type','application/force-download')
- ->setHeader('Content-Type','application/download')
- ->setHeader('Content-Type','application/zip')
- ->setHeader('Content-Description','File Transfer')
- ->setHeader('Content-Transfer-Encoding','binary')
- ->setHeader('Expires',0)
- ->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0')
- ->setHeader('Pragma','public')
- ->setBody($content);
- // }
- }//end if
- else
- {
- $this->messenger->addMessage('您没有权限下载该附件');
- $this->_redirect("/data/$uuid");
- }//未登陆
- }//end if
- else
- {
- $this->messenger->addMessage('您没有权限下载该附件');
- $this->_redirect("/data/$uuid");
- }//无权限
-
- }
-
-
- /*
- * 西部计划项目及其数据产出
- */
- public function westeeAction()
- {
- //$sql="select w.*,m.uuid from westee w left join westeemd m on w.id=m.eeid order by w.id";
- $sql="select * from westee order by id";
- $this->view->westee=$this->db->fetchAll($sql);
- $sql="select w.eeid,m.title,m.uuid from westeemd w left join metadata m on w.uuid=m.uuid order by w.eeid";
- $this->view->westeemd=$this->db->fetchAll($sql);
- }
-
- public function pingbackAction()
- {
- $this->_helper->ViewRenderer->setNoRender();
- $this->_helper->layout->disableLayout();
- $server = new Zend_XmlRpc_Server();
- $server->setClass('PingbackRpc', 'pingback');
- echo $server->handle();
- }
-
- public function pingtestAction()
- {
- $this->_helper->ViewRenderer->setNoRender();
- $this->_helper->layout->disableLayout();
- $client = new Zend_XmlRpc_Client('http://test.westgis.ac.cn/data/pingback');
- $arg1 = 'http://wlx.westgis.ac.cn/567/';
- $arg2 = 'http://test.westgis.ac.cn/data/487591d0-d437-4114-b810-cbef7c4ee4b2';
- //$result = $client->call('pingback.ping', array($arg1, $arg2));
- $test = $client->getProxy('pingback');
- $test->ping($arg1,$arg2);
- //var_dump($result);
- }
- public function outputAction()
- {
- $this->_helper->layout->disableLayout();
- $this->_helper->viewRenderer->setNoRender();
- $sql="select title,datatype,filesize,id from heihemetadata";
- $md=$this->db->fetchAll($sql);
- foreach($md as $m)
- {
- print $m["title"].",";
- print ($m["datatype"]?"内部":"公开").",";
- print ($m["filesize"]==1?" ":$m["filesize"]).",";
- $sql1="select keyword from keyword where id=".$m["id"]." and keytype='place'";
- $kd=$this->db->fetchAll($sql1);
- foreach ($kd as $p) print $p["keyword"]." ";
- print ",";
- $sql1="select keyword from keyword where id=".$m["id"]." and keytype='temporal'";
- $kd=$this->db->fetchAll($sql1);
- foreach ($kd as $p) print $p["keyword"]." ";
- print ",";
- print "
";
- }
-
- }
-
-
- public function jsonexit($data){
- $this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($data,JSON_NUMERIC_CHECK));
- return true;
- }
- function organizationAction()
- {
- $page = $this->_request->getParam('page');
- $name = $this->_request->getParam('name');
- $state=$this->db->query("select distinct responsible.organisation from responsible left join role on role.resid=responsible.id where role.role in ('pointOfContact','resourceProvider','owner')");
- $this->view->organisation=$state->fetchAll();
- if (!empty($name)) {
- $this->view->codename=$name;
- $sql="select distinct m.* from heihemetadata m left join role r on m.uuid=r.uuid left join responsible s on r.resid=s.id where r.role in ('pointOfContact','resourceProvider','owner') and s.organisation=?";
- $sth = $this->db->prepare($sql);
- $sth->execute(array($name));
- $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;
- } else {
- //提供全部分类列表
- }
- }
- function fundAction()
- {
- $id = (int)$this->_request->getParam('id');
- if (!empty($id)) {
- $sql="select * from fund where id=?";
- $this->view->fund=$this->db->fetchRow($sql,array($id));
- if ($this->view->fund) {
- $sql="select distinct m.* from heihemetadata m left join mdfund mf on m.uuid=mf.uuid where mf.fid=?";
- $sth = $this->db->prepare($sql);
- $sth->execute(array($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;
- }
- } else {
- //提供全部分类列表
- $sql="select f.id,f.title,f.fund_id,f.fund_type,f.ts_created,count(m.id) as datacount,sum(md.filesize) as filesize from fund f left join mdfund m on f.id=m.fid left join metadata md on m.uuid=md.uuid where m.id is not null group by f.id,f.title,f.fund_id,f.fund_type,f.ts_created order by datacount desc,f.ts_created desc";
- $sth = $this->db->prepare($sql);
- $sth->execute();
- $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('fund-list');
- }
- }
-
- //实现基于DOI信息的浏览
- function doiAction()
- {
- $ac = $this->_request->getParam('ac');
- if ($ac=='unready') {
- //列出没有DOI的数据
- $sql="select m.* from heihemetadata m where length(m.doi)<3 and m.uuid not in (select uuid from datadoi) order by m.ts_created desc";
- $this->view->pageID='doi-unready';
- } else if ($ac=='prepare') {
- //列出有DOI但还未进行提交申请的数据
- $sql="select m.* from heihemetadata m where length(m.doi)>3 and m.uuid not in (select uuid from datadoi) order by m.ts_created desc";
- $this->view->pageID='doi-prepare';
- } else if ($ac=='unsubmit') {
- //列出有DOI并计划提交申请的数据
- $sql="select m.*,d.doi as datadoi,date(d.ts_created) as ts_created from heihemetadata m left join datadoi d on m.uuid=d.uuid where length(m.doi)>3 and d.ts_created is not null and d.ts_submitted is null order by d.ts_created desc";
- $this->view->pageID='doi-unsubmit';
- } else if ($ac=='submit') {
- //列出有DOI并计划提交申请的数据
- $sql="select m.*,d.doi as datadoi,date(d.ts_submitted) as ts_submitted from heihemetadata m left join datadoi d on m.uuid=d.uuid where length(m.doi)>3 and d.ts_submitted is not null and d.ts_published is null order by d.ts_submitted desc,d.ts_created desc";
- $this->view->pageID='doi-submit';
- } else if ($ac=='publish' || empty($ac)) {
- //默认:列出最新发布的DOI数据
- $sql="select m.*,d.doi as datadoi,date(d.ts_submitted) as ts_submitted,date(d.ts_published) as ts_published from heihemetadata m left join datadoi d on m.uuid=d.uuid where length(m.doi)>3 and d.ts_published is not null order by d.ts_published desc,d.ts_submitted desc,d.ts_created desc";
- $this->view->pageID='doi-publish';
- }
- $sth = $this->db->prepare($sql);
- $sth->execute();
- $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;
- }
-
- //基于数据作者的浏览(包括认证后的数据作者以及未认证的数据作者)
- function authorAction()
- {
- $ac = $this->_request->getParam('ac');
- $id = (int)$this->_request->getParam('id');
- if ($ac=='verified') {
- //已经认证过的数据作者
- $this->view->pageID='author-verified';
- $this->view->ac='verified';
- if ($id) {
- //列出作者的数据
- $sql="select username,realname from users where id=?";
- $this->view->author=$this->db->fetchRow($sql,array($id));
- $sql="select m.* from heihemetadata m left join mdauthor a on a.uuid=m.uuid where a.userid=?";
- $sth = $this->db->prepare($sql);
- $sth->execute(array($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;
- } else {
- //已经认证过的数据作者
- $sql="select u.username,u.realname,u.id,count(u.id) as count from mdauthor a left join users u on a.userid=u.id where a.status=1 and a.uuid in (select uuid from heihemetadata) group by u.id,u.username,u.realname";
- $sth = $this->db->prepare($sql);
- $sth->execute();
- $rows = $sth->fetchAll();
- $paginator = Zend_Paginator::factory($rows);
- $paginator->setCurrentPageNumber($this->_getParam('page'));
- $paginator->setItemCountPerPage(50);
- $paginator->setView($this->view);
- Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
- $this->view->paginator=$paginator;
- }
- } else if ($ac=='unverified' || empty($ac)) {
- //未认证的数据作者
- $this->view->pageID='author-unverified';
- $this->view->ac='unverified';
- if ($id) {
- //列出数据
- $sql="select individual as username from responsible where id=?";
- $this->view->author=$this->db->fetchRow($sql,array($id));
- $sql="select distinct m.* from heihemetadata m left join role r on m.uuid=r.uuid left join responsible s on r.resid=s.id where r.role in ('pointOfContact','resourceProvider','owner') and s.id=?";
- $sth = $this->db->prepare($sql);
- $sth->execute(array($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;
- } else {
- //列出所有作者
- $sql="select distinct responsible.individual as username,responsible.id from responsible left join role on role.resid=responsible.id where role.role in ('pointOfContact','resourceProvider','owner')";
- $sth = $this->db->prepare($sql);
- $sth->execute();
- $rows = $sth->fetchAll();
- $paginator = Zend_Paginator::factory($rows);
- $paginator->setCurrentPageNumber($this->_getParam('page'));
- $paginator->setItemCountPerPage(50);
- $paginator->setView($this->view);
- Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
- $this->view->paginator=$paginator;
- }
- }
- }
-
- function listAction()
- {
- $sql="select m.uuid,m.title,m.citation,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year from heihemetadata m
-left join mdstatus s on m.uuid=s.uuid
-left join datadoi d on d.uuid=m.uuid
-where s.status>4
-and m.uuid not in
-(select d.uuid from datasource d left join source s on d.sourceid=s.id
-where s.code in ('heihe','water','hiwater','westee'))
-order by m.title";
- $this->view->metadata=$this->db->fetchAll($sql);
- $sql="select m.uuid,m.title,m.citation,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
- from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid where s.status>4 and m.title like '黑河综合遥感联合试验%' order by title";
- $this->view->water=$this->db->fetchAll($sql);
- $sql="select m.uuid,m.title,m.citation ,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
- from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid where s.status>0 and m.title like '黑河生态水文遥感试验%' order by title";
- $this->view->hiwater=$this->db->fetchAll($sql);
- $sql="select m.uuid,m.title,m.citation ,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
- from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid left join datasource ds on ds.uuid=m.uuid left join source sr on ds.sourceid=sr.id where sr.code='heihe' and s.status>0 and m.title not like '黑河生态水文遥感试验%' order by title";
- $this->view->heihe=$this->db->fetchAll($sql);
- $sql="select m.uuid,m.title,m.citation ,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
- from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid left join datasource ds on ds.uuid=m.uuid left join source sr on ds.sourceid=sr.id where sr.code='westee' and s.status>4 order by title";
- $this->view->westee=$this->db->fetchAll($sql);
-
- }
-}
-
+db=Zend_Registry::get('db');
+ $this->view->config = Zend_Registry::get('config');
+ $this->messenger=$this->_helper->getHelper('FlashMessenger');
+ $this->view->messages = $this->messenger->getMessages();
+ $this->view->theme = new Theme();
+ $this->view->main_nav_pageID = "data";
+
+ $this->view->nav = array(
+ array('link'=>'/','title'=>''),
+ array('link'=>'/data','title'=>$this->view->config->title->data),
+ );
+ }
+ function indexAction()
+ {
+ //序列
+ $state=$this->db->query('select s.id,s.name,count(*) as count from series s,dataseries d where d.sid=s.id and length(s.name)>2 group by s.id,s.name order by count desc limit 15');
+ $this->view->serie=$state->fetchAll();
+ //分类
+ $state=$this->db->query('select c.code,name,name_zh,count(*) from category c,categorycode cc where c.code=cc.code group by c.code,cc.name,cc.name_zh');
+ $this->view->category=$state->fetchAll();
+ //关键词
+ $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='place' group by keyword order by count desc limit 20");
+ $k1=$state->fetchAll();
+ $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='theme' group by keyword order by count desc limit 20");
+ //$state=$this->db->query("select k.keyword,count(k.keyword) from keyword k left join heihemetadata m on k.id=m.id where k.keytype='theme' and (m.uuid in (select uuid from dataorder group by uuid order by count(uuid) desc limit 20)) group by k.keyword order by count(k.keyword) desc limit 20");
+ $k2=$state->fetchAll();
+ $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='discipline' group by keyword order by count desc limit 20");
+ $k3=$state->fetchAll();
+ $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='stratum' group by keyword order by count desc limit 20");
+ $k4=$state->fetchAll();
+ $state=$this->db->query("select keyword,count(*) from keyword right join heihemetadata on keyword.id=heihemetadata.id where keytype='temporal' group by keyword order by count desc limit 20");
+ //$state=$this->db->query("select k.keyword,count(k.keyword) from keyword k left join heihemetadata m on k.id=m.id where k.keytype='temporal' and (m.uuid in (select uuid from dataorder group by uuid order by count(uuid) desc limit 20)) group by k.keyword order by count(k.keyword) desc limit 20");
+ $k5=$state->fetchAll();
+ $this->view->keywords=array('place'=>$k1,'theme'=>$k2,'discipline'=>$k3,'stratum'=>$k4,'temporal'=>$k5);
+ //最新10个入库数据
+ $state=$this->db->query('select id,uuid,title from heihemetadata order by id desc limit 10');
+ $this->view->metadata = $state->fetchAll();
+ //特色数据
+
+ //服务
+ $l=new mydir($this->view->config->paths->newsletter,"newsletter_*.pdf");
+ $this->view->newsletter=$l->getLast();
+ $name=basename($this->view->newsletter,'.pdf');
+ list(,$this->view->newsletterno)=explode("_",$name);
+
+ $this->view->addHelperPath('helper','Zend_View_Helper_');
+ $form=new MaillistForm();
+ $form->submit->setLabel('输入邮件地址,订阅数据通讯列表');
+
+ $this->view->form=$form;
+ if ($this->_request->isPost()) {
+ //发送邮件
+ $formData=$this->_request->getPost();
+ if ($form->isValid($formData)) {
+ $mail=new WestdcMailer($this->view->config->smtp);
+ $mail->setFrom($formData['email']);
+ $mail->setBodyText(".");
+ $mail->setSubject('subscribe');
+ $mail->addTo($this->view->config->reportemail);
+ $mail->send();
+ $this->messenger->addMessage('订阅成功,请检查您的邮件!');
+ $this->_redirect('/data/');
+ }
+ } else {
+ $auth = Zend_Auth::getInstance();
+ if ($auth->hasIdentity()) {
+ $user=$auth->getIdentity();
+ $formData['email']=$user->email;
+ $form->populate($formData);
+ }
+ }
+ $searchform=new SearchForm();
+ $this->view->searchform=$searchform;
+
+ //其他连接
+ }
+ function onlinelistAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $limit=30;
+ $offset=$limit*($page-1);
+ $state=$this->db->query('select count(*) from heihemetadata where datatype=0');
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('heihemetadata','*')->where('datatype=0')->order('title')->limitPage($page,$limit);
+ $this->view->metadata = $this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$limit);
+ }
+ function offlinelistAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $limit=30;
+ $offset=$limit*($page-1);
+ $state=$this->db->query('select count(*) from heihemetadata where datatype=1');
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('heihemetadata','*')->where('datatype=1')->order('title')->limitPage($page,$limit);
+ $this->view->metadata = $this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$limit);
+ }
+ //展示最近20条离线神情记录情况
+ function offlineappAction()
+ {
+ $sql="select * from offlineapp where ts_approved is not null and pdflink<>'' and status>=0 order by ts_created desc limit 20";
+ $this->view->rows=$this->db->fetchAll($sql);
+ }
+ function requestAction()
+ {
+ $archives=new Archive($this->db);
+ $this->view->item=$archives->getOneArchive('如何申请数据','help');
+ }
+ function submitAction()
+ {
+ $archives=new Archive($this->db);
+ $this->view->item=$archives->getOneArchive('如何发布数据','help');
+ }
+ function serviceAction()
+ {
+ }
+ function newsletterAction()
+ {
+ $l=new mydir($this->view->config->paths->newsletter,"newsletter_*.pdf");
+ $this->view->newsletters=$l->toArray();
+ $this->view->addHelperPath('helper','Zend_View_Helper_');
+ rsort($this->view->newsletters);
+ $form=new MaillistForm();
+ $this->view->form=$form;
+ $form->submit->setLabel('输入邮件地址,订阅数据通讯列表');
+ if ($this->_request->isPost()) {
+ //发送邮件
+ $formData=$this->_request->getPost();
+ if ($form->isValid($formData)) {
+ //$mail=new Zend_Mail('utf-8');
+ $mail=new WestdcMailer($this->view->config->smtp);
+ $mail->setFrom($formData['email']);
+ $mail->setBodyText(".");
+ $mail->setSubject('subscribe');
+ $mail->addTo($this->view->config->reportemail);
+ /*
+ $tr=new Zend_Mail_Transport_Smtp($this->view->config->smtp->host,
+ array('ssl' => $this->view->config->smtp->ssl,
+ 'auth'=>$this->view->config->smtp->auth,
+ 'username'=>$this->view->config->smtp->username,
+ 'password'=>$this->view->config->smtp->password));
+ $mail->send($tr);
+ */
+ $mail->send();
+ $this->messenger->addMessage('订阅成功,请检查您的邮件!');
+ $this->_redirect('/data/newsletter');
+ }
+ } else {
+ $auth = Zend_Auth::getInstance();
+ if ($auth->hasIdentity()) {
+ $user=$auth->getIdentity();
+ $formData['email']=$user->email;
+ $form->populate($formData);
+ }
+ }
+ }
+ function featureAction()
+ {
+ $sql="select * from datafeature order by id desc";
+ $this->view->feature=$this->db->fetchAll($sql);
+ }
+
+ function datasetcdAction()
+ {
+ $cd=new DatasetcdTable();
+ $this->view->rows=$cd->fetchAll();
+ }
+ /*
+ * 数据浏览
+ */
+ function browseAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $limit=10;
+ $offset=$limit*($page-1);
+ $state=$this->db->query('select count(*) from metadata');
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('metadata','*')->order('id desc')->limitPage($page,$limit);
+ $this->view->metadata = $this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$limit);
+ }
+ function tagAction()
+ {
+ $id = (int)$this->_request->getParam('id');
+ $key = $this->_request->getParam('key');
+ $keytype = $this->_request->getParam('keytype');
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $limit=10;
+ $offset=$limit*($page-1);
+ $sql='select keyword,count(*),keytype from keyword right join heihemetadata on keyword.id=heihemetadata.id ';
+ if (!empty($keytype) && ($keytype=='place' || $keytype=='theme' || $keytype=='discipline'||$keytype=='temporal')) $sql.=" where keytype='".$keytype."'";
+ $sql.=' group by keyword,keytype order by keytype,keyword,count desc';
+ $state=$this->db->query($sql);
+ $this->view->keywords=$state->fetchAll();
+
+ if ($id>0 or !empty($key)) {
+ if (empty($key)) {
+ $where=$this->db->quoteInto('id = ?',$id);
+ $row=$md->fetchRow($where);
+ $key=$row->name;
+ }
+ $this->view->codename=$key;
+ $sql=$this->db->quoteInto('select count(m.id) from heihemetadata m,keyword k where m.id=k.id and k.keyword=?',$key);
+
+ $state=$this->db->query($sql);
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('heihemetadata','*')->join('keyword','heihemetadata.id=keyword.id')->where('keyword.keyword=?',$key)->order('heihemetadata.title')->limitPage($page,$limit);
+ //$sql=$db->quoteInto('select m.* from metadata m,keyword k where m.id=k.id and k.keyword=?',$key);
+ //$state=$db->query($sql);
+ $this->view->metadata=$this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$limit);
+ }
+ }
+ /*
+ * 数据集序列浏览
+ */
+ function seriesAction()
+ {
+ $id = $this->_request->getParam('id');
+ if (empty($id)) $id=0;
+ if (!is_numeric($id))
+ {
+ $name=$id;
+ $id='';
+ }
+ $keyword=$this->_request->getParam('keyword');
+ if (empty($id)) {
+ if (!empty($name))
+ {
+ $where=$this->db->quoteInto('name = ?',$name);
+ $row=$this->db->fetchRow("select * from series where ".$where);
+ }
+ } else {
+ $where=$this->db->quoteInto('id = ?',$id);
+ $row=$this->db->fetchRow("select * from series where ".$where);
+ }
+ if (!empty($id) or !empty($name))
+ {
+ if (!$row) $this->_redirect('/data');
+ $id=$row['id'];
+ }
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $limit=10;
+ $offset=$limit*($page-1);
+ $state=$this->db->query('select s.id,name,count(*) from series s,dataseries d where d.sid=s.id group by s.id,s.name');
+ $this->view->serie=$state->fetchAll();
+ if ($id>0) {
+ //$where=$this->db->quoteInto('id = ?',$id);
+ //$row=$this->db->fetchRow("select * from series where ".$where);
+ $this->view->codename=$row['name'];
+ if (!empty($keyword))
+ {
+ $sql='select count(m.id) as count from heihemetadata m,dataseries d,keyword k where m.id=d.id and m.id=k.id and d.sid=? and k.keyword=?';
+ $row=$this->db->fetchAll($sql,array($id,$keyword));
+ $this->view->codename.="【关键词:".$keyword."】";
+ }else{
+ $sql='select count(m.id) as count from heihemetadata m,dataseries d where m.id=d.id and d.sid=?';
+ $row=$this->db->fetchAll($sql,array($id));
+ }
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('heihemetadata','*')->join('dataseries','heihemetadata.id=dataseries.id')->where('dataseries.sid=?',$id)->order('heihemetadata.title')->limitPage($page,$limit);
+ if (!empty($keyword)) $select->join('keyword','keyword.id=heihemetadata.id')->where('keyword.keyword=?',$keyword);
+ $this->view->metadata=$this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$limit);
+ //$this->view->showtools=($sum>$page)?true:false;
+ //$this->view->form=new SearchForm();
+ $sql=$this->db->quoteInto("select keyword,count(*) as count from (select t.keyword,t.id from keyword t left join dataseries d on t.id=d.id where t.keytype='place' and d.sid=?) as f group by keyword order by count desc limit 30",$id);
+ $state=$this->db->query($sql);
+ $row=$state->fetchAll();
+ $this->view->places=$row;
+ $this->view->seriesid=$id;
+ } else {
+ //提供全部数据集序列列表
+ }
+ }
+ /*
+ * 分类浏览模式
+ */
+ function categoryAction()
+ {
+ $page = $this->_request->getParam('page');
+ $code = (int)$this->_request->getParam('code');
+ $state=$this->db->query('select c.code,name,name_zh,count(*) from category c,categorycode cc where c.code=cc.code group by c.code,cc.name,cc.name_zh');
+ $this->view->category=$state->fetchAll();
+ if ($code>0 && $code<20) {
+ $where=$this->db->quoteInto('code = ?',$code);
+ $row=$this->db->fetchRow("select * from categorycode where ".$where);
+ $this->view->codename=(empty($row['name_zh'])?$row['name']:$row['name_zh']);
+ $sql='select count(m.id) from heihemetadata m left join category c on m.id=c.id where c.code=?';
+ $row=$this->db->fetchRow($sql,array($code));
+ $sum=$row['count'];
+ $select=$this->db->select();
+ $select->from('heihemetadata as m','*')->joinLeft('category as c','m.id=c.id')->where('c.code=?',$code)->order('m.title')->limitPage($page,$this->limit);
+ $this->view->metadata=$this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$this->limit);
+ } else {
+ //提供全部分类列表
+ }
+ }
+ /*
+ * 时间浏览方式
+ * todo:实现xml的缓存,基于时间的缓存(每天)?基于元数据修改的缓存,每次导入后都重新生成一次。
+ */
+ function timelineAction()
+ {
+ $fn="time1.xml";
+ $rows=$this->db->fetchAll("select ts_created from heihemetadata order by ts_created desc limit 1");
+ $last_update=strtotime($rows[0]['ts_created']);
+ if (!file_exists($fn) || (filemtime($fn)<$last_update))
+ {
+ $dateformat="M j Y";
+ $md = new MetadataTable();
+ $db=$md->getAdapter();
+ $state=$db->query('select id,uuid,description,title,timebegin,timeend from heihemetadata where timebegin is not null order by timebegin');
+ $rows=$state->fetchAll();
+ $timexml='';
+ foreach($rows as $row) {
+ $timexml.='';
+ $desc_length=mb_strlen($row['description'],"UTF-8");
+ $desc=mb_substr($row['description'],0,($desc_length>300)?300:$desc_length,"UTF-8");
+ if ($desc_length>300) $desc.=" ...";
+ $timexml.=htmlspecialchars($desc);
+ $timexml.="\n";
+ }
+ $timexml.='';
+ $fp=fopen($fn,'w');
+ fwrite($fp,$timexml);
+ fclose($fp);
+ }
+ //$this->_helper->layout->disableLayout();
+ }
+ /*
+ * todo:空间浏览
+ */
+ function mapAction()
+ {
+ //use json & openlayers?
+ $id=(int)$this->_request->getParam('id');
+ if ($id>0) $this->view->params="/id/$id";
+ }
+ /*
+ * 产生geojson数据
+ */
+ function jsonAction()
+ {
+ $md=new MetadataTable();
+ $db=$md->getAdapter();
+ $id = (int)$this->_request->getParam('id');
+ $where='';
+ if (!empty($id)) { $where=' where id='.$id; }
+ $sql='select id,uuid,west,south,north,east,title from heihemetadata'.$where;
+ $state=$db->query($sql);
+ $rows=$state->fetchAll();
+ $geomd=new GeoMetaData();
+ foreach($rows as $row){
+ if ($id)
+ $box=new GeoBox($row['west'],$row['south'],$row['east'],$row['north']);
+ else
+ $box=new GeoBoxLine($row['west'],$row['south'],$row['east'],$row['north']);
+ $feature=new Geofeature();
+ $feature->id=$row['id'];
+ $feature->addProperties('title',$row['title']);
+ $feature->addProperties('uuid',$row['uuid']);
+ $feature->addProperties('id',$row['id']);
+ $feature->geometry=$box;
+ $geomd->addFeature($feature);
+ }
+ $this->_helper->json($geomd);
+ }
+ /*
+ * 时空动态浏览
+ */
+ function timemapAction()
+ {
+ $sql='select id,uuid,west,south,north,east,title,timebegin,timeend from heihemetadata where timebegin is not null';
+ $this->view->rows=$this->db->fetchAll($sql);
+ }
+ /*
+ * 返回XML源文件
+ */
+ function xmlAction()
+ {
+ $uuid=$this->_request->getParam('uuid');
+ $row=$this->db->fetchRow("select xml.data from xml left join metadata on xml.id=metadata.id where metadata.uuid=?",array($uuid));
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $this->getResponse()->setHeader('Content-Type', 'text/xml')
+ ->setBody($row['data']);
+ }
+ function detailAction()
+ {
+ $id=(int)$this->_request->getParam('id');
+ $xml=new XmlTable();
+ $db=$xml->getAdapter();
+ $where=$db->quoteInto('id=?',$id);
+ $order='id desc';
+ $row=$xml->fetchRow($where,$order);
+ // Load the XML source
+ $xml = new DOMDocument;
+ $xml->loadXML($row->data);
+ $xsl = new DOMDocument;
+ $xsl->load($this->view->config->westdc->xsl);
+ // Configure the transformer
+ $proc = new XSLTProcessor;
+ $proc->importStyleSheet($xsl); // attach the xsl rules
+ $this->view->xml=$proc->transformToXML($xml);
+ //$this->_helper->layout->disableLayout();
+ //$this->_helper->viewRenderer->setNoRender();
+ //$this->getResponse()->setHeader('Content-Type', 'text/html')
+ // ->setBody($proc->transformToXML($xml));
+ }
+ function feedAction()
+ {
+ $feedArray = array(
+ 'title' => '中国西部环境与生态科学数据中心',
+ 'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/feed',
+ 'description' => '共享西部计划产生的数据',
+ 'language' => 'zh-CN',
+ 'charset' => 'utf-8',
+ 'published' => time(),
+ //'generator' => 'Zend Framework Zend_Feed',
+ 'entries' => array()
+ );
+ $sql="select * from heihemetadata order by ts_created desc";
+ $rs=$this->db->fetchAll($sql);
+ $feedArray['published']=strtotime($rs[0]['ts_created']);
+ foreach($rs as $r)
+ {
+ $feedArray['entries'][] = array(
+ 'title' => $r['title'],
+ 'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
+ 'guid' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
+ //'content'=>$r['description'],
+ 'description' => $r['description'],
+ 'lastUpdate' => strtotime($r['ts_created'])
+ );
+ }
+ $feed = Zend_Feed::importArray($feedArray,'rss');
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $feed->send();
+ }
+ /*
+ * todo: search
+ */
+ function searchAction()
+ {
+ $this->view->addHelperPath('helper','Zend_View_Helper_');
+ $form=new SearchForm();
+ $this->view->form=$form;
+ //$form->submit->setLabel('快速搜索');
+ $key=$this->_request->getParam('q');
+ if (!empty($key)) {
+ //$formData=$this->_request->getPost();
+ //include_once("bcspamblock.php");
+ //if ($form->isValid($formData)) {
+ $page=@(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $search=new Search($key);
+ $where=$search->sql_expr(array("title","description"));
+ $row=$this->db->fetchAll("select count(*) from heihemetadata where ".$where);
+ $sum=$row[0]['count'];
+ $sql="select uuid,title,id,description from heihemetadata where ".$where." order by title limit ? offset ?";
+ $this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
+ $this->view->page=new Pagination($sum,$page,$this->limit);
+ $this->view->key=$key;
+ }
+ }
+ /*
+ * todo: 高级搜索
+ */
+ function advancesearchAction()
+ {
+ $this->view->addHelperPath('helper','Zend_View_Helper_');
+ //$form=new SearchForm();
+ //$this->view->form=$form;
+
+ $md=new MetadataTable();
+ $db=$md->getAdapter();
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $limit=10;
+ $offset=$limit*($page-1);
+ $key=$this->_request->getParam('q');
+ $n=(int)$this->_request->getParam('n');
+ $s=(int)$this->_request->getParam('s');
+ $e=(int)$this->_request->getParam('e');
+ $w=(int)$this->_request->getParam('w');
+ if (!(empty($n) && empty($key))) {
+ if (empty($n)) $n=90;
+ if (empty($s)) $s=-90;
+ if (empty($e)) $e=180;
+ if (empty($w)) $w=-180;
+ $start=$this->_request->getParam('start');
+ $end=$this->_request->getParam('end');
+ if (!empty($key)) {
+ $sql='select count(*) from heihemetadata where east and west>? and north and south>? and (title ilike ? or description ilike ?)';
+ $row=$db->fetchAll($sql,array($e,$w,$n,$s,'%'.$key.'%','%'.$key.'%'));
+ } else {
+ $sql='select count(*) from heihemetadata where east and west>? and north and south>?';
+ $row=$db->fetchAll($sql,array($e,$w,$n,$s));
+ }
+ $sum=$row[0]['count'];
+ $select=$db->select();
+ $select->from('heihemetadata','*')->where('east',$e)->where('west>?',$w)->where('north',$n)->where('south>?',$s);
+ if (!empty($key)) $select->where('(title ilike ? or description ilike ?)','%'.$key.'%');
+ $select->order('title')->limit($limit,$offset);
+ $this->view->metadata = $db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page);
+ $this->view->key=$key;
+ }
+ }
+ /*
+ * 根据id或uuid来查看元数据
+ * id为一组数字,uuid为唯一标识符
+ */
+ function viewAction()
+ {
+ $id = (int)$this->_request->getParam('id');
+ $sql="select m.*,s.status,g.id as gid,t.filename,i.doi as datadoi,i.authors,i.author_en,i.publisher,i.publisher_en, date_part('year',i.ts_published) as publish_year from heihemetadata m left join mdstatus s on m.uuid=s.uuid
+ left join thumbnail t on t.id=m.id left join geonetworkmetadata g on m.uuid=g.uuid left join datadoi i on i.uuid=m.uuid where ";
+ if (empty($id)) {
+ $uuid = $this->_request->getParam('uuid');
+ if (empty($uuid)) $this->_redirect('/data');
+ $where=$this->db->quoteInto('m.uuid = ?',$uuid);
+ } else {
+ $where=$this->db->quoteInto('m.id = ?',$id);
+ }
+ $sql.=$where;
+ $this->db->setFetchMode(Zend_Db::FETCH_OBJ);
+ $row=$this->db->fetchRow($sql);
+ if (!$row) $this->_redirect('/data');
+ $id=$row->id;
+ $uuid=$row->uuid;
+ $this->view->metadata=$row;
+ //提前对表格进行预处理
+ $wiki=new WikiFormat();
+ $this->view->metadata->description=$wiki->parseTable($this->view->escape($row->description));
+ //处理外部链接
+ $this->view->metadata->description=preg_replace('/\[\s*(http:\/\/.+?)\s+(.*?)\]/m','$2',$this->view->metadata->description);
+ $this->view->thumburl='/gndata/'.sprintf('%05d',floor(($row->gid+0.1)/100)*100).'-'.sprintf('%05d',ceil(($row->gid+0.1)/100)*100-1)."/".$row->gid;
+ $this->view->thumburl.='/public/'.str_replace('_s.','.',$row->filename);
+ if (is_numeric($row->projection))
+ {
+ $sql="select proj4text from spatial_ref_sys where auth_srid=?";
+ $rs=$this->db->fetchRow($sql,array((int)$row->projection));
+ if ($rs) $this->view->projection=$rs->proj4text;
+ }
+
+ $sql = "select * from keyword where id=? order by keytype,ts_created";
+ $sth = $this->db->prepare($sql);
+ $rs = $sth->execute(array($id));
+ $this->view->keys = $sth->fetchAll(PDO::FETCH_BOTH);
+
+ $sql='select c.code,cc.name,cc.name_zh from category c,categorycode cc where c.code=cc.code and c.id= ?';
+ $state=$this->db->query($sql,array($id));
+ $this->view->category=$state->fetchAll();
+ $sql='select s.name,s.id from dataseries d, series s where d.sid=s.id and d.id= ?';
+ $state=$this->db->query($sql,array($id));
+ $this->view->series=$state->fetchAll();
+ $sql=$this->db->quoteInto("select count(*) as count from dataorder where uuid=?",$uuid);
+ $row=$this->db->fetchRow($sql);
+ $this->view->downloaded=$row->count;
+ //update the viewed times
+ $sql="update mdstat set viewed=viewed+1 where uuid=?";
+ $this->db->query($sql,array($uuid));
+ $sql=$this->db->quoteInto("select viewed from mdstat where uuid=?",$uuid);
+ $row=$this->db->fetchRow($sql);
+ $this->view->viewed=$row->viewed;
+ //数据文档
+ $sql="select linkage from onlineresource where uuid=? and description='数据说明文档'";
+ $sql=$this->db->quoteInto($sql,$uuid);
+ $row=$this->db->fetchRow($sql);
+ if ($row) $this->view->doc=$row->linkage;
+ //相关资源
+ $sql="select * from onlineresource where uuid=? and (linkage not like '%ftp.westgis%') and name<>'元数据地址'";
+ $sql=$this->db->quoteInto($sql,$uuid);
+ $this->view->resources=$this->db->fetchAll($sql);
+ //建议参考文献
+ $sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=? and m.reftype=0 order by m.place";
+ $sql=$this->db->quoteInto($sql,$uuid);
+ $this->view->ref=$this->db->fetchAll($sql);
+ //用户发表文献
+ $sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=? and m.reftype=1";
+ $sql=$this->db->quoteInto($sql,$uuid);
+ $this->view->userref=$this->db->fetchAll($sql);
+ //多篇引用形式:hiwater
+ $sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=? and m.reftype=3 order by m.place";
+ $sql=$this->db->quoteInto($sql,$uuid);
+ $this->view->mcitation=$this->db->fetchAll($sql);
+ //相关用户
+ $sql="select p.email,p.individual,p.organisation,r.role from role r left join responsible p on r.resid=p.id where r.uuid=? order by r.role,r.id";
+ $this->view->authors=$this->db->fetchAll($sql,array($uuid));
+ //数据限制信息
+ $sql="select u.* from uselimit u left join mdlimit m on u.id=m.lid where m.uuid=?";
+ $this->view->uselimits=$this->db->fetchAll($sql,array($uuid));
+ //相关下载
+ $sql = "select d.uuid,count(distinct(d.userid)) as downtimes,m.title from dataorder d left join metadata m on d.uuid=m.uuid where d.userid in (
+ select distinct(userid) from dataorder where uuid=? and status in (0,5)
+ ) and d.uuid<>? and length(m.title)>2 group by d.uuid,m.title order by count(distinct(d.userid)) desc limit 10;";
+ $this->view->downlists = $this->db->fetchAll($sql,array($uuid,$uuid));
+ //相关文献
+ $sql="select a.*,array_to_string(array(select author from knl_author t where t.item_id=a.item_id order by place asc),'; ') as author from knl_article a where (";
+ foreach($this->view->keys as $k)
+ {
+ if ($k['keytype']=='theme')
+ {
+ $sql.=" a.title like '%".$k['keyword']."%' or ";
+ }
+ }
+ $sql.=" 1<>1) order by a.ts_created desc limit 10";
+ $this->view->literature=$this->db->fetchAll($sql);
+ //相关元数据,根据同名关键词实现
+ $sql="select distinct(md.uuid),md.title from keyword kw left join heihemetadata md on kw.id=md.id where kw.keyword in (select k.keyword from keyword k left join metadata m on k.id=m.id where m.id=? and k.keytype='theme') and kw.id<>? limit 10";
+ $this->view->related=$this->db->fetchAll($sql,array($id,$id));
+ //用户下载记录
+ $sql = "select o.ts_created,m.uuid,u.realname,u.unit,oa.project as onlineproject, fa.project as offlineproject
+ from dataorder as o left join metadata as m on o.uuid = m.uuid left join users as u on o.userid=u.id
+ left join onlineapp oa on o.onlineappid=oa.id left join offlineapp fa on o.offlineappid=fa.id
+ where m.uuid = '$uuid' and (o.status=0 or o.status=5) and u.realname IS NOT NULL order by o.ts_created desc limit 10";
+ $this->view->downhistory=$this->db->fetchAll($sql);
+ //数据附件
+ $sql = $this->db->quoteInto("select m.id,a.realname from mdattach m left join attachments a on m.id=a.id where m.uuid=?",$uuid);
+ $this->view->attachments = $this->db->fetchAll($sql);
+ //数据版本
+ $sql = "SELECT count(id) as c FROM mdversion WHERE uuid=? AND changelog IS NOT NULL";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($uuid));
+ $row = $sth->fetch();
+ $this->view->version = $row;
+ $archives = new Archive($this->db);
+ $data_archives = $archives->getArchiveByUUID($uuid);
+ if(!empty($data_archives))
+ {
+ foreach($data_archives as $k=>$v)
+ {
+ $data_archives[$k]['url'] = $archives->getArchiveUrlByCid($v['id']);
+ }
+ }
+ $this->view->data_archives = $data_archives;
+ //支持项目
+ include_once("data/Fund.php");
+ $fund = new Fund($this->db);
+ $this->view->fund = $fund->fetch($uuid);
+
+ //自动跳转
+ $sql="select s.* from datasource d left join source s on d.sourceid=s.id where d.uuid=?";
+ $row=$this->db->fetchRow($this->db->quoteInto($sql,$uuid));
+ $jump=$this->_request->getParam('jump');
+ if ($jump=="") $jump=1;//默认跳转
+ if (@$row->has_pages && ($jump==1))
+ {
+ $this->_helper->viewRenderer($row->code.'/view',null,true);
+ }
+ } //viewAction
+
+ /*
+ getversionAction() 获取数据版本
+ */
+ function getversionAction(){
+
+ $ac = $this->_getParam('ac');
+ $uuid = $this->_getParam('uuid');
+
+ if($ac == 'list')
+ {
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+
+ $sql = "SELECT v.changelog,v.ts_created,u.username FROM mdversion v
+ LEFT JOIN users u ON v.userid=u.id
+ WHERE v.uuid=? AND v.changelog IS NOT NULL
+ ORDER BY v.ts_created DESC";
+
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($uuid));
+ $rows = $sth->fetchAll();
+
+ if($rows)
+ {
+ foreach($rows as $k=>$v)
+ {
+ $rows[$k]['ts_created'] = date("Y-m-d H:i",strtotime($v['ts_created']));
+ $rows[$k]['changelog'] = str_replace("\n","",$v['changelog']);
+ }
+ $data = array("list"=>$rows);
+ $this->jsonexit($data);
+ return true;
+ }else{
+ $data = array("error"=>"处理中出现错误");
+ $this->jsonexit($data);
+ return true;
+ }
+ }
+
+ }//getversionAction()
+
+ function replace($string){
+ $patterns = array("/\"/i","/\'/i");
+ $replacements = array("“","‘");
+ ksort($patterns);
+ ksort($replacements);
+ return preg_replace($patterns, $replacements, $string);
+ }//引号替换
+
+
+ function postcommentAction(){
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ try{
+ $auth = Zend_Auth::getInstance();
+ if($auth->hasIdentity())
+ {
+ $user = $auth->getIdentity();
+ $userid = $user->id;
+ }else
+ {
+ $userid=0;
+ }
+
+ $author = mb_substr($this->replace(trim($this->_request->getParam('author'))),0,30,'UTF-8');
+ $email = mb_substr($this->replace(trim($this->_request->getParam('email'))),0,60,'UTF-8');
+ $url = mb_substr($this->replace(trim($this->_request->getParam('url'))),0,60,'UTF-8');
+ $content = $this->replace(trim($this->_request->getParam('content')));
+ $vdcode = mb_substr($this->replace(trim($this->_request->getParam('vdcode'))),0,4,'UTF-8');
+
+ if(empty($author))
+ {
+ echo "请输入您的名字";
+ exit();
+ }
+
+ if(strlen($author)<3) exit("姓名长度不得少于2个汉字 :)");
+
+ if(empty($email))
+ {
+ echo "请输入您的电子邮箱地址";
+ exit();
+ }
+
+ if(strlen($email)<4) exit("Email长度太短,请填写正确的Email :)");
+
+ if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i",$email))
+ {
+ echo "Email格式不正确";
+ exit();
+ }
+
+ if(strlen($content)<5) exit("评论长度不得少于3个汉字 :)");
+
+ if(preg_match("/script/i",$content))
+ {
+ $content = preg_replace("/script/i","script",$content);
+ }
+
+ if(preg_match("/<|>/",$content))
+ {
+ $data=array(
+ '<'=>'<',
+ '>'=>'>',
+ );
+
+ $patterns = array();
+ $replacements = array();
+ foreach($data as $k=>$v)
+ {
+ $patterns[]='/'.$k.'/i';
+ $replacements[]=$v;
+ }
+ ksort($patterns);
+ ksort($replacements);
+ $content=preg_replace($patterns, $replacements, $content);
+ if(!empty($url))
+ {
+ $url=preg_replace($patterns, $replacements, $url);
+ }
+ }
+
+ if(preg_match("/script/i",$url))
+ {
+ $url = preg_replace("/script/i","script",$url);
+ }
+
+ if(!preg_match("/http:\/\//",$url))
+ {
+ $url = "http://".$url;
+ }
+
+ $uuid = trim($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();
+ }
+
+ if(strtolower($vdcode) != $_SESSION['vdcodes'])
+ {
+ echo "验证码错误,请重新输入";
+ exit();
+ }
+
+
+ $data = array(
+ 'uuid' => $uuid,
+ 'uid' => $userid,
+ 'author' => $author,
+ 'email' => $email,
+ 'url' => $url,
+ 'ip' => $_SERVER['REMOTE_ADDR'],
+ 'content' => $content,
+ 'agent' => $_SERVER['HTTP_USER_AGENT'],
+ 'type' => 'comment'
+ );
+
+ $sql = "INSERT INTO comments (author,email,url,ip,content,agent,type,uuid,userid) VALUES (?,?,?,?,?,?,?,?,?)";
+ $sth = $this->db->prepare($sql);
+ $exec = $sth->execute(array($data['author'],$data['email'],$data['url'],$data['ip'],$data['content'],$data['agent'],$data['type'],$data['uuid'],$data['uid']));
+
+ if($exec)
+ {
+ $sql = "SELECT u.email FROM mdauthor au
+ LEFT JOIN users u on au.userid=u.id
+ WHERE au.uuid='$uuid'";
+ $sth = $this->db->query($sql);
+ $rows = $sth->fetchAll();
+
+ @$mailtp=new EmailText(
+ $this->db,
+ 'data-comment-note',
+ array(
+ 'user' =>$user->username,
+ 'uuid' =>$data['uuid'],
+ 'title' =>$this->replace(trim($this->_request->getParam('mdtitle'))),
+ 'content'=>$content
+ )
+ );
+ @$mail=new WestdcMailer($this->view->config->smtp);
+ @$mail->setBodyText($mailtp->getBody());
+ @$mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
+ @$mail->addTo($this->view->config->service->email);
+ if(is_array($rows) && count($rows)>0)
+ {
+ foreach($rows as $v)
+ {
+ @$mail->addTo($v['email']);
+ }
+ }
+ @$mail->setSubject($mailtp->getSubject());
+ @$mail->send();
+ $msg = "用户".$user->username."对元数据《".$this->replace(trim($this->_request->getParam('mdtitle')))."》进行了评论,点击查看";
+ include_once("message.php");
+ message::post($this->db,0,-1,"收到新数据评论",$msg);
+ echo "评论成功";
+ exit();
+ }else
+ {
+ echo "评论失败,请重试 :)";
+ exit();
+ }
+ }catch(Exception $e){
+ echo "出错了,请稍后再试";
+ exit();
+ }
+ }//ajax评论
+
+
+ /*
+ * 数据评论,根据UUID读取
+ */
+ function commentAction()
+ {
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $uuid=$this->_request->getParam('uuid');
+ if (empty($uuid)) die();
+ $sql="select * from comments where uuid=? AND reply=0 order by id desc";
+ $comments=$this->db->fetchAll($sql,array($uuid));
+
+ $paginator = Zend_Paginator::factory($comments);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(5);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('data/pagination_ajax.phtml');
+
+ include_once("Avatar.php");
+ $avatar = new Avatar();
+ if ($paginator)
+ {
+ foreach($paginator as $c)
+ {
+ //$author=$this->view->escape($c['author']);
+ $sql = "SELECT cr.id,cr.content as body,cr.reply,u.username,cr.ts_created,u.usertype,u.email as email,
+ (SELECT au.uuid FROM mdauthor au WHERE au.userid=u.id AND au.uuid='$uuid') as uuid
+ FROM comments cr
+ LEFT JOIN users u ON cr.userid=u.id
+ WHERE cr.reply=?";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($c['id']));
+ $replys = $sth->fetchAll();
+ $replyhtml = "";
+ if(!empty($replys) || count($replys)>0)
+ {
+ foreach($replys as $v)
+ {
+ $usertype = "";
+ $color = "";
+ if($v['usertype'] == "administrator")
+ {
+ $usertype = "[管理员]";
+ $color="#009d00";
+ }
+ if($v['uuid'] == $uuid)
+ {
+ $usertype = "[数据作者]";
+ $color="#add2e9";
+ }
+ if(!empty($color))
+ {
+ $color = 'background:'.$color.';color:#FFFFFF;';
+ }
+ $img = $avatar->Get($v['email'],48);
+ $replyhtml .='
+
+ ';
+
+ }
+ }
+
+ $img = $avatar->Get($c['email'],64);
+ //$img = '';
+
+ $author = $c['author'];
+ $author = ($c['url'])?''.$author.'':$author;
+ $author = ''.$author."";
+ $time = '发表于'.date('Y-m-d H:i:s',strtotime($c['ts_created'])).'';
+ print '
+
+ ';
+ }
+ echo ''.$paginator.'
';
+ }//else echo "No comments.";
+ }//评论列表
+
+ /**
+ * 判断用户是否填写了申请信息
+ * @param string $uuid
+ * @param int $userid
+ */
+ function todownloadAction() {
+
+ $this->view->pageID = "account-dataorder";
+
+ $this->_helper->viewRenderer('onlineapp-download');
+
+ $this->view->uuid = $uuid = $this->_request->getParam('uuid');
+
+ $auth = Zend_Auth::getInstance();
+ if (!$auth->hasIdentity())
+ {
+ $this->view->AlertType = "alert-error";
+ $this->view->msg = "请先登录您的账户后进行下载,页面将自动跳转";
+ $this->view->jump_url = '/account/login/?href=/data/todownload/uuid/'.$uuid;
+ return true;
+ }
+
+ if(empty($uuid))
+ {
+ $this->view->AlertType = "alert-error";
+ $this->view->msg = "参数错误!";
+ $this->view->jump_url = "/data";
+ return true;
+ }
+
+ $this->view->projectType = array(
+ "请选择项目类型" => "",
+ "国家973计划项目课题" => "国家973计划项目课题",
+ "国家863计划课题"=>"国家863计划课题",
+ "国家级科技支撑课题" => "国家级科技支撑课题",
+ "国家级科技重大专项" => "国家级科技重大专项",
+ "国家级国家重大工程" => "国家级国家重大工程",
+ "国家级国家自然科学基金" => "国家级国家自然科学基金",
+ "国际合作项目"=>"国际合作项目",
+ "省部级项目" => "省部级项目",
+ "其他项目工程" => "其他项目工程",
+ );
+
+ $userid = Zend_Auth::getInstance()->getIdentity()->id;
+
+ $submit = $this->_getParam('submit');
+ if(!empty($submit)){
+
+ $datas = array();
+ $datas['realname'] = $this->_request->getParam('realname');
+ $datas['unit'] = $this->_request->getParam('unit');
+ $datas['phone'] = $this->_request->getParam('phone');
+ $datas['address'] = $this->_request->getParam('address');
+ $datas['postcode'] = $this->_request->getParam('postcode');
+ $datas['email'] = $this->_request->getParam('email');
+ $datas['project'] = $this->_request->getParam('project');
+ $datas['project_id'] = $this->_request->getParam('project_id');
+ $datas['project_type'] = $this->_request->getParam('project_type');
+ $datas['project_title'] = $this->_request->getParam('project_title');
+
+ $this->view->info = $datas;
+
+ $this->view->AlertType = "alert-error";
+
+ foreach($datas as $k=>$v)
+ {
+ if(empty($v))
+ {
+ $this->view->error = "每一项内容都需要填写";
+ return true;
+ }
+ }
+
+ if(!is_numeric($datas['postcode']))
+ {
+ $this->view->error = "联系电话和邮政编码请填写数字";
+ return true;
+ }
+
+ if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i",$datas['email']))
+ {
+ $this->view->error = "请填写正确的email地址";
+ return true;
+ }
+
+ if(mb_strlen($datas['project'],"utf-8")<8)
+ {
+ $this->view->error = "项目介绍内容不少于8个字符";
+ return true;
+ }
+
+ if(preg_match('/^\d+$/',$datas['project']))
+ {
+ $this->view->error = "请输入有意义的项目介绍内容";
+ return true;
+ }
+
+ $data = array(
+ 'userid' => $userid,
+ 'username' => $datas['realname'],
+ 'unit' => $datas['unit'],
+ 'phone' => $datas['phone'],
+ 'address' => $datas['address'],
+ 'postcode' => $datas['postcode'],
+ 'project' => $datas['project'],
+ 'uuid' =>$uuid,
+ 'email' =>$datas['email'],
+ 'project_id'=>$datas['project_id'],
+ 'project_title'=>$datas['project_title'],
+ 'project_type'=>$datas['project_type']
+ );
+
+ if($this->db->insert('onlineapp',$data))
+ {
+ $select = "select id from onlineapp where userid='$userid' order by id desc";
+ $re=$this->db->query($select);
+ $row=$re->fetch();
+
+ $this->view->AlertType = "alert-success";
+ $this->view->jump_url = '/data/download/uuid/'.$uuid.'/onlineappid/'.$row['id'];
+ $this->view->msg = "您的信息已经提交成功,可以进行下载。请等待页面自动跳转,view->jump_url."\">或点击这里进入下载页面";
+
+ $msg = "用户{$data['username']} 填写了在线数据申请表 查看详细";
+ $title = "用户 {$data['username']} 申请了在线下载数据";
+ include_once("message.php");
+ message::post($this->db,0,-1,$title,$msg);
+
+ return true;
+ }
+ else {
+ $this->view->AlertType = "alert-error";
+ $this->view->error = "申请失败,请稍后重新尝试";
+ $this->view->info = $data;
+ return true;
+ }
+
+ return true;
+ }else{
+
+ $testsql="select * from onlineapp where userid='$userid' and uuid='$uuid' order by id desc";
+ $result=$this->db->query($testsql);
+ $rows = $result->fetch();
+ if (empty($rows['id']))
+ {
+ include_once("Users.php");
+ $usr = new Users($this->db);
+ $this->view->info = $usr->getUserInfo($userid);
+ return true;
+ }
+ else
+ {
+ $datas['realname'] = $rows['username'];
+ $datas['unit'] = $rows['unit'];
+ $datas['phone'] = $rows['phone'];
+ $datas['address'] = $rows['address'];
+ $datas['postcode'] = $rows['postcode'];
+ $datas['email'] = $rows['email'];
+ $datas['project'] = $rows['project'];
+ $datas['project_id'] = $rows['project_id'];
+ $datas['project_type'] = $rows['project_type'];
+ $datas['project_title'] = $rows['project_title'];
+ $this->view->info = $datas;
+ return true;
+ }
+ }
+
+ return true;
+
+ $userid=Zend_Auth::getInstance()->getIdentity()->id;
+
+ $datas = array();
+ $submited = $this->_request->getParam('submited');
+ $datas['username'] = $this->_request->getParam('username');
+ $datas['unit'] = $this->_request->getParam('unit');
+ $datas['phone'] = $this->_request->getParam('phone');
+ $datas['address'] = $this->_request->getParam('address');
+ $datas['postcode'] = $this->_request->getParam('postcode');
+ $datas['email'] = $this->_request->getParam('email');
+ $datas['project'] = $this->_request->getParam('project');
+ $datas['project_id'] = $this->_request->getParam('projectid');
+ $datas['project_type'] = $this->_request->getParam('projecttype');
+ $datas['project_title'] = $this->_request->getParam('projecttitle');
+
+
+
+ $form=$this->creatform($datas);
+
+ if (!empty($submited) && $ft==0){
+
+ foreach($datas as $k=>$v)
+ {
+ if($v == '')
+ {
+ echo $form.'';
+ exit();
+ }
+ }
+
+ if(!is_numeric($datas['postcode']))
+ {
+ echo $form.'';
+ exit();
+ }
+
+ if(!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i",$datas['email']))
+ {
+ echo $form.'';
+ exit();
+ }
+
+ if(mb_strlen($datas['project'],"utf-8")<8)
+ {
+ echo $form.'';
+ exit();
+ }
+
+ if(preg_match('/^\d+$/',$datas['project']))
+ {
+ echo $form.'';
+ exit();
+ }
+
+ $data = array(
+ 'userid' => $userid,
+ 'username' => $datas['username'],
+ 'unit' => $datas['unit'],
+ 'phone' => $datas['phone'],
+ 'address' => $datas['address'],
+ 'postcode' => $datas['postcode'],
+ 'project' => $datas['project'],
+ 'uuid' =>$uuid,
+ 'email' =>$datas['email'],
+ 'project_id'=>$datas['project_id'],
+ 'project_title'=>$datas['project_title'],
+ 'project_type'=>$datas['project_type']
+ );
+
+ if($this->db->insert('onlineapp',$data))
+ {
+ $select = "select id from onlineapp where userid='$userid' order by id desc";
+ $re=$this->db->query($select);
+ $row=$re->fetch();
+ echo "您的信息已经提交成功,可以进行下载。
+ 如果页面没有自动跳转,请点击这里进入下载页面
+ ";
+ $msg = "用户{$data['username']} 填写了在线数据申请表 查看详细";
+ $title = "用户 {$data['username']} 申请了在线下载数据";
+ include_once("message.php");
+ message::post($this->db,0,-1,$title,$msg);
+ exit();
+ }
+ else {
+ echo $form.'';
+ exit();
+ }
+
+ }else if( $ft==1 )
+ {
+ $testsql="select * from onlineapp where userid='$userid' and uuid='$uuid' order by id desc";
+ $result=$this->db->query($testsql);
+ $rows = $result->fetch();
+ if (empty($rows['id']))
+ {
+ $sql="select * from users where id='$userid'";
+ $result=$this->db->query($sql);
+ $rows = $result->fetch();
+
+ $datas['username'] = $rows['realname'];
+ $datas['unit'] = $rows['unit'];
+ $datas['phone'] = $rows['phone'];
+ $datas['address'] = $rows['address'];
+ $datas['postcode'] = $rows['postcode'];
+ $datas['email'] = $rows['email'];
+ $datas['project'] = $rows['project'];
+ $datas['project_id'] = $rows['project_id'];
+ $datas['project_type'] = $rows['project_type'];
+ $datas['project_title'] = $rows['project_title'];
+
+ echo $this->creatform($datas);
+ exit();
+ }
+ else
+ {
+ $datas['username'] = $rows['username'];
+ $datas['unit'] = $rows['unit'];
+ $datas['phone'] = $rows['phone'];
+ $datas['address'] = $rows['address'];
+ $datas['postcode'] = $rows['postcode'];
+ $datas['email'] = $rows['email'];
+ $datas['project'] = $rows['project'];
+ $datas['project_id'] = $rows['project_id'];
+ $datas['project_type'] = $rows['project_type'];
+ $datas['project_title'] = $rows['project_title'];
+
+ echo $this->creatform($datas);
+ exit();
+ }
+ }
+
+ }
+
+ /*
+ * 数据下载,根据UUID进行判断
+ * 一次只下载一个数据(一个元数据项)
+ */
+ function downloadAction()
+ {
+ $uuid=$this->_request->getParam('uuid');
+ $onlineappid=$this->_request->getParam('onlineappid');
+ $this->view->pageID = "account-dataorder";
+
+ if (empty($uuid)) $this->_redirect('/data');
+
+ $auth = Zend_Auth::getInstance();
+ if($auth->hasIdentity())
+ {
+ $user = $auth->getIdentity();
+ $userid = $user->id;
+ }
+
+ $testsql="select id,has_send_mail from onlineapp where userid='$userid' and uuid='$uuid' order by id desc";
+ $result=$this->db->query($testsql);
+ $rows = $result->fetch();
+ $has_send_mail=$rows['has_send_mail'];
+ if (empty($rows['id']))
+ {
+ $this->_redirect('/data/'.$uuid);
+ }
+ else
+ {
+ $sql="select onlineappid,id from dataorder where status=0 and userid='$userid' and uuid='$uuid' order by id desc";
+ $re=$this->db->query($sql);
+ $row=$re->fetch();
+ if(empty($row['onlineappid']))
+ {
+ $data = array(
+ 'userid' => $userid,
+ 'uuid' => $uuid,
+ 'onlineappid'=> $onlineappid,
+ 'ts_approved'=>'now()',
+ );
+ try {$this->db->insert('dataorder',$data);} catch (Exception $e) {}
+ }else
+ {
+ $sql="update dataorder set onlineappid='$onlineappid',ts_approved=now() where id='{$row['id']}'";
+ try {$this->db->exec($sql);} catch (Exception $e) {}
+ }
+ }
+
+
+ $sql=$this->db->quoteInto("select * from dataset o left join metadata m on o.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid where s.status>4 and m.datatype=0 and m.uuid=?",$uuid);
+ $data=$this->db->fetchRow($sql);
+ $updateftp=$updateftp1=false;
+ $this->view->md=$data;
+ $this->view->userpass=md5('westdc'.rand(1000,9999));
+ $this->view->ftptime=date('Y-m-d H:i:s', strtotime('+1 week'));
+ $sql=$this->db->quoteInto("select * from ftpuser where userid=?",$userid);
+ $row=$this->db->fetchRow($sql);
+ $datacount=$row['datacount'];
+ if ($data['host']=='ftp.westgis.ac.cn')
+ {
+ //添加FTP帐号信息以及时间控制信息
+ $updateftp=true;
+ $g6=new G6ftp();
+ $g6->db=$this->db;
+ //不进行判断,每个元数据中的下载地址都对应一个虚拟路径
+ $path[]=$data['path'];
+ $this->view->username='westdc'.$userid;
+ $uu=(object)array("id"=>$userid,
+ "username"=>$this->view->username,
+ "password"=>$this->view->userpass,
+ "path"=>$path,
+ "maxdata"=>$this->view->config->download->max,
+ "time"=>$this->view->ftptime,
+ "datacount"=>$datacount);
+ if ($g6->createuser($uu)) {
+ $this->view->userpass=$g6->pwd;
+ $this->view->ftptime=$g6->time;
+ } else {
+ $this->messenger->addMessage('错误:您正在进行下载的在线数据数已经超过系统允许的最大值,请在下面点击“完成”或“取消”对应的在线数据下载!');
+ $this->_redirect('/data/order');
+ }
+ } elseif ($data['host']=='ftp1.westgis.ac.cn')
+ {
+ //添加FTP1帐号信息以及时间控制信息
+ $proftp=new Proftp();
+ $proftp->db=$this->db;
+ //proftp离线用户名和g6的用户名稍有不同
+ $this->view->username='westdc_'.$userid;
+ $uu=(object)array("id"=>$userid,
+ "username"=>$this->view->username,
+ "password"=>$this->view->userpass,
+ "host"=>'ftp1.westgis.ac.cn',
+ "param"=>"onlineappid=".$onlineappid,
+ "maxdata"=>$this->view->config->download->max,
+ "time"=>$this->view->ftptime,
+ "datacount"=>$datacount);
+ if ($proftp->createuser($uu))
+ {
+ $this->view->userpass=$proftp->pwd;
+ $this->view->ftptime=$proftp->time;
+ }
+ } elseif ($data['host']=='ftp2.westgis.ac.cn')
+ {
+ //添加FTP2帐号信息以及时间控制信息
+ $proftp=new Pureftp();
+ $proftp->db=$this->db;
+ $this->view->username='westdc_'.$userid;
+ $uu=(object)array("id"=>$userid,
+ "username"=>$this->view->username,
+ "password"=>$this->view->userpass,
+ "host"=>'ftp2.westgis.ac.cn',
+ "param"=>"onlineappid=".$onlineappid,
+ "maxdata"=>$this->view->config->download->max,
+ "time"=>$this->view->ftptime,
+ "datacount"=>$datacount);
+ if ($proftp->createuser($uu))
+ {
+ $this->view->userpass=$proftp->pwd;
+ $this->view->ftptime=$proftp->time;
+ }
+ }
+ $ftpurl='ftp://'.$this->view->username.'@'.$data['host'];
+ if ($data['host']=='ftp.westgis.ac.cn') $ftpurl.=$data['path'];
+
+ //设置输出
+ //if ($updateftp || $updateftp1) $this->view->userpass=$password;
+ $this->view->ftpurl=$ftpurl;
+ //更新下载记录
+ //todo: 尝试添加一个RULE:若有对应数据存在,则不插入( userid,uuid,status=0,ts_approved:null)
+ /*$sql="select * from dataorder where userid=? and uuid=? and status=0 and (ts_approved is null)";
+ $u=$this->db->fetchRow($sql,array($userid,$uuid));
+ if (empty($u)) {
+ $sql="insert into dataorder (userid,uuid,ts_created) values(?,?,now())";
+ $this->db->query($sql,array($userid,$uuid));
+ }*/
+ if (!empty($ftpurl) && !$has_send_mail)
+ {
+ $data = array(
+ "uuid"=>$uuid,
+ "title"=>$this->view->md['title']."(".$this->view->md['filesize']."MB)",
+ "user"=>$user->username,
+ "ftpuser"=>$this->view->username,
+ "ftppwd"=>$this->view->userpass,
+ "ftptime"=>$this->view->ftptime,
+ "ftpurl"=>$this->view->ftpurl,
+ "note"=>$updateftp?'BTW:请注意登陆后要手工进入对应的目录!':''
+ );
+ $mailtp=new EmailText($this->db,'online-download',$data);
+ $mail=new WestdcMailer($this->view->config->smtp);
+ $mail->setBodyText($mailtp->getBody());
+ $mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
+ $mail->addTo($user->email);
+ $mail->setSubject($mailtp->getSubject());
+ @$mail->send();
+ $sql="update onlineapp set has_send_mail=true where id=?";
+ $sth=$this->db->prepare($sql);
+ $sth->execute(array($onlineappid));
+ }
+ }
+ /*
+ * 离线申请(可以包括在线数据),在无数据参数时,则显示已有列表
+ */
+ function orderAction()
+ {
+ $this->view->pageID = "account-dataorder";
+ $ac = $this->_request->getParam('ac');
+ include_once("helper/view.php");
+
+ $uuid = $this->_request->getParam('uuid');
+
+ $del = $this->_request->getParam('del');
+ $apply = $this->_request->getParam('apply');
+ $finish = $this->_request->getParam('finish');
+ $cancel = $this->_request->getParam('cancel');
+ $pdf = $this->_request->getParam('pdf');
+
+ //if (empty($uuid)) $this->_redirect('/data');
+ $userid = view::User('id');
+
+ if ($uuid)
+ {
+ //存在历史遗留问题,原来的数据并不能保证唯一
+
+ $order = new order\Order();
+ $orderListener = new order\listener\OrderListener();
+ @$order->events()->attachAggregate($orderListener);
+ $state = $order->addOrder($uuid);
+
+ if($state !== true)
+ {
+ $this->view->msg = \view::Msg('alert-error',$state);
+ }else{
+ $this->view->msg = \view::Msg('alert-success',"添加成功!您可以继续浏览数据或是继续提交申请表");
+ }
+
+ if (empty($ac)) $ac='offline1';
+
+ } elseif ($del) {
+ //删除数据申请
+ $sql=$this->db->quoteInto("delete from dataorder where userid=".$userid." and status in (1,2) and id=?",$del);
+ $this->db->query($sql);
+ $this->_redirect('/data/order');
+ } elseif ($apply) {
+ if ($apply=='all') {
+ $sql=$this->db->quoteInto("update dataorder set status=2 where status=1 and userid=?",$userid);
+ $this->db->query($sql);
+ } else {
+ $sql="update dataorder set status=2 where status=1 and userid=? and id=?";
+ $this->db->query($sql,array($userid,(int)$apply));
+ }
+ if (empty($ac)) $ac='offline2';
+ } elseif ($finish) {
+ if ($finish=='all') {
+ $sql=$this->db->quoteInto("update dataorder set ts_approved=now() where status=0 and userid=?",$userid);
+ $this->db->query($sql);
+ $sql="update ftpuser set datacount=0 where userid=?";
+ $this->db->query($sql,array($userid));
+ } else {
+ $sql="update dataorder set ts_approved=now() where status=0 and userid=? and id=?";
+ $this->db->query($sql,array($userid,(int)$finish));
+ $sql="update ftpuser set datacount=datacount-1 where userid=? and datacount>0";
+ $this->db->query($sql,array($userid));
+ }
+ } elseif ($cancel) {
+ if ($cancel=='all') {
+ $sql=$this->db->quoteInto("update dataorder set ts_approved=now(),status=-1 where status=0 and userid=?",$userid);
+ $this->db->query($sql);
+ $sql="update ftpuser set datacount=0 where userid=?";
+ $this->db->query($sql,array($userid));
+ } else {
+ $sql="update dataorder set ts_approved=now(),status=-1 where status in (0,1,2) and userid=? and id=?";
+ $this->db->query($sql,array($userid,(int)$cancel));
+ $sql="update ftpuser set datacount=datacount-1 where userid=? and datacount>0";
+ $this->db->query($sql,array($userid));
+ }
+ if (empty($ac)) $ac='offline2';
+ } elseif ($pdf) {
+ //生成PDF离线申请文件
+ //用户信息可以从SESSION中读取?离线申请信息
+ //$sql="select * from users where id=?";
+ $sql="select m.title||'('||m.filesize::text||'MB)' as title,m.ts_published,date_part('year',doi.ts_published) as publish_year,m.citation,m.suppinfo,
+array_to_string(ARRAY(
+select r.reference from mdref mr left join reference r on mr.refid=r.id
+where mr.reftype=3 and mr.uuid=d.uuid order by mr.place),'\n'::text) as reference,
+array_to_string(array(
+select fund.fund_type||':'||fund.title||'(编号:'||fund.fund_id||')'
+from fund left join mdfund on fund.id=mdfund.fid where mdfund.uuid=d.uuid),'\n'::text) as fund,
+doi.doi as datadoi,doi.authors,doi.publisher,doi.title as doititle,doi.author_en,doi.publisher_en,doi.title_en
+from dataorder d left join metadata m on d.uuid=m.uuid left join datadoi doi on doi.uuid=d.uuid
+where d.status=2 and d.userid=? order by d.ts_created desc
+";
+ $rows=$this->db->fetchAll($sql,array($userid));
+ if ($rows) {
+ $this->view->data2=$rows;
+ $this->view->form=new OfflinePdfForm();
+
+ $this->_helper->viewRenderer('pdf');
+ if ($this->_request->isPost()) {
+ $formData = $this->_request->getPost();
+ $datalist='';
+ foreach($rows as $i=>$row) $datalist.=($i+1).". ".$row['title'].";";
+ $formData['datalist']=$datalist;
+ if ($this->view->form->isValid($formData)) {
+ if (@$formData['save']) {
+ //保存
+ //根据pdflink字段,以判断是否已经提交
+ //在数据库中创建rules,在更新offlineapp表时同时更新users表中对应的信息
+ $sql="select id from offlineapp where userid=? and (pdflink is null or pdflink='') and (ts_approved is null)";
+ $row=$this->db->fetchRow($sql,array($userid));
+ if ($row) {
+ $sql="update offlineapp set username=?,email=?,phone=?,address=?,postcode=?,project=?,unit=?,datalist=?,ts_created=now(),project_type=?,project_id=?,project_title=? where id=?";
+ $this->db->query($sql,array($formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$formData['project_type'],$formData['project_id'],$formData['project_title'],$row['id']));
+ } else {
+ $sql="insert into offlineapp (userid,username,email,phone,address,postcode,project,unit,datalist,project_type,project_id,project_title) values(?,?,?,?,?,?,?,?,?,?,?,?)";
+ $this->db->query($sql,array($userid,$formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$formData['project_type'],$formData['project_id'],$formData['project_title']));
+ }
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ //生成PDF
+ $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join heihemetadata m on d.uuid=m.uuid where d.status=2 and d.userid=?";
+ $list=$this->db->fetchAll($sql,array($userid));
+ foreach($list as $i=>$row) @$formData['heihelist'].=($i+1).". ".$row['title'].";";
+ $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join normalmetadata m on d.uuid=m.uuid where d.uuid not in (select uuid from heihemetadata) and d.status=2 and d.userid=?";
+ $list=$this->db->fetchAll($sql,array($userid));
+ foreach($list as $i=>$row) @$formData['westdclist'].=($i+1).". ".$row['title'].";";
+ $pdf = new ApplicantPDF();
+ $pdf->template=$this->view->config->offline->template;
+ $pdf->heihetemplate=$this->view->config->offline->heihetemplate;
+ $formData['project'].='['.$formData['project_title'].' | '.$formData['project_type'].' | '.$formData['project_id'].']';
+ $pdf->data = $formData;
+ if (isset($formData['westdclist'])) $pdf->drawWestdc();
+ if (isset($formData['heihelist'])) $pdf->drawHeihe();
+ $pdf->addRef($rows);
+ $pdf->addSecurity($this->view->config->offline->security);
+ header("Content-Disposition: inline; filename=westdc-data-apply.pdf");
+ header("Content-Type:application/pdf");
+ //header("Content-Length: " . strlen($pdfstring));
+ echo $pdf->Output('westdc-data-apply.pdf','S');
+ die();
+ //exit;
+ } elseif ($formData['submit']) {
+ //提交
+ //生成PDF
+ $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join heihemetadata m on d.uuid=m.uuid where d.status=2 and d.userid=?";
+ $list=$this->db->fetchAll($sql,array($userid));
+ foreach($list as $i=>$row) @$formData['heihelist'].=($i+1).". ".$row['title'].";";
+ $sql="select m.title||'('||m.filesize::text||'MB)' as title from dataorder d right join normalmetadata m on d.uuid=m.uuid where d.uuid not in (select uuid from heihemetadata) and d.status=2 and d.userid=?";
+ $list=$this->db->fetchAll($sql,array($userid));
+ foreach($list as $i=>$row) @$formData['westdclist'].=($i+1).". ".$row['title'].";";
+ $pdf = new ApplicantPDF();
+ $pdf->template=$this->view->config->offline->template;
+ $pdf->heihetemplate=$this->view->config->offline->heihetemplate;
+ $pdf->data = $formData;
+ $pdf->data['project'].='['.$formData['project_title'].' | '.$formData['project_type'].' | '.$formData['project_id'].']';
+ if (isset($formData['westdclist'])) $pdf->drawWestdc();
+ if (isset($formData['heihelist'])) $pdf->drawHeihe();
+ $pdf->addRef($rows);
+ $pdf->addSecurity($this->view->config->offline->security);
+ $fn=$formData['realname'].date('YmdHis').".pdf";
+ $pdf->Output($this->view->config->offline->savepath."/".$fn, 'F');
+
+ //保存到数据库
+ $sql="select id from offlineapp where userid=? and pdflink is null and (ts_approved is null)";
+ $row=$this->db->fetchRow($sql,array($userid));
+ if ($row) {
+ $sql="update offlineapp set username=?,email=?,phone=?,address=?,postcode=?,project=?,unit=?,datalist=?,ts_created=now(),pdflink=?,project_type=?,project_id=?,project_title=? where id=?";
+ $this->db->query($sql,array($formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$fn,$formData['project_type'],$formData['project_id'],$formData['project_title'],$row['id']));
+ } else {
+ $sql="insert into offlineapp (userid,username,email,phone,address,postcode,project,unit,datalist,pdflink,project_type,project_id,project_title) values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
+ $this->db->query($sql,array($userid,$formData['realname'],$formData['email'],$formData['phone'],$formData['address'],$formData['postcode'],$formData['project'],$formData['unit'],$datalist,$fn,$formData['project_type'],$formData['project_id'],$formData['project_title']));
+ $sql="select id from offlineapp where userid=? and pdflink=?";
+ $row=$this->db->fetchRow($sql,array($userid,$fn));
+ }
+ $sql="update dataorder set status=3, offlineappid=? where status=2 and userid=?";
+ $this->db->query($sql,array($row['id'],$userid));
+
+ //发送用户邮件进行信息提示和说明
+ //$mail = new Zend_Mail('utf-8');
+ $data = array(
+ "user"=>$formData['realname'],
+ "datalist"=>str_replace(";","\n",$datalist)
+ );
+ $mailtp=new EmailText($this->db,'offline-email',$data);
+ $mail = new WestdcMailer($this->view->config->smtp);
+ $mail->setBodyText($mailtp->getBody());
+ $mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
+ $mail->addTo($formData['email']);
+ $mail->setSubject($mailtp->getSubject());
+ $attach=$mail->createAttachment($pdf->Output('applicant','S'));
+ $attach->filename='数据申请-'.$formData['realname'].'.pdf';
+ $mail->send();
+ $this->_helper->viewRenderer('order');
+
+ //跳转到/data/order,并提示帮助信息,告知用户已经发送EMAIL
+ $this->view->msg=view::Msg('alert-success',"提示信息:您的离线申请已经提交,系统已经发送一封邮件给您,请打印出申请表、签字后扫描为pdf并email给数据中心服务组(仍可以采用邮寄方式),具体信息请参考邮件说明。",0);
+ if (empty($ac)) $ac='offline3';
+ //$this->_redirect('/data/order');
+ }
+ }
+ } else {
+ $sql="select u.* from users u left join offlineapp o on u.id=o.userid where u.id=?";
+ $row=$this->db->fetchRow($sql,array($userid));
+ /*$row=$ut->fetchRow('id='.$userid);
+ $formData['email']=$row->email;
+ $formData['phone']=$row->phone;
+ $formData['realname']=$row->realname;
+ $formData['unit']=$row->unit;
+ $formData['address']=$row->address;
+ $formData['purpose']=$row->project;
+ $formData['id']=$row->id;*/
+ $this->view->form->populate($row);
+ }
+ } else
+ $this->view->msg=view::Msg('alert-error',"错误:您还没有提交任何离线申请的数据,或您的数据申请已经提交(等待处理过程中)!",0);
+ }
+
+ if ($ac=='' || $ac=='online')
+ {
+ $status='d.status=0 and d.ts_approved is not null';
+ $this->view->tabID='order-online';
+ } else if ($ac=='offline1') {
+ $status='d.status in (1)';
+ $this->view->tabID='order-offline1';
+ } else if ($ac=='offline2') {
+ $status='d.status in (2)';
+ $this->view->tabID='order-offline2';
+ } else if ($ac=='offline3') {
+ $status='d.status in (3,4)';
+ $this->view->tabID='order-offline3';
+ } else if ($ac=='offline4') {
+ $status='d.status in (5)';
+ $this->view->tabID='order-offline4';
+ }
+ //显示已经申请的数据,包括已经提交的申请和未提交的申请,还有已经处理完成的申请,正在进行的在线数据下载
+ $sql="select d.*,m.title,m.datatype from dataorder d left join metadata m on d.uuid=m.uuid
+ where $status and d.userid=? order by d.status,d.ts_created desc";
+ $rows=$this->db->fetchAll($sql,array($userid));
+ $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;
+ /*foreach($rows as $row) {
+ switch ($row['status']){
+ case 0:
+ $dataorder0[]=$row;
+ break;
+ case 1:
+ $dataorder1[]=$row;
+ break;
+ case 2:
+ case 3:
+ case 4:
+ $dataorder2[]=$row;
+ break;
+ case 5:
+ $dataorder3[]=$row;
+ break;
+ default:
+ break;
+ }
+ }
+ @$this->view->dataorder0=$dataorder0;
+ @$this->view->dataorder1=$dataorder1;
+ @$this->view->dataorder2=$dataorder2;
+ @$this->view->dataorder3=$dataorder3;*/
+ }
+ /*
+ * 查看数据缩略图
+ */
+ function thumbAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(*) from heihemetadata");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('heihemetadata as m','m.*')
+ ->order('m.title desc')->limitPage($page,9);
+ $this->view->metadata = $this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$this->limit);
+ }
+
+ /*
+ *附件下载
+ */
+ function attachAction(){
+
+ $uuid = $this->_request->getParam('uuid');
+
+ if(!empty($uuid))
+ {
+
+ $sql="select * from mdattach m left join attachments a on m.id=a.id where m.uuid='$uuid'";
+ $re=$this->db->query($sql);
+ $atts = $re->fetch();
+
+ if(empty($atts['id']))
+ {
+ $this->_redirect("/data/$uuid");
+ }//没有附件
+
+ $auth = Zend_Auth::getInstance();
+ if($auth->hasIdentity())
+ {
+ /*
+ $user = $auth->getIdentity();
+ $userid = $user->id;
+ $sql = "select d.* from dataorder d
+ left join users u on u.id=d.userid
+ left join metadata m on m.uuid=d.uuid
+ where (d.status=5 and d.userid='$userid' and d.uuid='$uuid') or u.usertype='administrator'";
+ $re= $this->db->query($sql);
+ $row=$re->fetch();
+ if(!empty($row['uuid']))
+ {
+ $this->messenger->addMessage('您没有权限下载该附件');
+ $this->_redirect("/data");
+ }
+ else
+ {*/
+ //由于涉及多个文件下载,所以将附件添加到zip压缩文件再输出
+
+ $sql="select * from mdattach m left join attachments a on m.id=a.id where m.uuid='$uuid'";
+ $re=$this->db->query($sql);
+ $atts = $re->fetchAll();
+
+ $zip = new ZipArchive();
+ $url=$this->view->config->upload."tmp/attachments_$uuid.zip";//创建临时文件
+ $opened=$zip->open($url, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
+ if( $opened !== true ){
+ die("cannot open {$url} for writing.");
+ }
+
+ $updates = array(); //统计被下载的附件ID
+
+ foreach ($atts as $k=>$v)
+ {
+ if (is_file($this->view->config->upload.$v['filename'])) {
+ $updates[]=$v['id'];
+ $zip->addFile($this->view->config->upload.$v['filename'],'/'.basename($v['filename']));
+ }
+ }
+ $zip->close();
+
+ //更新统计
+ $ids=join(',',$updates);
+ $sql = "update attachments set downtimes=downtimes+1 where id in ($ids)";
+ @$this->db->exec($sql);
+
+
+ //输出下载
+ $content=file_get_contents($url);
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $this->getResponse()->setHeader('Content-Type', 'application/octet-stream')
+ ->setHeader('Content-Disposition','attachment; filename="'.basename($url).'"')
+ ->setHeader('Content-Length', strlen($content))
+ ->setHeader('Content-Type','application/force-download')
+ ->setHeader('Content-Type','application/download')
+ ->setHeader('Content-Type','application/zip')
+ ->setHeader('Content-Description','File Transfer')
+ ->setHeader('Content-Transfer-Encoding','binary')
+ ->setHeader('Expires',0)
+ ->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0')
+ ->setHeader('Pragma','public')
+ ->setBody($content);
+ // }
+ }//end if
+ else
+ {
+ $this->messenger->addMessage('您没有权限下载该附件');
+ $this->_redirect("/data/$uuid");
+ }//未登陆
+ }//end if
+ else
+ {
+ $this->messenger->addMessage('您没有权限下载该附件');
+ $this->_redirect("/data/$uuid");
+ }//无权限
+
+ }
+
+
+ /*
+ * 西部计划项目及其数据产出
+ */
+ public function westeeAction()
+ {
+ //$sql="select w.*,m.uuid from westee w left join westeemd m on w.id=m.eeid order by w.id";
+ $sql="select * from westee order by id";
+ $this->view->westee=$this->db->fetchAll($sql);
+ $sql="select w.eeid,m.title,m.uuid from westeemd w left join metadata m on w.uuid=m.uuid order by w.eeid";
+ $this->view->westeemd=$this->db->fetchAll($sql);
+ }
+
+ public function pingbackAction()
+ {
+ $this->_helper->ViewRenderer->setNoRender();
+ $this->_helper->layout->disableLayout();
+ $server = new Zend_XmlRpc_Server();
+ $server->setClass('PingbackRpc', 'pingback');
+ echo $server->handle();
+ }
+
+ public function pingtestAction()
+ {
+ $this->_helper->ViewRenderer->setNoRender();
+ $this->_helper->layout->disableLayout();
+ $client = new Zend_XmlRpc_Client('http://test.westgis.ac.cn/data/pingback');
+ $arg1 = 'http://wlx.westgis.ac.cn/567/';
+ $arg2 = 'http://test.westgis.ac.cn/data/487591d0-d437-4114-b810-cbef7c4ee4b2';
+ //$result = $client->call('pingback.ping', array($arg1, $arg2));
+ $test = $client->getProxy('pingback');
+ $test->ping($arg1,$arg2);
+ //var_dump($result);
+ }
+ public function outputAction()
+ {
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+ $sql="select title,datatype,filesize,id from heihemetadata";
+ $md=$this->db->fetchAll($sql);
+ foreach($md as $m)
+ {
+ print $m["title"].",";
+ print ($m["datatype"]?"内部":"公开").",";
+ print ($m["filesize"]==1?" ":$m["filesize"]).",";
+ $sql1="select keyword from keyword where id=".$m["id"]." and keytype='place'";
+ $kd=$this->db->fetchAll($sql1);
+ foreach ($kd as $p) print $p["keyword"]." ";
+ print ",";
+ $sql1="select keyword from keyword where id=".$m["id"]." and keytype='temporal'";
+ $kd=$this->db->fetchAll($sql1);
+ foreach ($kd as $p) print $p["keyword"]." ";
+ print ",";
+ print "
";
+ }
+
+ }
+
+
+ public function jsonexit($data){
+ $this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($data,JSON_NUMERIC_CHECK));
+ return true;
+ }
+ function organizationAction()
+ {
+ $page = $this->_request->getParam('page');
+ $name = $this->_request->getParam('name');
+ $state=$this->db->query("select distinct responsible.organisation from responsible left join role on role.resid=responsible.id where role.role in ('pointOfContact','resourceProvider','owner')");
+ $this->view->organisation=$state->fetchAll();
+ if (!empty($name)) {
+ $this->view->codename=$name;
+ $sql="select distinct m.* from heihemetadata m left join role r on m.uuid=r.uuid left join responsible s on r.resid=s.id where r.role in ('pointOfContact','resourceProvider','owner') and s.organisation=?";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($name));
+ $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;
+ } else {
+ //提供全部分类列表
+ }
+ }
+ function fundAction()
+ {
+ $id = (int)$this->_request->getParam('id');
+ if (!empty($id)) {
+ $sql="select * from fund where id=?";
+ $this->view->fund=$this->db->fetchRow($sql,array($id));
+ if ($this->view->fund) {
+ $sql="select distinct m.* from heihemetadata m left join mdfund mf on m.uuid=mf.uuid where mf.fid=?";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($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;
+ }
+ } else {
+ //提供全部分类列表
+ $sql="select f.id,f.title,f.fund_id,f.fund_type,f.ts_created,count(m.id) as datacount,sum(md.filesize) as filesize from fund f left join mdfund m on f.id=m.fid left join metadata md on m.uuid=md.uuid where m.id is not null group by f.id,f.title,f.fund_id,f.fund_type,f.ts_created order by datacount desc,f.ts_created desc";
+ $sth = $this->db->prepare($sql);
+ $sth->execute();
+ $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('fund-list');
+ }
+ }
+
+ //实现基于DOI信息的浏览
+ function doiAction()
+ {
+ $ac = $this->_request->getParam('ac');
+ if ($ac=='unready') {
+ //列出没有DOI的数据
+ $sql="select m.* from heihemetadata m where length(m.doi)<3 and m.uuid not in (select uuid from datadoi) order by m.ts_created desc";
+ $this->view->pageID='doi-unready';
+ } else if ($ac=='prepare') {
+ //列出有DOI但还未进行提交申请的数据
+ $sql="select m.* from heihemetadata m where length(m.doi)>3 and m.uuid not in (select uuid from datadoi) order by m.ts_created desc";
+ $this->view->pageID='doi-prepare';
+ } else if ($ac=='unsubmit') {
+ //列出有DOI并计划提交申请的数据
+ $sql="select m.*,d.doi as datadoi,date(d.ts_created) as ts_created from heihemetadata m left join datadoi d on m.uuid=d.uuid where length(m.doi)>3 and d.ts_created is not null and d.ts_submitted is null order by d.ts_created desc";
+ $this->view->pageID='doi-unsubmit';
+ } else if ($ac=='submit') {
+ //列出有DOI并计划提交申请的数据
+ $sql="select m.*,d.doi as datadoi,date(d.ts_submitted) as ts_submitted from heihemetadata m left join datadoi d on m.uuid=d.uuid where length(m.doi)>3 and d.ts_submitted is not null and d.ts_published is null order by d.ts_submitted desc,d.ts_created desc";
+ $this->view->pageID='doi-submit';
+ } else if ($ac=='publish' || empty($ac)) {
+ //默认:列出最新发布的DOI数据
+ $sql="select m.*,d.doi as datadoi,date(d.ts_submitted) as ts_submitted,date(d.ts_published) as ts_published from heihemetadata m left join datadoi d on m.uuid=d.uuid where length(m.doi)>3 and d.ts_published is not null order by d.ts_published desc,d.ts_submitted desc,d.ts_created desc";
+ $this->view->pageID='doi-publish';
+ }
+ $sth = $this->db->prepare($sql);
+ $sth->execute();
+ $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;
+ }
+
+ //基于数据作者的浏览(包括认证后的数据作者以及未认证的数据作者)
+ function authorAction()
+ {
+ $ac = $this->_request->getParam('ac');
+ $id = (int)$this->_request->getParam('id');
+ if ($ac=='verified') {
+ //已经认证过的数据作者
+ $this->view->pageID='author-verified';
+ $this->view->ac='verified';
+ if ($id) {
+ //列出作者的数据
+ $sql="select username,realname from users where id=?";
+ $this->view->author=$this->db->fetchRow($sql,array($id));
+ $sql="select m.* from heihemetadata m left join mdauthor a on a.uuid=m.uuid where a.userid=?";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($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;
+ } else {
+ //已经认证过的数据作者
+ $sql="select u.username,u.realname,u.id,count(u.id) as count from mdauthor a left join users u on a.userid=u.id where a.status=1 and a.uuid in (select uuid from heihemetadata) group by u.id,u.username,u.realname";
+ $sth = $this->db->prepare($sql);
+ $sth->execute();
+ $rows = $sth->fetchAll();
+ $paginator = Zend_Paginator::factory($rows);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(50);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
+ $this->view->paginator=$paginator;
+ }
+ } else if ($ac=='unverified' || empty($ac)) {
+ //未认证的数据作者
+ $this->view->pageID='author-unverified';
+ $this->view->ac='unverified';
+ if ($id) {
+ //列出数据
+ $sql="select individual as username from responsible where id=?";
+ $this->view->author=$this->db->fetchRow($sql,array($id));
+ $sql="select distinct m.* from heihemetadata m left join role r on m.uuid=r.uuid left join responsible s on r.resid=s.id where r.role in ('pointOfContact','resourceProvider','owner') and s.id=?";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($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;
+ } else {
+ //列出所有作者
+ $sql="select distinct responsible.individual as username,responsible.id from responsible left join role on role.resid=responsible.id where role.role in ('pointOfContact','resourceProvider','owner')";
+ $sth = $this->db->prepare($sql);
+ $sth->execute();
+ $rows = $sth->fetchAll();
+ $paginator = Zend_Paginator::factory($rows);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(50);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
+ $this->view->paginator=$paginator;
+ }
+ }
+ }
+
+ function listAction()
+ {
+ $sql="select m.uuid,m.title,m.citation,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year from heihemetadata m
+left join mdstatus s on m.uuid=s.uuid
+left join datadoi d on d.uuid=m.uuid
+where s.status>4
+and m.uuid not in
+(select d.uuid from datasource d left join source s on d.sourceid=s.id
+where s.code in ('heihe','water','hiwater','westee'))
+order by m.title";
+ $this->view->metadata=$this->db->fetchAll($sql);
+ $sql="select m.uuid,m.title,m.citation,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
+ from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid where s.status>4 and m.title like '黑河综合遥感联合试验%' order by title";
+ $this->view->water=$this->db->fetchAll($sql);
+ $sql="select m.uuid,m.title,m.citation ,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
+ from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid where s.status>0 and m.title like '黑河生态水文遥感试验%' order by title";
+ $this->view->hiwater=$this->db->fetchAll($sql);
+ $sql="select m.uuid,m.title,m.citation ,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
+ from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid left join datasource ds on ds.uuid=m.uuid left join source sr on ds.sourceid=sr.id where sr.code='heihe' and s.status>0 and m.title not like '黑河生态水文遥感试验%' order by title";
+ $this->view->heihe=$this->db->fetchAll($sql);
+ $sql="select m.uuid,m.title,m.citation ,m.doi,d.doi as datadoi,d.ts_published,d.authors,d.publisher,date_part('year',d.ts_published) as publish_year
+ from heihemetadata m left join datadoi d on d.uuid=m.uuid left join mdstatus s on m.uuid=s.uuid left join datasource ds on ds.uuid=m.uuid left join source sr on ds.sourceid=sr.id where sr.code='westee' and s.status>4 order by title";
+ $this->view->westee=$this->db->fetchAll($sql);
+
+ }
+}
+
diff --git a/application/default/views/scripts/data/order.phtml b/application/default/views/scripts/data/order.phtml
index 479be521..4a455e08 100644
--- a/application/default/views/scripts/data/order.phtml
+++ b/application/default/views/scripts/data/order.phtml
@@ -6,11 +6,11 @@
$this->breadcrumb('首页');
$this->breadcrumb(''.$this->config->title->data.'');
$this->breadcrumb('离线申请');
- $this->breadcrumb()->setSeparator(' > ');
+ $this->breadcrumb()->setSeparator(' > ');
$this->nav[] = array('link'=>"/data/order",'title'=>'数据蓝');
?>
- = $this->render('breadcrumbs.phtml') ?>
-
+ = $this->render('breadcrumbs.phtml') ?>
+
-
数据篮
+
数据篮
- msg))
- {
- echo $this->msg;
- }
+ msg))
+ {
+ echo $this->msg;
+ }
?>
-
+
paginator)) : ?>
= $this->paginator; ?>
时间 |
- 标题 |
-
-tabID=='order-offline1') {
-echo '提交所有数据(一次最多5条)';
-} elseif ($this->tabID=='order-offline2') {
-echo '提交离线申请';
-} elseif ($this->tabID=='order-offline3') {
-echo '申请状态';
-} elseif ($this->tabID=='order-offline4') {
-echo '通过时间';
-}
-?>
-
+ | 标题 |
+
+tabID=='order-offline1') {
+echo '提交所有数据(一次最多5条)';
+} elseif ($this->tabID=='order-offline2') {
+echo '提交离线申请';
+} elseif ($this->tabID=='order-offline3') {
+echo '申请状态';
+} elseif ($this->tabID=='order-offline4') {
+echo '通过时间';
+}
+?>
+
|
-paginator as $order) : ?>
+paginator as $order) : ?>
|
- |
-
-tabID=='order-offline1') {
+ | |
+
+tabID=='order-offline1') {
echo '提交
- 取消';
-} elseif ($this->tabID=='order-offline2') {
+ 取消';
+} elseif ($this->tabID=='order-offline2') {
switch($order['status']) {
case 2:
echo "请生成PDF申请表";
@@ -76,8 +76,8 @@ if ($this->tabID=='order-offline1') {
break;
default:
break;
- }
-} elseif ($this->tabID=='order-offline3') {
+ }
+} elseif ($this->tabID=='order-offline3') {
switch($order['status']) {
case 3:
echo "请打印签字扫描为pdf并email或邮寄";
@@ -90,18 +90,18 @@ if ($this->tabID=='order-offline1') {
break;
default:
break;
- }
-} elseif ($this->tabID=='order-offline4') {
- echo date('Y-m-d',strtotime($order['ts_approved']));
-}
-?>
+ }
+} elseif ($this->tabID=='order-offline4') {
+ echo date('Y-m-d',strtotime($order['ts_approved']));
+}
+?>
|
-
+
-
+
diff --git a/application/models/order/Order.php b/application/models/order/Order.php
new file mode 100644
index 00000000..a0ca62b1
--- /dev/null
+++ b/application/models/order/Order.php
@@ -0,0 +1,99 @@
+db = \Zend_Registry::get('db');
+ }else{
+ $this->db = $db;
+ }
+
+ $this->config = \Zend_Registry::get('config');
+ }
+
+ public function events(\Zend_EventManager_EventCollection $events = NULL)
+ {
+ if ($events !== NULL) {
+ $this->events = $events;
+ } elseif ($this->events === NULL) {
+ $this->events = new \Zend_EventManager_EventManager(__CLASS__);
+ }
+ return $this->events;
+ }
+
+ /*************
+
+ status:
+
+ 1 开始进入离线申请申请程序中
+ 2 填写并提交离线申请表
+ 3 邮寄离线申请表
+ 4 收到离线申请表
+ 5 处理离线申请表
+ 10:离线申请完成?
+ -1: 取消了在线下载进程
+
+ **************/
+
+ //添加到数据篮
+ public function addOrder($uuid,$uid = 0){
+
+ if(empty($uid))
+ {
+ $uid = \view::User('id');
+ }
+
+ 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))
+ {
+ return "参数错误";
+ }
+
+ $results = $this->events()->trigger('submit', $this, compact('uuid','uid'));
+ $data = $results->bottom();
+
+ if($data !== true)
+ {
+ return $data;
+ }
+
+ if($this->pushToDataorder($uuid,$uid) === true)
+ {
+ return true;
+ }else{
+ return "操作中出现错误,请重试";
+ }
+
+ }
+
+ //放到数据篮中
+ public function pushToDataorder($uuid,$uid = 0)
+ {
+ if(empty($uid))
+ {
+ $uid = \view::User('id');
+ }
+
+ $sql="insert into dataorder (uuid,ts_created,userid,status) values(?,now(),?,?)";
+ $rs = $this->db->query($sql,array($uuid,$uid,1));
+
+ if($rs)
+ {
+ return true;
+ }else{
+ return false;
+ }
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/application/models/order/listener/OrderEvents.php b/application/models/order/listener/OrderEvents.php
new file mode 100644
index 00000000..3c78445f
--- /dev/null
+++ b/application/models/order/listener/OrderEvents.php
@@ -0,0 +1,7 @@
+db = \Zend_Registry::get('db');
+ }else{
+ $this->db = $db;
+ }
+ $this->config = \Zend_Registry::get('config');
+ }
+
+ public function attach(\Zend_EventManager_EventCollection $events)
+ {
+ $this->attachOnOrder($events);
+ }
+
+ public function detach(\Zend_EventManager_EventCollection $events)
+ {
+
+ }
+
+ public function attachOnOrder(\Zend_EventManager_EventCollection $events)
+ {
+ $mountedClass = new \order\mount\OrderOperate();
+ $events->attach('submit', array($mountedClass, 'submit'), 100);
+ }
+
+}
\ No newline at end of file
diff --git a/application/models/order/mount/OrderOperate.php b/application/models/order/mount/OrderOperate.php
new file mode 100644
index 00000000..35f27ece
--- /dev/null
+++ b/application/models/order/mount/OrderOperate.php
@@ -0,0 +1,117 @@
+db = \Zend_Registry::get('db');
+ }else{
+ $this->db = $db;
+ }
+
+ $this->config = \Zend_Registry::get('config');
+ }
+
+ //提交申请
+ public function submit($e)
+ {
+ $uuid = $e->getParam('uuid');
+ $uid = $e->getParam('uid');
+
+ try{
+ if($this->checkOrderUUID($uuid) !== false)
+ {
+ return "此数据尚未正式发布,还不能申请";
+ }
+
+ if($this->checkOrderNum(true,$uid) === false)
+ {
+ return "您的数据篮中存放的数据已达到可申请的数量";
+ }
+
+ if($this->checkOrderHas($uuid,$uid))
+ {
+ return "此数据已经在数据篮中";
+ }
+ }catch(Exception $e)
+ {
+ \view::Dump($e->getMessage());
+ }
+
+ return true;
+ }
+
+ //检查元数据是否已发布(存在于metadata表中)
+ public function checkOrderUUID($uuid)
+ {
+ $sql = "select count(*) as mdcount from {$this->tbl_metadata} where uuid=?";
+ $rs = $this->db->fetchRow($this->db->quoteInto($sql,$uuid));
+
+ if($rs['mdcount'] == 0)
+ {
+ return true;
+ }else{
+ return false;
+ }
+ }
+
+ //检查用户是否已经提交了该数据的申请
+ public function checkOrderHas($uuid,$uid = 0)
+ {
+ if(empty($uid))
+ {
+ $uid = \view::User('id');
+ }
+
+ $sql = "select count(*) as datacount from {$this->tbl_dataorder} where (ts_approved is null) and userid=$uid and uuid=? and status in (1,2,3,4)";
+ $rs = $this->db->fetchRow($this->db->quoteInto($sql,$uuid));
+
+ if($rs['datacount']>=1)
+ {
+ return true;
+ }else{
+ return false;
+ }
+ }//CheckOrderHas()
+
+ //检查用户已经在数据篮中的申请的数量
+ // 已经超过返回 true
+ public function checkOrderNum($bool = true,$uid = 0)
+ {
+ if(empty($uid))
+ {
+ $uid = \view::User('id');
+ }
+
+ $sql = "select count(*) as datacount from {$this->tbl_dataorder} where (ts_approved is null) and userid=? and status>0 and status<3";
+ $rs = $this->db->fetchRow($this->db->quoteInto($sql,$uid));
+
+ if($bool === true)
+ {
+ if($rs['datacount'] <= $this->config->download->max - 1)
+ {
+ return true;
+ }else{
+ return false;
+ }
+ }else{
+ return $rs['datacount'];
+ }
+ }//checkOrderNum
+
+
+
+}
\ No newline at end of file