/libraries/controllers/table/TableGisVisualizationController.php

https://gitlab.com/trungthao379/phpmyadmin · PHP · 214 lines · 136 code · 25 blank · 53 comment · 22 complexity · 6c10948351300927d1da337d39f3903b MD5 · raw file

  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Holds the PMA\TableIndexesController
  5. *
  6. * @package PMA
  7. */
  8. namespace PMA\libraries\controllers\table;
  9. use PMA\libraries\controllers\TableController;
  10. use PMA\libraries\Message;
  11. use PMA\libraries\Template;
  12. use PMA\libraries\gis\GISVisualization;
  13. use PMA\libraries\URL;
  14. require_once 'libraries/common.inc.php';
  15. require_once 'libraries/db_common.inc.php';
  16. /**
  17. * Class TableGisVisualizationController
  18. *
  19. * @package PMA\libraries\controllers\table
  20. */
  21. class TableGisVisualizationController extends TableController
  22. {
  23. /**
  24. * @var array $url_params
  25. */
  26. protected $url_params;
  27. /**
  28. * @var string $sql_query
  29. */
  30. protected $sql_query;
  31. /**
  32. * @var array $visualizationSettings
  33. */
  34. protected $visualizationSettings;
  35. /**
  36. * @var \PMA\libraries\gis\GISVisualization $visualization
  37. */
  38. protected $visualization;
  39. /**
  40. * Constructor
  41. *
  42. * @param string $sql_query SQL query for retrieving GIS data
  43. * @param array $url_params array of URL parameters
  44. * @param string $goto goto script
  45. * @param string $back back script
  46. * @param array $visualizationSettings visualization settings
  47. */
  48. public function __construct(
  49. $sql_query,
  50. $url_params,
  51. $goto,
  52. $back,
  53. $visualizationSettings
  54. ) {
  55. parent::__construct();
  56. $this->sql_query = $sql_query;
  57. $this->url_params = $url_params;
  58. $this->url_params['goto'] = $goto;
  59. $this->url_params['back'] = $back;
  60. $this->visualizationSettings = $visualizationSettings;
  61. }
  62. /**
  63. * Save to file
  64. *
  65. * @return void
  66. */
  67. public function saveToFileAction()
  68. {
  69. $this->response->disable();
  70. $file_name = $this->visualizationSettings['spatialColumn'];
  71. $save_format = $_REQUEST['fileFormat'];
  72. $this->visualization->toFile($file_name, $save_format);
  73. }
  74. /**
  75. * Index
  76. *
  77. * @return void
  78. */
  79. public function indexAction()
  80. {
  81. // Throw error if no sql query is set
  82. if (! isset($this->sql_query) || $this->sql_query == '') {
  83. $this->response->setRequestStatus(false);
  84. $this->response->addHTML(
  85. Message::error(__('No SQL query was set to fetch data.'))
  86. );
  87. return;
  88. }
  89. // Execute the query and return the result
  90. $result = $this->dbi->tryQuery($this->sql_query);
  91. // Get the meta data of results
  92. $meta = $this->dbi->getFieldsMeta($result);
  93. // Find the candidate fields for label column and spatial column
  94. $labelCandidates = array();
  95. $spatialCandidates = array();
  96. foreach ($meta as $column_meta) {
  97. if ($column_meta->type == 'geometry') {
  98. $spatialCandidates[] = $column_meta->name;
  99. } else {
  100. $labelCandidates[] = $column_meta->name;
  101. }
  102. }
  103. // Get settings if any posted
  104. if (PMA_isValid($_REQUEST['visualizationSettings'], 'array')) {
  105. $this->visualizationSettings = $_REQUEST['visualizationSettings'];
  106. }
  107. if (!isset($this->visualizationSettings['labelColumn'])
  108. && isset($labelCandidates[0])
  109. ) {
  110. $this->visualizationSettings['labelColumn'] = '';
  111. }
  112. // If spatial column is not set, use first geometric column as spatial column
  113. if (! isset($this->visualizationSettings['spatialColumn'])) {
  114. $this->visualizationSettings['spatialColumn'] = $spatialCandidates[0];
  115. }
  116. // Convert geometric columns from bytes to text.
  117. $pos = isset($_REQUEST['pos']) ? $_REQUEST['pos']
  118. : $_SESSION['tmpval']['pos'];
  119. if (isset($_REQUEST['session_max_rows'])) {
  120. $rows = $_REQUEST['session_max_rows'];
  121. } else {
  122. if ($_SESSION['tmpval']['max_rows'] != 'all') {
  123. $rows = $_SESSION['tmpval']['max_rows'];
  124. } else {
  125. $rows = $GLOBALS['cfg']['MaxRows'];
  126. }
  127. }
  128. $this->visualization = GISVisualization::get(
  129. $this->sql_query,
  130. $this->visualizationSettings,
  131. $rows,
  132. $pos
  133. );
  134. if (isset($_REQUEST['saveToFile'])) {
  135. $this->saveToFileAction();
  136. return;
  137. }
  138. $this->response->getHeader()->getScripts()->addFiles(
  139. array(
  140. 'openlayers/OpenLayers.js',
  141. 'jquery/jquery.svg.js',
  142. 'tbl_gis_visualization.js',
  143. )
  144. );
  145. // If all the rows contain SRID, use OpenStreetMaps on the initial loading.
  146. if (! isset($_REQUEST['displayVisualization'])) {
  147. if ($this->visualization->hasSrid()) {
  148. $this->visualizationSettings['choice'] = 'useBaseLayer';
  149. } else {
  150. unset($this->visualizationSettings['choice']);
  151. }
  152. }
  153. $this->visualization->setUserSpecifiedSettings($this->visualizationSettings);
  154. if ($this->visualizationSettings != null) {
  155. foreach ($this->visualization->getSettings() as $setting => $val) {
  156. if (! isset($this->visualizationSettings[$setting])) {
  157. $this->visualizationSettings[$setting] = $val;
  158. }
  159. }
  160. }
  161. /**
  162. * Displays the page
  163. */
  164. $this->url_params['sql_query'] = $this->sql_query;
  165. $downloadUrl = 'tbl_gis_visualization.php' . URL::getCommon(
  166. array_merge(
  167. $this->url_params,
  168. array(
  169. 'saveToFile' => true,
  170. 'session_max_rows' => $rows,
  171. 'pos' => $pos
  172. )
  173. )
  174. );
  175. $html = Template::get('table/gis_visualization/gis_visualization')->render(
  176. array(
  177. 'url_params' => $this->url_params,
  178. 'downloadUrl' => $downloadUrl,
  179. 'labelCandidates' => $labelCandidates,
  180. 'spatialCandidates' => $spatialCandidates,
  181. 'visualizationSettings' => $this->visualizationSettings,
  182. 'sql_query' => $this->sql_query,
  183. 'visualization' => $this->visualization->toImage('svg'),
  184. 'drawOl' => $this->visualization->asOl()
  185. )
  186. );
  187. $this->response->addHTML($html);
  188. }
  189. }