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,(select count(uuid) as watergncount from watergn where schemaid='iso19115') as t3"; $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=$this->_request->getParam('uuid'); if ($this->_request->isPost()) $uuid=$this->_request->getPost('uuid'); //$uuid=$this->_request->getParam('uuid'); if ($source=="geonetwork" && empty($uuid) ) { //从geonetwork向WESTDC同步 $sql="select uuid,data 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='0595169a-279e-4b95-819f-129d0ba4280d'"; $this->db->query($sql); $sql="delete from responsible where id not in (select distinct(resid) from role)"; $this->db->query($sql); //同步黑河遥感实验的元数据 $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 (!empty($uuid) && isset($_POST['submit'])) { //同步单条元数据 $sql=$this->db->quoteInto("select data from geonetworkmetadata where uuid=?",$uuid); if ($rs=$this->db->fetchRow($sql)) { $this->import($rs->data); $this->view->msg='成功同步元数据:'.$uuid; } else $this->view->msg='不存在此元数据:'.$uuid; } elseif (!empty($uuid) && isset($_POST['watersubmit'])) { //同步单条元数据 $sql=$this->db->quoteInto("select data from watergn where uuid=?",$uuid); if ($rs=$this->db->fetchRow($sql)) { $this->import($rs->data); $this->view->msg='成功同步元数据:'.$uuid; } else $this->view->msg='不存在此元数据:'.$uuid; } elseif ($list=='water') { $sql="select uuid,title 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->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=='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 where usertype='administrator'"; $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='$row->password',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','$row->password','$row->email')"; $this->db->query($sql); } } $this->view->msg='已成功同步管理员帐号!'; } } //离线数据申请管理 function offlineappAction() { $view=(int)$this->_getParam('view'); $start=(int)$this->_getParam('start'); $finish=(int)$this->_getParam('finish'); $cancel=(int)$this->_getParam('cancel'); if ($view) { //查看此次申请的具体内容,包括指向的地址 } elseif ($start) { $sql="update dataorder set status=4 where status=3 and userid=?"; $this->db->query($sql,array($start)); //提示信息 $this->messenger->addMessage('提示信息:该离线数据已经开始处理,请在处理完成后点击“完成”。'); $this->_redirect('/admin/data/offlineapp'); } elseif ($finish) { try { $sql="update dataorder set status=5,ts_approved=now() where status=4 and userid=?"; $this->db->query($sql,array($finish)); $sql="update offlineapp set ts_approved=now() where userid=? and ts_approved is null"; $this->db->query($sql,array($finish)); $this->messenger->addMessage('提示信息:该离线数据已经处理完成。'); } catch (Exception $e) { //提示信息 $this->messenger->addMessage($e->getMessage()); $this->messenger->addMessage('提示信息:该数据有可能还没有开始处理,请先开始。'); } $this->_redirect('/admin/data/offlineapp'); } elseif ($cancel) { //取消=删除? //需谨慎操作 $sql="update dataorder set status=-1 where (status=3 or status=4) and userid=?"; $this->db->query($sql,array($cancel)); $sql="delete from offlineapp where id=?"; $this->db->query($sql,array($cancel)); $this->messenger->addMessage('提示信息:已取消该用户离线申请。'); $this->_redirect('/admin/data/offlineapp'); } $select=$this->db->select(); $select->from('offlineapp')->where('ts_approved is null')->where('pdflink is not null')->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 offlineAction() { $add=(int)$this->_getParam('add'); $edit=(int)$this->_getParam('edit'); $delete=(int)$this->_getParam('delete'); $down=(int)$this->_getParam('down'); if ($add) { $form=new OfflinelogForm(); $form->pdf->setDestination($this->view->config->offline->savepath); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $uploadedData = $form->getValues(); $pdf = basename($form->pdf->getFileName()); $sql="insert into offlineapp (username,email,unit,phone,address,postcode,project,pdflink,datalist,ts_created,ts_approved) values(?,?,?,?,?,?,?,?,?,?,now())"; $this->db->query($sql,array($formdata['username'],$formdata['email'],$formdata['unit'],$formdata['phone'],$formdata['address'],$formdata['postcode'],$formdata['project'],$pdf,$formdata['datalist'],$formdata['ts_approved'])); $this->messenger->addMessage('提示信息:您已经成功添加该离线服务记录。'); $this->_redirect('/admin/data/offline'); } else { $form->populate($formdata); } } $this->view->form=$form; $this->_helper->viewRenderer('offlineadd'); } elseif ($edit){ $form=new OfflinelogForm(); $form->pdf->setRequired(false); if ($this->_request->isPost()) { $formdata=$this->_request->getPost(); if ($form->isValid($formdata)) { $uploadedData = $form->getValues(); $pdf = basename($form->pdf->getFileName()); $sql="update offlineapp set username=?,email=?,unit=?,phone=?,address=?,postcode=?,project=?,"; if ($form->pdf->isUploaded()) $sql.="pdflink=?,"; $sql.="datalist=?,ts_approved=? where id=?"; $param=array($formdata['username'],$formdata['email'],$formdata['unit'],$formdata['phone'],$formdata['address'],$formdata['postcode'],$formdata['project']); if ($form->pdf->isUploaded()) $param[]=$pdf; $param[]=$formdata['datalist']; $param[]=$formdata['ts_approved']; $param[]=$edit; $this->db->query($sql,$param); $this->messenger->addMessage('提示信息:您已经编辑添加该记录。'); $this->_redirect('/admin/data/offline'); } else { $form->populate($formdata); } } else { $sql="select * from offlineapp where id=?"; $formdata=$this->db->fetchRow($sql,array($edit)); $form->submit->setLabel('保存'); $form->populate($formdata); } $this->view->form=$form; $this->_helper->viewRenderer('offlineadd'); } elseif ($delete) { $sql="delete from offlineapp where id=?"; try { $this->db->query($sql,array($delete)); $this->messenger->addMessage('提示信息:您已经成功删除该服务记录。'); } catch (Exception $e) { $this->messenger->addMessage($e->getMessage()); } $this->_redirect("/admin/data/offline"); } elseif ($down) { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $sql="select * from offlineapp where ts_approved is not null and pdflink is not null order by ts_created desc"; $rows=$this->db->fetchAll($sql); foreach($rows as $row){ $content.='"'.$row['username'].'","'.$row['unit'].'","'.$row['phone'].'","'.$row['address'].'","'.$row['postcoe'].'","'.$row['project'].'","'.$row['datalist'].'","'.$row['email'].'",'.$row['ts_approved']."\n"; } $this->getResponse()->setHeader('Content-Type', 'application/octet-stream') ->setHeader('Content-Disposition','attachment; filename="offlineapp.csv"') ->setHeader('Content-Length', strlen($content)) ->setHeader('Content-Type','application/force-download') ->setHeader('Content-Type','application/download') ->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); } $select=$this->db->select(); $select->from('offlineapp')->where('ts_approved is not null')->where('pdflink is not null')->order('ts_created 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 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'); 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 ($down) { $zip = new ZipArchive(); $url="/tmp/xml.zip"; $opened=$zip->open($url, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if( $opened !== true ){ die("cannot open {$url} for writing."); } $dirName = '../data/import/'; $zip->addEmptyDir("xml/"); $filesToAdd = array(); $dir = dir($dirName); while (false !== ($node = $dir->read())) { if (($node == '..') || ($node == '.')) { continue; } if (is_file($dirName.$node)) { $zip->addFile($dirName.$node,"xml/".$node); } } $zip->close(); $content=file_get_contents($url); $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $this->getResponse()->setHeader('Content-Type', 'application/octet-stream') ->setHeader('Content-Disposition','attachment; filename="'.basename($url).'"') ->setHeader('Content-Length', strlen($content)) ->setHeader('Content-Type','application/force-download') ->setHeader('Content-Type','application/download') ->setHeader('Content-Type','application/zip') ->setHeader('Content-Description','File Transfer') ->setHeader('Content-Transfer-Encoding','binary') ->setHeader('Expires',0) ->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0') ->setHeader('Pragma','public') ->setBody($content); } $select=$this->db->select(); $select->from('metadata') ->joinLeft('mdstat','metadata.uuid=mdstat.uuid','viewed') ->joinLeft('geonetworkmetadata','geonetworkmetadata.uuid=metadata.uuid','id as gid') ->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'); 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) values(?,?)"; $this->db->query($sql,array(trim($formdata['uuid']),$row['id'])); $this->messenger->addMessage('提示信息:您已经成功添加该数据文献。'); $this->_redirect('/admin/data/reference'); }else { $form->populate($formdata); } } else { if ($uuid) { $formdata['uuid']=$uuid; $form->populate($formdata); } } $this->view->form=$form; $this->_helper->viewRenderer('referenceadd'); } elseif ($edit){ $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->query($sql,array($formdata['reference'])); if ($row) { //更新文献信息 $sql="update reference set reference=?,link=? where id=?"; $param=array($formdata['reference'],$formdata['link'],$edit); $this->db->query($sql,$param); } else { //更新文献链接表 $sql="update mdref set refid=? where uuid=? and refid=?"; $this->db->query($sql,array($row['id'],$formdata['uuid'],$edit)); } $this->messenger->addMessage('提示信息:您已经编辑该数据文献。'); $this->_redirect('/admin/data/reference'); } else { $form->populate($formdata); } } else { $sql="select * from reference r left join mdref m on r.id=m.refid where r.id=?"; $formdata=$this->db->fetchRow($sql,array($edit)); $form->populate($formdata); } $this->view->form=$form; $this->_helper->viewRenderer('referenceadd'); } elseif ($delete) { $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"); } $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('/metadata'); } 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'); } } /* * 保存XML数据到数据库 */ private function import($xml) { $iso=new ISO19115(); $iso->loadXML($xml); $md=new MetadataTable(); $thumb=new ThumbnailTable(); $xmlt=new XmlTable(); $cgt=new CategoryTable(); $cgct=new CategoryCodeTable(); $keyt=new KeywordTable(); $dst=new DatasetSeriesTable(); $seriestable=new SeriesTable(); $db=$seriestable->getAdapter(); //save metadata //先删除已有元数据,然后再插入新数据 $sql="delete from metadata where uuid=?"; $this->db->query($sql,array($iso->uuid)); //删除所有未用到的responsible数据 $sql="delete from responsible where id not in (select distinct(resid) from role)"; $this->db->query($sql); $row=$md->createRow(); $trow=$thumb->createRow(); $row->uuid=$iso->uuid; $row->title=$iso->resTitle; $row->title_en=$iso->resAltTitle; $row->description=$iso->idAbs; $row->citation=$iso->citation; $row->suppinfo=$iso->suppinfo; $row->fileformat=$iso->fileformat; $row->projection=$iso->projection; //$row->author=$iso->author; $row->datatype=$iso->datatype; $row->filesize=$iso->filesize; $row->ts_created=$iso->mdDateSt; $row->timebegin=$iso->timebegin; $row->timeend=$iso->timeend; $row->west=$iso->geoBox['w']; $row->south=$iso->geoBox['s']; $row->north=$iso->geoBox['n']; $row->east=$iso->geoBox['e']; if (!empty($iso->doi)) $row->doi=$iso->doi; //生成空白统计数据 $sql=$db->quoteInto("select * from mdstat where uuid=?",$iso->uuid); if (!$db->fetchRow($sql)) { $sql="insert into mdstat (uuid) values(?)"; $db->query($sql,array($iso->uuid)); } try { $id=$row->save(); //处理在线资源 if ($iso->onlineresource) foreach($iso->onlineresource as $resource) { $sql="insert into onlineresource (uuid,linkage,protocol,name,description) values(?,?,?,?,?)"; $db->query($sql,array($iso->uuid,$resource['linkage'],$resource['protocol'],$resource['name'],$resource['description'])); } //处理缩略图 if (!empty($iso->thumbnail)) { $trow->id=$id; $trow->data=$iso->thumbnail; $trow->filetype='jpg'; $trow->save(); } elseif ($iso->graph) { $trow->id=$id; //$trow->data=$iso->graph['data']; $sql="select id as gid from geonetworkmetadata where uuid=?"; $r=$this->db->fetchRow($sql,array($iso->uuid)); if ($r) { $trow->data=base64_encode(file_get_contents($this->view->config->geonetwork->url.'srv/cn/resources.get?access=public&id='.$r->gid.'&fname='.urlencode($iso->graph['filename']))); } $trow->filetype=$iso->graph['filetype']; $trow->filedesc=$iso->graph['filedesc']; $trow->filename=$iso->graph['filename']; $trow->save(); } //todo:处理关键词 //1:N relation foreach($iso->keyword as $keytype=>$keys) { foreach($keys as $key) { $row=$keyt->createRow(); $row->id=$id; //统一转换为大写 //不再统一转换 $row->keyword=$key; $row->keytype=$keytype; $row->save(); } } //todo:处理数据集序列 //M:N relation if ($iso->datasetSeries) foreach($iso->datasetSeries as $ds) { $where=$db->quoteInto('name = ?',$ds['seriesName']); $trow=$seriestable->fetchRow($where); if ($trow) $sid=$trow->id; else { $trow=$seriestable->createRow(); $trow->name=$ds['seriesName']; $sid=$trow->save(); } $row=$dst->createRow(); $row->id=$id; $row->sid=$sid; $row->save(); } //处理XML入库 $row=$xmlt->createRow(); $row->id=$id; $row->data=$xml; $row->save(); //处理数据分类 foreach($iso->tpCat as $cat){ if (is_numeric($cat)) { $row=$cgt->createRow(); $row->id=$id; $row->code=(int)$cat; $row->save(); } else { //是字符串,geonetwork会采用这种模式 //从categorycode表中查找其对应的code $where=$db->quoteInto('name= ?',trim($cat)); $trow=$cgct->fetchRow($where); if ($trow) { $row=$cgt->createRow(); $row->id=$id; $row->code=$trow->code; $row->save(); } //$db=$cgt->getAdapter(); //$sql="insert into category (id,code) values($id,(select code from categorycode where name='$cat'))"; //$db->query($sql); } } //处理联系人信息 //先查询再进行处理 //若用户信息发生变化,则存在问题 //无法保证数据的更新状态 foreach($iso->author as $au) { $inds=explode(",",$au['individual']); foreach($inds as $ind) { $sql="select id from responsible where individual=? and organisation=?"; $row=$this->db->fetchRow($sql,array(trim($ind),trim($au['organisation']))); if (!$row) { $sql="insert into responsible (individual,organisation,position,delivery,phone,email,city,country,administrative,postal) values(?,?,?,?,?,?,?,?,?,?)"; $this->db->query($sql,array(trim($ind),trim($au['organisation']),trim($au['position']),trim($au['delivery']),trim($au['phone']),trim($au['email']),trim($au['city']),trim($au['country']),trim($au['administrative']),trim($au['postal']))); } elseif (count($inds)==1) { //deal email address if (($au['email']) && empty($row->email)) { $sql="update responsible set email=? where id=?"; $this->db->query($sql,array(trim($au['email']),$row->id)); } } $sql="select id from responsible where individual=? and organisation=?"; $row=$this->db->fetchRow($sql,array(trim($ind),trim($au['organisation']))); if ($row->id>0) { $sql="insert into role (resid,uuid,role) values(?,?,?)"; $this->db->query($sql,array($row->id,$iso->uuid,trim($au['role']))); } } } //处理数据限制信息 foreach($iso->limits as $uselimit) { $sql="select id from uselimit where uselimit=?"; $row=$this->db->fetchRow($sql,array($uselimit)); if (!$row) { $sql="insert into uselimit (uselimit) values (?)"; $this->db->query($sql,array($uselimit)); } $sql="select id from uselimit where uselimit=?"; $row=$this->db->fetchRow($sql,array($uselimit)); if ($row) { $sql="insert into mdlimit (uuid,lid) values(?,?)"; $this->db->query($sql,array($iso->uuid,$row->id)); } } $iso->save("../data/import/$iso->uuid.xml"); } catch (Exception $e) { //数据重复插入,此处忽略所有错误 print $iso->uuid.' has error: '.$e->getMessage().'
'; } } }