westdc-zf1/application/default/controllers/ServiceController.php

1817 lines
68 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use Helpers\View;
use Helpers\dbh;
use Files\Files;
use Files\Output;
use Files\Listener\FileListener;
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->view->config = $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,substring(description for 400) as description,filesize,fileformat from normalmetadata where east<? and west>? and north<? and south>?";
if (!empty($key)) {
$search=new SimpleSearch($key);
$where=$search->sql_expr(array("title","description"));
$sql.= " and ".$where;
$sql.= " order by title";
$rows=$this->db->fetchAll($sql,array($e,$w,$n,$s));
} else {
$sql.= " order by title limit 10";
$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 normalmetadata 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 uuid,title,datatype,filesize,id from normalmetadata";
$md=$this->db->fetchAll($sql);
foreach($md as $m)
{
print $m["uuid"].",";
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 g.data,m.title,m.description,g.id,m.projection,m.citation,m.title_en
,m.ts_published,d.doi as datadoi,d.authors,d.author_en,d.publisher,d.publisher_en, date_part('year',d.ts_published) as publish_year
from metadata m left join thumbnail t on m.id=t.id
left join datadoi d on d.uuid=m.uuid
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.reftype=0 and m.uuid=? order by m.place";
$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'];
//判断是否使用多篇文献引用
$sql="select r.* from reference r left join mdref m on m.refid=r.id where m.reftype=3 and m.uuid=? order by m.place";
$sql=$this->db->quoteInto($sql,$uuid);
$ref=$this->db->fetchAll($sql);
$ref1="";
foreach($ref as $k=>$refer)
{
$ref1.='<li>'.str_replace(array("\r\n", "\n", "\r"),'',$refer['reference'])."</li>";
}
$row['mcitation']=$ref1;
$citation='';
if ($row['mcitation'])
{
$citation=$row['mcitation'];
} else if ($row['citation'])
{
if (empty($row['datadoi']))
{
$citation=$row['citation'];
}
elseif (!strpos($row['citation'],$row['datadoi']))
{
$citation='<li>文章引用:'.$row['citation'].'</li>';
$citation.="<li>数据的引用:";
$citation.=substr($row['authors'],1,-1).'. '.$row['title'].'. '.$row['publisher'].', '.(empty($row['ts_published'])?$row['publish_year']:date('Y',strtotime($row['ts_published']))).'. doi:'.$row['datadoi'];
$citation.=' ['.str_replace('"','',substr($row['author_en'],1,-1)).'. '.$row['title_en'].'. '.$row['publisher_en'].', '.(empty($row['ts_published'])?$row['publish_year']:date('Y',strtotime($row['ts_published']))).'. doi:'.$row['datadoi'].']';
$citation.="</li>";
}
}
//支持项目判断
$sql="select f.* from fund f left join mdfund m on m.fid=f.id where m.uuid=? order by m.place";
$sql=$this->db->quoteInto($sql,$uuid);
$ref=$this->db->fetchAll($sql);
$fund="";
foreach($ref as $k=>$refer)
{
$fund.='<li>'.$refer['fund_type'].''.str_replace(array("\r\n", "\n", "\r"),'',$refer['title']).'(编号:'.$refer['fund_id'].")</li>";
}
if (empty($fund)) $fund=$row['suppinfo'];
}
$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("'","&apos;",$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);
$xslt->setParameter('','citation',$citation);
$xslt->setParameter('','fund',$fund);
$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 {}
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>';
$dispostion = 'attachment; filename*="utf8\' \''.urlencode($row['title']).'.doc"';
$ua = $_SERVER["HTTP_USER_AGENT"];
if (preg_match("/MSIE/", $ua)) {
$dispostion = 'attachment; filename="'.urlencode($row['title']).'.doc"';
} else if (preg_match("/Firefox/", $ua)) {
//$dispostion;
} else {
$dispostion = 'attachment; filename="'.$row['title'].'.doc"';
}
$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',$dispostion)
->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 g.data,m.title,m.citation,m.suppinfo,m.doi,m.filesize,m.fileformat,m.south,m.east,m.west,m.north,date(m.timebegin) as timebegin,date(m.timeend) as timeend,m.title_en,m.uuid,m.description,g.id,m.projection,t.filetype
,m.ts_published,d.doi as datadoi,d.authors,d.author_en,d.publisher,d.publisher_en, date_part('year',d.ts_published) as publish_year
from metadata m left join thumbnail t on m.id=t.id
left join datadoi d on d.uuid=m.uuid
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.reftype=0 and m.uuid=? order by m.place";
$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 r.* from reference r left join mdref m on m.refid=r.id where m.reftype=3 and m.uuid=? order by m.place";
$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['mcitation']=$reference;
//支持项目判断
$sql="select f.* from fund f left join mdfund m on m.fid=f.id where m.uuid=? order by m.place";
$sql=$this->db->quoteInto($sql,$uuid);
$ref=$this->db->fetchAll($sql);
$fund="";
foreach($ref as $k=>$refer)
{
$fund.=($k+1).'. '.$refer['fund_type'].''.str_replace(array("\r\n", "\n", "\r"),'',$refer['title']).'(编号:'.$refer['fund_id'].")\r\n";
}
if (!empty($fund)) $row['suppinfo']=$fund;
$sql="select cc.name as category, cc.name_zh from metadata m left join category c on m.id=c.id left join categorycode cc on c.code=cc.code where m.uuid=".$this->db->quote($uuid);
$cat=$this->db->fetchAll($sql);
$row['category_zh']='';
foreach($cat as $category)
{
$row['category_zh'].=$category['name_zh'].' ';
}
$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;
$cit='';
if ($row['mcitation'])
{
$cit=$row['mcitation'];
} else if ($row['citation'])
{
if (empty($row['datadoi']))
{
$cit=$row['citation'];
}
elseif (!strpos($row['citation'],$row['datadoi']))
{
$cit='文章引用:'.$row['citation'];
$cit.="\r\n数据的引用:";
$cit.=substr($row['authors'],1,-1).'. '.$row['title'].'. '.$row['publisher'].', '.(empty($row['ts_published'])?$row['publish_year']:date('Y',strtotime($row['ts_published']))).'. doi:'.$row['datadoi'];
$cit.=' ['.str_replace('"','',substr($row['author_en'],1,-1)).'. '.$row['title_en'].'. '.$row['publisher_en'].', '.(empty($row['ts_published'])?$row['publish_year']:date('Y',strtotime($row['ts_published']))).'. doi:'.$row['datadoi'].']';
}
}
$row['citation']=$cit;
}
$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');
$ac=$this->_request->getParam('ac');
//error_reporting(1);
if (!empty($uuid))
{
$sql="select g.data,m.title,m.citation,m.suppinfo,m.doi,m.filesize,m.fileformat,m.ts_created,m.south,m.east,m.west,m.north,date(m.timebegin) as timebegin,date(m.timeend) as timeend,m.title_en,m.uuid,m.description,g.id,m.projection,t.filetype
,m.ts_published,d.doi as datadoi,d.authors,d.author_en,d.publisher,d.publisher_en, date_part('year',d.ts_published) as publish_year
from metadata m left join thumbnail t on m.id=t.id
left join datadoi d on d.uuid=m.uuid
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.reftype=0 and m.uuid=? order by m.place";
$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 r.* from reference r left join mdref m on m.refid=r.id where m.reftype=3 and m.uuid=? order by m.place";
$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['mcitation']=$reference;
//支持项目判断
$sql="select f.* from fund f left join mdfund m on m.fid=f.id where m.uuid=? order by m.place";
$sql=$this->db->quoteInto($sql,$uuid);
$ref=$this->db->fetchAll($sql);
$fund="";
foreach($ref as $k=>$refer)
{
$fund.=($k+1).'. '.$refer['fund_type'].''.str_replace(array("\r\n", "\n", "\r"),'',$refer['title']).'(编号:'.$refer['fund_id'].")\r\n";
}
if (!empty($fund)) $row['suppinfo']=$fund;
$sql="select cc.name as category, cc.name_zh from metadata m left join category c on m.id=c.id left join categorycode cc on c.code=cc.code where m.uuid=".$this->db->quote($uuid);
$cat=$this->db->fetchAll($sql);
$row['category_zh']='';
foreach($cat as $category)
{
$row['category_zh'].=$category['name_zh'].' ';
}
$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";
if ($ac=='simple')
$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 r.role in ('resourceProvider','owner','pointOfContact') and 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";
if ($ac=='simple')
$odf=new Odf("../data/metadata-template-simple.odt",$config);
else
$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',strtotime($row['ts_created'])));
$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('category',$row['category'].' '.$row['category_zh'],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');
$cit='';
if ($row['mcitation'])
{
$cit=$row['mcitation'];
} else if ($row['citation'])
{
if (empty($row['datadoi']))
{
$cit=$row['citation'];
}
elseif (!strpos($row['citation'],$row['datadoi']))
{
$cit='文章引用:'.$row['citation'];
$cit.="\r\n数据的引用:";
$cit.=substr($row['authors'],1,-1).'. '.$row['title'].'. '.$row['publisher'].', '.(empty($row['ts_published'])?$row['publish_year']:date('Y',strtotime($row['ts_published']))).'. doi:'.$row['datadoi'];
$cit.=' ['.str_replace('"','',substr($row['author_en'],1,-1)).'. '.$row['title_en'].'. '.$row['publisher_en'].', '.(empty($row['ts_published'])?$row['publish_year']:date('Y',strtotime($row['ts_published']))).'. doi:'.$row['datadoi'].']';
}
}
@$odf->setVars('citation',$cit,true,'utf-8');
@$odf->setVars('reference',$row['reference'],true,'utf-8');
@$odf->setVars('doi',$row['doi'],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');
if (!$ac=='simple')
{
@$odf->setImage('bigthumb', 'http://westdc.westgis.ac.cn/service/bigthumb/uuid/'.$row['uuid']);
@$odf->setImage('thumb', 'http://westdc.westgis.ac.cn/service/thumb/uuid/'.$row['uuid']);
@$odf->setVars('projection',$row['projection'],true,'utf-8');
@$odf->setVars('resolution',$row['resolution'],true,'utf-8');
@$odf->setVars('rfdenom',$row['rfdenom'],true,'utf-8');
@$odf->setVars('stratum_keyword',$row['keyword']['stratum'],true,'utf-8');
@$odf->setVars('uselimits',$row['uselimits'],true,'utf-8');
@$odf->setVars('resources',$row['resources'],true,'utf-8');
@$odf->setVars('suppinfo',$row['suppinfo'],true,'utf-8');
@$odf->setVars('contacts',$row['contacts'],true,'utf-8');
} else {
@$odf->setImage('qrcode', 'http://westdc.westgis.ac.cn/service/qrcode/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'];
$fileurl = $msg['file_url'];
$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'];
include_once('files.php');
$imgct = files::getImageType($this->config->upload.$filename);
if(!isset($imgct['error'])) $preview = '<img src="/service/attpreview/id/'.$attid.'" style="display:block;" />';
else $preview = "";
$msg['html'] = $preview.$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>';
$msg['preview'] = "/service/attpreview/id/".$attid;
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 getattsAction(){
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$id = $this->_request->getParam('id');
if($id!='')
{
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$userid = $user->id;
$sql = "select att.realname,att.id,att.filename from attachments att
left join mdreviewattach ratt on att.id=ratt.attachid
where ratt.reviewid=$id and att.userid=$userid";
$rs = $this->db->query($sql);
$atts = $rs->fetchAll();
include_once('files.php');
foreach($atts as $k=>$v)
{
$imgct = files::getImageType($this->config->upload.$v['filename']);
if(!isset($imgct['error'])) $preview = '<img src="/service/attpreview/id/'.$v['id'].'" style="display:block;" />';
else $preview = "";
$atts[$k]['html']= $preview.$v['realname'].'[已完成]<input type="hidden" name="atts[]" value="'.$v['id'].'" /><div class="cancel"><a href="javascript:;" id="deletebtn_'.$v['id'].'"><img border="0" src="/static/js/uploadify/cancel.png" /></a></div>';
}
echo Zend_Json::encode($atts);
exit();
}else
{
exit();
}
}else{
exit();
}
//不输出错误
}//获取附件
//json 文件列表
function filelistAction()
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid=$this->_request->getParam('uuid');
$sql="select f.filename,f.id,s.uuid,f.depth,f.filesize as filesize,f.ts_created 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));
//文件大小处理
foreach($files as $k=>$v)
{
if ($v['filesize']<1024)
{
$files[$k]['filesize']=$v['filesize'].'Byte';
} elseif($v['filesize']<1024*1024) {
$files[$k]['filesize']=round($v['filesize']/1024,2).'KB';
} elseif($v['filesize']<1024*1024*1024) {
$files[$k]['filesize']=round($v['filesize']/1024/1024,2).'MB';
} else {
$files[$k]['filesize']=round($v['filesize']/1024/1024/1024,2).'GB';
}
$files[$k]['ts_created'] = date("Y-m-d H:i",strtotime($v['ts_created']));
}
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($files,JSON_NUMERIC_CHECK));
return true;
}
function subfilelistAction()
{
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid=$this->_request->getParam('uuid');
$subpath=(int)$this->_request->getParam('subpath');
$depth=(int)$this->_request->getParam('depth');
$depth++;
$sql="select f.*,s.uuid 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));
foreach($files as $k=>$v)
{
$files[$k]['ts_created'] = date("Y-m-d H:i",strtotime($v['ts_created']));
if ($v['filesize']<1024)
{
$files[$k]['filesize']=$v['filesize'].'Byte';
} elseif($v['filesize']<1024*1024) {
$files[$k]['filesize']=round($v['filesize']/1024,2).'KB';
} elseif($v['filesize']<1024*1024*1024) {
$files[$k]['filesize']=round($v['filesize']/1024/1024,2).'MB';
} else {
$files[$k]['filesize']=round($v['filesize']/1024/1024/1024,2).'GB';
}
if ($v['isdir']==1)
{
$files[$k]['filename']=substr(strrchr(substr($v['filename'],0,-1),'/'),1).'/';}
else{
$files[$k]['filename']=substr(strrchr($v['filename'],'/'),1);
}
$files[$k]['ext'] = "";
$temp_arr = explode(".", $v['filename']);
if($temp_arr)
{
$file_ext = array_pop($temp_arr);
$file_ext = trim($file_ext);
$files[$k]['ext'] = strtolower($file_ext);
}
}
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($files,JSON_NUMERIC_CHECK));
return true;
}
/*
* 附件下载
*/
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 delreviewattAction(){
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$id = $this->_request->getParam('id');
$basepath = $this->view->config->upload;
$info = $this->getFileinfo($id);
$filepath = $basepath.$info['filename'];
try{
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$userid = $user->id;
$sql = "delete from attachments where id='$id' and userid='$userid'";
if($this->db->exec($sql)>0)
{
@unlink($filepath);
}
}
}catch(Exception $e){}
//不输出任何错误
}//删除评审附件
function attpreviewAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$id=(int)$this->_request->getParam('id');
include_once('files.php');
$info = files::getOne($this->db,$id);
if(!empty($info['error']))
{
exit($info['error']);
}
else
{
try{
$filename = $this->config->upload.$info['filename'];
$imgct = files::getImageType($filename);
if(isset($imgct['error'])) exit("Error");
//var_dump($imgct);exit();
files::thumb($filename,300,0);
exit;
}catch(Exception $e){
echo $e->getMessage();
exit();
}
}
}
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);
}
function googlesearchAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$q = $this->_request->getParam('q');
$rez = $this->google_search_api(array(
'q' => $q, // 查询内容
'key' => $this->config->google->maps->api,
'userip' => $_SERVER['REMOTE_ADDR'],
'rsz' => 5
));
print_r($rez);
exit();
}
function google_search_api($args, $referer = 'http://westdc.westgis.ac.cn/', $endpoint = 'web'){
$url = "http://ajax.googleapis.com/ajax/services/search/".$endpoint;
if ( !array_key_exists('v', $args) )
$args['v'] = '1.0';
$url .= '?'.http_build_query($args, '', '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$body = curl_exec($ch);
curl_close($ch);
return $body;
}// google 搜索
function bingsearchAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$q = $this->_request->getParam('q');
$rez = $this->bing_search($q);
print_r($rez);
exit();
}
function bing_search($keyword,$referer = 'http://westdc.westgis.ac.cn/'){
$keyword=urlencode($keyword);
$url = "http://api.bing.net/json.aspx?AppId=".$this->config->bing->api
."&Query=".$keyword
."&Sources=Web"
."&Version=2.0"
."&Market=zh-cn"
."&Adult=Moderate"
//."&Options=EnableHighlighting"
."&Web.Count=5"
."&Web.Offset=0"
."&Web.Options=DisableHostCollapsing+DisableQueryAlterations";
//&JsonType=callback&JsonCallback=SearchCompleted
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$body = curl_exec($ch);
curl_close($ch);
return $body;
}//bing 搜索
function cnkisearchAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$q = $this->_request->getParam('q');
$rez = $this->cnki_search($q);
print_r($rez);
exit();
}
function cnki_search($keyword , $referer = 'http://westdc.westgis.ac.cn/'){
$keyword = urlencode($keyword);
$url = "http://search.cnki.net/search.aspx?q=$keyword";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$body = curl_exec($ch);
curl_close($ch);
$rev = array();
$max = 5;
$error='';
if(preg_match_all("#<a\sclass=\"acticle\" href=\"(.+?)\".*?>(.+?)<\/a>#im",$body,$matchs,PREG_PATTERN_ORDER))
{
foreach ($matchs[2] as $k=>$v){
if($k < $max) $rev[$k]['title']=$v;
}
foreach ($matchs[1] as $k=>$v){
if($k < $max) $rev[$k]['url']=$v;
}
}else{
$error = "无搜索结果";
}
if(preg_match_all("#<span class=\"search_result_snap\" >(.+?)<\/span>#im",$body,$matchs,PREG_PATTERN_ORDER))
{
foreach ($matchs[1] as $k=>$v){
if($k < $max) $rev[$k]['content']=$v;
}
}
$response=array("result"=>$rev,"count"=>$max,"morelink"=>'http://search.cnki.net/search.aspx?q='.$keyword,"error"=>$error);
$rev = Zend_Json::encode($response);
return $rev;
}//cnki 搜索
function scholarsearchAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$q = $this->_request->getParam('q');
$rez = $this->scholar_search($q);
print_r($rez);
exit();
}
function scholar_search($keyword , $referer = 'http://westdc.westgis.ac.cn/'){
$keyword = urlencode($keyword);
$url = "http://scholar.google.com/scholar?q=$keyword";
$url .= "&hl=en&btnG=搜索&lr=";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
$html = curl_exec($ch);
curl_close($ch);
$rev = array();
$max = 5;
$error='';
if(preg_match_all("#<h3.*?>(.+?)<\/h3>#im",$html,$matchs,PREG_PATTERN_ORDER))
{
foreach ($matchs[0] as $k=>$v){
if($k < $max) $rev[$k]['title']=utf8_encode($v);
}
}else{
$error = "无搜索结果";
}
if(preg_match_all('!<div class="gs_a">(.*?)<\/div>!im',$html,$matchs,PREG_PATTERN_ORDER))
{
foreach ($matchs[0] as $k=>$v){
if($k < $max) $rev[$k]['content']=utf8_encode($v);
}
}
//var_dump($rev);
//exit();
$response=array("result"=>$rev,"count"=>$max,"morelink"=>'http://scholar.google.com/scholar?hl=zh-CN&btnG=搜索&lr=&q='.$keyword,"error"=>$error);
$rev = Zend_Json::encode($response);
return $rev;
}//scholar 搜索
function recommendAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid = $this->_request->getParam('uuid');
$page = $this->_getParam('page');
$pageSize = 5;//每页容量
$pre='';
$next='';
$sql = "select d.uuid,count(distinct(d.userid)) as downtimes,m.title from dataorder d left join metadata m on d.uuid=m.uuid where d.userid in (
select distinct(userid) from dataorder where uuid=? and status in (0,5)
) and d.uuid<>? and length(m.title)>2 group by d.uuid,m.title order by count(distinct(d.userid)) desc";
$pagnation="";
if(isset($page))
{
$page=intval($page);
if($page<0)
{
$page=0;
}
$re = $this->db->query($sql,array($uuid,$uuid));
$rows = $re->fetchAll();
$num = count($rows);
if( $num > $pageSize)
{
if($page > 0)
{
$pre = '<li><a href="javascript:void(0);" onClick="recommend('. ($page-1) .')">Prev</a></li>';
}
if($num > $pageSize*($page+1))
{
$next = '<li><a href="javascript:void(0);" onClick="recommend('. ($page+1) .')">Next</a></li>';
}
}
$sql .=" limit $pageSize offset ".$page*$pageSize;
}
else
{
$sql .=" limit $pageSize";
}
$re = $this->db->query($sql,array($uuid,$uuid));
$rows = $re->fetchAll();
if(count($rows>0))
{
echo '<ul class="unstyled">';
foreach($rows as $c)
{
echo
'<li class="well well-small" style="overflow:hidden;">
<img src="/service/thumb/uuid/'.$c['uuid'].'" alt="'.$c['title'].'" title="'.$c['title'].'"
class="pull-left img-polaroid img-rounded" style="height:80px;"/>
<h4><a target="_blank" href="/data/'.$c['uuid'].'"><span class="title">'.$c['title'].'</span></a></h4>
<h5>推荐指数:'.$c['downtimes'].'</h5>
</li>';
}
echo '</ul>';
echo '<div class="pagination"><ul>';
echo $pre;
echo $next;
echo '</ul></div>';
}else
{
echo "暂无相关数据";
}
}//相关下载 给我推荐
function relatedAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid = $this->_request->getParam('uuid');
$sql="select m.id from normalmetadata m left join mdstatus s on m.uuid=s.uuid
left join thumbnail t on t.id=m.id left join geonetworkmetadata g on m.uuid=g.uuid where ";
$where=$this->db->quoteInto('m.uuid = ?',$uuid);
$sql.=$where;
$row=$this->db->fetchRow($sql);
if (!$row) exit("读取信息错误");
$id=$row['id'];
//相关元数据,根据同名关键词实现
$sql="select distinct(md.uuid),md.title from keyword kw left join normalmetadata md on kw.id=md.id where length(md.title)>2 and kw.keyword in (select k.keyword from keyword k left join metadata m on k.id=m.id where m.id=? and k.keytype='theme') and kw.id<>?";
$rows=$this->db->fetchAll($sql,array($id,$id));
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('data/pagination_related.phtml');
if ($paginator)
{
foreach($paginator as $c)
{
print '<li><a target="_blank" href="/data/'.$c['uuid'].'">'.$c['title']."</a></li>\r\n";
}
echo '<div class="paginator">'.$paginator.'</div>';
}
} //相关数据
function literatureAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid = $this->_request->getParam('uuid');
$sql="select m.id from normalmetadata m left join mdstatus s on m.uuid=s.uuid
left join thumbnail t on t.id=m.id left join geonetworkmetadata g on m.uuid=g.uuid where ";
$where=$this->db->quoteInto('m.uuid = ?',$uuid);
$sql.=$where;
$row=$this->db->fetchRow($sql);
if (!$row) exit("读取信息错误");
$id=$row['id'];
$keys=$this->db->fetchAll("select * from keyword where id=? order by keytype,ts_created",array($id));
$wheresql = array();
foreach ($keys as $k=>$v)
{
if($v['keytype']=="theme")
$wheresql[] = " a.title like '%".$v['keyword']."%' ";
}
$wheresql[] = " 1<>1 ";
$wheresql = join(" or ",$wheresql);
$sql="select a.*,array_to_string(array(select author from knl_author t where t.item_id=a.item_id order by place asc),'; ') as author from knl_article a where ($wheresql) order by a.ts_created desc";
$rows = $this->db->fetchAll($sql);
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(10);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('data/pagination_literature.phtml');
if ($paginator)
{
foreach($paginator as $c)
{
$u=parse_url($c['url']);
if (@$u['host']=='hdl.handle.net') $c['url'] = $this->config->seekspace->handleurl.$u['path'];
print '<li><a target="_blank" href="'.$c['url'].'">'.$c['title'].'</a>【'.$c['author'].' '.$c['publisher'].' '.$c['ts_issued']."】</li>";
}
echo '<div class="paginator">'.$paginator.'</div>';
}
}//相关文献
function refdatalistAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$id = $this->_request->getParam('id');
$page = $this->_getParam('page');
$pageSize = 10;//每页容量
$sql = "select distinct md.title,md.uuid from mdref mr
right join normalmetadata md on md.uuid=mr.uuid
where mr.refid=$id";
$pagnation="";
if(isset($page))
{
$page=intval($page);
if($page<0)
{
$page=0;
}
$re = $this->db->query($sql);
$rows = $re->fetchAll();
$num = count($rows);
if( $num > $pageSize)
{
if($page <= 0)
{
$pre = '<span class="disabled">&lt;</span>';
}else{
$pre = '<a href="javascript:void(0);" onClick="showdata('.$id.','. ($page-1) .')">&lt;</a>';
}
if($num <= $pageSize*($page+1))
{
$next = '<span class="disabled">&gt;</span>';
}else{
$next = "<a href=\"javascript:void(0);\" onclick=\"showdata(".$id.",". ($page+1) .")\">&gt;</a>";
}
$pagnation = '<div class="paginationControl">'.$pre.$next.'<span class="disabled">共 '.$num.' 条</span></div>';
}
$sql .="limit $pageSize offset ".$page*$pageSize;
}
else
{
$sql .="limit $pageSize";
}
$re = $this->db->query($sql);
$rows = $re->fetchAll();
echo '<ul>';
foreach($rows as $c)
{
echo '<li><a href="/data/'.$c['uuid'].'">'.$c['title'].'</a></li>';
}
echo '</ul>';
echo $pagnation;
}//文档页面相关数据
function refdatacountAction()
{
if(view::isXmlHttpRequest($this))
{
$id = (int)$this->_getParam('id');
if($id < 1){
echo 0;
return;
}
$sql = "select count(md.id) as total from mdref mr
right join normalmetadata md on md.uuid=mr.uuid
where mr.refid=$id";
$rs = $this->db->query($sql);
$row = $rs->fetch();
echo $row['total'];
}
}
function tagdatalistAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$id = $this->_request->getParam('id');
$page = $this->_getParam('page');
$pageSize = 10;//每页容量
$keys=$this->db->fetchAll("select keyword from knl_keyword where item_id=$id");
$wheresql = array();
$where2sql=array();
foreach ($keys as $k=>$v)
{
//split chinese keyword and english keyword
$k1=explode('(',$v['keyword']);
if (is_array($k1) && count($k1)>1)
{
$k2=substr($k1[1],0,-1);
$wheresql[] = " a.keyword like '%".$k2."%' ";
$where2sql[] = " title like '%".$k2."%' ";
$where2sql[] = " description like '%".$k2."%' ";
}
$wheresql[] = " a.keyword like '%".$k1[0]."%' ";
$where2sql[] = " title like '%".$k1[0]."%' ";
$where2sql[] = " description like '%".$k1[0]."%' ";
}
$wheresql[] = " 1<>1 ";
$wheresql = join(" or ",$wheresql);
$where2sql[] = " 1<>1 ";
$where2sql = join(" or ",$where2sql);
$sql = "select m.title,m.uuid from normalmetadata m where id in (select distinct id from keyword a where $wheresql) or $where2sql";
$pagnation="";
if(isset($page))
{
$page=intval($page);
if($page<0)
{
$page=0;
}
$re = $this->db->query($sql);
$rows = $re->fetchAll();
$num = count($rows);
if( $num > $pageSize)
{
if($page <= 0)
{
$pre = '<span class="disabled">&lt;</span>';
}else{
$pre = '<a href="javascript:void(0);" onClick="showdata('.$id.','. ($page-1) .')">&lt;</a>';
}
if($num <= $pageSize*($page+1))
{
$next = '<span class="disabled">&gt;</span>';
}else{
$next = "<a href=\"javascript:void(0);\" onclick=\"showdata(".$id.",". ($page+1) .")\">&gt;</a>";
}
$pagnation = '<div class="paginationControl">'.$pre.$next.'<span class="disabled">共 '.$num.' 条</span></div>';
}
$sql .="limit $pageSize offset ".$page*$pageSize;
}
else
{
$sql .="limit $pageSize";
}
$re = $this->db->query($sql);
$rows = $re->fetchAll();
echo '<strong>数据和文献存在一定的相关性,仅供参考。</strong><ul>';
foreach($rows as $c)
{
echo '<li><a href="/data/'.$c['uuid'].'">'.$c['title'].'</a></li>';
}
if (!$rows) echo '<li>很抱歉,未找到相关的数据</li>';
echo '</ul>';
echo $pagnation;
}//利用关键词查找的相关数据
function geonetworkAction()
{
//$this->_helper->viewRenderer->setNoRender();
//$this->_helper->layout->disableLayout();
$auth = Zend_Auth::getInstance();
$url = $this->config->geonetwork->url.'/srv/cn/'.urldecode($this->_request->getParam('url'));
if (!$auth->hasIdentity())
{
//$this->_redirect('/account/login?href=/service/geonetwork?url='.$url);
$url = '/account/login?href=/service/geonetwork?url='.$url;
}else{
$user = $auth->getIdentity();
//need to get pwd from database
$sql='select username,md5(password) as pwd from users where id='.$user->id;
$this->db->setFetchMode(Zend_Db::FETCH_OBJ);
$row=$this->db->fetchRow($sql);
$this->view->login=$this->config->geonetwork->url.'srv/en/xml.user.login?username='.$row->username.'&password='.$row->pwd;
}
$this->view->url = $url;
}
//上传申请表
function uploadapplicationformAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$id = $this->_getParam('offlineappid');
if(empty($id))
{
$this->jsonexit(array('error'=>"参数错误"));
return true;
}
$uid = view::User('id');
if(!is_numeric($uid))
{
$this->jsonexit(array('error'=>"用户信息读取失败,请重试"));
return true;
}
$files = new Files();
$FileListener = new FileListener();
@$files->events()->attachAggregate($FileListener);
$statu = $files->uploadApplicationForm($_FILES['Filedata'],$id);
if(isset($statu['error']))
{
$this->jsonexit($statu);
return true;
}else{
$sql = "UPDATE offlineapp SET applicationform='{$statu['file']}' WHERE id=$id AND userid=$uid";
if($this->db->exec($sql))
{
$this->jsonexit(array("success"=>1));
return true;
}else{
$this->jsonexit(array('error'=>"申请表上传失败".$sql));
return true;
}
}
}
//下载申请表
public function downloadapplicationformAction()
{
}
/*
输出验证码
*/
public function imgcodeAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
include_once('ImgCode.php');
$imagecode=new Custom_Controller_Plugin_ImgCode();
$imagecode->image2();
}
//header output
function headerAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$header=file_get_contents('../application/default/views/scripts/header.phtml');
$content='<link rel="stylesheet" type="text/css" media="screen"
href="/css/default.css" />';
$content.=eval('?>'.$header);
$content.='<script src="/js/navi.js" type="text/javascript"></script>';
$this->getResponse()->setHeader('Content-Type', 'text/html')
->setBody($content);
}
//footer output
function footerAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$footer=file_get_contents('../application/default/views/scripts/footer.phtml');
$this->getResponse()->setHeader('Content-Type', 'text/html')
->setBody($footer);
}
//RIS format convert
function risAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid=$this->_request->getParam('uuid');
//文献id
$id=(int)$this->_request->getParam('id');
$lang=$this->_request->getParam('lang');
$ris='';
if ($lang=='cn' && !empty($uuid))
{
$sql="select d.*,m.description,m.ts_published as publish_year from datadoi d left join metadata m on d.uuid=m.uuid where d.uuid='$uuid' and d.ts_published is not null";
$row=$this->db->fetchRow($sql);
$authors=explode(',',str_replace('"','',substr($row['authors'],1,-1)));
$ris.='TY - JOUR'."\r\n";
$ris.='T1 - '.$row['title']."\r\n";
foreach($authors as $a)
{
$ris.='A1 - '.$a."\r\n";
}
$ris.='Y1 - '.(empty($row['publish_year'])?date('Y/m/d',strtotime($row['ts_published'])):date('Y/m/d',strtotime($row['publish_year'])))."\r\n";
$ris.='JF - '.$row['publisher']."\r\n";
$ris.='JA - '.$row['publisher']."\r\n";
$ris.='UR - http://dx.doi.org/'.$row['doi']."\r\n";
$ris.='PB - '.$row['publisher']."\r\n";
$ris.='M3 - doi:'.$row['doi']."\r\n";
$ris.='DO - doi:'.$row['doi']."\r\n";
$ris.='ER -'."\r\n";
}
else if ($lang=='en' && !empty($uuid))
{
$sql="select d.*,m.description,m.ts_published as publish_year from datadoi d left join metadata m on d.uuid=m.uuid where d.uuid='$uuid' and d.ts_published is not null";
$row=$this->db->fetchRow($sql);
$authors=explode(',',str_replace('"','',substr($row['author_en'],1,-1)));
$ris.='TY - JOUR'."\r\n";
$ris.='T1 - '.$row['title_en']."\r\n";
foreach($authors as $a)
{
$ris.='A1 - '.$a."\r\n";
}
$ris.='Y1 - '.(empty($row['publish_year'])?date('Y/m/d',strtotime($row['ts_published'])):date('Y/m/d',strtotime($row['publish_year'])))."\r\n";
$ris.='JF - '.$row['publisher_en']."\r\n";
$ris.='JA - '.$row['publisher_en']."\r\n";
$ris.='UR - http://dx.doi.org/'.$row['doi']."\r\n";
$ris.='PB - '.$row['publisher_en']."\r\n";
$ris.='M3 - doi:'.$row['doi']."\r\n";
$ris.='DO - doi:'.$row['doi']."\r\n";
$ris.='ER -'."\r\n";
} else if ($id) {
$sql="select ris from reference where id=$id";
$row=$this->db->fetchRow($sql);
$ris=$row['ris'];
}
if (!empty($ris))
{
$this->getResponse()->setHeader('Content-Type', 'application/x-Research-Info-Systems')->setHeader('Content-Disposition','attachment; filename="'.$uuid.'.ris"')
//->setHeader('Content-Type','application/force-download')
->setBody($ris);
}
}
//Bibtex format convert
function bibtexAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid=$this->_request->getParam('uuid');
$lang=$this->_request->getParam('lang');
$bib='';
if ($lang=='cn' && !empty($uuid))
{
$sql="select d.*,m.description,m.ts_published as publish_year from datadoi d left join metadata m on d.uuid=m.uuid where d.uuid='$uuid' and d.ts_published is not null";
$row=$this->db->fetchRow($sql);
$bib.='@article{'.$row['doi'].",\r\n";
$bib.=' author = '.str_replace('"','',str_replace(',',' and ',$row['authors'])).",\r\n";
$bib.=' journal = {'.$row['publisher']."},\r\n";
$bib.=' publisher = {'.$row['publisher']."},\r\n";
$bib.=' title = {'.$row['title']."},\r\n";
$bib.=' year = {'.(empty($row['publish_year'])?date('Y',strtotime($row['ts_published'])):date('Y',strtotime($row['publish_year'])))."},\r\n";
$bib.=' month = {'.(empty($row['publish_year'])?date('m',strtotime($row['ts_published'])):date('m',strtotime($row['publish_year'])))."},\r\n";
$bib.=' url = {http://dx.doi.org/'.$row['doi']."},\r\n";
$bib.=' doi = {'.$row['doi']."}\r\n";
$bib.="}\r\n";
}
else if ($lang=='en' && !empty($uuid))
{
$sql="select d.*,m.description,m.ts_published as publish_year from datadoi d left join metadata m on d.uuid=m.uuid where d.uuid='$uuid' and d.ts_published is not null";
$row=$this->db->fetchRow($sql);
$bib.='@article{'.$row['doi'].",\r\n";
$bib.=' author = '.str_replace('"','',str_replace(',',' and ',$row['author_en'])).",\r\n";
$bib.=' journal = {'.$row['publisher_en']."},\r\n";
$bib.=' publisher = {'.$row['publisher_en']."},\r\n";
$bib.=' title = {'.$row['title']."},\r\n";
$bib.=' year = {'.(empty($row['publish_year'])?date('Y',strtotime($row['ts_published'])):date('Y',strtotime($row['publish_year'])))."},\r\n";
$bib.=' month = {'.(empty($row['publish_year'])?date('m',strtotime($row['ts_published'])):date('m',strtotime($row['publish_year'])))."},\r\n";
$bib.=' url = {http://dx.doi.org/'.$row['doi']."},\r\n";
$bib.=' doi = {'.$row['doi']."}\r\n";
$bib.="}\r\n";
}
if (!empty($bib))
{
$this->getResponse()->setHeader('Content-Type', 'application/x-Bibtex')->setHeader('Content-Disposition','attachment; filename="'.$uuid.'.bib"')
//->setHeader('Content-Type','application/force-download')
->setBody($bib);
}
}
function mapsearchAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
include_once("data/Metadata.php");
$md = new Metadata($this->db);
$options = $this->_getParam('opt');
if(isset($options['east']))
$options['east'] = (float)$options['east'];
if(isset($options['west']))
$options['west'] = (float)$options['west'];
if(isset($options['north']))
$options['north'] = (float)$options['north'];
if(isset($options['south']))
$options['south'] = (float)$options['south'];
$data = $md->DatasFilter($options);
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($data,JSON_NUMERIC_CHECK));
return true;
}
function qrcodeAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid = $this->getRequest()->getParam('uuid');
$code_params = array('text' => 'http://westdc.westgis.ac.cn/data/'.$uuid,
'backgroundColor' => '#FFFFFF',
'foreColor' => '#000000',
'padding' => 4, //array(10,5,10,5),
'moduleSize' => 2);
$renderer_params = array('imageType' => 'png');
Zend_Matrixcode::render('qrcode', $code_params, 'image', $renderer_params);
}
public function jsonexit($data){
$this->getResponse()->setHeader('Content-Type', 'application/json')->appendBody(json_encode($data,JSON_NUMERIC_CHECK));
return true;
}
}