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() { $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'); $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->view->msg='成功同步元数据!'; } elseif (!empty($uuid)) { //同步单条元数据 $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 ($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 ($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 ($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 d set d.status=4 where d.status=3 and d.userid=?"; $this->db->query($sql,array($start)); //提示信息 $this->messenger->addMessage('提示信息:该离线数据已经开始处理,请在处理完成后点击“完成”。'); $this->_redirect('/admin/data/offline'); } elseif ($finish) { $sql="begin;update dataorder d set d.status=5,d.ts_approved=now() where d.status=4 and d.userid=?;"; $sql.="update offlineapp set ts_approved=now() where userid=? and ts_approved is null;commit;"; try { $this->db->query($sql,array($finish,$finish)); $this->messenger->addMessage('提示信息:该离线数据已经开始处理,请在处理完成后点击“完成”。'); } catch (Exception $e) { //提示信息 $this->messenger->addMessage($e->getMessage()); $this->messenger->addMessage('提示信息:该数据有可能还没有开始处理,请先开始。'); } $this->_redirect('/admin/data/offline'); } elseif ($cancel) { //取消=删除? //需谨慎操作 $sql="begin;update dataorder d set d.status=-1 where (d.status=3 or d.status=4) and d.userid=?;"; $sql.="delete from offlineapp where id=?;commit;"; //todo: 此处有问题,暂时跳过 } $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'); 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_approved) values(?,?,?,?,?,?,?,?,?,?)"; $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"); } $select=$this->db->select(); $select->from('offlineapp')->where('ts_approved is not 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 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,url,img,document,descript) values(?,?,?,?,?,?)"; $this->db->query($sql,array($formdata['title'],$formdata['size'],$formdata['url'],$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=?,url=?,"; if ($form->img->isUploaded()) $sql.="img=?,"; if ($form->document->isUploaded()) $sql.="document=?,"; $sql.="descript=? where id=?"; $param=array($formdata['title'],$formdata['size'],$formdata['url']); 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'); 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"); } $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=$form->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 datasetcd set title=?,detailurl=?,imgurl=?,descrition=? where id=?"; $param=array($formdata['title'],$formdata['detailurl'],$formdata['imgurl'],$formdata['descript'],$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 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)); $row=$md->createRow(); $trow=$thumb->createRow(); $row->uuid=$iso->uuid; $row->title=$iso->resTitle; $row->description=$iso->idAbs; $row->citation=$iso->citation; $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']; //生成空白统计数据 $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']; $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=strtoupper($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); } } $iso->save("../data/import/$iso->uuid.xml"); } catch (Exception $e) { //数据重复插入,此处忽略所有错误 } } }