db=Zend_Registry::get('db'); $this->view->config = Zend_Registry::get('config'); $this->messenger=$this->_helper->getHelper('FlashMessenger'); $this->view->messages = $this->messenger->getMessages(); } function postDispatch() { $this->view->messages = $this->messenger->getMessages(); } function indexAction() { //其他连接 } //提供和GEONETWORK中的元数据的同步功能 //提供双向同步功能,但只处理ISO 19115格式的元数据? function syncAction() { set_time_limit(0); $sql="select * from (select count(*) as westdccount from metadata) as t1,(select count(uuid) as gncount from geonetworkmetadata where schemaid='iso19115') as t2"; $this->db->setFetchMode(Zend_Db::FETCH_OBJ); $this->view->mdcount=$this->db->fetchRow($sql); $source=$this->_request->getParam('source'); $delete=$this->_request->getParam('delete'); $thumb=$this->_request->getParam('thumb'); $list=$this->_request->getParam('list'); $adminuser=$this->_request->getParam('adminuser'); $uuid=trim($this->_request->getParam('uuid')); if ($source=="geonetwork" && empty($uuid) ) { //从geonetwork向WESTDC同步 //对所有的新数据增加评审状态 $sql="insert into mdstatus (uuid,status,ts_accepted,userid) select uuid,1,now(),? from geonetworkmetadata gn where uuid not in (select uuid from mdstatus)"; $userid = Zend_Auth::getInstance()->getIdentity()->id; $this->db->query($sql,array($userid)); $sql="select uuid,data,source from geonetworkmetadata where schemaid='iso19115'"; $rs=$this->db->fetchAll($sql); foreach($rs as $gmd) { $this->import($gmd->data); $this->db->query("update metadata set source=? where uuid=?",array($gmd->source,$gmd->uuid)); } $this->view->msg='成功同步元数据!'; } elseif ($source=="watergn" && empty($uuid) ) { //首先删除所有的黑河试验数据 //$sql="delete from metadata where source='e3ad32dc-f573-11e0-aa7b-b768cfd88d80'"; $sql="delete from metadata where uuid in (select uuid from watergn)"; $this->db->query($sql); $sql="delete from responsible where id not in (select distinct(resid) from role)"; $this->db->query($sql); //对所有的新数据增加评审状态 $sql="insert into mdstatus (uuid,status,ts_accepted,userid) select uuid,1,now(),? from watergn where uuid not in (select uuid from mdstatus)"; $userid = Zend_Auth::getInstance()->getIdentity()->id; $this->db->query($sql,array($userid)); //同步黑河遥感实验的元数据 $sql="select uuid,data,source from watergn where schemaid='iso19115'"; $rs=$this->db->fetchAll($sql); foreach($rs as $gmd) { $this->import($gmd->data); $this->db->query("update metadata set source=? where uuid=?",array($gmd->source,$gmd->uuid)); } $this->view->msg='成功同步黑河遥感综合实验元数据!'; } elseif ($source=="westdc" && empty($uuid) ) { //从westdc向geonetwork同步 $sql="select m.uuid,m.source,x.data from metadata m left join xml x on m.id=x.id where m.uuid not in (select uuid from geonetworkmetadata)"; $rs=$this->db->fetchAll($sql); foreach($rs as $gmd) { $sql="insert into geonetworkmetadata (uuid,source,data) values('".$gmd->uuid."','".$gmd->source."',".$this->db->quote($gmd->data).")"; $this->db->exec($sql); } $sql="select m.uuid,m.source,x.data from metadata m left join xml x on m.id=x.id where m.uuid in (select uuid from geonetworkmetadata)"; $rs=$this->db->fetchAll($sql); foreach($rs as $gmd) { $sql="update geonetworkmetadata set source='".$gmd->source."',data=".$this->db->quote($gmd->data)." where uuid='".$gmd->uuid."'"; $this->db->exec($sql); } $this->view->msg='成功同步WESTDC元数据到GEONETWORK!'; } elseif (!empty($uuid) && isset($_POST['submit'])) { //同步单条元数据 $sql=$this->db->quoteInto("select data,source from geonetworkmetadata where uuid=?",$uuid); if ($rs=$this->db->fetchRow($sql)) { $this->import($rs->data); $this->db->exec($this->db->quoteInto("update metadata set source=? where uuid='$uuid'",$rs->source)); $userid = Zend_Auth::getInstance()->getIdentity()->id; $this->db->query("insert into mdstatus (uuid,status,ts_accepted,userid) select uuid,1,now(),? from geonetworkmetadata gn where uuid not in (select uuid from mdstatus) and uuid=?",array($userid,$uuid)); $this->view->msg='成功同步元数据:'.$uuid; } else $this->view->msg='不存在此元数据:'.$uuid; } elseif (!empty($uuid) && isset($_POST['gnsubmit'])) { //同步单条元数据到geonetwork $sql=$this->db->quoteInto("select m.uuid,m.source,x.data,g.id from metadata m left join xml x on m.id=x.id left join geonetworkmetadata g on g.uuid=m.uuid where m.uuid=?",$uuid); if ($gmd=$this->db->fetchRow($sql)) { if (!empty($gmd->id)) { $sql="update geonetworkmetadata set source='".$gmd->source."',data=".$this->db->quote($gmd->data)." where uuid='".$gmd->uuid."'"; } else { $sql="insert into geonetworkmetadata (uuid,source,data) values('".$gmd->uuid."','".$gmd->source."',".$this->db->quote($gmd->data).")"; } $this->db->exec($sql); $this->view->msg='成功同步元数据:'.$uuid; } else $this->view->msg='不存在此元数据:'.$uuid; } elseif (!empty($uuid) && isset($_POST['watersubmit'])) { //同步单条元数据 $sql=$this->db->quoteInto("select data,source from watergn where uuid=?",$uuid); if ($rs=$this->db->fetchRow($sql)) { $this->import($rs->data); $this->db->query("update metadata set source=? where uuid=?",array($rs->source,$uuid)); $this->view->msg='成功同步元数据:'.$uuid; } else $this->view->msg='不存在此元数据:'.$uuid; } elseif ($list=='westdc') { $sql="select uuid,title from metadata where uuid not in (select uuid from geonetworkmetadata where schemaid='iso19115')"; $this->view->metadata=$this->db->query($sql); } elseif ($list=='geonetwork') { $sql="select id,uuid,(regexp_matches(data,'(.*)'))[1] as title from geonetworkmetadata where uuid not in (select uuid from metadata)"; $this->view->metadata=$this->db->query($sql); } elseif ($delete=='westdc') { $sql="delete from metadata where uuid not in (select uuid from geonetworkmetadata where schemaid='iso19115')"; $this->db->query($sql); $this->view->msg='已删除WESTDC中多出的元数据!'; } elseif ($delete=='geonetwork') { //dblink view中删除多条有问题,暂时用单条删除替代 //$sql="delete from geonetworkmetadata where uuid not in (select uuid from metadata)"; $sql="select uuid from geonetworkmetadata where uuid not in (select uuid from metadata)"; $rows=$this->db->fetchAll($sql); foreach($rows as $row) { $this->db->exec($this->db->quoteInto("delete from geonetworkmetadata where uuid=?",$row->uuid)); } $this->view->msg='已删除GEONETWORK中多出的元数据!'; } elseif ($delete=='water') { $sql="delete from metadata where uuid not in (select uuid from watergn where schemaid='iso19115') and uuid not in (select uuid from geonetworkmetadata where schemaid='iso19115')"; $this->db->query($sql); $this->view->msg='已删除WESTDC中多出的元数据!'; } elseif ($thumb=='geonetwork') { $sql="select g.id as gid,m.uuid,t.* from thumbnail t left join metadata m on t.id=m.id left join geonetworkmetadata g on m.uuid=g.uuid where t.filetype is not null and t.filename is not null"; $rows=$this->db->fetchAll($sql); foreach($rows as $row) { $data=file_get_contents($this->view->config->geonetwork->url.'srv/cn/resources.get?access=public&id='.$row->gid.'&fname='.urlencode($row->filename)); $sql="update thumbnail set data=? where id=?"; $this->db->query($sql,array(base64_encode($data),$row->id)); } $this->view->msg='已成功同步缩略图!'; } elseif ($thumb=='water') { $sql="select g.id as gid,m.uuid,t.* from watergn g left join metadata m on m.uuid=g.uuid left join thumbnail t on t.id=m.id where t.filetype is not null and t.filename is not null"; $rows=$this->db->fetchAll($sql); foreach($rows as $row) { $data=file_get_contents($this->view->config->watergeonetwork->url.'srv/cn/resources.get?access=public&id='.$row->gid.'&fname='.urlencode($row->filename)); $sql="update thumbnail set data=? where id=?"; $this->db->query($sql,array(base64_encode($data),$row->id)); } $this->view->msg='已成功同步缩略图!'; } elseif ($adminuser=='geonetwork') { $sql="select id,username,password,email from users"; $rows=$this->db->fetchAll($sql); foreach($rows as $row) { $sql="select * from geonetworkusers where id=?"; $r=$this->db->fetchRow($sql,array($row->id)); if ($r) { $sql="update geonetworkusers set username='$row->username',password=encode(digest(md5('$row->password'),'sha1'),'hex'),email='$row->email' where id=$row->id"; $this->db->query($sql); } else { $sql="insert into geonetworkusers (id,username,password,email) values($row->id,'$row->username',encode(digest(md5('$row->password'),'sha1'),'hex'),'$row->email')"; $this->db->query($sql); } } $this->view->msg='已成功同步帐号!'; } } function datasetcdAction() { $add=(int)$this->_getParam('add'); $edit=(int)$this->_getParam('edit'); $delete=(int)$this->_getParam('delete'); if ($add) { $form=new DatasetcdForm(); $form->img->setRequired(true); $form->document->setRequired(true); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $uploadedData = $form->getValues(); $img = '/'.$form->img->getFileName(); $document='/'.$form->document->getFileName(); $sql="insert into datasetcd (title,size,uuid,img,document,descript) values(?,?,?,?,?,?)"; $this->db->query($sql,array($formdata['title'],$formdata['size'],$formdata['uuid'],$img,$document,$formdata['descript'])); $this->messenger->addMessage('提示信息:您已经成功添加该特色数据集。'); $this->_redirect('/admin/data/datasetcd'); } else { $form->populate($formdata); } } $this->view->form=$form; $this->_helper->viewRenderer('datasetcdadd'); } elseif ($edit){ $form=new DatasetcdForm(); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $uploadedData = $form->getValues(); $img = '/'.$form->img->getFileName(); $document='/'.$form->document->getFileName(); $sql="update datasetcd set title=?,size=?,uuid=?,"; if ($form->img->isUploaded()) $sql.="img=?,"; if ($form->document->isUploaded()) $sql.="document=?,"; $sql.="descript=? where id=?"; $param=array($formdata['title'],$formdata['size'],$formdata['uuid']); if ($form->img->isUploaded()) $param[]=$img; if ($form->document->isUploaded()) $param[]=$document; $param[]=$formdata['descript']; $param[]=$edit; $this->db->query($sql,$param); $this->messenger->addMessage('提示信息:您已经编辑添加该特色数据集。'); $this->_redirect('/admin/data/datasetcd'); } else { $form->populate($formdata); } } else { $sql="select * from datasetcd where id=?"; $formdata=$this->db->fetchRow($sql,array($edit)); $form->populate($formdata); } $this->view->form=$form; $this->_helper->viewRenderer('datasetcdadd'); } elseif ($delete) { $sql="delete from datasetcd where id=?"; try { $this->db->query($sql,array($delete)); $this->messenger->addMessage('提示信息:您已经成功删除该特色数据集。'); } catch (Exception $e) { $this->messenger->addMessage($e->getMessage()); } $this->_redirect("/admin/data/datasetcd"); } $select=$this->db->select(); $select->from('datasetcd')->order('id desc'); $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage($this->view->config->page->max); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; } function mdAction() { $delete=(int)$this->_getParam('delete'); $down=(int)$this->_getParam('down'); $search = $this->_getParam('search'); $keyword = $this->_getParam('keyword'); $att=$this->_getParam('att'); if ($delete) { $sql="delete from metadata where id=?"; try { $this->db->query($sql,array($delete)); $this->messenger->addMessage('提示信息:您已经成功删除该数据。'); } catch (Exception $e) { $this->messenger->addMessage($e->getMessage()); } $this->_redirect("/admin/data/md"); }//删除 elseif($att>0){ $submit=$this->_request->getParam('submit'); $uuid=$this->_request->getParam('uuid'); $atts=$this->_request->getParam('ids'); $addatts=$this->_request->getParam('addatts'); $this->view->id = $att; $this->view->uuid = $uuid; if(!empty($addatts)) { if(empty($submit)) { $sql = "select title from metadata where uuid='$uuid'"; $re = $this->db->query($sql); $rows = $re->fetch(); $this->view->id = $att; $this->view->uuid = $uuid; $this->view->mdtitle = $rows['title']; $this->view->thisatt = $rows; $this->_redirect("/admin/data/attachments/uuid/$uuid/mdtitle/{$rows['title']}"); } else { if(!empty($uuid)) { foreach($atts as $v) { $sql = "insert into mdattach (uuid,id) values ('$uuid','$v')"; try{ $this->db->exec($sql); $this->messenger->addMessage('成功添加附件:'.$v); }catch (Exception $e) { $this->messenger->addMessage('添加附件失败:'.$v); } } $this->_redirect("/admin/data/md/att/1/uuid/$uuid"); } } }//empty($addatts) else { if(!empty($uuid)) { $sql = "select m.*,a.*,d.title from mdattach m left join attachments a on m.id = a.id left join metadata d on m.uuid=d.uuid where m.uuid='$uuid'"; $re = $this->db->query($sql); $rows = $re->fetchAll(); $sql = "select title from metadata where uuid='$uuid'"; $re = $this->db->query($sql); $title = $re->fetch(); $this->view->atts=$rows; $this->view->mdtitle = $title['title']; $this->_helper->viewRenderer('attmanager'); } } }//编辑附件 /* * 输出打包下载的xml文件 * * 文件量大时可能出现超时,需要修改超时时间为无限 */ elseif ($down) { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); //临时zip文件名 $tmpname="dataxml"; //xml文件存放的缓存目录 $dirName = '../data/import/'; //查询需要创建的文件 $sql = "SELECT md.title,md.uuid,x.* from xml x LEFT JOIN normalmetadata md ON md.id=x.id"; $sth = $this->db->prepare($sql); $sth->execute(); $rows = $sth->fetchAll(); //将结果储存,但不使用 //创建zip文件,创建成功后再使用查询结果 $zip = new ZipArchive(); $url = tempnam($this->config->temp->path,$tmpname);//创建临时文件 if( $zip->open($url, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== true ) { throw new Exception("cannot open {$url} for writing."); } foreach($rows as $k=>$v) { $filename = $dirName.$v['uuid'].'.xml'; //创建xml文件 $handle = fopen($filename,"w"); fwrite($handle,$v['data']); fclose($handle); //添加到zip文件 //zip localname 直接使用UUID作为文件名 $zip->addFile($filename,$v['uuid'].".xml"); } $zip->close(); //zip文件创建完成后删除服务器上的缓存文件,防止发生冗余 foreach($rows as $k=>$v) { $filename = $dirName.$v['uuid'].'.xml'; unlink($filename); } //输出下载 $content=file_get_contents($url); $this->getResponse()->setHeader('Content-Type', 'application/octet-stream') ->setHeader('Content-Disposition','attachment; filename="dataxml.zip"') ->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); }//down else if($search){ if(!empty($keyword)) { $sql = "select m.*,md.viewed,g.id as gid from metadata m left join mdstat md on m.uuid=md.uuid left join geonetworkmetadata g on g.uuid=m.uuid where m.title like '%$keyword%' order by m.id desc "; $re=$this->db->query($sql); $row=$re->fetchAll(); $paginator = Zend_Paginator::factory($row); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage($this->view->config->page->max); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; $this->messenger->addMessage($keyword.' 的搜索结果'); } else { $this->messenger->addMessage('请输入搜索关键字'); $this->_redirect("/admin/data/md"); } }//search else{ $select=$this->db->select(); $select->from('metadata') ->joinLeft('mdstat','metadata.uuid=mdstat.uuid','viewed') ->joinLeft('geonetworkmetadata','geonetworkmetadata.uuid=metadata.uuid','id as gid') ->joinLeft('mdstatus','metadata.uuid=mdstatus.uuid','status as mdstatus') ->order('metadata.id desc'); $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage($this->view->config->page->max); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; } } function commentAction() { $delete=(int)$this->_getParam('delete'); if ($delete) { $sql="delete from comments where id=?"; try { $this->db->query($sql,array($delete)); $this->messenger->addMessage('提示信息:您已经成功删除该评论。'); } catch (Exception $e) { $this->messenger->addMessage($e->getMessage()); } $this->_redirect("/admin/data/comment"); } $select=$this->db->select(); $select->from('comments') ->joinLeft('metadata','metadata.uuid=comments.uuid','title') ->order('comments.ts_created desc') ->order('comments.id desc'); $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage($this->view->config->page->max); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; } function newsletterAction() { $form=new Zend_Form(); $form->setName('newsletter'); $form->setAttrib('enctype', 'multipart/form-data'); $nlf=new Zend_Form_Element_File('nlf'); $nlf->setLabel('数据通讯') ->setRequired(true) ->setDestination($this->view->config->paths->newsletter) ->addValidator('Count', false, 1) // ensure only 1 file ->addValidator('Size', false, 2048000) // limit to 2M ->addValidator('Extension', false, 'pdf'); // only JPEG, PNG, and GIFs $submit = new Zend_Form_Element_Submit('submit'); $form->addElements(array($nlf,$submit)); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $uploadedData = $form->getValues(); //自动生成JPG文件 $pdf = $form->nlf->getFileName(); $img = new Imagick($pdf.'[0]'); $img->thumbnailImage(200, 0); $img->writeImage($this->view->config->paths->newsletter.basename($pdf,'.pdf').'.jpg'); $this->messenger->addMessage('提示信息:您已经成功添加该数据通讯。'); $this->_redirect('/admin/data/newsletter'); } } $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); $this->view->form=$form; } function featureAction() { $add=(int)$this->_getParam('add'); $edit=(int)$this->_getParam('edit'); $delete=(int)$this->_getParam('delete'); if ($add) { $form=new DatafeatureForm(); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $uploadedData = $form->getValues(); if (!$form->imgurl) { $imgurl = '/'.$form->img->getFileName(); } else $imgurl=$formdata['imgurl']; $sql="insert into datafeature (title,detailurl,imgurl,description) values(?,?,?,?)"; $this->db->query($sql,array($formdata['title'],$formdata['detailurl'],$imgurl,$formdata['description'])); $this->messenger->addMessage('提示信息:您已经成功添加该特色推荐。'); $this->_redirect('/admin/data/feature'); } else { $form->populate($formdata); } } $this->view->form=$form; $this->_helper->viewRenderer('featureadd'); } elseif ($edit){ $form=new DatafeatureForm(); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $uploadedData = $form->getValues(); if (!$form->imgurl) { $imgurl = '/'.$form->img->getFileName(); } else $imgurl=$form->imgurl; $sql="update datafeature set title=?,detailurl=?,imgurl=?,description=? where id=?"; $param=array($formdata['title'],$formdata['detailurl'],$formdata['imgurl'],$formdata['description'],$edit); $this->db->query($sql,$param); $this->messenger->addMessage('提示信息:您已经编辑该特色推荐。'); $this->_redirect('/admin/data/feature'); } else { $form->populate($formdata); } } else { $sql="select * from datafeature where id=?"; $formdata=$this->db->fetchRow($sql,array($edit)); $form->populate($formdata); } $this->view->form=$form; $this->_helper->viewRenderer('featureadd'); } elseif ($delete) { $sql="delete from datafeature where id=?"; try { $this->db->query($sql,array($delete)); $this->messenger->addMessage('提示信息:您已经成功删除该特色推荐。'); } catch (Exception $e) { $this->messenger->addMessage($e->getMessage()); } $this->_redirect("/admin/data/feature"); } $select=$this->db->select(); $select->from('datafeature')->order('id desc'); $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage($this->view->config->page->max); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; } /* * 数据文献管理 */ function referenceAction() { $add=(int)$this->_getParam('add'); $edit=(int)$this->_getParam('edit'); $delete=(int)$this->_getParam('delete'); $uuid=$this->_getParam('uuid'); $search=$this->_getParam('search'); $keyword=$this->_getParam('keyword'); $import=(int)$this->_getParam('import'); $show = $this->_getParam('show'); if ($add) { $form=new ReferenceForm(); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $sql="select id from reference where reference=?"; $row=$this->db->fetchRow($sql,array(trim($formdata['reference']))); if (!$row) { $sql="insert into reference (reference,link) values(?,?)"; $this->db->query($sql,array(trim($formdata['reference']),trim($formdata['link']))); $sql="select id from reference where reference=?"; $row=$this->db->fetchRow($sql,array(trim($formdata['reference']))); } $sql="insert into mdref (uuid,refid,reftype) values(?,?,?)"; $this->db->query($sql,array(trim($formdata['uuid']),$row['id'],$formdata['reftype'])); $this->messenger->addMessage('提示信息:您已经成功添加该数据文献。'); $this->_redirect('/admin/data/reference/show/'.$formdata['uuid']); }else { $form->populate($formdata); } } else { if ($uuid) { $formdata['uuid']=$uuid; $form->populate($formdata); } } $this->view->form=$form; $this->_helper->viewRenderer('referenceadd'); } //添加 else if($show){ $sql = "select mr.id as mdid,mr.refid,r.reference,md.title,md.uuid FROM mdref mr left join metadata md on md.uuid=mr.uuid left join reference r on r.id=mr.refid where mr.uuid='$show'; "; $rs = $this->db->query($sql); $rows = $rs->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; } //按UUID查看 elseif ($edit){ $form=new ReferenceForm(); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $sql="select id from reference where reference=? order by id desc"; $rs=$this->db->query($sql,array($formdata['reference'])); $row = $rs->fetch(); if ($row['id']!='') { //更新文献信息 $sql="update mdref set refid=?,reftype=? where uuid=? and id=?"; $td = $this->db->query($sql,array($row['id'],$formdata['reftype'],$formdata['uuid'],$edit)); $sql="update reference set reference=?,link=? where id=?"; $this->db->query($sql,array($formdata['reference'],$formdata['link'],$row['id'])); if($td) { $this->messenger->addMessage('提示信息:您已经编辑该数据文献。'); $this->_redirect('/admin/data/reference/show/'.$formdata['uuid']); } }else { $sql = "INSERT INTO reference (reference,link) VALUES ('".$formdata['reference']."','".$formdata['link']."') RETURNING id"; $sth = $this->db->prepare($sql); if($sth->execute()) { $row = $sth->fetch(PDO::FETCH_ASSOC); $sql="update mdref set refid=?,reftype=? where uuid=? and id=?"; $td = $this->db->query($sql,array($row['id'],$formdata['reftype'],$formdata['uuid'],$edit)); $this->messenger->addMessage('提示信息:您已经编辑该数据文献。'); $this->_redirect('/admin/data/reference/show/'.$formdata['uuid']); }else { $this->messenger->addMessage('提示信息:文献创建失败,请重试'); $this->_redirect('/admin/data/reference/edit/'.$edit); } } } else { $form->populate($formdata); } } else { $sql="select m.uuid,r.reference,r.link,m.reftype from reference r left join mdref m on r.id=m.refid where m.id=?"; $formdata=$this->db->fetchRow($sql,array($edit)); $form->populate($formdata); } $this->view->form=$form; $this->_helper->viewRenderer('referenceadd'); } //编辑相关文献 elseif ($delete) { $sql = "select uuid from mdref where id=$delete"; $rs = $this->db->query($sql); $row = $rs->fetch(); $sql="delete from mdref where id=?"; try { $this->db->query($sql,array($delete)); $this->messenger->addMessage('提示信息:您已经成功删除该数据文献。'); } catch (Exception $e) { $this->messenger->addMessage($e->getMessage()); } $this->_redirect('/admin/data/reference/show/'.$row['uuid']); } //删除相关文献 elseif ($import) { if ($this->_request->isPost()) { if ($_FILES["ref"]["error"] == UPLOAD_ERR_OK) { $tmp_name = $_FILES["ref"]["tmp_name"]; $fp = fopen($tmp_name, "rb"); $ref=fread($fp, filesize($tmp_name)); fclose($fp); $lines=explode("\n",$ref); foreach($lines as $line) { $data=explode(";",$line); if (count($data)==2) $link=''; else $link=$data[2]; $link=$this->db->quote($link); $sql="insert into reference (reference,link) values(?,".$link.")"; try { $this->db->exec($this->db->quoteInto($sql,$data[1])); } catch (Exception $e) {} $sql="select id from reference where reference=?"; $row=$this->db->fetchRow($this->db->quoteInto($sql,$data[1])); $sql="insert into mdref (uuid,refid) values(?,".$row['id'].")"; try { $this->db->exec($this->db->quoteInto($sql,$data[0])); } catch (Exception $e) {} } }//end if } $this->_helper->viewRenderer('referenceimport'); } //引用 else if($search){ if(!empty($keyword)) { $sql="select rf.id as mdid,rf.refid,m.*,r.* from mdref rf left join metadata m on m.uuid=rf.uuid left join reference r on r.id=rf.refid where m.title like '%$keyword%' order by m.title"; $re=$this->db->query($sql); $row=$re->fetchAll(); $paginator = Zend_Paginator::factory($row); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; $this->messenger->addMessage($keyword.' 的搜索结果'); } else { $this->messenger->addMessage('请输入搜索关键字'); $this->_redirect("/admin/data/reference"); } } //搜索 else{ $select=$this->db->select(); $select->from('mdref',array('id as mdid','refid')) ->join('metadata','metadata.uuid=mdref.uuid') ->join('reference','reference.id=mdref.refid') ->order('metadata.title'); $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; }//列表 } /* * 删除元数据,删除前有确认 */ function deleteAction() { if ($this->_request->isPost()) { $id = (int)$this->_request->getPost('id'); $del = $this->_request->getPost('del'); if ($del == 'Yes' && $id > 0) { $md = new MetadataTable(); $where = 'id = ' . $id; $md->delete($where); } $this->_redirect('/data'); } else { $id = (int)$this->_request->getParam('id'); if ($id > 0) { $mdt = new MetadataTable(); $this->view->md = $mdt->fetchRow('id='.$id); } } } /* * 导入本地元数据 */ function importAction() { $md=new MetadataTable(); $thumb=new ThumbnailTable(); $xmlt=new XmlTable(); $cgt=new CategoryTable(); $cgct=new CategoryCodeTable(); $keyt=new KeywordTable(); $dst=new DatasetSeriesTable(); $seriestable=new SeriesTable(); if ($this->_request->isPost()) { foreach ($_FILES["xmlfile"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["xmlfile"]["tmp_name"][$key]; $name = $_FILES["xmlfile"]["name"][$key]; $fp = fopen($tmp_name, "rb"); $xml=fread($fp, filesize($tmp_name)); fclose($fp); $this->import($xml); //采用UUID为文件名? //move_uploaded_file($tmp_name, "../data/import/$name"); }//end if }//foreach $this->_redirect('/data'); } else { //do nothing now. } } /* * 批量处理元数据(元数据保存在服务器的一个目录上) */ function batchimportAction() { if ($this->_request->isPost()) { $dir = $this->_request->getPost('directory'); $subdir = $this->_request->getPost('subdir'); $l=new mydir($dir,"*.xml"); $xmlfiles=$l->toArray(); foreach($xmlfiles as $xmlfile) { $fp=fopen($dir.'/'.$xmlfile,'rb'); $xml=fread($fp,filesize($dir.'/'.$xmlfile)); fclose($fp); $this->import($xml); } $this->_redirect('/data'); } } function datafileimportAction() { if ($this->_request->isPost()) { set_time_limit(0); $dir = $this->_request->getPost('directory'); if (file_exists($dir.'/dataset.txt')) { $fp=fopen($dir.'/dataset.txt','rb'); $ds=fread($fp,filesize($dir.'/dataset.txt')); fclose($fp); $ds1=explode("\n",$ds); for($i=0;$idb->query($sql); //$sql="insert into dataset (path,uuid) values('".$dpath."','".$duuid."')"; $sql="insert into dataset (path,uuid) values(?,?)"; $this->db->query($sql,array($dpath,$duuid)); $sql="select id from dataset where uuid='".$duuid."'"; $rs=$this->db->fetchRow($sql); $dsid=$rs["id"]; $fp=fopen($dir.'/'.$duuid.'.txt','rb'); $filep=fread($fp,filesize($dir.'/'.$duuid.'.txt')); fclose($fp); $filep1=explode("\n",$filep); //print $duuid."
"; //print $dpath." ".count($dpatch)."
"; for($j=0;$j"; //$sql="insert into datafile (dsid,filename,filesize,isdir,depth) values(".$dsid.",'".$this->db->escape($fpath)."',".$fsize.",".$fdir.",".$fdepth.")"; $sql="insert into datafile (dsid,filename,filesize,isdir,depth) values(?,?,?,?,?)"; $this->db->query($sql,array($dsid,$fpath,$fsize,$fdir,$fdepth)); } } } } } $this->view->msg='已成功处理数据目录信息!'; } }//datafileimportAction function sourceAction() { $do = $this->_request->getParam('do'); $uuid = $this->_request->getParam('uuid'); $id = $this->_request->getParam('id'); $q = $this->_request->getParam('q'); $search = $this->_request->getParam('search'); if ($do == 'add') { $redirect = "/admin/data/source/"; if(!empty($_POST['submit'])) { try{ $title = $this->_request->getParam('title'); $uuid = $this->_request->getParam('uuid'); $code = $this->_request->getParam('code'); $description = $this->_request->getParam('description'); $has_pages = $this->_request->getParam('has_pages'); $has_agreement = $this->_request->getParam('has_agreement'); $data = array( 'title' => $title, 'uuid' => $uuid, 'code' => $code, 'description' => $description, 'has_pages' => $has_pages, 'has_agreement' => $has_agreement ); if($this->db->insert('source',$data)) { $this->messenger->addMessage('添加来源信息成功'); $this->_redirect($redirect); } }catch(Exception $e){ $this->messenger->addMessage('添加来源信息失败:'.$e->getMessage()); $this->_redirect('/admin/data/source/do/add'); } } $this->_helper->viewRenderer('sourceadd'); }// 添加项目来源 else if($do == 'edit' && !empty($id)) { if(!empty($_POST['submit'])) { try{ $title = $this->_request->getParam('title'); $uuid = $this->_request->getParam('uuid'); $code = $this->_request->getParam('code'); $description = $this->_request->getParam('description'); $has_pages = $this->_request->getParam('has_pages'); $has_agreement = $this->_request->getParam('has_agreement'); $sql = "update source set title='$title',uuid='$uuid',code='$code',description='$description',has_pages='$has_pages',has_agreement='$has_agreement' where id='$id'"; if($this->db->exec($sql)) { $this->messenger->addMessage('修改来源信息成功'); $this->_redirect("/admin/data/source/do/edit/id/$id"); } }catch(Exception $e){ $this->messenger->addMessage('修改来源信息失败:'.$e->getMessage()); $this->_redirect("/admin/data/source/do/edit/id/$id"); } } $sql = "select * from source where id='$id'"; $rs = $this->db->query($sql); $row = $rs->fetch(); $this->view->info = $row; $this->_helper->viewRenderer('sourceadd'); }// 编辑单条信息 else if($do == 'datasource' && !empty($uuid)) { $redirect = "/admin/data/source/do/datasource/uuid/$uuid"; $this->view->uuid = $uuid; $sql = "select md.title,ds.id,ds.sourceid,s.title as stitle,s.code from metadata md left join datasource ds on ds.uuid=md.uuid left join source s on s.id=ds.sourceid where md.uuid='$uuid'"; $rs = $this->db->query($sql); $row = $rs->fetch(); $this->view->info = $row; if(!empty($_POST['submit'])) { $sourceid = $this->_request->getParam('sourceid'); if(empty($sourceid)) { $this->messenger->addMessage('请选择项目来源'); $this->_redirect($redirect); } $sql=""; if(empty($row['id'])) { $sql = "insert into datasource (uuid,sourceid) values ('$uuid','$sourceid')"; }else { $sql = "update datasource set uuid='$uuid',sourceid='$sourceid' where id='{$row['id']}'"; } try{ if($this->db->exec($sql)) { $this->messenger->addMessage('修改项目来源成功'); $this->_redirect($redirect); } else { $this->messenger->addMessage('修改项目来源失败'); $this->_redirect($redirect); } }catch (Exception $e){ $this->messenger->addMessage('修改项目来源失败:'.$e->getMessage()); $this->_redirect($redirect); } } $wheresql = array(); if(!empty($q) && !empty($search)) { $this->view->q = $q; $wheresql[] = " title like '%$q%' "; } if(count($wheresql>0))$wheresql = join(' and ',$wheresql); else $wheresql=''; if($wheresql!='') { $wheresql = 'where '.$wheresql; } $sql = "select * from source $wheresql order by id desc"; $rs = $this->db->query($sql); $rows = $rs->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; $this->_helper->viewRenderer('sourceselect'); }// 为元数据选择项目来源 else if($do == 'del' && !empty($id)) { $redirect = "/admin/data/source/"; $sql = "delete from source where id='$id'"; try{ if($this->db->exec($sql)) { $this->messenger->addMessage('删除成功'); $this->_redirect($redirect); }else{ $this->messenger->addMessage('删除失败,可能该数据已不存在'); $this->_redirect($redirect); } }catch (Exception $e){ $this->messenger->addMessage('删除失败:'.$e->getMessage()); $this->_redirect($redirect); } }// 删除项目来源 else if($do == 'fetch' && !empty($id)) { $wheresql = array(); $wheresql[] = " ds.sourceid='$id' "; if(!empty($q) && !empty($search)) { $this->view->q = $q; $wheresql[] = " title like '%$q%' "; } if(count($wheresql>0))$wheresql = join(' and ',$wheresql); else $wheresql=''; if($wheresql!='') { $wheresql = 'where '.$wheresql; } $sql = "select md.title,md.uuid,ds.id,ds.sourceid,s.title as stitle,s.code from metadata md left join datasource ds on ds.uuid=md.uuid left join source s on s.id=ds.sourceid $wheresql order by id desc"; $rs = $this->db->query($sql); $rows = $rs->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; $this->_helper->viewRenderer('sourcefetchone'); }//查看某项目来源中的所有元数据 else if($do == 'delsource' && !empty($id)) { $redirect = "/admin/data/source/do/datasource/uuid/$uuid"; $sql = "delete from datasource where id='$id'"; try{ if($this->db->exec($sql)) { $this->messenger->addMessage('删除成功'); $this->_redirect($redirect); }else{ $this->messenger->addMessage('删除失败,可能该数据已不存在'); $this->_redirect($redirect); } }catch (Exception $e){ $this->messenger->addMessage('删除失败:'.$e->getMessage()); $this->_redirect($redirect); } }// 清除元数据来源记录 elseif ($do=='sync') { //同步数据来源到metadata表 $redirect = "/admin/data/source/"; $sql = "update metadata m set source=s.uuid from source s right join datasource d on s.id=d.sourceid where m.uuid=d.uuid"; if($this->db->exec($sql)) { $this->messenger->addMessage('成功同步数据来源'); $this->_redirect($redirect); }else{ $this->messenger->addMessage('同步数据来源失败'); $this->_redirect($redirect); } } else { $wheresql = array(); if(!empty($q) && !empty($search)) { $this->view->q = $q; $wheresql[] = " title like '%$q%' "; } if(count($wheresql>0))$wheresql = join(' and ',$wheresql); else $wheresql=''; if($wheresql!='') { $wheresql = 'where '.$wheresql; } $sql = "select * from source $wheresql order by id desc"; $rs = $this->db->query($sql); $rows = $rs->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; }// 项目来源管理 }//function sourceAction function attachmentsAction() { $submit = $this->_request->getParam('submit'); $add = $this->_request->getParam('add'); $search = $this->_request->getParam('search'); $delete = $this->_request->getParam('delete'); $edit = $this->_request->getParam('edit'); $down = $this->_request->getParam('down'); $uuid = $this->_request->getParam('uuid'); $mdtitle = $this->_request->getParam('mdtitle'); $mdattdel = $this->_request->getParam('mdattdel'); if(!empty($uuid)&&!empty($mdtitle)) { $this->view->uuid= $uuid; $this->view->mdtitle=$mdtitle; } if($add) { $this->_helper->viewRenderer('attachmentsadd'); if(!empty($uuid)) { $this->view->uuid = $uuid; } }//附件添加 else if($mdattdel) { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $sql = "delete from mdattach where uuid=? AND id=?"; $sth = $this->db->prepare($sql); $ds = $sth->execute(array($uuid,$mdattdel)); if($ds) { $data = array("status"=>1); //操作状态代码 : 1=>成功 2=>失败 $this->jsonexit($data); return true; }else{ $data = array("error"=>"处理中出现错误"); $this->jsonexit($data); return true; } } else if($delete) { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); //需要删除文件,通过Zend_Registry::get('upload')获得上传文件的根目录 $basepath = $this->view->config->upload; //从数据库获取文件路径 $info = $this->getFileinfo($delete); $filepath = $basepath.$info['filename']; $sql = "SELECT * FROM mdattach WHERE id=?"; $sth = $this->db->prepare($sql); $sth->execute(array($delete)); $rows = $sth->fetchAll(); if(count($rows)>0) { $data = array("error"=>'删除失败!该文件有元数据附件信息,不能直接删除',"status"=>0); $this->jsonexit($data); return true; } $sql = "SELECT * FROM mdreviewattach WHERE attachid=?"; $sth = $this->db->prepare($sql); $sth->execute(array($delete)); $rows = $sth->fetchAll(); if(count($rows)>0) { $data = array("error"=>'删除失败!该文件有对应评审附件信息,不能直接删除',"status"=>0); $this->jsonexit($data); return true; } $sql = "SELECT link FROM reference WHERE link!=''"; $sth = $this->db->prepare($sql); $sth->execute(); $rows = $sth->fetchAll(); $ids = array(); foreach($rows as $k=>$v) { if(preg_match("/service/i",$v['link'])) { $ids[] = str_replace("/service/attach/id/","",$v['link']); } unset($rows[$k]); } unset($rows); if(in_array($delete,$ids)) { $data = array("error"=>'删除失败!该文件有对应文献附件信息,不能直接删除',"status"=>0); $this->jsonexit($data); return true; } if(unlink($filepath)) { $sql = "delete from attachments where id='$delete'"; if($this->db->exec($sql)>0) { $data = array("status"=>1); $this->jsonexit($data); return true; } } else { $sql = "delete from attachments where id='$delete'"; if($this->db->exec($sql)>0) { $data = array("error"=>'文件删除失败,仅删除数据库记录,请手动删除文件:'.$info['filename'],"status"=>0); $this->jsonexit($data); return true; } } }//删除 else if($edit>0) { if(empty($submit)) { $this->view->info = $this->getFileinfo($edit); $this->_helper->viewRenderer('attachmentsadd'); } else { $filedesc = $this->_request->getParam('filedesc'); $sql="update attachments set filedesc='$filedesc' where id='$edit'"; if($this->db->exec($sql)>0) { $this->messenger->addMessage('编辑成功'); $this->_redirect("/admin/data/attachments/edit/$edit"); } } }//编辑 else if($search && $search!='my') { $keyword = $this->_request->getParam('keyword'); if(empty($keyword)) { $this->messenger->addMessage('请输入关键词'); $this->_redirect("/admin/data/attachments/search/1"); } else { $sql="select * from attachments where filedesc like '%$keyword%'"; $re = $this->db->query($sql); $rows=$re->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; } }//搜索 else if($search && $search=='my') { $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $user = $auth->getIdentity(); $userid = $user->id; $sql="select * from attachments where userid='$userid'"; $re= $this->db->query($sql); $rows = $re->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; } }//我的附件列表 else if ($down>0) { $sql = "select * from attachments where id='$down'"; $re = $this->db->query($sql); $row = $re->fetch(); $file = new files(); $fullPath = $this->view->config->upload.$row['filename']; // Parse Info / Get Extension $fsize = filesize($fullPath); $path_parts = pathinfo($fullPath); $ext = strtolower($path_parts["extension"]); // Determine Content Type switch ($ext) { case "pdf": $ctype="application/pdf"; break; case "exe": $ctype="application/octet-stream"; break; case "zip": $ctype="application/zip"; break; case "doc": $ctype="application/msword"; break; case "xls": $ctype="application/vnd.ms-excel"; break; case "ppt": $ctype="application/vnd.ms-powerpoint"; break; case "gif": $ctype="image/gif"; break; case "png": $ctype="image/png"; break; case "jpeg": case "jpg": $ctype="image/jpg"; break; default: $ctype="application/force-download"; } $content=file_get_contents($fullPath); $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $this->getResponse()->setHeader('Content-Type', 'application/octet-stream') ->setHeader('Content-Disposition','attachment; filename="'.basename($fullPath).'"') ->setHeader('Content-Length', $fsize) ->setHeader('Content-Type','application/force-download') ->setHeader('Content-Type','application/download') ->setHeader('Content-Type',$ctype) ->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); //$sql = "update attachments set downtimes=downtimes+1 where id='$down'"; //$this->db->exec($sql); }//附件下载 else { $sql="select * from attachments order by id desc"; $re= $this->db->query($sql); $rows = $re->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(30); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; }//所有附件 }//attachments 附件 function uploadAction(){ $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $uuid = $this->_getParam('uuid'); try{ $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $user = $auth->getIdentity(); $userid = $user->id; } if(empty($userid)||!is_numeric($userid)){ $msg['error'] = "请先登录"; echo Zend_Json::encode($msg); exit(); } if($user->usertype!='administrator') { $msg['error'] = "您无权使用此功能"; echo Zend_Json::encode($msg); exit(); } $files=new files(); $msg = $files -> upload($this->view->config->upload,$_FILES['Filedata'],empty($uuid)?'file':'md'); if(empty($msg['error'])) { $msg['error']=""; $filename = $msg['db_path']; $filesize = $msg['file_size']; $filedesc = $this->_request->getParam('filedesc'); $filetype = $msg['file_type']; $realname = $msg['realname']; $sql = "insert into attachments (filename,filetype,filedesc,userid,filesize,realname) values ('$filename','$filetype','$filedesc','$userid','$filesize','$realname') RETURNING id"; $sth = $this->db->prepare($sql); $sth->execute(); $att = $sth->fetch(PDO::FETCH_ASSOC); $msg['attid'] = $attid = $att['id']; $sql = "insert into mdattach (uuid,id) values ('$uuid','$attid')"; if(empty($uuid) || $this->db->exec($sql)) { $msg['html'] = $realname.'['. round($filesize/1024,2) .' kb]
'; echo Zend_Json::encode($msg); exit(); }else{ $msg['error'] = '附件上传失败:写入附件表出错'; @unlink($filename); echo Zend_Json::encode($msg); exit(); } }else{ $msg['error'] = '附件上传失败:'.$msg['error']; @unlink($filename); echo Zend_Json::encode($msg); exit(); } }catch(Exception $e){ $msg['error'] = "错误:".$e->getMessage(); echo Zend_Json::encode($msg); exit(); } }// uploadAction ajax上传附件 function getattsAction(){ $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $uuid = $this->_request->getParam('uuid'); if($uuid!='') { $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $user = $auth->getIdentity(); $userid = $user->id; $sql = "select m.*,a.*,d.title from mdattach m left join attachments a on m.id = a.id left join metadata d on m.uuid=d.uuid where m.uuid='$uuid' ORDER BY a.ts_created ASC"; $rs = $this->db->query($sql); $atts = $rs->fetchAll(); foreach($atts as $k=>$v) { $atts[$k]['html']= $v['realname'].'['. round($v['filesize']/1024,2) .' kb]
'; } echo Zend_Json::encode($atts); exit(); }else { exit(); } }else{ exit(); } //不输出错误 }//获取附件 /* versionAction 版本管理 */ public function versionAction(){ $ac = $this->_request->getParam('ac'); $uuid = $this->_request->getParam('uuid'); $auth = Zend_Auth::getInstance(); if($auth->hasIdentity()) { $user = $auth->getIdentity(); $u_id = $user->id; } //查看单条数据的所有版本 if (!empty($uuid) && empty($ac)) { //view the versions of the data $sql = "SELECT md.title,md.uuid,v.ts_created,v.changelog,v.userid,v.id,u.username,u.realname FROM mdversion v LEFT JOIN metadata md ON md.uuid=v.uuid LEFT JOIN mdauthor a ON md.uuid=a.uuid left join users u on v.userid=u.id WHERE md.title IS NOT NULL AND v.uuid=? AND a.status=1 order by v.ts_created desc "; $sth = $this->db->prepare($sql); $sth->execute(array($uuid)); $rows = $sth->fetchAll(); @$this->view->mdtitle=$rows[0]['title']; $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(15); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; } //查看所有版本列表 else if((empty($ac) && empty($uuid))|| $ac=='list') { $sql = "SELECT md.title,md.uuid,v.ts_created,v.changelog,v.userid,v.id,u.username,u.realname FROM mdversion v LEFT JOIN metadata md ON md.uuid=v.uuid left join users u on v.userid=u.id WHERE md.title IS NOT NULL order by v.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(15); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; } //按数据浏览 else if($ac=="bydata") { $keywords = $this->_request->getParam('q'); if(!empty($keywords)) $this->view->q = $keywords; $sql = "SELECT md.title,md.uuid,count(v.id) as c FROM mdversion v LEFT JOIN metadata md ON md.uuid=v.uuid WHERE md.title IS NOT NULL"; if(!empty($keywords)) { $search=new Search($keywords); $where=$search->sql_expr(array("md.title","md.description")); $sql.=' and '.$where; } $sql.=" group by md.uuid,md.title"; $sth = $this->db->prepare($sql); $sth->execute(); $rows = $sth->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage(10); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; $this->_helper->viewRenderer('version-bydata'); } //删除某个版本 else if($ac=="delete") { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $data = ""; try{ $id = $this->_request->getParam('id'); if(empty($id) || !is_numeric($id)) { $data = array("error"=>"参数错误"); $this->jsonexit($data); return true; } $sql = "DELETE FROM mdversion WHERE id=?"; $sth = $this->db->prepare($sql); $ex = $sth -> execute(array($id)); if($ex) { $data = array("deleted"=>$id,"error"=>$this->alertbox('ok','删除成功')); $this->jsonexit($data); return true; }else{ $data = array("error"=>$this->alertbox('error','删除失败,请确认权限后重试')); $this->jsonexit($data); return true; } }catch(Exception $e) { $msg = "删除失败,请确认权限后重试"; if($this->debug>0) {$msg .= $e->getMessage();} $data = array("error"=>$this->alertbox('error',$msg)); $this->jsonexit($data); return true; } } //恢复到geonetwork else if($ac == "restore") { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $data = ""; try{ $id = $this->_request->getParam('id'); if(empty($id) || !is_numeric($id)) { $data = array("error"=>"参数错误"); $this->jsonexit($data); return true; } $this->wdb=Zend_Db::factory($this->view->config->geonetwork); $sql = "SELECT v.xml,v.uuid FROM mdversion v WHERE v.id=?"; $sth = $this->db->prepare($sql); $sth ->execute(array($id)); $row = $sth->fetch(); $sql = "SELECT data FROM metadata WHERE uuid=?"; $sth = $this->wdb->prepare($sql); $sth ->execute(array($row['uuid'])); $row_geo = $sth->fetch(); if($row['xml']==$row_geo['data']) { $data = array("error"=>$this->alertbox('warning','无须恢复,元数据相同')); $this->jsonexit($data); return true; } $sql = "UPDATE metadata SET data=? WHERE uuid=?"; $sth = $this->wdb->prepare($sql); $ex = $sth ->execute(array($row['xml'],$row['uuid'])); if($ex) { $data = array("error"=>$this->alertbox('ok','恢复成功')); $this->jsonexit($data); return true; }else{ $data = array("error"=>$this->alertbox('error','恢复失败,请确认权限后重试')); $this->jsonexit($data); return true; } }catch(Exception $e) { $msg = "恢复失败,请确认权限后重试"; if($this->debug>0) {$msg .= $e->getMessage();} $data = array("error"=>$this->alertbox('error',$msg)); $this->jsonexit($data); return true; } } //发布到评审 else if($ac == "commit") { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $data = ""; try{ $id = $this->_request->getParam('id'); if(empty($id) || !is_numeric($id)) { $data = array("error"=>"参数错误"); $this->jsonexit($data); return true; } $changelog = $this->_request->getParam('changelog'); if(empty($changelog)) { $data = array("error"=>$this->alertbox('warning','请输入变更信息')); $this->jsonexit($data); return true; } // 1. 权限认定 $sql="select a.* from mdauthor a left join mdversion v on a.uuid=v.uuid where a.status=1 and a.userid=? and v.id=?"; $sth=$this->db->prepare($sql); $sth->execute(array($u_id,$id)); $row=$sth->fetch(); if (empty($row)) { $data = array("error"=>'无权限修改数据'); $this->jsonexit($data); return true; } // 2. 保存变化记录 save changelog & userid $sql = "UPDATE mdversion SET changelog=?,userid=? WHERE id=?"; $this->db->query($sql,array($changelog,$u_id,$id)); // 3. 获取数据评审状态 $sql = "SELECT s.*,v.xml,m.title FROM mdstatus s left join mdversion v on s.uuid=v.uuid left join metadata m on s.uuid=m.uuid WHERE v.id=?"; $sth = $this->db->prepare($sql); $sth->execute(array($id)); $row = $sth->fetch(); if (empty($row)) //无对应记录 { $sql="select m.id from metadata m left join mdversion v on m.uuid=v.uuid where v.id=?"; $sth=$this->db->prepare($sql); $sth->execute(array($id)); $mrow=$sth->fetch(); if (empty($mrow)) //说明是新数据 { //导入元数据 $iso=new ISO19115(); $iso->saveDB($this->db,$row['xml']); //进入评审库 $sql="insert into mdstatus (uuid,status,userid) select uuid,0,? from mdversion where id=?"; $this->db->query($sql,array($u_id,$id)); //email to admin $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"metadata-new-admin",array( 'user' => $user->username, 'uuid' => $iso->uuid, 'email'=> $user->email, //元数据标题 'title'=> $iso->resTitle, )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } $mail->send(); unset($mail); unset($mailtp); //email to author $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"metadata-new-author",array( 'user' => $user->username, 'uuid' => $iso->uuid, 'email'=> $user->email, //元数据标题 'title'=> $iso->resTitle, )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($user->email); $mail->addCc($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } @$mail->send(); $data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功提交,请等待数据中心进一步处理!')); $this->jsonexit($data); return true; } else { //说明是已发布的数据且数据不存在评审信息 //同步元数据 $iso=new ISO19115(); $iso->saveDB($this->db,$row['xml']); //移除中间版本 $sql="delete from mdversion where uuid in (select uuid from mdversion where v.id=?) and char_length(changelog)<3"; $this->db->query($sql,array($id)); //修改评审状态为发布,且由其提交的用户进行管理 $sql="insert into mdstatus (uuid,status,userid) select uuid,6,? from mdversion where id=?"; $this->db->query($sql,array($u_id,$id)); //email to admin & author $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"metadata-release",array( 'user' => $user->username, 'uuid' => $row['uuid'], 'email'=> $user->email, //元数据标题 'title'=> $row['title'], 'changelog'=>$changelog, )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($this->view->config->service->email); $mail->addCc($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } @$mail->send(); $data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功发布!')); $this->jsonexit($data); return true; } } else if ($row['id']==-1 || $row['id']==0 || $row['id']==1) //取消发布的数据,初始状态,已接收 { //同步元数据 $iso=new ISO19115(); $iso->saveDB($this->db,$row['xml']); //email to admin $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"version-commit-admin",array( 'user' => $user->username, 'uuid' => $row['uuid'], 'email'=> $user->email, //元数据标题 'title'=> $row['title'], 'changelog'=>$changelog, )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } $mail->send(); unset($mail); unset($mailtp); //email to author $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"version-commit-author",array( 'user' => $user->username, 'uuid' => $row['uuid'], 'email'=> $user->email, //元数据标题 'title'=> $row['title'], )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($user->email); $mail->addCc($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } @$mail->send(); $data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功提交并同步,请等待数据中心进一步处理!')); $this->jsonexit($data); return true; } else if ($row['id']==2 || $row['id']==3 || $row['id']==4)//已发送过外审邮件,需由编辑告知变化信息 { //email to admin $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"version-commit-admin",array( 'user' => $user->username, 'uuid' => $row['uuid'], 'email'=> $user->email, //元数据标题 'title'=> $row['title'], 'changelog'=>$changelog, )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } $mail->send(); unset($mail); unset($mailtp); //email to author $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"version-commit-author",array( 'user' => $user->username, 'uuid' => $row['uuid'], 'email'=> $user->email, //元数据标题 'title'=> $row['title'], )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($user->email); $mail->addCc($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } @$mail->send(); //email to experts, sync to database? //todo!!! //should generate new pdf? or user could not commit a new version when it is in the reviewing process? /* unset($mail); unset($mailtp); $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"version-commit-expert",array( 'user' => $user->username, 'uuid' => $row['uuid'], 'email'=> $user->email, //元数据标题 'title'=> $row['title'], )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($user->email); $mail->addCc($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } @$mail->send(); */ $data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功提交,请等待数据中心进一步处理!')); $this->jsonexit($data); return true; } else if ($row['id']>=5)//数据已经发布,再次修改后将只通知管理员,保留发布状态 { //同步元数据 $iso=new ISO19115(); $iso->saveDB($this->db,$row['xml']); //移除中间版本 $sql="delete from mdversion where uuid in (select uuid from mdversion where v.id=?) and char_length(changelog)<3"; $this->db->query($sql,array($id)); //email to admin & author $mail=new WestdcMailer($this->view->config->smtp); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mailtp=new EmailText($this->db,"metadata-release",array( 'user' => $user->username, 'uuid' => $row['uuid'], 'email'=> $user->email, //元数据标题 'title'=> $row['title'], 'changelog'=>$changelog, )); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); if($this->debug==0) { $mail->addTo($this->view->config->service->email); $mail->addCc($this->view->config->service->email); }else{ $mail->addTo($this->debug_email); } @$mail->send(); $data = array("commited"=>1,"error"=>$this->alertbox('ok','该版本已经成功发布!')); $this->jsonexit($data); return true; } }catch(Exception $e) { $msg = "提交失败,请确认权限后重试"; if($this->debug>0) {$msg .= $e->getMessage();} $data = array("error"=>$this->alertbox('error',$msg)); $this->jsonexit($data); return true; } }//发布到评审 //与前一个版本对比 else if($ac == "diff") { $this->_helper->viewRenderer('version-diff'); $id = $this->_request->getParam('id'); if(empty($id) || !is_numeric($id)) { $this->view->error = "参数错误"; return true; } $sql = "SELECT v.uuid,md.title FROM mdversion v LEFT JOIN metadata md ON v.uuid=md.uuid WHERE v.id=?"; $sth = $this->db->prepare($sql); $sth -> execute(array($id)); $row = $sth->fetch(); $sql = "SELECT v.* FROM mdversion v WHERE v.uuid=? AND v.id<=? ORDER BY v.ts_created DESC LIMIT ?"; $sth = $this->db->prepare($sql); $sth -> execute(array($row['uuid'],$id,2)); $rows = $sth->fetchAll(); if(count($rows)<2) { $this->view->error = "对比失败:之前没有版本可以对比"; return true; } $this->view->info = $row; $this->view->data = $rows; } }//versionAction 版本控制 /* authorAction() 数据作者 */ public function authorAction(){ $ac = $this->_getParam('ac'); if(empty($ac)) { $keywords = $this->_request->getParam('q'); if(!empty($keywords)) $this->view->q = $keywords; $sql = "select md.id,md.title,md.uuid,count(a.userid) as c from metadata md LEFT JOIN mdauthor a ON md.uuid=a.uuid "; if(!empty($keywords)) { $search=new Search($keywords); $where=$search->sql_expr(array("md.title")); $sql.=' and '.$where; } $sql .= "GROUP by md.id,md.title,md.uuid,md.ts_created ORDER BY c DESC,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(15); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; }//列表 if($ac == 'add') { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $username = $this->_getParam('username'); $uuid = $this->_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)) { $data = array("error"=>"uuid参数错误"); $this->jsonexit($data); return true; } if(empty($username)) { $data = array("error"=>'请输入要添加为该数据作者的用户名'); $this->jsonexit($data); return true; } $sql = "SELECT * FROM users WHERE username=?"; $sth = $this->db->prepare($sql); $sth->execute(array($username)); $row = $sth->fetch(); if(empty($row['id']) || !isset($row['id'])) { $data = array("error"=>'您输入的用户名无任何对应用户'); $this->jsonexit($data); return true; } $uid = $row['id']; $sql = "SELECT * FROM mdauthor WHERE userid=? AND uuid=?"; $sth = $this->db->prepare($sql); $sth->execute(array($row['id'],$uuid)); $row = $sth->fetch(); if(!empty($row['id']) && $row['status']==1) { $data = array("error"=>'该用户已经是此数据的作者'); $this->jsonexit($data); return true; } if(!empty($row['id']) && in_array($row['status'],array(0,-1)) ) { $sql = "UPDATE mdauthor SET status=1 WHERE uuid=? AND userid=?"; $sth = $this->db->prepare($sql); $ds = $sth->execute(array($uuid,$uid)); if($ds) { $data = array("msg"=>'该用户已被提升为数据作者','added'=>1); $this->jsonexit($data); return true; }else{ $data = array("error"=>'处理中出现错误'); $this->jsonexit($data); return true; } } if(empty($row['id'])) { $sql = "INSERT INTO mdauthor (uuid,userid,status) VALUES (?,?,?)"; $sth = $this->db->prepare($sql); $ds = $sth->execute(array($uuid,$uid,1)); if($ds) { $data = array("msg"=>'该用户已被添加为数据作者','added'=>1); $this->jsonexit($data); return true; }else{ $data = array("error"=>"处理中出现错误"); $this->jsonexit($data); return true; } } $data = array("error"=>"处理中出现错误"); $this->jsonexit($data); return true; }//ajax 添加作者 if($ac == "edit") { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer('author-edit'); }// 作者管理弹窗 }//authorAction() 数据作者管理 /* 获得单个文件的信息 return array row */ public function getFileinfo($id){ $sql = "select * from attachments where id='$id'"; $re= $this->db->query($sql); $row= $re->fetch(); return $row; } /* * 保存XML数据到数据库 */ private function import($xml) { $iso=new ISO19115(); $iso->saveDB($this->db,$xml); } /* * jsonexit() 退出并返回json数据 * * param array $data 要返回的JSON数据,可以是任意数组 * * return JSON-response */ public function jsonexit($data){ $this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($data,JSON_NUMERIC_CHECK)); return true; }//jsonexit() 退出并返回json数据 }