PageRenderTime 38ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/app/plugins/geo/views/helpers/geo_simple.php

https://github.com/minoura/GeoSimple-Plugin
PHP | 149 lines | 96 code | 21 blank | 32 comment | 23 complexity | 8fa1affb40d854f09207a3ff5de9268c MD5 | raw file
  1. <?php
  2. // 携帯ライブラリ
  3. require_once(VENDORS.'ecw'.DS.'lib3gk.php');
  4. // 距離計算ライブラリの読込み
  5. App::import('Vendor', 'Geo.GeoSimple');
  6. class GeoSimpleHelper extends Helper {
  7. var $helpers = array('Html', 'Javascript');
  8. #####################################################
  9. /**
  10. * GPS機能の判別 (分岐条件は要検証)
  11. * 0: PC/iPhone等
  12. * 1: 基地局レベル
  13. * 2: GPS端末
  14. *
  15. */
  16. #####################################################
  17. function getGpsType(){
  18. $agent = @$_SERVER['HTTP_USER_AGENT'];
  19. $lib3gk = Lib3gk::get_instance();
  20. $carrier = $lib3gk->get_carrier();
  21. switch($carrier){
  22. case KTAI_CARRIER_DOCOMO:
  23. $info = $lib3gk->get_machineinfo();
  24. if( preg_match('/^DoCoMo\\/2\\.0\\ /', $agent) &&
  25. !in_array($info['machine_name'], array(
  26. 'F884i','F801i','F905iBiz','SO905iCS','N905iBiz','N905imyu','SO905i','F905i','P905i','N905i','D905i','SH905i','P904i','D904i',
  27. 'F904i','N904i','SH904i','F883iESS','F883iES','F903iBSC','SO903i','F903i','D903i','N903i','P903i','SH903i','SA800i','SA702i',
  28. 'SA700iS','F661i','F884iES','N906iL','P906i','SO906i','SH906i','N906imyu','F906i','N906i','F01A','F03A','F06A',
  29. 'F05A','P01A','P02A','SH01A','SH02A','SH03A','SH04A','N01A','N02A','P07A3','N06A3','N08A3','P08A3','P09A3','N09A3','F09A3',
  30. 'SH05A3','SH06A3','SH07A3'))
  31. ){
  32. return array($carrier, 2);
  33. }else{
  34. return array($carrier, 1);
  35. }
  36. case KTAI_CARRIER_KDDI:
  37. return array($carrier, 2);
  38. case KTAI_CARRIER_SOFTBANK:
  39. if(preg_match("/^(Softbank|Vodafone|MOT\-[CV]|Vemulator)/i", $agent)){
  40. return array($carrier, 2);
  41. }else{
  42. return array($carrier, 1);
  43. }
  44. }
  45. return array(0, 0);
  46. }
  47. #####################################################
  48. /**
  49. * GPS用のリンクを生成
  50. */
  51. #####################################################
  52. function geoLink($title, $url = null, $htmlAttributes = array(), $confirmMessage = false, $escapeTitle = true){
  53. // 一旦通常リンクを生成
  54. $htmlLink = $this->Html->link($title, $url, $htmlAttributes, $confirmMessage, $escapeTitle);
  55. // リンクを分解
  56. $parser = xml_parser_create();
  57. if(!xml_parse_into_struct($parser, $htmlLink, $vals, $index) || empty($vals)){
  58. return $htmlLink;
  59. }
  60. xml_parser_free($parser);
  61. $attrs = array();
  62. foreach($vals[0]['attributes'] as $k => $v){
  63. $k = strtolower($k);
  64. if($k == 'href'){
  65. $url = $v;
  66. }else{
  67. $attrs[] = sprintf('"%s"="%s"', $k, $v);
  68. }
  69. }
  70. if(isset($vals[0]) && isset($vals[0]['value'])){
  71. $title = $vals[0]['value'];
  72. }
  73. $attr = implode(' ', $attrs);
  74. // リンクURLを絶対パスに変更する
  75. if(strpos($url, 'http', 0) !== 0){
  76. $url = 'http://' . $_SERVER['HTTP_HOST']. $url;
  77. }
  78. list($carrier, $gpsType) = $this->getGpsType();
  79. if($carrier === KTAI_CARRIER_DOCOMO && $gpsType === 1){
  80. return sprintf('<a href="http://w1m.docomo.ne.jp/cp/iarea?ecode=OPENAREACODE&msn=OPENAREAKEY&posinfo=1&nl=%s" %s>%s</a>', urlencode($url), $attr, $title);
  81. }
  82. if($carrier === KTAI_CARRIER_DOCOMO && $gpsType === 2){
  83. return sprintf('<a href="%s" %s lcs>%s</a>', $url, $attr, $title);
  84. }
  85. if($carrier === KTAI_CARRIER_KDDI && $gpsType === 1){
  86. return sprintf('<a href="device:location?url=%s" %s>%s</a>', $url, $attr, $title);
  87. }
  88. if($carrier === KTAI_CARRIER_KDDI && $gpsType === 2){
  89. return sprintf('<a href="device:gpsone?url=%s&ver=1&datum=0&acry=0&number=0" %s>%s</a>', $url, $attr, $title);
  90. }
  91. if($carrier === KTAI_CARRIER_SOFTBANK && $gpsType === 1){
  92. return sprintf('<a href="location:cell?url=%s" %s>%s</a>', $url, $attr, $title);
  93. }
  94. if($carrier === KTAI_CARRIER_SOFTBANK && $gpsType === 2){
  95. return sprintf('<a href="location:gps?url=%s" %s>%s</a>', $url, $attr, $title);
  96. }
  97. // 携帯以外はブラウザ側のJavaScriptで位置情報APIにより取得
  98. $jsPath = DS. 'geo'. DS. 'js'. DS;
  99. // for Android
  100. if(strpos($_SERVER['HTTP_USER_AGENT'], 'Android')){
  101. // $this->Javascript->link('http://code.google.com/intl/ja-JP/apis/gears/gears_init.js', false);
  102. $this->Javascript->link($jsPath. 'gears_init.js', false);
  103. }
  104. $this->Javascript->link($jsPath. 'geo_simple.js', false);
  105. return sprintf('<a href="javascript:geo_simple_link(\'%s\')" %s>%s</a>', $url, $attr, $title);
  106. }
  107. #####################################################
  108. /**
  109. * GoogleMap用のリンクを生成
  110. */
  111. #####################################################
  112. function gmapLink($title, $lat, $lng, $zoom=15, $htmlAttributes = array(), $confirmMessage = false, $escapeTitle = true){
  113. $url = sprintf('http://maps.google.com/?z=%s&q=%s,%s(%s)', $zoom, $lat, $lng, $title);
  114. if(!isset($htmlAttributes['target'])){
  115. $htmlAttributes['target'] = '_blank';
  116. }
  117. return $this->Html->link($title, $url, $htmlAttributes, $confirmMessage, $escapeTitle);
  118. }
  119. #####################################################
  120. /**
  121. * 2地点間の距離計算
  122. */
  123. #####################################################
  124. function distance(){
  125. $args = func_get_args();
  126. return call_user_func_array(array('GeoSimple', 'distance'), $args);
  127. }
  128. }