diff --git a/application/admin/controllers/ReviewController.php b/application/admin/controllers/ReviewController.php
index 7aed7cb4..aeb934cb 100644
--- a/application/admin/controllers/ReviewController.php
+++ b/application/admin/controllers/ReviewController.php
@@ -755,9 +755,9 @@ class Admin_ReviewController extends Zend_Controller_Action
//update search document
$search=new Search();
//create search view in xunsearch
- $sql="select * from xunsearch where uuid in (select uuid from mdstatus where id in (?))";
+ $sql="select * from xunsearch where uuid in (select uuid from mdstatus where id in (".$ids."))";
$sth = $this->db->prepare($sql);
- $sth->execute(array($ids));
+ $sth->execute();
while ($data = $sth->fetch())
{
$search->update($data);
diff --git a/application/default/controllers/QzrController.php b/application/default/controllers/QzrController.php
new file mode 100644
index 00000000..9e250be3
--- /dev/null
+++ b/application/default/controllers/QzrController.php
@@ -0,0 +1,1100 @@
+_helper->layout->setLayout('heihe');
+ $this->debug = 1;
+ }
+
+ function indexAction()
+ {
+ $sql="select m.uuid,m.title,m.id,m.description from normalmetadata m left join thumbnail t on m.id=t.id where m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and length(t.data)>2 order by random() limit 3";
+ $this->view->meatdata=$this->db->fetchAll($sql);
+ }
+
+ function newsAction()
+ {
+ $this->view->theme = new Theme();
+
+ $title=$this->_request->getParam('title');
+
+ if($title == "national_geog")
+ {
+
+ }
+
+ return true;
+ $archive=new Archive($this->db);
+ $this->view->infos = $archive->getOneArchive($title);
+ }
+
+ /*
+ * 数据浏览
+ */
+ function browseAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') ");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('normalmetadata','*')->where(" uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') ")->order('title desc')->limitPage($page,$this->limit);
+ $this->view->metadata = $this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$this->limit);
+ $this->view->offset=$offset+1;
+ }
+
+ 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 normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') ");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $select=$this->db->select();
+ $select->from('normalmetadata as m','m.*')
+ ->where(" uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') ")
+ ->order('m.title desc')->limitPage($page,$this->limit);
+ $this->view->metadata = $this->db->fetchAll($select);
+ $this->view->page=new Pagination($sum,$page,$this->limit);
+ }
+
+ function documentAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $row=$this->db->fetchAll("select count(*) from reference where id in (select refid from mdref where uuid in (select uuid from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') ))");
+ $sum=$row[0]['count'];
+ $sql="select * from reference where id in (select refid from mdref where uuid in (select uuid from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') )) order by reference limit ? offset ?";
+ $this->view->refs=$this->db->fetchAll($sql,array($this->limit,$offset));
+ $this->view->page=new Pagination($sum,$page,$this->limit,"文献");
+ $this->view->offset=$offset+1;
+ }
+
+ function baseAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='冰川' or keyword='沙漠' or keyword='地貌' or keyword='植被' or keyword='草场' or keyword='沙漠化' or keyword='基础地理' or keyword='遥感影像' or keyword='水文地质' or keyword='社会经济' or keyword='人口' or keyword='SWAT' or keyword='NPP' or keyword='WRF' or keyword='辐射' or keyword='NEP'))");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $sql="select uuid,title from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='冰川' or keyword='沙漠' or keyword='地貌' or keyword='植被' or keyword='草场' or keyword='沙漠化' or keyword='基础地理' or keyword='遥感影像' or keyword='水文地质' or keyword='社会经济' or keyword='人口' or keyword='SWAT' or keyword='NPP' or keyword='WRF' or keyword='辐射' or keyword='NEP')) order by timebegin,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->offset=$offset+1;
+ }
+
+ function geobaseAction()
+ {
+ $this->getmd('基础地理');
+ }
+
+ function coreAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='DEM' or keyword='土地利用' or keyword='土壤' or keyword='气象' or keyword='水文观测' or keyword='灌溉' or keyword='试验'))");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $sql="select uuid,title from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='DEM' or keyword='土地利用' or keyword='土壤' or keyword='气象' or keyword='水文观测' or keyword='灌溉' or keyword='试验')) order by timebegin,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->offset=$offset+1;
+ }
+
+ function demAction()
+ {
+ $this->getmd('DEM');
+ }
+
+ function rsAction()
+ {
+ $this->getmd('遥感影像');
+ }
+
+ function waterAction()
+ {
+ $this->getmd('水文地质');
+ }
+
+ function modelAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='WRF' or keyword='NPP' or keyword='SWAT' or keyword='NEP' or keyword='辐射'))");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $sql="select uuid,title from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='WRF' or keyword='NPP' or keyword='SWAT' or keyword='NEP' or keyword='辐射')) order by timebegin,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->offset=$offset+1;
+ }
+
+ function economicAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='人口' or keyword='社会经济'))");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $sql="select uuid,title from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='人口' or keyword='社会经济')) order by timebegin,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->offset=$offset+1;
+ }
+
+ function landsurfaceAction()
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='冰川' or keyword='沙漠' or keyword='地貌' or keyword='植被' or keyword='草场' or keyword='沙漠化'))");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $sql="select uuid,title from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='theme' and (keyword='冰川' or keyword='沙漠' or keyword='地貌' or keyword='植被' or keyword='草场' or keyword='沙漠化')) order by timebegin,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->offset=$offset+1;
+ }
+
+ function landuseAction()
+ {
+ $this->getmd('土地利用','theme');
+ }
+
+ function soilAction()
+ {
+ $this->getmd('土壤','theme');
+ }
+
+ function meteoAction()
+ {
+ $this->getmd('气象','theme');
+ }
+
+ function hydroAction()
+ {
+ $this->getmd('水文观测','theme');
+ }
+ function irragationAction()
+ {
+ $this->getmd('灌溉','theme');
+ }
+
+ function obsAction()
+ {
+ $this->getmd('试验','theme');
+ }
+
+ function listAction()
+ {
+ $sql="select uuid,title from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') order by timebegin,title";
+ $this->view->metadata=$this->db->fetchAll($sql);
+ }
+
+ function tagAction()
+ {
+ $key = $this->_request->getParam('key');
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ if (!empty($key)) {
+ $this->view->codename=$key;
+ $sql=$this->db->quoteInto('select count(id) from keyword where keyword=?',$key);
+ $state=$this->db->query($sql);
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ $sql="select uuid,title,id,description from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keyword='".$key."') order by timebegin,title limit ? offset ?";
+ $this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
+ $this->view->page=new Pagination($sum,$page,$this->limit);
+ } else {
+ $state=$this->db->query("select keyword.keyword,count(*) from keyword left join normalmetadata m on keyword.id=m.id where keyword.keytype='place' and m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') group by keyword.keyword order by count desc");
+ $k1=$state->fetchAll();
+ $state=$this->db->query("select k.keyword,count(k.keyword) from keyword k left join normalmetadata m on k.id=m.id where k.keytype='theme' and m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') group by k.keyword order by k.keyword");
+ $k2=$state->fetchAll();
+ $state=$this->db->query("select k.keyword,count(k.keyword) from keyword k left join normalmetadata m on k.id=m.id where k.keytype='discipline' and m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') group by k.keyword order by k.keyword");
+ $k3=$state->fetchAll();
+ $state=$this->db->query("select k.keyword,count(k.keyword) from keyword k left join normalmetadata m on k.id=m.id where k.keytype='stratum' and m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') group by k.keyword order by k.keyword");
+ $k4=$state->fetchAll();
+ $state=$this->db->query("select keyword.keyword,count(*) from keyword left join normalmetadata m on keyword.id=m.id where keyword.keytype='temporal' and m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') group by keyword.keyword order by keyword.keyword");
+ $k5=$state->fetchAll();
+ $this->view->keywords=array('place'=>$k1,'theme'=>$k2,'discipline'=>$k3,'stratum'=>$k4,'temporal'=>$k5);
+ }
+ }
+
+ 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)) {
+ $search=new Search($key);
+ $where=$search->sql_expr(array("title","description"));
+ $page=@(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $row=$this->db->fetchAll("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and ".$where);
+ $sum=$row[0]['count'];
+ $sql="select uuid,title,id,description from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and ".$where." order by timebegin,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;
+ $this->view->offset=$offset+1;
+ }
+ }
+
+ function timemapAction()
+ {
+ $sql="select id,uuid,west,south,north,east,title,timebegin,timeend from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and timebegin is not null";
+ $this->view->rows=$this->db->fetchAll($sql);
+ }
+
+ function timelineAction()
+ {
+ $fn="heihetime.xml";
+ $rows=$this->db->fetchAll("select ts_created from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') 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";
+ $rows=$this->db->fetchAll("select id,uuid,description,title,timebegin,timeend from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and timebegin is not null order by timebegin,title");
+ $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);
+ }
+ }
+
+ function categoryAction()
+ {
+ $code = (int)$this->_request->getParam('code');
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $this->view->category=$this->db->fetchAll("select c.code,name,name_zh,count(*) from category c left join normalmetadata m on c.id=m.id,categorycode cc where c.code=cc.code and m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') group by c.code,cc.name,cc.name_zh");
+ if ($code>0 && $code<20) {
+ $row=$this->db->fetchAll("select count(*) from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from category where code=".$code.")");
+ $sum=$row[0]['count'];
+ $sql="select uuid,title,description,id from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select distinct id from category where code=".$code.") order by timebegin,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->offset=$offset+1;
+ $row=$this->db->fetchRow("select name,name_zh from categorycode where code=?",$code);
+ $this->view->codename=(empty($row['name_zh'])?$row['name']:$row['name_zh']);
+ } else {
+ //提供全部分类列表
+ }
+ }
+
+ private function getmd($keyword,$type='theme')
+ {
+ $page=(int)$this->_request->getParam('page');
+ if (empty($page)) $page=1;
+ $offset=$this->limit*($page-1);
+ $state=$this->db->query("select count(m.*) from normalmetadata m left join datasource d on m.uuid=d.uuid left join source s on d.sourceid=s.id where s.code='heihe' and m.id in (select id from keyword where keytype='".$type."' and keyword='".$keyword."')");
+ $row=$state->fetchAll();
+ $sum=$row[0]['count'];
+ //@todo: add order with title
+ $sql="select uuid,title from normalmetadata where uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code='heihe') and id in (select id from keyword where keytype='".$type."' and keyword='".$keyword."') order by timebegin,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->offset=$offset+1;
+ }
+
+ /*
+ * submitAction() //数据汇交
+ *
+ * param string $ac //动作
+ * param int $id //数据模版ID
+ * param int $group //geonetwork页面跳转参数
+ *
+ * return view
+ */
+ function submitAction(){
+
+ $ac = $this->_getParam('ac');
+ $id = $this->_request->getParam('id');
+ $this->wdb=Zend_Db::factory($this->view->config->geonetwork);
+
+ $auth = Zend_Auth::getInstance();
+ if($auth->hasIdentity())
+ {
+ $user = $auth->getIdentity();
+ $u_id = $user->id;
+ $this->view->isadmin=false;
+ if ($user->usertype=='administrator') $this->view->isadmin=true;
+ }
+
+ if(empty($ac) || $ac == "index")
+ {
+ $this->_helper->viewRenderer('submit-index');
+ return true;
+ }
+
+ //新建元数据
+ if($ac == "newdata")
+ {
+
+ $do = $this->_getParam('do');
+
+ if(empty($do))
+ {
+ $this->_helper->viewRenderer('submit-newdata');
+
+ $keywords = $this->_request->getParam('q');
+ $sql="select id,(regexp_matches(data,'(.*)'))[1] as title,(owner-".$u_id.") as isowner from metadata where istemplate='y' and schemaid='iso19115'";
+ if(!empty($keywords))
+ {
+ $this->view->q = $keywords;
+ $search=new Search($keywords);
+ $where=$search->sql_expr(array("data"));
+ $sql.=' and '.$where;
+ }
+ $sql.=" order by changedate desc";
+ $sth = $this->wdb->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;
+
+ return true;
+ }
+
+ if($do == "add")
+ {
+ $this->_helper->viewRenderer('submit-newdata-add');
+ $this->view->pageNav = "newdata-add";
+
+ $keywords = $this->_request->getParam('q');
+ $sql = "SELECT md.title,md.uuid,md.description,gn.id as gid FROM normalmetadata md
+ left join geonetworkmetadata gn on md.uuid=gn.uuid
+ WHERE gn.id is not null";
+ if(!empty($keywords))
+ {
+ $this->view->q = $keywords;
+ $search=new Search($keywords);
+ $where=$search->sql_expr(array("md.title","md.description"));
+ $sql.=' and '.$where;
+ }
+ $sql.=" order by md.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;
+
+ return true;
+ }
+ return true;
+ }//newdata
+
+ //未提交数据
+ if($ac == "unsubmit")
+ {
+ $do = $this->_getParam('do');
+
+ //未提交的数据列表
+ if(empty($do) || $do=="index")
+ {
+ $this->_helper->viewRenderer('submit-unsubmit');
+
+ $sql = "SELECT (regexp_matches(gn.data,'(.*)'))[1] as title,gn.id,gn.uuid FROM geonetworkmetadata gn
+ WHERE gn.uuid not in (select uuid from metadata) and gn.owner=?
+ order by gn.id desc
+ ";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($u_id));
+ $rows = $sth->fetchAll();
+
+ $paginator = Zend_Paginator::factory($rows);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(15);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
+ $this->view->paginator=$paginator;
+
+ return true;
+ }//index
+
+ //提交
+ if($do=="commit")
+ {
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+
+ $data = "";
+ $id = $this->_request->getParam('id');
+ try{
+ if(empty($id) || !is_numeric($id))
+ {
+ $data = array("error"=>"参数错误");
+ $this->jsonexit($data);
+ return true;
+ }
+
+ $changelog = $this->_request->getParam('changelog');
+
+ if(empty($changelog))
+ {
+ $data = array("error"=>'请输入变更信息');
+ $this->jsonexit($data);
+ return true;
+ }
+
+ // 1. 权限认定:当前用户必须和其owner相同
+ // 数据应当没有评审状态,没有作者信息
+ $sql="select gn.id from geonetworkmetadata gn
+ left join mdstatus s on gn.uuid=s.uuid
+ left join mdauthor a on s.uuid=a.uuid
+ where (s.id is not null or a.id is not null) and gn.id=?";
+ $sth=$this->db->prepare($sql);
+ $sth->execute(array($id));
+ $row=$sth->fetch();
+ if (!empty($row))
+ {
+ $data = array("error"=>'错误的入口');
+ $this->jsonexit($data);
+ return true;
+ }
+
+ $sql="select uuid,data as xml from metadata where id=? and owner=?";
+ $sth=$this->wdb->prepare($sql);
+ $sth->execute(array($id,$u_id));
+ $row=$sth->fetch();
+ if (empty($row))
+ {
+ $data = array("error"=>'无权限修改数据');
+ $this->jsonexit($data);
+ return true;
+ }else{
+ $uuid = $row['uuid'];
+ }
+
+ //检查元数据错误
+ $iso=new ISO19115();
+ @$iso->loadXML($row['xml']);
+ if ($iso->validate())
+ {
+ $data=array("error"=>"元数据导入过程中发现错误。
".implode("
",$iso->error));
+ $this->jsonexit($data);
+ return true;
+ }
+
+ $messages = array();
+
+ // 保存数据作者信息
+ $sql="insert into mdauthor (uuid,userid,ts_activated,status) values(?,?,now(),1)";
+ $sth=$this->db->query($sql,array($row['uuid'],$u_id));
+
+ // 2. 保存变化记录 save changelog & userid for the latest version
+ $sql = "UPDATE mdversion SET changelog=?,userid=? WHERE id in (select id from mdversion where uuid=? order by ts_created desc limit 1)";
+ $this->db->query($sql,array($changelog,$u_id,$row['uuid']));
+
+ // 处理文件权限和数据信息
+ $ftp_user = "heihe".$u_id."upload";
+ $sql = "SELECT * FROM pureftp WHERE userid=? AND homedir LIKE ?";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($ftp_user,'%'.$uuid.'%'));
+ $row1 = $sth->fetch(PDO::FETCH_ASSOC);
+
+ if(!empty($row1['passwd']))
+ {
+ $old=umask(0);
+ //$this->chmodr($row1['homedir'],1444);
+ umask($old);
+ }
+
+ //$path = $row1['homedir'];
+ $path = '/var/www/westdc.westgis.ac.cn/data/heihe_upload/'.$uuid.'/';
+
+ //delete dataset & datafile records
+ $sql="delete from dataset where uuid=?";
+ $sth = $this->db->prepare($sql);
+ $sth->execute(array($uuid));
+ //自动添加数据分类为黑河
+ $sql="insert into datasource (uuid,sourceid) values(?,1)";
+ $sth=$this->db->prepare($sql);
+ try{$sth->execute(array($uuid));}catch(Exception $e) {}
+
+ $sql = "INSERT INTO dataset (uuid,path) VALUES (?,?) RETURNING id";
+ $sth = $this->db->prepare($sql);
+ $rs = $sth->execute(array($uuid,$path));
+
+ if(!$rs)
+ {
+ $messages[] = "元数据信息写入失败";
+ /*
+ $data = array("error"=>'元数据信息写入失败');
+ $this->jsonexit($data);
+ return true;
+ */
+ }
+
+ $temp = $sth->fetch(PDO::FETCH_ASSOC);
+
+ $dsid = $temp['id'];
+
+ $dir = new mydir();
+ $files=$dir->recursive($path);
+
+ foreach ($files as $k=>$v)
+ {
+ //$pathinfo = pathinfo($path.$v);
+ $filename = mb_substr($v,mb_strlen($path)+1);
+ $filesize = filesize($v);
+ $isdir=is_dir($v)?1:0;
+ $depth=substr_count($filename,"/")+1;
+ if (substr($filename,-1,1)=='/') $depth--;
+ //$this->chmodr($path.$v,0444);
+ $sql = "INSERT INTO datafile (dsid,filename,filesize,isdir,depth) VALUES (?,?,?,?,?)";
+ $sth = $this->db->prepare($sql);
+ $rs = $sth->execute(array($dsid,$filename,$filesize,$isdir,$depth));
+ if(!$rs)
+ {
+ $messages[] = "数据文件".$filename.'写入失败';
+ }
+ }
+
+
+ // 3. 保存数据评审状态
+ //导入元数据
+ $iso->saveDB($this->db);
+ //进入评审库
+ $sql="insert into mdstatus (uuid,status,userid) values(?,?,?)";
+ $this->db->query($sql,array($uuid,0,$u_id));
+
+ //email to admin
+ $mail=new WestdcMailer($this->view->config->smtp);
+ $mail->setFrom($this->view->config->service->email,'数据服务组');
+ $mailtp=new EmailText($this->db,"metadata-new-admin",array(
+ 'user' => $user->username,
+ 'uuid' => $iso->uuid,
+ 'email'=> $user->email,
+ //元数据标题
+ 'title'=> $iso->resTitle,
+ ));
+ $mail->setBodyText($mailtp->getBody());
+ $mail->setSubject($mailtp->getSubject());
+ $mail->addTo($this->view->config->service->email);
+ $mail->send();
+
+ unset($mail);
+ unset($mailtp);
+ //email to author
+ $mail=new WestdcMailer($this->view->config->smtp);
+ $mail->setFrom($this->view->config->service->email,'数据服务组');
+ $mailtp=new EmailText($this->db,"heihe-new-author",array(
+ 'user' => $user->username,
+ 'uuid' => $iso->uuid,
+ 'email'=> $user->email,
+ //元数据标题
+ 'title'=> $iso->resTitle,
+ ));
+ $mail->setBodyText($mailtp->getBody());
+ $mail->setSubject($mailtp->getSubject());
+ $mail->addTo($user->email);
+ $mail->addCc($this->view->config->service->email);
+ @$mail->send();
+
+ $data = array("commited"=>1,"error"=>'该版本已经成功提交,请等待数据中心进一步处理!');
+ $this->jsonexit($data);
+ return true;
+ }catch(Exception $e) {
+ $sql="delete from mdstatus where uuid in (select uuid from geonetworkmetadata where id=?)";
+ $this->db->query($sql,array($id));
+ $sql="delete from mdauthor where userid=? and uuid in (select uuid from geonetworkmetadata where id=?)";
+ $this->db->query($sql,array($u_id,$id));
+
+ $msg = "提交失败,请确认权限后重试";
+ if($this->debug>0)
+ {$msg .= $e->getMessage();}
+ $data = array("error"=>$msg);
+ $this->jsonexit($data);
+ return true;
+ }
+ }//commit
+
+ return true;
+ }//unsubmit
+
+ //FTP
+ if($ac == "ftp")
+ {
+ $this->_helper->layout->disableLayout();
+ $this->_helper->viewRenderer->setNoRender();
+
+ $uuid = $this->_getParam('uuid');
+
+ $this->view->uuid = $uuid;
+
+ if(empty($uuid) || !preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
+ {
+ $data = array(
+ 'error'=>"参数错误"
+ );
+ $this->jsonexit($data);
+ return true;
+ }
+ //安全检查: uuid必须是当前用户且为新建数据
+ $sql="select * from geonetworkmetadata where uuid=? and uuid not in (select uuid from metadata) and owner=?";
+ $sth=$this->db->prepare($sql);
+ $sth->execute(array($uuid,$u_id));
+ $row=$sth->fetch();
+ if (empty($row))
+ {
+ $data = array(
+ 'error'=>"参数错误"
+ );
+ $this->jsonexit($data);
+ return true;
+ }
+
+ //ftp 用户名
+ $uname = 'heihe'.$u_id.'upload';
+
+ //ftp路径
+ $homedir = "/var/www/westdc.westgis.ac.cn/data/heihe_upload/".$uuid."/";
+
+ $sql = "SELECT * FROM pureftp WHERE userid='$uname' ORDER BY pkid DESC";
+ $sth = $this->db->prepare($sql);
+ $sth->execute();
+ $row = $sth->fetch();
+
+ $old=umask(0);
+ @mkdir($homedir,0777);
+ umask($old);
+
+ if(!empty($row['pkid']))
+ {
+ if(preg_match("/.*".$uuid.".*/",$row['homedir']))
+ {
+ $data = array(
+ 'statu'=>1,
+ 'user'=>$row['userid'],
+ 'passwd'=>$row['passwd']
+ );
+
+ $this->jsonexit($data);
+ return true;
+
+ }else{
+ $uid = 1001;
+ $gid = 1001;
+
+ $passwd = $this->genRandomString(16);
+ $sql = "UPDATE pureftp SET passwd=?,uid=?,gid=?,homedir=? WHERE userid=?";
+ $sth = $this->db->prepare($sql);
+ $rs = $sth->execute(array($passwd,$uid,$gid,$homedir,$uname));
+ if($rs)
+ {
+ $data = array(
+ 'statu'=>1,
+ 'user'=>$uname,
+ 'passwd'=>$passwd
+ );
+ $this->jsonexit($data);
+ return true;
+ }else{
+ $data = array(
+ 'error'=>"FTP信息更新失败,请重试"
+ );
+ $this->jsonexit($data);
+ return true;
+ }
+ }
+ }
+
+ else{
+ $uid = 1001;
+ $gid = 1001;
+ $passwd = $this->genRandomString(16);
+
+ $sql = "INSERT INTO pureftp (userid,passwd,uid,gid,homedir) VALUES (?,?,?,?,?)";
+ $sth = $this->db->prepare($sql);
+ $rs = $sth->execute(array($uname,$passwd,$uid,$gid,$homedir));
+ if($rs)
+ {
+ $data = array(
+ 'statu'=>1,
+ 'user'=>$uname,
+ 'passwd'=>$passwd
+ );
+ $this->jsonexit($data);
+ return true;
+ }else{
+ $data = array(
+ 'error'=>"FTP信息更新失败,请重试"
+ );
+ $this->jsonexit($data);
+ return true;
+ }
+ }//end if
+
+ }//ftp
+
+ }//function submitAction()
+
+ /*
+ * projectsAction() 数据汇交计划
+ *
+ *
+ *
+ *
+ */
+ function projectsAction()
+ {
+
+ $ac = $this->_getParam('ac');
+ $invite = $this->_getParam('invite');
+
+ $heihe = new Heihe($this->db);
+
+ $auth = Zend_Auth::getInstance();
+ if($auth->hasIdentity())
+ {
+ $user = $auth->getIdentity();
+ $uid = $user->id;
+ $this->view->user_email = $user_email = $user->email;
+ }
+
+ if(empty($ac) || $ac == "index" || $ac == 'my')
+ {
+ $this->_helper->viewRenderer('project-index');
+
+ //Search Link
+ $this->view->searchLink = "/heihe/projects/ac/index/";
+
+ $q = $this->_getParam('q');
+
+ $wheresql = array();
+
+ if(!empty($q))
+ {
+ if(!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$q))
+ {
+ $this->view->error = "输入的搜索条件有误,只允许输入汉字、数字、字母";
+ return true;
+ }
+ $wheresql[] = " (title LIKE '%$q%' OR
+ code LIKE '%$q%' OR
+ name LIKE '%$q%')";
+ $this->view->searchKeyword = $q;
+ }
+
+ if($ac == "my")
+ {
+ $wheresql[] = " email='$user_email' ";
+ }
+
+ if(count($wheresql)>0)
+ {
+ $wheresql = join(" AND ",$wheresql);
+ }else{
+ $wheresql = "";
+ }
+
+ if(!empty($wheresql))
+ {
+ $wheresql = " WHERE ".$wheresql;
+ }
+
+ $sql = "SELECT * FROM heiheproject $wheresql
+ ORDER BY id DESC";
+ $sth = $this->db->query($sql);
+ $rows = $sth->fetchAll();
+
+ foreach ($rows as $k=>$v)
+ {
+ $rows[$k]['status'] = $heihe->getStatus($v['status']);
+ }
+
+ $paginator = Zend_Paginator::factory($rows);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(15);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
+ $this->view->paginator=$paginator;
+
+ }//ac == index
+
+ if($ac == "submitting")
+ {
+ $this->_helper->viewRenderer('project-index');
+
+ $sql = "SELECT * FROM heiheproject WHERE status<4";
+ $sth = $this->db->query($sql);
+ $rows = $sth->fetchAll();
+
+ foreach ($rows as $k=>$v)
+ {
+ $rows[$k]['status'] = $heihe->getStatus($v['status']);
+ }
+
+ $paginator = Zend_Paginator::factory($rows);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(15);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
+ $this->view->paginator=$paginator;
+ }//ac == submitting 正在提交
+
+ if($ac == "unsubmit")
+ {
+ $this->_helper->viewRenderer('project-index');
+
+ $sql = "SELECT * FROM heiheproject WHERE attachid IS NULL OR attachid=0";
+ $sth = $this->db->query($sql);
+ $rows = $sth->fetchAll();
+
+ foreach ($rows as $k=>$v)
+ {
+ $rows[$k]['status'] = $heihe->getStatus($v['status']);
+ }
+
+ $paginator = Zend_Paginator::factory($rows);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(15);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
+ $this->view->paginator=$paginator;
+ }//ac == unsubmit 未提交
+
+ if($ac == "submit")
+ {
+ $this->_helper->viewRenderer('project-index');
+
+ $sql = "SELECT * FROM heiheproject WHERE status=4";
+ $sth = $this->db->query($sql);
+ $rows = $sth->fetchAll();
+
+ foreach ($rows as $k=>$v)
+ {
+ $rows[$k]['status'] = $heihe->getStatus($v['status']);
+ }
+
+ $paginator = Zend_Paginator::factory($rows);
+ $paginator->setCurrentPageNumber($this->_getParam('page'));
+ $paginator->setItemCountPerPage(15);
+ $paginator->setView($this->view);
+ Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml');
+ $this->view->paginator=$paginator;
+ }//ac == submit 已提交
+
+ if($ac == "upload")
+ {
+ $this->_helper->layout->setLayout('layout-iframe');
+ $this->_helper->viewRenderer('project-upload');
+
+ $submit = $this->_getParam('submit');
+
+ $pid = $this->_getParam('pid');
+
+ if(empty($pid) || !is_numeric($pid))
+ {
+ $this->view->error = "参数错误";
+ return true;
+ }
+
+ $this->view->pid = $pid;
+
+ if(empty($uid))
+ {
+ $this->view->error = "请先登录";
+ return true;
+ }
+
+ $sql = "SELECT * FROM heiheproject WHERE id=$pid";
+ $sth = $this->db->query($sql);
+ $row = $sth->fetch();
+
+ if($row['email']!= $user_email)
+ {
+ $this->view->error = "您没有权限进行此操作";
+ return true;
+ }
+
+ if(!empty($submit) && empty($this->view->error))
+ {
+
+ $files=new files();
+ $msg = $files -> upload($this->view->config->upload,$_FILES['Filedata'],'heihe');
+
+ if(empty($msg['error']))
+ {
+ $msg['error']="";
+ $filename = $msg['db_path'];
+ $filesize = $msg['file_size'];
+ $filedesc = $this->_request->getParam('filedesc');
+ $filetype = $msg['file_type'];
+ $realname = $msg['realname'];
+
+ if(!empty($row['attachid']))
+ {
+ $sql = "SELECT * FROM attachments WHERE id={$row['attachid']}";
+ $sth = $this->db->query($sql);
+ $attach = $sth->fetch();
+ $this->db->exec("DELETE FROM attachments WHERE id={$row['attachid']} AND filetype='heihe'");
+ @unlink($this->view->config->upload.$attach['filename']);
+ }
+
+ $sql = " INSERT INTO attachments (filename,filetype,filedesc,userid,filesize,realname) values
+ ('$filename','heihe','$filedesc','$uid','$filesize','$realname') RETURNING id";
+ $sth = $this->db->prepare($sql);
+ $sth->execute();
+ $att = $sth->fetch(PDO::FETCH_ASSOC);
+ $msg['attid'] = $attid = $att['id'];
+
+ $sql = "UPDATE heiheproject SET attachid=$attid WHERE id=$pid";
+ $sth = $this->db->exec($sql);
+
+ if($sth)
+ {
+ $this->view->message = "上传成功";
+ }else{
+ @unlink($filename);
+ $this->view->error = '附件上传失败:写入附件表出错';
+ return true;
+ }
+ }else{
+ @unlink($filename);
+ $this->view->error = "附件上传失败".$msg['error'];
+ return true;
+ }
+ }
+
+ $sql = "SELECT * FROM heiheproject WHERE id=$pid";
+ $sth = $this->db->query($sql);
+ $row = $sth->fetch();
+
+ $sql = "SELECT * FROM attachments WHERE id = {$row['attachid']}";
+ $sth = $this->db->query($sql);
+ $this->view->att = $sth->fetch();
+
+ return true;
+ }
+
+ if(!empty($invite))
+ {
+
+ $this->_helper->viewRenderer('project-invite');
+
+ $pid = $this->_getParam('pid');
+
+ $level = $heihe->expertActive($pid,$invite,$user_email);
+
+ if($level>100)
+ {
+ $this->view->error = "数据中心对您的邀请已经确认!感谢您的支持";
+ return true;
+ }else{
+ $this->view->error = $heihe->expertActiveError($level);
+ return true;
+ }
+
+ }//专家邀请链接
+
+
+ }//projectsAction()
+
+ function genRandomString($len)
+ {
+ $chars = array(
+ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
+ "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
+ "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
+ "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
+ "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
+ "3", "4", "5", "6", "7", "8", "9"
+ );
+ $charsLen = count($chars) - 1;
+
+ shuffle($chars); // 将数组打乱
+
+ $output = "";
+ for ($i=0; $i<$len; $i++)
+ {
+ $output .= $chars[mt_rand(0, $charsLen)];
+ }
+ return $output;
+ }
+
+ function chmodr($path, $filemode) {
+ if (!is_dir($path))
+ return chmod($path, $filemode);
+
+ $dh = opendir($path);
+ while (($file = readdir($dh)) !== false) {
+ if($file != '.' && $file != '..') {
+ $fullpath = $path.'/'.$file;
+ if(is_link($fullpath))
+ return FALSE;
+ elseif(!is_dir($fullpath) && !chmod($fullpath, $filemode))
+ return FALSE;
+ elseif(!$this->chmodr($fullpath, $filemode))
+ return FALSE;
+ }
+ }
+ closedir($dh);
+ if(chmod($path, $filemode))
+ return TRUE;
+ else
+ return FALSE;
+ }
+
+ //成为作者后的后继处理工作
+ private function author_first($uuid,$author)
+ {
+ $sql="insert into mdversion (xml,ts_created,uuid,changelog,userid)
+ select x.data,m.ts_created,?,?,? from metadata m left join xml x on m.id=x.id
+ left join mdversion v on m.uuid=v.uuid
+ where m.uuid=? and v.changelog is null";
+ $sth=$this->db->prepare($sql);
+ try
+ {
+ $sth->execute(array($uuid,'初始版本 version 1.0',$author,$uuid));
+ } catch(Exception $e){
+ // do nothing here.
+ // 说明之前已经有对应数据
+ }
+ $this->wdb=Zend_Db::factory($this->view->config->geonetwork);
+ $sql="update metadata set owner=? where uuid=?";
+ $sth=$this->wdb->prepare($sql);
+ $sth->execute(array($author,$uuid));
+ }
+
+}
\ No newline at end of file