2010-11-18 07:24:32 +00:00
< ? 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 -> view -> 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 ()
{
2011-10-26 09:27:11 +00:00
$id = ( int ) $this -> _request -> getParam ( 'id' );
if ( empty ( $id )) {
$uuid = $this -> _request -> getParam ( 'uuid' );
if ( empty ( $uuid )) $this -> _redirect ( '/data' );
2011-11-02 14:07:49 +00:00
$where = $this -> db -> quoteInto ( 'm.uuid = ?' , $uuid );
2011-10-26 09:27:11 +00:00
} else {
2011-11-02 14:07:49 +00:00
$where = $this -> db -> quoteInto ( 'm.id = ?' , $id );
2011-10-26 09:27:11 +00:00
}
2011-11-02 14:07:49 +00:00
$sql = " select t.* from thumbnail t left join metadata m on t.id=m.id where " . $where ;
2011-10-26 09:27:11 +00:00
$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' ]);
}
}
2010-11-18 07:24:32 +00:00
/*
2011-10-28 09:40:00 +00:00
* 查看数据缩略大图
*/
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 -> view -> 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 ;
}
}
/*
2011-10-26 09:27:11 +00:00
* 搜索 , no page , json output
2010-11-18 07:24:32 +00:00
*/
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');
2010-12-02 14:24:57 +00:00
$sql = " select id,title,uuid,description,filesize,fileformat from metadata where east<? and west>? and north<? and south>? " ;
2010-11-18 07:24:32 +00:00
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 -> view -> 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> " ;
}
}
2011-11-02 14:07:49 +00:00
/*
* 转换元数据为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' ]);
$row [ 'rfdenom' ] =@ $dom -> getElementsByTagName ( 'rfDenom' ) -> item ( 0 ) -> nodeValue ;
$row [ 'resolution' ] =@ $dom -> getElementsByTagName ( 'scaleDist' ) -> item ( 0 ) -> nodeValue ;
$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();
}
2010-11-18 07:24:32 +00:00
}