762 lines
32 KiB
PHP
762 lines
32 KiB
PHP
<?php
|
||
class ServiceController extends Zend_Controller_Action
|
||
{
|
||
private $limit=10;
|
||
function __call($id, $arguments)
|
||
{
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$this->_helper->layout->disableLayout();
|
||
}
|
||
|
||
function preDispatch()
|
||
{
|
||
$this->db=Zend_Registry::get('db');
|
||
$this->config = Zend_Registry::get('config');
|
||
$this->messenger=$this->_helper->getHelper('FlashMessenger');
|
||
$this->view->messages = $this->messenger->getMessages();
|
||
}
|
||
|
||
/*
|
||
* 返回XML源文件
|
||
*/
|
||
function xmlAction()
|
||
{
|
||
$uuid=$this->_request->getParam('uuid');
|
||
$row=$this->db->fetchRow("select xml.data from xml left join metadata on xml.id=metadata.id where metadata.uuid=?",array($uuid));
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$this->getResponse()->setHeader('Content-Type', 'text/xml')
|
||
->setBody($row['data']);
|
||
}
|
||
/*
|
||
* 查看数据缩略图
|
||
*/
|
||
function thumbAction()
|
||
{
|
||
$id = (int)$this->_request->getParam('id');
|
||
if (empty($id)) {
|
||
$uuid = $this->_request->getParam('uuid');
|
||
if (empty($uuid)) $this->_redirect('/data');
|
||
$where=$this->db->quoteInto('m.uuid = ?',$uuid);
|
||
} else {
|
||
$where=$this->db->quoteInto('m.id = ?',$id);
|
||
}
|
||
$sql="select t.* from thumbnail t left join metadata m on t.id=m.id where ".$where;
|
||
$thumb=$this->db->fetchRow($sql);
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
if (empty($thumb['data'])) {
|
||
header("Content-Type:image/png");
|
||
header("Content-Length: " . filesize("images/nothumb.png"));
|
||
$file=fopen("images/nothumb.png",'r');
|
||
fpassthru($file);
|
||
exit;
|
||
} else {
|
||
header("Content-Type:image/".$thumb['filetype']);
|
||
print base64_decode($thumb['data']);
|
||
}
|
||
}
|
||
|
||
/*
|
||
* 查看数据缩略大图
|
||
*/
|
||
function bigthumbAction()
|
||
{
|
||
$id = (int)$this->_request->getParam('id');
|
||
if (empty($id)) {
|
||
$uuid = $this->_request->getParam('uuid');
|
||
if (empty($uuid)) $this->_redirect('/data');
|
||
$where=$this->db->quoteInto('m.uuid = ?',$uuid);
|
||
} else {
|
||
$where=$this->db->quoteInto('m.id = ?',$id);
|
||
}
|
||
$sql="select g.id as gid,t.filename,t.filetype from geonetworkmetadata g left join metadata m on g.uuid=m.uuid left join thumbnail t on t.id=m.id where ".$where;
|
||
$thumb=$this->db->fetchRow($sql);
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
if (empty($thumb['filename'])) {
|
||
header("Content-Type:image/png");
|
||
header("Content-Length: " . filesize("images/nothumb.png"));
|
||
$file=fopen("images/nothumb.png",'r');
|
||
fpassthru($file);
|
||
exit;
|
||
} else {
|
||
$url=$this->config->bigthumb->path.sprintf('%05d',floor(($thumb['gid']+0.1)/100)*100).'-'.sprintf('%05d',ceil(($thumb['gid']+0.1)/100)*100-1)."/".$thumb['gid'];
|
||
$url.='/public/'.str_replace('_s.','.',$thumb['filename']);
|
||
header("Content-Type:image/".$thumb['filetype']);
|
||
$file=fopen($url,'r');
|
||
fpassthru($file);
|
||
exit;
|
||
}
|
||
}
|
||
/*
|
||
* 搜索, no page, json output
|
||
*/
|
||
function searchAction()
|
||
{
|
||
$this->view->addHelperPath('helper','Zend_View_Helper_');
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
//$page=(int)$this->_request->getParam('page');
|
||
//if (empty($page)) $page=1;
|
||
//$offset=$this->limit*($page-1);
|
||
$key=$this->_request->getParam('q');
|
||
$n=(int)$this->_request->getParam('n');
|
||
$s=(int)$this->_request->getParam('s');
|
||
$e=(int)$this->_request->getParam('e');
|
||
$w=(int)$this->_request->getParam('w');
|
||
if (!(empty($n) && empty($key))) {
|
||
if (empty($n)) $n=90;
|
||
if (empty($s)) $s=-90;
|
||
if (empty($e)) $e=180;
|
||
if (empty($w)) $w=-180;
|
||
//$start=$this->_request->getParam('start');
|
||
//$end=$this->_request->getParam('end');
|
||
$sql="select id,title,uuid,description,filesize,fileformat from metadata where east<? and west>? and north<? and south>?";
|
||
if (!empty($key)) {
|
||
$sql.= " and (title ilike ? or description ilike ?)";
|
||
$sql.= " order by title";
|
||
$rows=$this->db->fetchAll($sql,array($e,$w,$n,$s,'%'.$key.'%','%'.$key.'%'));
|
||
} else {
|
||
$sql.= " order by title";
|
||
$rows=$this->db->fetchAll($sql,array($e,$w,$n,$s));
|
||
}
|
||
$this->_helper->json($rows);
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
* 产生geojson数据
|
||
*/
|
||
function jsonAction()
|
||
{
|
||
$md=new MetadataTable();
|
||
$db=$md->getAdapter();
|
||
$id = (int)$this->_request->getParam('id');
|
||
$where='';
|
||
if (!empty($id)) { $where=' where id='.$id; }
|
||
$sql='select id,uuid,west,south,north,east,title from metadata'.$where;
|
||
$state=$db->query($sql);
|
||
$rows=$state->fetchAll();
|
||
$geomd=new GeoMetaData();
|
||
foreach($rows as $row){
|
||
if ($id)
|
||
$box=new GeoBox($row['west'],$row['south'],$row['east'],$row['north']);
|
||
else
|
||
$box=new GeoBoxLine($row['west'],$row['south'],$row['east'],$row['north']);
|
||
$feature=new Geofeature();
|
||
$feature->id=$row['id'];
|
||
$feature->addProperties('title',$row['title']);
|
||
$feature->addProperties('uuid',$row['uuid']);
|
||
$feature->addProperties('id',$row['id']);
|
||
$feature->geometry=$box;
|
||
$geomd->addFeature($feature);
|
||
}
|
||
$this->_helper->json($geomd);
|
||
}
|
||
|
||
function detailAction()
|
||
{
|
||
$id=(int)$this->_request->getParam('id');
|
||
$xml=new XmlTable();
|
||
$db=$xml->getAdapter();
|
||
$where=$db->quoteInto('id=?',$id);
|
||
$order='id desc';
|
||
$row=$xml->fetchRow($where,$order);
|
||
// Load the XML source
|
||
$xml = new DOMDocument;
|
||
$xml->loadXML($row->data);
|
||
$xsl = new DOMDocument;
|
||
$xsl->load($this->config->westdc->xsl);
|
||
// Configure the transformer
|
||
$proc = new XSLTProcessor;
|
||
$proc->importStyleSheet($xsl); // attach the xsl rules
|
||
$this->view->xml=$proc->transformToXML($xml);
|
||
//$this->_helper->layout->disableLayout();
|
||
//$this->_helper->viewRenderer->setNoRender();
|
||
//$this->getResponse()->setHeader('Content-Type', 'text/html')
|
||
// ->setBody($proc->transformToXML($xml));
|
||
}
|
||
function feedAction()
|
||
{
|
||
$feedArray = array(
|
||
'title' => '中国西部环境与生态科学数据中心',
|
||
'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/feed',
|
||
'description' => '共享西部计划产生的数据',
|
||
'language' => 'zh-CN',
|
||
'charset' => 'utf-8',
|
||
'published' => time(),
|
||
//'generator' => 'Zend Framework Zend_Feed',
|
||
'entries' => array()
|
||
);
|
||
$sql="select * from metadata order by ts_created desc";
|
||
$rs=$this->db->fetchAll($sql);
|
||
$feedArray['published']=strtotime($rs[0]['ts_created']);
|
||
foreach($rs as $r)
|
||
{
|
||
$feedArray['entries'][] = array(
|
||
'title' => $r['title'],
|
||
'link' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
|
||
'guid' => 'http://'.$_SERVER['SERVER_NAME'].'/data/' . $r['uuid'],
|
||
//'content'=>$r['description'],
|
||
'description' => $r['description'],
|
||
'lastUpdate' => strtotime($r['ts_created'])
|
||
);
|
||
}
|
||
$feed = Zend_Feed::importArray($feedArray,'rss');
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$feed->send();
|
||
}
|
||
|
||
public function pingbackAction()
|
||
{
|
||
$this->_helper->ViewRenderer->setNoRender();
|
||
$this->_helper->layout->disableLayout();
|
||
$server = new Zend_XmlRpc_Server();
|
||
$server->setClass('PingbackRpc', 'pingback');
|
||
echo $server->handle();
|
||
}
|
||
|
||
public function pingtestAction()
|
||
{
|
||
$this->_helper->ViewRenderer->setNoRender();
|
||
$this->_helper->layout->disableLayout();
|
||
$client = new Zend_XmlRpc_Client('http://test.westgis.ac.cn/data/pingback');
|
||
$arg1 = 'http://wlx.westgis.ac.cn/567/';
|
||
$arg2 = 'http://test.westgis.ac.cn/data/487591d0-d437-4114-b810-cbef7c4ee4b2';
|
||
//$result = $client->call('pingback.ping', array($arg1, $arg2));
|
||
$test = $client->getProxy('pingback');
|
||
$test->ping($arg1,$arg2);
|
||
//var_dump($result);
|
||
}
|
||
public function outputAction()
|
||
{
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$sql="select title,datatype,filesize,id from metadata";
|
||
$md=$this->db->fetchAll($sql);
|
||
foreach($md as $m)
|
||
{
|
||
print $m["title"].",";
|
||
print ($m["datatype"]?"内部":"公开").",";
|
||
print ($m["filesize"]==1?" ":$m["filesize"]).",";
|
||
$sql1="select keyword from keyword where id=".$m["id"]." and keytype='place'";
|
||
$kd=$this->db->fetchAll($sql1);
|
||
foreach ($kd as $p) print $p["keyword"]." ";
|
||
print ",";
|
||
$sql1="select keyword from keyword where id=".$m["id"]." and keytype='temporal'";
|
||
$kd=$this->db->fetchAll($sql1);
|
||
foreach ($kd as $p) print $p["keyword"]." ";
|
||
print ",";
|
||
print "<br>";
|
||
}
|
||
|
||
}
|
||
|
||
/*
|
||
* 转换元数据为WORD DOC格式
|
||
*/
|
||
public function docAction()
|
||
{
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$uuid=$this->_request->getParam('uuid');
|
||
$review=$this->_request->getParam('review');
|
||
if (!empty($uuid))
|
||
{
|
||
$sql="select x.data,m.title,m.description,g.id,m.projection from xml x left join metadata m on m.id=x.id left join geonetworkmetadata g on g.uuid=m.uuid where m.uuid=".$this->db->quote($uuid);
|
||
$row=$this->db->fetchRow($sql);
|
||
$sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=?";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$ref=$this->db->fetchAll($sql);
|
||
$reference='<ol>';
|
||
foreach($ref as $refer)
|
||
{
|
||
$reference.='<li>'.$refer['reference'].'</li>';
|
||
}
|
||
$reference.='</ol>';
|
||
if (is_numeric($row['projection']))
|
||
{
|
||
$sql="select proj4text from spatial_ref_sys where auth_srid=?";
|
||
$rs=$this->db->fetchRow($sql,array($row['projection']));
|
||
if ($rs) $projection=$rs['proj4text'];
|
||
}
|
||
if (empty($projection)) $projection=$row['projection'];
|
||
} else
|
||
$projection='';
|
||
|
||
$dom = new DOMDocument();
|
||
$dom->loadXML($row['data']);
|
||
//提前对表格进行预处理
|
||
$wiki=new WikiFormat();
|
||
$abs=$wiki->parseTable($this->view->escape($row["description"]));
|
||
//处理外部链接
|
||
$abs=preg_replace('/\[\s*(http:\/\/.+?)\s+(.*?)\]/m','<a href="$1">$2</a>',$abs);
|
||
$abs=str_replace(array("\r\n", "\n", "\r"),'</p><p>',$abs);
|
||
$abs=str_replace("'","'",$abs);//not needed?
|
||
$id = $row['id'];
|
||
$thumburl=sprintf('%05d',floor(($id+0.1)/100)*100).'-'.sprintf('%05d',ceil(($id+0.1)/100)*100-1)."/".$id;
|
||
$xslt = new XSLTProcessor();
|
||
$xslt->registerPHPFunctions();
|
||
$xslt->setParameter('', 'thumburl', $thumburl);
|
||
$xslt->setParameter('', 'abstract', $abs);
|
||
$xslt->setParameter('','projection',$projection);
|
||
$xslt->setParameter('','reference',$reference);
|
||
$XSL = new DOMDocument();
|
||
$XSL->load( '../data/doc.xsl', LIBXML_NOCDATA);
|
||
$xslt->importStylesheet($XSL);
|
||
$content='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
|
||
$content.='<title>'.$row['title'].'</title>';
|
||
$content.='<style>
|
||
body{MARGIN-RIGHT: auto;MARGIN-LEFT: auto;font-size:14px;line-height:22px;font-family:宋体,Arial;}
|
||
span{font-size:14px;}
|
||
div{clear: both;margin: 0 auto;width:100%;vertical-align:baseline;}
|
||
#uuid{text-align: right;}
|
||
h3{font-size: 18px;}
|
||
img {border:0 none;}
|
||
a, a:visited {color:Blue;text-decoration:none;}
|
||
a:hover{text-decoration:underline;}
|
||
ul{list-style: none;margin: 0;}
|
||
ul li{list-style:none;}
|
||
#etitle{font-size:16px;margin-left:10px;}
|
||
span{font-weight:bolder;}
|
||
#content{padding:5px 0 10px 0;border:1px solid #BF5008;}
|
||
#divFooter {background-color:#BF5008;color:White;font-size:12px;padding:5px 15px;}
|
||
#divFooter a:link, #divFooter a:visited, #divFooter a:active {color:White;font-family:Arial,Serif;text-decoration:none;}
|
||
</style>
|
||
</head>
|
||
<body>';
|
||
$content.=$xslt->transformToXML($dom);
|
||
if ($review==1) $content.=file_get_contents('../data/review-table.htm',true);
|
||
$content.="</body></html>";
|
||
$this->getResponse()->setHeader('Content-Type', 'application/vnd.ms-doc')
|
||
->setHeader('Content-Disposition','attachment; filename="'.$row['title'].'.doc"')
|
||
->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);
|
||
}
|
||
|
||
/*
|
||
* 转换元数据为PDF格式
|
||
*/
|
||
public function pdfAction()
|
||
{
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$uuid=$this->_request->getParam('uuid');
|
||
$review=$this->_request->getParam('review');
|
||
error_reporting(1);
|
||
if (!empty($uuid))
|
||
{
|
||
$sql="select x.data,m.title,m.citation,m.suppinfo,m.doi,m.filesize,m.fileformat,m.south,m.east,m.west,m.north,m.timebegin,m.timeend,m.title_en,m.uuid,m.description,g.id,m.projection,t.filetype,
|
||
cc.name as category, cc.name_zh as category_zh
|
||
from xml x left join metadata m on m.id=x.id left join thumbnail t on x.id=t.id
|
||
left join category c on c.id=m.id left join categorycode cc on c.code=cc.code
|
||
left join geonetworkmetadata g on g.uuid=m.uuid where m.uuid=".$this->db->quote($uuid);
|
||
$row=$this->db->fetchRow($sql);
|
||
$sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=?";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$ref=$this->db->fetchAll($sql);
|
||
$reference="";
|
||
foreach($ref as $k=>$refer)
|
||
{
|
||
$reference.=($k+1).'. '.str_replace(array("\r\n", "\n", "\r"),'',$refer['reference'])."\r\n";
|
||
}
|
||
$row['reference']=$reference;
|
||
$sql="select u.uselimit from mdlimit ml left join metadata m on ml.uuid=m.uuid left join uselimit u on ml.lid=u.id where m.uuid=?";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$limits=$this->db->fetchAll($sql);
|
||
$uselimits="";
|
||
foreach($limits as $k=>$limit)
|
||
{
|
||
//$uselimits.=($k+1).'. '.str_replace(array("\r\n", "\n", "\r"),'',$limit['uselimit'])."\r\n";
|
||
$uselimits.=($k+1).'. '.str_replace(array("\r\n", "\n", "\r"),'',$limit['uselimit'])."\r\n";
|
||
}
|
||
$row['uselimits']=$uselimits;
|
||
$sql="select ol.* from onlineresource ol left join metadata m on ol.uuid=m.uuid where m.uuid=?";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$row['resources']=$this->db->fetchAll($sql);
|
||
$sql="select r.role,s.* from role r left join responsible s on r.resid=s.id left join metadata m on m.uuid=r.uuid where m.uuid=? order by r.role,r.id";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$row['contacts']=$this->db->fetchAll($sql);
|
||
|
||
$sql="select k.keyword, k.keytype from keyword k left join metadata m on k.id=m.id where m.uuid=? order by k.keytype";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$keys=$this->db->fetchAll($sql);
|
||
$keyword=array();
|
||
foreach($keys as $key)
|
||
{
|
||
@$keyword[$key['keytype']].=$key['keyword'].',';
|
||
}
|
||
$row['keyword']=$keyword;
|
||
|
||
if (is_numeric($row['projection']))
|
||
{
|
||
$sql="select proj4text from spatial_ref_sys where auth_srid=?";
|
||
$rs=$this->db->fetchRow($sql,array($row['projection']));
|
||
if ($rs) $projection=$rs['proj4text'];
|
||
}
|
||
if (!empty($projection)) $row['projection']=$projection;
|
||
} else
|
||
$projection='';
|
||
|
||
$dom = new DOMDocument();
|
||
$dom->loadXML($row['data']);
|
||
$xpath = new DOMXpath($dom);
|
||
$row['rfdenom']=@$dom->getElementsByTagName('rfDenom')->item(0)->nodeValue;
|
||
$row['resolution']=@$xpath->query('//scaleDist/value/Real')->item(0)->nodeValue;
|
||
$row['resolution'].=@$dom->getElementsByTagName('uomName')->item(0)->nodeValue;
|
||
//提前对表格进行预处理
|
||
/*$wiki=new WikiFormat();
|
||
$row['description']=$wiki->parseTable($row["description"]);
|
||
preg_match_all('/<table>[\s\S]*?<\/table>/im', $row['description'],$tables);
|
||
foreach($tables as $k=>$table)
|
||
{
|
||
$row['description']=@str_replace($tables[$k],"\n 【表格内容暂不支持,请访问网站查看,此处请忽略】\n",$row['description']);
|
||
}*/
|
||
$pdf=new MetadataPDF();
|
||
$pdf->metadata=$row;
|
||
$pdf->Draw();
|
||
$pdf->setTitle($row['title'],true);
|
||
$pdf->setAuthor('中国西部环境与生态科学数据中心',true);
|
||
$this->getResponse()->setHeader('Content-Type', 'application/pdf');
|
||
//->setHeader('Content-Disposition','inline; filename="'.$row['title'].'.pdf"');
|
||
$pdf->Output($row['title'].'.pdf','I');
|
||
//die();
|
||
}
|
||
public function odtAction()
|
||
{
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$uuid=$this->_request->getParam('uuid');
|
||
$review=$this->_request->getParam('review');
|
||
//error_reporting(1);
|
||
if (!empty($uuid))
|
||
{
|
||
$sql="select x.data,m.title,m.citation,m.suppinfo,m.doi,m.filesize,m.fileformat,m.south,m.east,m.west,m.north,m.timebegin,m.timeend,m.title_en,m.uuid,m.description,g.id,m.projection,t.filetype,
|
||
cc.name as category, cc.name_zh as category_zh
|
||
from xml x left join metadata m on m.id=x.id left join thumbnail t on x.id=t.id
|
||
left join category c on c.id=m.id left join categorycode cc on c.code=cc.code
|
||
left join geonetworkmetadata g on g.uuid=m.uuid where m.uuid=".$this->db->quote($uuid);
|
||
$row=$this->db->fetchRow($sql);
|
||
$sql="select r.* from reference r left join mdref m on m.refid=r.id where m.uuid=?";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$ref=$this->db->fetchAll($sql);
|
||
$reference="";
|
||
foreach($ref as $k=>$refer)
|
||
{
|
||
$reference.=($k+1).'. '.str_replace(array("\r\n", "\n", "\r"),'',$refer['reference'])."\r\n";
|
||
}
|
||
$row['reference']=$reference;
|
||
$sql="select u.uselimit from mdlimit ml left join metadata m on ml.uuid=m.uuid left join uselimit u on ml.lid=u.id where m.uuid=?";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$limits=$this->db->fetchAll($sql);
|
||
$uselimits="";
|
||
foreach($limits as $k=>$limit)
|
||
{
|
||
//$uselimits.=($k+1).'. '.str_replace(array("\r\n", "\n", "\r"),'',$limit['uselimit'])."\r\n";
|
||
$uselimits.=($k+1).'. '.str_replace(array("\r\n", "\n", "\r"),'',$limit['uselimit'])."\r\n";
|
||
}
|
||
$row['uselimits']=$uselimits;
|
||
$sql="select ol.* from onlineresource ol left join metadata m on ol.uuid=m.uuid where m.uuid=?";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$res=$this->db->fetchAll($sql);
|
||
$resource="";
|
||
foreach($res as $k=>$r)
|
||
{
|
||
$resource.=($k+1).". ".$r['name'].' '.$r['linkage']."\n";
|
||
}
|
||
$row['resources']=$resource;
|
||
$sql="select r.role,s.* from role r left join responsible s on r.resid=s.id left join metadata m on m.uuid=r.uuid where m.uuid=? order by r.role,r.id";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$contact=$this->db->fetchAll($sql);
|
||
$contacts="";
|
||
$party_zh=array('resourceProvider'=>'资源提供者','custodian'=>'维护者','owner'=>'拥有者','user'=>'用户','distributor'=>'数据服务联系人','originator'=>'创建者','pointOfContact'=>'联系人','principalInvestigator'=>'数据调查与处理者','processor'=>'处理者','publisher'=>'元数据发布者','author'=>'元数据作者');
|
||
foreach($contact as $k=>$c)
|
||
{
|
||
@$contacts.=($k+1).". ".$party_zh[$c['role']]."\n";
|
||
@$contacts.=$c['individual'].' 单位:'.$c['organisation']."\n";
|
||
@$contacts.='地址:'.$c['country'].' '.$c['administractive'].' '.$c['city'].' '.$c['delivery']."\n";
|
||
@$contacts.='邮编:'.$c['postal'].' 电话:'.$c['phone'].' 邮件:'.$c['email']."\n\n";
|
||
}
|
||
$row['contacts']=$contacts;
|
||
$sql="select k.keyword, k.keytype from keyword k left join metadata m on k.id=m.id where m.uuid=? order by k.keytype";
|
||
$sql=$this->db->quoteInto($sql,$uuid);
|
||
$keys=$this->db->fetchAll($sql);
|
||
$keyword=array();
|
||
foreach($keys as $key)
|
||
{
|
||
@$keyword[$key['keytype']].=$key['keyword'].',';
|
||
}
|
||
$row['keyword']=$keyword;
|
||
|
||
if (is_numeric($row['projection']))
|
||
{
|
||
$sql="select proj4text from spatial_ref_sys where auth_srid=?";
|
||
$rs=$this->db->fetchRow($sql,array($row['projection']));
|
||
if ($rs) $projection=$rs['proj4text'];
|
||
}
|
||
if (!empty($projection)) $row['projection']=$projection;
|
||
} else
|
||
$projection='';
|
||
|
||
$dom = new DOMDocument();
|
||
$dom->loadXML($row['data']);
|
||
$xpath = new DOMXpath($dom);
|
||
$row['rfdenom']=@$dom->getElementsByTagName('rfDenom')->item(0)->nodeValue;
|
||
$row['resolution']=@$xpath->query('//scaleDist/value/Real')->item(0)->nodeValue;
|
||
$row['resolution'].=@$dom->getElementsByTagName('uomName')->item(0)->nodeValue;
|
||
//提前对表格进行预处理
|
||
$wiki=new WikiFormat();
|
||
$row['description']=$wiki->parseTable($row["description"]);
|
||
preg_match_all('/<table>[\s\S]*?<\/table>/im', $row['description'],$tables);
|
||
$search=array();
|
||
$replace=array();
|
||
foreach($tables as $k=>$table)
|
||
{
|
||
/*$search[]="<table>";
|
||
$replace[]='<table:table table:name="Table 3">'.str_repeat('<table:table-column />',substr_count($table[0],'<th>'));
|
||
$search[]="<tr>";
|
||
$replace[]="<table:table-row>";
|
||
$search[]="<td>";
|
||
$replace[]="<table:table-cell><text:p>";
|
||
$search[]="<th>";
|
||
$replace[]="<table:table-cell><text:p>";
|
||
$search[]="</td>";
|
||
$replace[]="</text:p></table:table-cell>";
|
||
$search[]="</th>";
|
||
$replace[]="</text:p></table:table-cell>";
|
||
$search[]="</tr>";
|
||
$replace[]="</table:table-row>";
|
||
$search[]="</table>";
|
||
$replace[]="</table:table>";
|
||
$table=str_replace($search,$replace,$table[0]);*/
|
||
$row['description']=@str_replace($tables[$k][0],"\n 【表格内容暂不支持,请访问网站查看,此处请忽略】\n",$row['description']);
|
||
}
|
||
|
||
require_once('odtphp/library/odf.php');
|
||
$config["PATH_TO_TMP"]="/tmp/zip";
|
||
$config["ZIP_PROXY"]="ZipArchive";
|
||
$odf=new Odf("../data/metadata-template.odt",$config);
|
||
$odf->setVars('title',$row['title'],true,'utf-8');
|
||
@$odf->setVars('title_en',$row['title_en'],true,'utf-8');
|
||
$odf->setVars('uuid',$row['uuid'],true,'utf-8');
|
||
$odf->setVars('datetime',date('Y-m-d'));
|
||
$odf->setVars('abstract',$row['description'],true,'utf-8');
|
||
@$odf->setVars('theme_keyword',$row['keyword']['theme'],true,'utf-8');
|
||
@$odf->setVars('place_keyword',$row['keyword']['place'],true,'utf-8');
|
||
@$odf->setVars('temporal_keyword',empty($row['keyword']['temporal'])?'':$row['keyword']['temporal'],true,'utf-8');
|
||
@$odf->setVars('discipline_keyword',$row['keyword']['discipline'],true,'utf-8');
|
||
@$odf->setVars('stratum_keyword',$row['keyword']['stratum'],true,'utf-8');
|
||
@$odf->setVars('category',$row['category'].' '.$row['category_zh'],true,'utf-8');
|
||
@$odf->setVars('rfdenom',$row['rfdenom'],true,'utf-8');
|
||
@$odf->setVars('resolution',$row['resolution'],true,'utf-8');
|
||
@$odf->setVars('projection',$row['projection'],true,'utf-8');
|
||
@$odf->setVars('filesize',$row['filesize'],true,'utf-8');
|
||
@$odf->setVars('fileformat',$row['fileformat'],true,'utf-8');
|
||
@$odf->setVars('timebegin',$row['timebegin'],true,'utf-8');
|
||
@$odf->setVars('timeend',$row['timeend'],true,'utf-8');
|
||
@$odf->setVars('citation',$row['citation'],true,'utf-8');
|
||
@$odf->setVars('reference',$row['reference'],true,'utf-8');
|
||
@$odf->setVars('doi',$row['doi'],true,'utf-8');
|
||
@$odf->setVars('suppinfo',$row['suppinfo'],true,'utf-8');
|
||
@$odf->setVars('uselimits',$row['uselimits'],true,'utf-8');
|
||
@$odf->setVars('resources',$row['resources'],true,'utf-8');
|
||
@$odf->setVars('contacts',$row['contacts'],true,'utf-8');
|
||
@$odf->setVars('north',$row['north'],true,'utf-8');
|
||
@$odf->setVars('south',$row['south'],true,'utf-8');
|
||
@$odf->setVars('west',$row['west'],true,'utf-8');
|
||
@$odf->setVars('east',$row['east'],true,'utf-8');
|
||
$odf->setImage('bigthumb', 'http://test.westgis.ac.cn/service/bigthumb/uuid/'.$row['uuid']);
|
||
$odf->setImage('thumb', 'http://test.westgis.ac.cn/service/thumb/uuid/'.$row['uuid']);
|
||
$odf->exportAsAttachedFile($row['title'].'.odt');
|
||
}
|
||
|
||
function uploadAction(){
|
||
$this->_helper->layout()->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
|
||
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();
|
||
}
|
||
|
||
$files=new files();
|
||
$msg = $files -> upload($this->config->upload,$_FILES['Filedata'],'reviewatt');
|
||
|
||
if(empty($msg['error']))
|
||
{
|
||
$msg['error']="";
|
||
$filename = $msg['db_path'];
|
||
$filesize = $msg['file_size'];
|
||
$filedesc = $this->_request->getParam('filedesc');
|
||
$filetype = $this->_request->getParam('dir');
|
||
$realname = $msg['realname'];
|
||
|
||
|
||
$sql = "insert into attachments (filename,filetype,filedesc,userid,filesize,realname) values ('$filename','reviewatt','$filedesc','$userid','$filesize','$realname') RETURNING id";
|
||
$sth = $this->db->prepare($sql);
|
||
$sth->execute();
|
||
$att = $sth->fetch(PDO::FETCH_ASSOC);
|
||
$msg['attid'] = $attid = $att['id'];
|
||
$msg['html'] = $realname.'[已完成]<input type="hidden" name="atts[]" value="'.$attid.'" /><div class="cancel"><a href="javascript:;" id="deletebtn_'.$attid.'"><img border="0" src="/static/js/uploadify/cancel.png" /></a></div>';
|
||
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();
|
||
}
|
||
}
|
||
|
||
function filelistAction()
|
||
{
|
||
$uuid=$this->_request->getParam('uuid');
|
||
$sql="select f.filename,f.id,s.uuid,f.depth from datafile f,dataset s where s.id=f.dsid and s.uuid=? and f.depth=1 and f.filename<>'/uuid.txt' order by f.isdir desc,f.filename";
|
||
$files=$this->db->fetchAll($this->db->quoteInto($sql,$uuid));
|
||
$this->_helper->layout()->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
echo Zend_Json::encode($files);
|
||
}
|
||
|
||
function subfilelistAction()
|
||
{
|
||
$uuid=$this->_request->getParam('uuid');
|
||
$subpath=(int)$this->_request->getParam('subpath');
|
||
$depth=(int)$this->_request->getParam('depth');
|
||
$depth++;
|
||
$sql="select f.filename,f.id,s.uuid,f.depth from datafile f,dataset s where s.id=f.dsid and s.uuid=? and f.depth=".$depth." and f.filename<>'/uuid.txt' and f.filename ilike (select filename from datafile where id=".$subpath.")||'%' order by f.isdir desc,f.filename";
|
||
$files=$this->db->fetchAll($this->db->quoteInto($sql,$uuid));
|
||
$this->_helper->layout()->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
echo Zend_Json::encode($files);
|
||
}
|
||
|
||
/*
|
||
* 附件下载
|
||
*/
|
||
function attachAction()
|
||
{
|
||
$zipuuid = $this->_request->getParam('zip');
|
||
$id=(int)$this->_request->getParam('id');
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
if(!empty($zipuuid))
|
||
{
|
||
$sql=$this->db->quoteInto("select a.*,md.title from mdattach m left join metadata md on m.uuid=md.uuid left join attachments a on m.id=a.id where m.uuid=? order by a.ts_created desc",$zipuuid);
|
||
$atts = $this->db->fetchAll($sql);
|
||
$title=$atts[0]['title'];
|
||
$zip = new ZipArchive();
|
||
$url = tempnam($this->config->temp->path,$zipuuid);//创建临时文件
|
||
$last_update=strtotime($atts[0]['ts_created']);
|
||
if (!file_exists($url) || (filemtime($fn)<$last_update))
|
||
{
|
||
if( $zip->open($url, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== true )
|
||
{
|
||
throw new Exception("cannot open {$url} for writing.");
|
||
}
|
||
|
||
$updates = array(); //统计被下载的附件ID
|
||
foreach ($atts as $k=>$v)
|
||
{
|
||
if (file_exists($this->config->upload.$v['filename'])) {
|
||
$updates[]=$v['id'];
|
||
$zip->addFile($this->config->upload.$v['filename'],'/'.basename($v['realname']));
|
||
}
|
||
}
|
||
$zip->close();
|
||
}
|
||
//更新统计
|
||
$ids=join(',',$updates);
|
||
$sql = "update attachments set downtimes=downtimes+1 where id in ($ids)";
|
||
@$this->db->exec($sql);
|
||
|
||
//输出下载
|
||
$content=file_get_contents($url);
|
||
$this->getResponse()->setHeader('Content-Type', 'application/octet-stream')
|
||
->setHeader('Content-Disposition','attachment; filename="'.basename($title).'-文档.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);
|
||
}
|
||
elseif ($id>0)
|
||
{
|
||
//下载单个附件
|
||
$sql=$this->db->quoteInto("select a.* from attachments a where a.id=? order by a.ts_created desc",$id);
|
||
$atts = $this->db->fetchRow($sql);
|
||
$updates = array(); //统计被下载的附件ID
|
||
//更新统计
|
||
$sql = "update attachments set downtimes=downtimes+1 where id in ($id)";
|
||
@$this->db->exec($sql);
|
||
|
||
//输出下载
|
||
$content=file_get_contents($this->config->upload.$atts['filename']);
|
||
$this->getResponse()->setHeader('Content-Type', 'application/octet-stream')
|
||
->setHeader('Content-Disposition','attachment; filename="'.$atts['realname'].'"')
|
||
->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);
|
||
}
|
||
else
|
||
{
|
||
throw new Exception('发生严重意外!您确认链接正确?');
|
||
}
|
||
|
||
}
|
||
|
||
function mdjsonAction()
|
||
{
|
||
$this->_helper->layout->disableLayout();
|
||
$this->_helper->viewRenderer->setNoRender();
|
||
$num=(int)$this->_request->getParam('num');
|
||
$source=$this->_request->getParam('source');
|
||
if (empty($num)) $num=3;
|
||
$sql="select m.uuid,m.title,m.id,substring(m.description from 0 for 200) as description from normalmetadata m left join thumbnail t on m.id=t.id where ";
|
||
if (!empty($source))
|
||
$sql.=$this->db->quoteInto(" m.uuid in (select d.uuid from datasource d left join source s on d.sourceid=s.id where s.code=?) and ",$source);
|
||
$sql.=" length(t.data)>2 order by random() limit $num";
|
||
$rows=$this->db->fetchAll($sql);
|
||
echo Zend_Json::encode($rows);
|
||
}
|
||
}
|
||
|