browse_foreigners.lib.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Contains functions used by browse_foreigners.php
  5. *
  6. * @package PhpMyAdmin
  7. */
  8. if (! defined('PHPMYADMIN')) {
  9. exit;
  10. }
  11. /**
  12. * Function to get html for relational field selection
  13. *
  14. * @param string $db current database
  15. * @param string $table current table
  16. * @param string $field field
  17. * @param array $foreignData foreign column data
  18. * @param string $fieldkey field key
  19. * @param array $data data
  20. *
  21. * @return string
  22. */
  23. function PMA_getHtmlForRelationalFieldSelection($db, $table, $field, $foreignData,
  24. $fieldkey, $data
  25. ) {
  26. $gotopage = PMA_getHtmlForGotoPage($foreignData);
  27. $showall = PMA_getHtmlForShowAll($foreignData);
  28. $output = '<form action="browse_foreigners.php" method="post">'
  29. . '<fieldset>'
  30. . PMA_URL_getHiddenInputs($db, $table)
  31. . '<input type="hidden" name="field" value="' . htmlspecialchars($field)
  32. . '" />'
  33. . '<input type="hidden" name="fieldkey" value="'
  34. . (isset($fieldkey) ? htmlspecialchars($fieldkey) : '') . '" />';
  35. if (isset($_REQUEST['rownumber'])) {
  36. $output .= '<input type="hidden" name="rownumber" value="'
  37. . htmlspecialchars($_REQUEST['rownumber']) . '" />';
  38. }
  39. $output .= '<span class="formelement">'
  40. . '<label for="input_foreign_filter">' . __('Search:') . '</label>'
  41. . '<input type="text" name="foreign_filter" '
  42. . 'id="input_foreign_filter" value="'
  43. . (isset($_REQUEST['foreign_filter'])
  44. ? htmlspecialchars($_REQUEST['foreign_filter'])
  45. : '')
  46. . '" />'
  47. . '<input type="submit" name="submit_foreign_filter" value="'
  48. . __('Go') . '" />'
  49. . '</span>'
  50. . '<span class="formelement">' . $gotopage . '</span>'
  51. . '<span class="formelement">' . $showall . '</span>'
  52. . '</fieldset>'
  53. . '</form>';
  54. $output .= '<table width="100%">';
  55. if (!is_array($foreignData['disp_row'])) {
  56. $output .= '</tbody>'
  57. . '</table>';
  58. return $output;
  59. }
  60. $header = '<tr>
  61. <th>' . __('Keyname') . '</th>
  62. <th>' . __('Description') . '</th>
  63. <td width="20%"></td>
  64. <th>' . __('Description') . '</th>
  65. <th>' . __('Keyname') . '</th>
  66. </tr>';
  67. $output .= '<thead>' . $header . '</thead>' . "\n"
  68. . '<tfoot>' . $header . '</tfoot>' . "\n"
  69. . '<tbody>' . "\n";
  70. $descriptions = array();
  71. $keys = array();
  72. foreach ($foreignData['disp_row'] as $relrow) {
  73. if ($foreignData['foreign_display'] != false) {
  74. $descriptions[] = $relrow[$foreignData['foreign_display']];
  75. } else {
  76. $descriptions[] = '';
  77. }
  78. $keys[] = $relrow[$foreignData['foreign_field']];
  79. }
  80. asort($keys);
  81. $hcount = 0;
  82. $odd_row = true;
  83. $indexByDescription = 0;
  84. // whether the keyname corresponds to the selected value in the form
  85. $rightKeynameIsSelected = false;
  86. $leftKeynameIsSelected = false;
  87. foreach ($keys as $indexByKeyname => $value) {
  88. $hcount++;
  89. if ($GLOBALS['cfg']['RepeatCells'] > 0
  90. && $hcount > $GLOBALS['cfg']['RepeatCells']
  91. ) {
  92. $output .= $header;
  93. $hcount = 0;
  94. $odd_row = true;
  95. }
  96. // keynames and descriptions for the left section,
  97. // sorted by keynames
  98. $leftKeyname = $keys[$indexByKeyname];
  99. list(
  100. $leftDescription,
  101. $leftDescriptionTitle
  102. ) = PMA_getDescriptionAndTitle($descriptions[$indexByKeyname]);
  103. // keynames and descriptions for the right section,
  104. // sorted by descriptions
  105. $rightKeyname = $keys[$indexByDescription];
  106. list(
  107. $rightDescription,
  108. $rightDescriptionTitle
  109. ) = PMA_getDescriptionAndTitle($descriptions[$indexByDescription]);
  110. $indexByDescription++;
  111. if (! empty($data)) {
  112. $rightKeynameIsSelected = $rightKeyname == $data;
  113. $leftKeynameIsSelected = $leftKeyname == $data;
  114. }
  115. $output .= '<tr class="noclick ' . ($odd_row ? 'odd' : 'even') . '">';
  116. $odd_row = ! $odd_row;
  117. $output .= PMA_getHtmlForColumnElement(
  118. 'class="nowrap"', $leftKeynameIsSelected,
  119. $leftKeyname, $leftDescription,
  120. $leftDescriptionTitle, $field
  121. );
  122. $output .= PMA_getHtmlForColumnElement(
  123. '', $leftKeynameIsSelected, $leftKeyname,
  124. $leftDescription, $leftDescriptionTitle, $field
  125. );
  126. $output .= '<td width="20%">'
  127. . '<img src="' . $GLOBALS['pmaThemeImage'] . 'spacer.png" alt=""'
  128. . ' width="1" height="1" /></td>';
  129. $output .= PMA_getHtmlForColumnElement(
  130. '', $rightKeynameIsSelected, $leftKeyname,
  131. $rightDescription, $rightDescriptionTitle, $field
  132. );
  133. $output .= PMA_getHtmlForColumnElement(
  134. 'class="nowrap"', $rightKeynameIsSelected,
  135. $rightKeyname, $rightDescription,
  136. $rightDescriptionTitle, $field
  137. );
  138. $output .= '</tr>';
  139. } // end while
  140. $output .= '</tbody>'
  141. . '</table>';
  142. return $output;
  143. }
  144. /**
  145. * Get the description (possibly truncated) and the title
  146. *
  147. * @param string $description the keyname's description
  148. *
  149. * @return array the new description and title
  150. */
  151. function PMA_getDescriptionAndTitle($description)
  152. {
  153. $pmaString = $GLOBALS['PMA_String'];
  154. $limitChars = $GLOBALS['cfg']['LimitChars'];
  155. if ($pmaString->strlen($description) <= $limitChars) {
  156. $description = htmlspecialchars(
  157. $description
  158. );
  159. $descriptionTitle = '';
  160. } else {
  161. $descriptionTitle = htmlspecialchars(
  162. $description
  163. );
  164. $description = htmlspecialchars(
  165. $pmaString->substr(
  166. $description, 0, $limitChars
  167. )
  168. . '...'
  169. );
  170. }
  171. return array($description, $descriptionTitle);
  172. }
  173. /**
  174. * Function to get html for each column element
  175. *
  176. * @param string $cssClass class="nowrap" or ''
  177. * @param bool $isSelected whether current equals form's value
  178. * @param string $keyname current key
  179. * @param string $description current value
  180. * @param string $title current title
  181. * @param string $field field
  182. *
  183. * @return string
  184. */
  185. function PMA_getHtmlForColumnElement($cssClass, $isSelected, $keyname,
  186. $description, $title, $field
  187. ) {
  188. $output = '<td ' . $cssClass . '>'
  189. . ($isSelected ? '<strong>' : '')
  190. . '<a href="#" title="' . __('Use this value')
  191. . ($title != ''
  192. ? ': ' . $title
  193. : '')
  194. . '" onclick="formupdate(\'' . md5($field) . '\', \''
  195. . PMA_jsFormat($keyname, false)
  196. . '\'); return false;">';
  197. if ($cssClass !== '') {
  198. $output .= htmlspecialchars($keyname);
  199. } else {
  200. $output .= $description;
  201. }
  202. $output .= '</a>' . ($isSelected ? '</strong>' : '') . '</td>';
  203. return $output;
  204. }
  205. /**
  206. * Function to get javascript code to handle display selection for relational
  207. * field values
  208. *
  209. * @return string
  210. */
  211. function PMA_getJsScriptToHandleSelectRelationalFields()
  212. {
  213. $element_name = PMA_getElementName();
  214. $fieldkey = PMA_getFieldKey();
  215. $error = PMA_getJsError();
  216. $code = <<<EOC
  217. self.focus();
  218. function formupdate(fieldmd5, key) {
  219. var \$inline = window.opener.jQuery('.browse_foreign_clicked');
  220. if (\$inline.length != 0) {
  221. \$inline.removeClass('browse_foreign_clicked')
  222. // for grid editing,
  223. // puts new value in the previous element which is
  224. // a span with class curr_value, and trigger .change()
  225. .prev('.curr_value').text(key).change();
  226. // for zoom-search editing, puts new value in the previous
  227. // element which is an input field
  228. \$inline.prev('input[type=text]').val(key);
  229. self.close();
  230. return false;
  231. }
  232. if (opener && opener.document && opener.document.insertForm) {
  233. var field = 'fields';
  234. var field_null = 'fields_null';
  235. $element_name
  236. var element_name_alt = field + '[$fieldkey]';
  237. if (opener.document.insertForm.elements[element_name]) {
  238. // Edit/Insert form
  239. opener.document.insertForm.elements[element_name].value = key;
  240. if (opener.document.insertForm.elements[null_name]) {
  241. opener.document.insertForm.elements[null_name].checked = false;
  242. }
  243. self.close();
  244. return false;
  245. } else if (opener.document.insertForm.elements[element_name_alt]) {
  246. // Search form
  247. opener.document.insertForm.elements[element_name_alt].value = key;
  248. self.close();
  249. return false;
  250. }
  251. }
  252. alert('$error');
  253. }
  254. EOC;
  255. return $code;
  256. }
  257. /**
  258. * Function to get formatted error message for javascript
  259. *
  260. * @return string
  261. */
  262. function PMA_getJsError()
  263. {
  264. return PMA_jsFormat(
  265. __(
  266. 'The target browser window could not be updated. '
  267. . 'Maybe you have closed the parent window, or '
  268. . 'your browser\'s security settings are '
  269. . 'configured to block cross-window updates.'
  270. )
  271. );
  272. }
  273. /**
  274. * Function to get the field key
  275. *
  276. * @return string
  277. */
  278. function PMA_getFieldKey()
  279. {
  280. if (! isset($_REQUEST['fieldkey']) || ! is_numeric($_REQUEST['fieldkey'])) {
  281. $fieldkey = 0;
  282. } else {
  283. $fieldkey = $_REQUEST['fieldkey'];
  284. }
  285. return $fieldkey;
  286. }
  287. /**
  288. * Function to get the element name
  289. *
  290. * @return string
  291. */
  292. function PMA_getElementName()
  293. {
  294. // When coming from Table/Zoom search
  295. if (isset($_REQUEST['fromsearch'])) {
  296. // In table or zoom search, input fields are named "criteriaValues"
  297. $element_name = " var field = 'criteriaValues';\n";
  298. } else {
  299. // In insert/edit, input fields are named "fields"
  300. $element_name = " var field = 'fields';\n";
  301. }
  302. if (isset($_REQUEST['rownumber'])) {
  303. $element_name .= " var element_name = field + '[multi_edit]["
  304. . htmlspecialchars($_REQUEST['rownumber']) . "][' + fieldmd5 + ']';\n"
  305. . " var null_name = field_null + '[multi_edit]["
  306. . htmlspecialchars($_REQUEST['rownumber']) . "][' + fieldmd5 + ']';\n";
  307. } else {
  308. $element_name .= "var element_name = field + '[]'";
  309. }
  310. return $element_name;
  311. }
  312. /**
  313. * Function to get html for show all case
  314. *
  315. * @param array $foreignData foreign data
  316. *
  317. * @return string
  318. */
  319. function PMA_getHtmlForShowAll($foreignData)
  320. {
  321. $showall = '';
  322. if (is_array($foreignData['disp_row'])) {
  323. if ($GLOBALS['cfg']['ShowAll']
  324. && ($foreignData['the_total'] > $GLOBALS['cfg']['MaxRows'])
  325. ) {
  326. $showall = '<input type="submit" name="foreign_navig" value="'
  327. . __('Show all') . '" />';
  328. }
  329. }
  330. return $showall;
  331. }
  332. /**
  333. * Function to get html for the goto page option
  334. *
  335. * @param array $foreignData foreign data
  336. *
  337. * @return string
  338. */
  339. function PMA_getHtmlForGotoPage($foreignData)
  340. {
  341. $gotopage = '';
  342. isset($_REQUEST['pos']) ? $pos = $_REQUEST['pos'] : $pos = 0;
  343. if (!is_array($foreignData['disp_row'])) {
  344. return $gotopage;
  345. }
  346. $session_max_rows = $GLOBALS['cfg']['MaxRows'];
  347. $pageNow = @floor($pos / $session_max_rows) + 1;
  348. $nbTotalPage = @ceil($foreignData['the_total'] / $session_max_rows);
  349. if ($foreignData['the_total'] > $GLOBALS['cfg']['MaxRows']) {
  350. $gotopage = PMA_Util::pageselector(
  351. 'pos',
  352. $session_max_rows,
  353. $pageNow,
  354. $nbTotalPage,
  355. 200,
  356. 5,
  357. 5,
  358. 20,
  359. 10,
  360. __('Page number:')
  361. );
  362. }
  363. return $gotopage;
  364. }
  365. /**
  366. * Function to get foreign limit
  367. *
  368. * @param string $foreign_navig foreign navigation
  369. *
  370. * @return string
  371. */
  372. function PMA_getForeignLimit($foreign_navig)
  373. {
  374. if (isset($foreign_navig) && $foreign_navig == __('Show all')) {
  375. return null;
  376. }
  377. isset($_REQUEST['pos']) ? $pos = $_REQUEST['pos'] : $pos = 0;
  378. return 'LIMIT ' . $pos . ', ' . $GLOBALS['cfg']['MaxRows'] . ' ';
  379. }
  380. ?>