westdc-zf1/application/admin/controllers/DataController.php

893 lines
35 KiB
PHP
Raw Normal View History

2009-03-06 03:20:46 +00:00
<?php
class Admin_DataController extends Zend_Controller_Action
{
function preDispatch()
{
$this->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();
2009-03-06 03:20:46 +00:00
}
function indexAction()
{
//其他连接
}
//提供和GEONETWORK中的元数据的同步功能
//提供双向同步功能但只处理ISO 19115格式的元数据
function syncAction()
{
2010-07-01 09:55:10 +00:00
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";
2009-03-06 03:20:46 +00:00
$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');
2009-03-06 03:20:46 +00:00
$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);
2010-06-22 06:42:15 +00:00
$this->db->query("update metadata set source=? where uuid=?",array($gmd->source,$gmd->uuid));
2009-03-06 03:20:46 +00:00
}
$this->view->msg='成功同步元数据!';
2009-06-26 08:35:39 +00:00
} 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);
//同步黑河遥感实验的元数据
2010-06-22 06:42:15 +00:00
$sql="select uuid,data,source from watergn where schemaid='iso19115'";
$rs=$this->db->fetchAll($sql);
foreach($rs as $gmd) {
2010-06-22 06:42:15 +00:00
$this->import($gmd->data);
$this->db->query("update metadata set source=? where uuid=?",array($gmd->source,$gmd->uuid));
}
$this->view->msg='成功同步黑河遥感综合实验元数据!';
2010-07-04 11:00:26 +00:00
} elseif (!empty($uuid) && isset($_POST['submit'])) {
2009-03-06 03:20:46 +00:00
//同步单条元数据
$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;
2010-07-04 11:00:26 +00:00
} 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);
2009-03-06 03:20:46 +00:00
} 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中多出的元数据';
2009-03-06 03:20:46 +00:00
} 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);
2009-03-06 03:20:46 +00:00
foreach($rows as $row) {
2009-12-22 11:18:24 +00:00
$data=file_get_contents($this->view->config->watergeonetwork->url.'srv/cn/resources.get?access=public&id='.$row->gid.'&fname='.urlencode($row->filename));
2009-03-06 03:20:46 +00:00
$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) {
2009-03-20 07:42:52 +00:00
$sql="update geonetworkusers set username='$row->username',password='$row->password',email='$row->email' where id=$row->id";
$this->db->query($sql);
} else {
2009-03-20 07:42:52 +00:00
$sql="insert into geonetworkusers (id,username,password,email) values($row->id,'$row->username','$row->password','$row->email')";
$this->db->query($sql);
}
}
$this->view->msg='已成功同步管理员帐号!';
}
2009-03-06 03:20:46 +00:00
}
//离线数据申请管理
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) {
2009-04-16 08:34:21 +00:00
$sql="update dataorder set status=4 where status=3 and userid=?";
2009-03-06 03:20:46 +00:00
$this->db->query($sql,array($start));
//提示信息
$this->messenger->addMessage('提示信息:该离线数据已经开始处理,请在处理完成后点击“完成”。');
$this->_redirect('/admin/data/offlineapp');
2009-03-06 03:20:46 +00:00
} 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));
2009-04-16 08:41:14 +00:00
$this->messenger->addMessage('提示信息:该离线数据已经处理完成。');
2009-03-06 03:20:46 +00:00
} catch (Exception $e) {
//提示信息
$this->messenger->addMessage($e->getMessage());
$this->messenger->addMessage('提示信息:该数据有可能还没有开始处理,请先开始。');
}
$this->_redirect('/admin/data/offlineapp');
2009-03-06 03:20:46 +00:00
} 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');
}
2009-03-06 03:20:46 +00:00
$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);
}
2009-03-06 03:20:46 +00:00
$select=$this->db->select();
$select->from('offlineapp')->where('ts_approved is not null')->where('pdflink is not null')->order('ts_created desc');
2009-03-06 03:20:46 +00:00
$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']));
2009-03-06 03:20:46 +00:00
$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=?,";
2009-03-06 03:20:46 +00:00
if ($form->img->isUploaded()) $sql.="img=?,";
if ($form->document->isUploaded()) $sql.="document=?,";
$sql.="descript=? where id=?";
$param=array($formdata['title'],$formdata['size'],$formdata['uuid']);
2009-03-06 03:20:46 +00:00
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');
2009-03-06 03:20:46 +00:00
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);
2009-03-06 03:20:46 +00:00
}
$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.uuid 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'];
2009-03-06 03:20:46 +00:00
$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);
2009-03-06 03:20:46 +00:00
$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']));
2010-06-30 14:04:58 +00:00
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;
}
2009-03-06 03:20:46 +00:00
/*
* 删除元数据,删除前有确认
*/
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);
2009-03-06 03:20:46 +00:00
$row=$md->createRow();
$trow=$thumb->createRow();
$row->uuid=$iso->uuid;
$row->title=$iso->resTitle;
2010-01-06 02:09:46 +00:00
$row->title_en=$iso->resAltTitle;
2009-03-06 03:20:46 +00:00
$row->description=$iso->idAbs;
$row->citation=$iso->citation;
$row->suppinfo=$iso->suppinfo;
2009-03-06 03:20:46 +00:00
$row->fileformat=$iso->fileformat;
$row->projection=$iso->projection;
//$row->author=$iso->author;
2009-03-06 03:20:46 +00:00
$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'];
2010-07-01 10:40:44 +00:00
if (!empty($iso->doi)) $row->doi=$iso->doi;
2009-03-06 03:20:46 +00:00
//生成空白统计数据
$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)
{
2010-01-07 10:24:23 +00:00
$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'])));
}
2009-03-06 03:20:46 +00:00
$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;
2009-03-06 03:20:46 +00:00
$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));
}
}
2009-03-06 03:20:46 +00:00
$iso->save("../data/import/$iso->uuid.xml");
} catch (Exception $e) {
//数据重复插入,此处忽略所有错误
2010-01-07 10:24:23 +00:00
print $iso->uuid.' has error: '.$e->getMessage().'<br />';
2009-03-06 03:20:46 +00:00
}
}
}