db_designer.lib.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Set of functions related to designer
  5. *
  6. * @package PhpMyAdmin
  7. */
  8. if (! defined('PHPMYADMIN')) {
  9. exit;
  10. }
  11. require_once 'libraries/relation.lib.php';
  12. require_once 'libraries/Template.class.php';
  13. /**
  14. * Function to get html to display a page selector
  15. *
  16. * @param array $cfgRelation information about the configuration storage
  17. * @param string $db database name
  18. *
  19. * @return string html content
  20. */
  21. function PMA_getHtmlForPageSelector($cfgRelation, $db)
  22. {
  23. return PMA\Template::get('database/designer/page_selector')
  24. ->render(
  25. array(
  26. 'db' => $db,
  27. 'cfgRelation' => $cfgRelation
  28. )
  29. );
  30. }
  31. /**
  32. * Function to get html for displaying the page edit/delete form
  33. *
  34. * @param string $db database name
  35. * @param string $operation 'edit' or 'delete' depending on the operation
  36. *
  37. * @return string html content
  38. */
  39. function PMA_getHtmlForEditOrDeletePages($db, $operation)
  40. {
  41. return PMA\Template::get('database/designer/edit_delete_pages')
  42. ->render(
  43. array(
  44. 'db' => $db,
  45. 'operation' => $operation
  46. )
  47. );
  48. }
  49. /**
  50. * Function to get html for displaying the page save as form
  51. *
  52. * @param string $db database name
  53. *
  54. * @return string html content
  55. */
  56. function PMA_getHtmlForPageSaveAs($db)
  57. {
  58. return PMA\Template::get('database/designer/page_save_as')
  59. ->render(
  60. array(
  61. 'db' => $db
  62. )
  63. );
  64. }
  65. /**
  66. * Retrieve IDs and names of schema pages
  67. *
  68. * @param string $db database name
  69. *
  70. * @return array array of schema page id and names
  71. */
  72. function PMA_getPageIdsAndNames($db)
  73. {
  74. $cfgRelation = PMA_getRelationsParam();
  75. $page_query = "SELECT `page_nr`, `page_descr` FROM "
  76. . PMA_Util::backquote($cfgRelation['db']) . "."
  77. . PMA_Util::backquote($cfgRelation['pdf_pages'])
  78. . " WHERE db_name = '" . PMA_Util::sqlAddSlashes($db) . "'"
  79. . " ORDER BY `page_descr`";
  80. $page_rs = PMA_queryAsControlUser(
  81. $page_query, false, PMA_DatabaseInterface::QUERY_STORE
  82. );
  83. $result = array();
  84. while ($curr_page = $GLOBALS['dbi']->fetchAssoc($page_rs)) {
  85. $result[$curr_page['page_nr']] = $curr_page['page_descr'];
  86. }
  87. return $result;
  88. }
  89. /**
  90. * Function to get html for displaying the schema export
  91. *
  92. * @param string $db database name
  93. * @param int $page the page to be exported
  94. *
  95. * @return string
  96. */
  97. function PMA_getHtmlForSchemaExport($db, $page)
  98. {
  99. /* Scan for schema plugins */
  100. /* @var $export_list SchemaPlugin[] */
  101. $export_list = PMA_getPlugins(
  102. "schema",
  103. 'libraries/plugins/schema/',
  104. null
  105. );
  106. /* Fail if we didn't find any schema plugin */
  107. if (empty($export_list)) {
  108. return PMA_Message::error(
  109. __('Could not load schema plugins, please check your installation!')
  110. )->getDisplay();
  111. }
  112. return PMA\Template::get('database/designer/schema_export')
  113. ->render(
  114. array(
  115. 'db' => $db,
  116. 'page' => $page,
  117. 'export_list' => $export_list
  118. )
  119. );
  120. }
  121. /**
  122. * Returns HTML for including some variable to be accessed by JavaScript
  123. *
  124. * @param array $script_tables array on foreign key support for each table
  125. * @param array $script_contr initialization data array
  126. * @param array $script_display_field display fields of each table
  127. * @param int $display_page page number of the selected page
  128. *
  129. * @return string html
  130. */
  131. function PMA_getHtmlForJSFields(
  132. $script_tables, $script_contr, $script_display_field, $display_page
  133. ) {
  134. return PMA\Template::get('database/designer/js_fields')
  135. ->render(
  136. array(
  137. 'script_tables' => $script_tables,
  138. 'script_contr' => $script_contr,
  139. 'script_display_field' => $script_display_field,
  140. 'display_page' => $display_page
  141. )
  142. );
  143. }
  144. /**
  145. * Returns HTML for the menu bar of the designer page
  146. *
  147. * @param boolean $visualBuilder whether this is visual query builder
  148. * @param string $selected_page name of the selected page
  149. * @param array $params_array array with class name for various buttons on side
  150. * menu
  151. *
  152. * @return string html
  153. */
  154. function PMA_getDesignerPageMenu($visualBuilder, $selected_page, $params_array)
  155. {
  156. return PMA\Template::get('database/designer/side_menu')
  157. ->render(
  158. array(
  159. 'visualBuilder' => $visualBuilder,
  160. 'selected_page' => $selected_page,
  161. 'params_array' => $params_array
  162. )
  163. );
  164. }
  165. /**
  166. * Returns array of stored values of Designer Settings
  167. *
  168. * @return array stored values
  169. */
  170. function PMA_getSideMenuParamsArray()
  171. {
  172. $params = array();
  173. $cfgRelation = PMA_getRelationsParam();
  174. if ($GLOBALS['cfgRelation']['designersettingswork']) {
  175. $query = 'SELECT `settings_data` FROM '
  176. . PMA_Util::backquote($cfgRelation['db']) . '.'
  177. . PMA_Util::backquote($cfgRelation['designer_settings'])
  178. . ' WHERE ' . PMA_Util::backquote('username') . ' = "'
  179. . $GLOBALS['cfg']['Server']['user'] . '";';
  180. $result = $GLOBALS['dbi']->fetchSingleRow($query);
  181. $params = json_decode($result['settings_data'], true);
  182. }
  183. return $params;
  184. }
  185. /**
  186. * Returns class names for various buttons on Designer Side Menu
  187. *
  188. * @return array class names of various buttons
  189. */
  190. function PMA_returnClassNamesFromMenuButtons()
  191. {
  192. $classes_array = array();
  193. $params_array = PMA_getSideMenuParamsArray();
  194. if (isset($params_array['angular_direct'])
  195. && $params_array['angular_direct'] == 'angular'
  196. ) {
  197. $classes_array['angular_direct'] = 'M_butt_Selected_down';
  198. } else {
  199. $classes_array['angular_direct'] = 'M_butt';
  200. }
  201. if (isset($params_array['snap_to_grid'])
  202. && $params_array['snap_to_grid'] == 'on'
  203. ) {
  204. $classes_array['snap_to_grid'] = 'M_butt_Selected_down';
  205. } else {
  206. $classes_array['snap_to_grid'] = 'M_butt';
  207. }
  208. if (isset($params_array['pin_text'])
  209. && $params_array['pin_text'] == 'true'
  210. ) {
  211. $classes_array['pin_text'] = 'M_butt_Selected_down';
  212. } else {
  213. $classes_array['pin_text'] = 'M_butt';
  214. }
  215. if (isset($params_array['relation_lines'])
  216. && $params_array['relation_lines'] == 'false'
  217. ) {
  218. $classes_array['relation_lines'] = 'M_butt_Selected_down';
  219. } else {
  220. $classes_array['relation_lines'] = 'M_butt';
  221. }
  222. if (isset($params_array['small_big_all'])
  223. && $params_array['small_big_all'] == 'v'
  224. ) {
  225. $classes_array['small_big_all'] = 'M_butt_Selected_down';
  226. } else {
  227. $classes_array['small_big_all'] = 'M_butt';
  228. }
  229. if (isset($params_array['side_menu'])
  230. && $params_array['side_menu'] == 'true'
  231. ) {
  232. $classes_array['side_menu'] = 'M_butt_Selected_down';
  233. } else {
  234. $classes_array['side_menu'] = 'M_butt';
  235. }
  236. return $classes_array;
  237. }
  238. /**
  239. * Returns HTML for the canvas element
  240. *
  241. * @return string html
  242. */
  243. function PMA_getHTMLCanvas()
  244. {
  245. return PMA\Template::get('database/designer/canvas')->render();
  246. }
  247. /**
  248. * Return HTML for the table list
  249. *
  250. * @param array $tab_pos table positions
  251. * @param int $display_page page number of the selected page
  252. *
  253. * @return string html
  254. */
  255. function PMA_getHTMLTableList($tab_pos, $display_page)
  256. {
  257. return PMA\Template::get('database/designer/table_list')
  258. ->render(
  259. array(
  260. 'tab_pos' => $tab_pos,
  261. 'display_page' => $display_page
  262. )
  263. );
  264. }
  265. /**
  266. * Get HTML to display tables on designer page
  267. *
  268. * @param array $tab_pos tables positions
  269. * @param int $display_page page number of the selected page
  270. * @param array $tab_column table column info
  271. * @param array $tables_all_keys all indices
  272. * @param array $tables_pk_or_unique_keys unique or primary indices
  273. *
  274. * @return string html
  275. */
  276. function PMA_getDatabaseTables(
  277. $tab_pos, $display_page, $tab_column, $tables_all_keys, $tables_pk_or_unique_keys
  278. ) {
  279. return PMA\Template::get('database/designer/database_tables')
  280. ->render(
  281. array(
  282. 'tab_pos' => $tab_pos,
  283. 'display_page' => $display_page,
  284. 'tab_column' => $tab_column,
  285. 'tables_all_keys' => $tables_all_keys,
  286. 'tables_pk_or_unique_keys' => $tables_pk_or_unique_keys
  287. )
  288. );
  289. }
  290. /**
  291. * Returns HTML for the new relations panel.
  292. *
  293. * @return string html
  294. */
  295. function PMA_getNewRelationPanel()
  296. {
  297. return PMA\Template::get('database/designer/new_relation_panel')->render();
  298. }
  299. /**
  300. * Returns HTML for the relations delete panel
  301. *
  302. * @return string html
  303. */
  304. function PMA_getDeleteRelationPanel()
  305. {
  306. return PMA\Template::get('database/designer/delete_relation_panel')->render();
  307. }
  308. /**
  309. * Returns HTML for the options panel
  310. *
  311. * @return string html
  312. */
  313. function PMA_getOptionsPanel()
  314. {
  315. return PMA\Template::get('database/designer/options_panel')->render();
  316. }
  317. /**
  318. * Get HTML for the 'rename to' panel
  319. *
  320. * @return string html
  321. */
  322. function PMA_getRenameToPanel()
  323. {
  324. return PMA\Template::get('database/designer/rename_to_panel')->render();
  325. }
  326. /**
  327. * Returns HTML for the 'having' panel
  328. *
  329. * @return string html
  330. */
  331. function PMA_getHavingQueryPanel()
  332. {
  333. return PMA\Template::get('database/designer/having_query_panel')->render();
  334. }
  335. /**
  336. * Returns HTML for the 'aggregate' panel
  337. *
  338. * @return string html
  339. */
  340. function PMA_getAggregateQueryPanel()
  341. {
  342. return PMA\Template::get('database/designer/aggregate_query_panel')->render();
  343. }
  344. /**
  345. * Returns HTML for the 'where' panel
  346. *
  347. * @return string html
  348. */
  349. function PMA_getWhereQueryPanel()
  350. {
  351. return PMA\Template::get('database/designer/where_query_panel')->render();
  352. }
  353. /**
  354. * Returns HTML for the query details panel
  355. *
  356. * @return string html
  357. */
  358. function PMA_getQueryDetails()
  359. {
  360. return PMA\Template::get('database/designer/query_details')->render();
  361. }