MyBootstrap.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. <?php
  2. /**
  3. * Basic bootstrap stuff
  4. *
  5. * Note: Do not use App::uses() to include this file.
  6. * Use App::import('Lib', 'Tools.Bootstrap/MyBootstrap'); as noted in the readme.
  7. */
  8. App::uses('Utility', 'Tools.Utility');
  9. # You can also use FULL_BASE_URL (cake) instead of HTTP_BASE
  10. if (!empty($_SERVER['HTTP_HOST'])) {
  11. define('HTTP_HOST', $_SERVER['HTTP_HOST']);
  12. define('HTTP_BASE', 'http://' . HTTP_HOST); //FULL_BASE_URL
  13. } else {
  14. define('HTTP_HOST', '');
  15. define('HTTP_BASE', '');
  16. }
  17. if (!empty($_SERVER['PHP_SELF'])) {
  18. define('HTTP_SELF', '' . $_SERVER['PHP_SELF']);
  19. }
  20. if (!empty($_SERVER['REQUEST_URI'])) {
  21. define('HTTP_URI', '' . $_SERVER['REQUEST_URI']);
  22. }
  23. if (!empty($_SERVER['HTTP_REFERER'])) {
  24. define('HTTP_REF', '' . $_SERVER['HTTP_REFERER']);
  25. }
  26. define('CHOWN_PUBLIC', 0770);
  27. # Useful when putting a string together that needs some "pretty" html-doc. source layouting
  28. # Only visible in SOURCE code (not in html layout in the browser)
  29. //define('LF',''); // line feed (depending on the system)
  30. define('LF', PHP_EOL); // line feed (depending on the system): \n or \n\r etc.
  31. # Alternativly NL,CR:
  32. define('NL', "\n"); // new line
  33. define('CR', "\r"); // carriage return
  34. define('TB', "\t"); // tabulator
  35. # Useful for html layouting
  36. # Visible in the Html Layout in the Browser
  37. define('BR', '<br />'); // line break
  38. # Make the app and l10n play nice with Windows.
  39. if (substr(PHP_OS, 0, 3) === 'WIN') { // || strpos(@php_uname(), 'ARCH')
  40. define('WINDOWS', true);
  41. } else {
  42. define('WINDOWS', false);
  43. }
  44. define('FORMAT_DB_DATETIME', 'Y-m-d H:i:s'); // date(...)
  45. define('FORMAT_DB_DATE', 'Y-m-d');
  46. define('FORMAT_DB_TIME', 'H:i:s');
  47. define('DEFAULT_DATETIME', '0000-00-00 00:00:00');
  48. define('DEFAULT_DATE', '0000-00-00');
  49. define('DEFAULT_TIME', '00:00:00');
  50. # workpaths
  51. define('FILES', APP . 'files' . DS);
  52. define('LOCALE', APP . 'locale' . DS);
  53. if (!defined('CLASS_USER')) {
  54. define('CLASS_USER', 'User');
  55. }
  56. # Validation ## (minus should be "hyphen")
  57. /** Valid characters: letters only */
  58. define('VALID_ALPHA', '/^[a-zA-Z]+$/');
  59. /** Valid characters: letters,underscores only */
  60. define('VALID_ALPHA_UNDERSCORES', '/^[a-zA-Z_]+$/');
  61. /** Valid characters: letters,underscores,minus only */
  62. define('VALID_ALPHA_MINUS_UNDERSCORES', '/^[a-zA-Z_-]+$/');
  63. /** Valid characters: letters,spaces only */
  64. define('VALID_ALPHA_WHITESPACES', '/^[a-zA-Z ]+$/');
  65. /** Valid characters: letters,numbers,underscores only */
  66. define('VALID_ALPHANUMERIC_UNDERSCORES', '/^[\da-zA-Z_]+$/');
  67. /** Valid characters: letters,numbers,underscores,minus only */
  68. define('VALID_ALPHANUMERIC_MINUS_UNDERSCORES', '/^[\da-zA-Z_-]+$/');
  69. /** Valid characters: letters,numbers,spaces only */
  70. define('VALID_ALPHANUMERIC_WHITESPACES', '/^[\da-zA-Z ]+$/');
  71. /** Valid characters: letters,numbers,spaces,underscores only */
  72. define('VALID_ALPHANUMERIC_WHITESPACES_UNDERSCORES', '/^[\da-zA-Z _]+$/');
  73. /** Valid characters: numbers,underscores only */
  74. define('VALID_NUMERIC_UNDERSCORES', '/^[\d_]+$/');
  75. /** Valid characters: numbers,spaces only */
  76. define('VALID_NUMERIC_WHITESPACES', '/^[\d ]+$/');
  77. /** Valid characters: numbers,spaces,underscores only */
  78. define('VALID_NUMERIC_WHITESPACES_UNDERSCORES', '/^[\d _]+$/');
  79. /** Valid integers: > 0 */
  80. define('VALID_INTEGERS', '/^[\d]+$/'); //??
  81. if (!defined('FORMAT_NICE_YMDHMS')) {
  82. define('FORMAT_NICE_YMDHMS','d.m.Y, H:i:s');
  83. define('FORMAT_NICE_YMDHM','d.m.Y, H:i');
  84. define('FORMAT_NICE_YM','m.Y');
  85. define('FORMAT_NICE_YMD','d.m.Y');
  86. define('FORMAT_NICE_MD','d.m.');
  87. define('FORMAT_NICE_D','d'); # xx
  88. define('FORMAT_NICE_W_NUM','w'); # xx (0=sunday to 6=saturday)
  89. define('FORMAT_NICE_W_ABBR','D'); # needs manual translation
  90. define('FORMAT_NICE_W_FULL','l'); # needs manual translation
  91. define('FORMAT_NICE_M','m'); # xx
  92. define('FORMAT_NICE_M_ABBR','M'); # needs manual translation
  93. define('FORMAT_NICE_M_FULL','F'); # needs manual translation
  94. define('FORMAT_NICE_Y_ABBR','y'); # xx
  95. define('FORMAT_NICE_Y','Y'); # xxxx
  96. define('FORMAT_NICE_HM','H:i');
  97. define('FORMAT_NICE_HMS','H:i:s');
  98. # localDate strings
  99. define('FORMAT_LOCAL_WA_YMDHMS','%a, %d.%m.%Y, %H:%M:%S');
  100. define('FORMAT_LOCAL_WF_YMDHMS','%A, %d.%m.%Y, %H:%M:%S');
  101. define('FORMAT_LOCAL_WA_YMDHM','%a, %d.%m.%Y, %H:%M');
  102. define('FORMAT_LOCAL_WF_YMDHM','%A, %d.%m.%Y, %H:%M');
  103. define('FORMAT_LOCAL_YMDHMS','%d.%m.%Y, %H:%M:%S');
  104. define('FORMAT_LOCAL_YMDHM','%d.%m.%Y, %H:%M');
  105. define('FORMAT_LOCAL_YMD','%d.%m.%Y');
  106. define('FORMAT_LOCAL_MD','%d.%m.');
  107. define('FORMAT_LOCAL_D','%d'); # xx
  108. define('FORMAT_LOCAL_W_NUM','%w'); # xx (0=sunday to 6=saturday)
  109. define('FORMAT_LOCAL_W_ABBR','%a'); # needs translation
  110. define('FORMAT_LOCAL_W_FULL','%A'); # needs translation
  111. define('FORMAT_LOCAL_M','%m'); # xx
  112. define('FORMAT_LOCAL_M_ABBR','%b'); # needs translation
  113. define('FORMAT_LOCAL_M_FULL','%B'); # needs translation
  114. define('FORMAT_LOCAL_Y_ABBR','%y'); # xx
  115. define('FORMAT_LOCAL_Y','%Y'); # xxxx
  116. define('FORMAT_LOCAL_H','%H');
  117. define('FORMAT_LOCAL_S','%S');
  118. define('FORMAT_LOCAL_HM','%H:%i');
  119. define('FORMAT_LOCAL_HMS','%H:%M:%S');
  120. }
  121. /*** chars ***/
  122. /* see http://www.htmlcodetutorial.com/characterentities_famsupp_69.html */
  123. define('CHAR_LESS', '&lt;'); # <
  124. define('CHAR_GREATER', '&gt;'); # >
  125. define('CHAR_QUOTE', '&quot;'); # "
  126. define('CHAR_APOSTROPHE', '&#39'); # '
  127. define('CHAR_ARROWS', '&raquo;'); # »
  128. define('CHAR_ARROWS_R', '&#187;'); # »
  129. define('CHAR_ARROWS_L', '&#171;'); # «
  130. define('CHAR_AVERAGE', '&#216;'); # Ø
  131. define('CHAR_INFIN', '&infin;'); # 8
  132. define('CHAR_MILL', '&#137;'); # ‰ (per mille) / or &permil;
  133. define('CHAR_PLUSMN', '&plusmn;'); # 8
  134. define('CHAR_HELLIP', '&#8230;'); # … (horizontal ellipsis = three dot leader)
  135. define('CHAR_CIRCA', '&asymp;'); # ˜ (almost equal to)
  136. define('CHAR_CHECKBOX_EMPTY', '&#9744;]'); #
  137. define('CHAR_CHECKBOX_MAKRED', '&#9745'); #
  138. define('CHAR_CHECKMARK', '&#10003;');
  139. define('CHAR_CHECKMARK_BOLD', '&#10004;');
  140. define('CHAR_BALLOT', '&#10007;');
  141. define('CHAR_BALLOT_BOLD', '&#10008;');
  142. define('CHAR_ABOUT','&asymp;'); # … (horizontal ellipsis = three dot leader)
  143. /* not very often used */
  144. define('CHAR_RPIME', '&#8242;'); # ' (minutes)
  145. define('CHAR_DOUBLE_RPIME', '&#8243;'); # ? (seconds)
  146. /** BASIC FUNCTIONS **/
  147. /**
  148. * Own slug function - containing extra char replacement
  149. *
  150. * 2010-11-07 ms
  151. */
  152. function slug($string, $separator = null, $low = true) {
  153. $additionalSlugElements = array(
  154. '/º|°/' => 0,
  155. '/¹/' => 1,
  156. '/²/' => 2,
  157. '/³/' => 3,
  158. # new utf8 char "capitel ß" still missing here! '/.../' => 'SS', (TODO in 2009)
  159. '/@/' => 'at',
  160. '/æ/' => 'ae',
  161. '/©/' => 'C',
  162. '/ç|¢/' => 'c',
  163. '/Ð/' => 'D',
  164. '/€/' => 'EUR',
  165. '/™/' => 'TM',
  166. # more missing?
  167. );
  168. if ($separator === null) {
  169. $separator = defined('SEO_SEPARATOR') ? SEO_SEPARATOR : '-';
  170. }
  171. $res = Inflector::slug($string, $separator, $additionalSlugElements);
  172. if ($low) {
  173. $res = strtolower($res);
  174. }
  175. return $res;
  176. }
  177. /**
  178. * Since nl2br doesn't remove the line breaks when adding in the <br /> tags,
  179. * it is necessary to strip those off before you convert all of the tags, otherwise you will get double spacing
  180. *
  181. * @param string $str
  182. * @return string
  183. * 2010-11-07 ms
  184. */
  185. function br2nl($str) {
  186. $str = preg_replace("/(\r\n|\r|\n)/", "", $str);
  187. return preg_replace("=<br */?>=i", "\n", $str);
  188. }
  189. /**
  190. * Replaces CRLF with spaces
  191. *
  192. * @param string $text Any text
  193. * @return string Safe string without new lines
  194. * 2010-11-14 ms
  195. */
  196. function safenl($str) {
  197. //$str = str_replace(chr(13).chr(10), " ", $str); # \r\n
  198. //$str = str_replace(chr(13), " ", $str); # \r
  199. //$str = str_replace(chr(10), " ", $str); # \n
  200. $str = preg_replace("/(\r\n|\r|\n)/", " ", $str);
  201. return $str;
  202. }
  203. /**
  204. * Convenience function to check on "empty()"
  205. *
  206. * @param mixed $var
  207. * @return boolean Result
  208. * 2009-06-15 ms
  209. */
  210. function isEmpty($var = null) {
  211. if (empty($var)) {
  212. return true;
  213. }
  214. return false;
  215. }
  216. /**
  217. * //TODO: use Debugger::exportVar() instead?
  218. * of what type is the specific value
  219. * @return type (NULL, array, bool, float, int, string, object, unknown) + value
  220. * 2009-03-03 ms
  221. */
  222. function returns($value) {
  223. if ($value === null) {
  224. return 'NULL';
  225. } elseif (is_array($value)) {
  226. return '(array)' . '<pre>' . print_r($value, true) . '</pre>';
  227. } elseif ($value === true) {
  228. return '(bool)TRUE';
  229. } elseif ($value === false) {
  230. return '(bool)FALSE';
  231. } elseif (is_numeric($value) && is_float($value)) {
  232. return '(float)' . $value;
  233. } elseif (is_numeric($value) && is_int($value)) {
  234. return '(int)' . $value;
  235. } elseif (is_string($value)) {
  236. return '(string)' . $value;
  237. } elseif (is_object($value)) {
  238. return '(object)' . get_class($value) . '<pre>' . print_r($value, true) .
  239. '</pre>';
  240. } else {
  241. return '(unknown)' . $value;
  242. }
  243. }
  244. /**
  245. * Quickly dump a $var
  246. *
  247. * @param mixed $var
  248. * @return void
  249. */
  250. function dump($var) {
  251. if (class_exists('Debugger')) {
  252. App::uses('Debugger', 'Utility');
  253. }
  254. return Debugger::dump($var);
  255. }
  256. /**
  257. * Returns htmlentities - string
  258. *
  259. * ENT_COMPAT = Will convert double-quotes and leave single-quotes alone.
  260. * ENT_QUOTES = Will convert both double and single quotes. !!!
  261. * ENT_NOQUOTES= Will leave both double and single quotes unconverted.
  262. */
  263. function ent($text) {
  264. return (!empty($text) ? htmlentities($text, ENT_QUOTES, 'UTF-8') : '');
  265. }
  266. /**
  267. * Convenience method for htmlspecialchars_decode
  268. *
  269. * @param string $text Text to wrap through htmlspecialchars_decode
  270. * @return string Wrapped text
  271. * 2011-04-03 ms
  272. */
  273. function hDec($text, $quoteStyle = ENT_QUOTES) {
  274. if (is_array($text)) {
  275. return array_map('hDec', $text);
  276. }
  277. return trim(htmlspecialchars_decode($text, $quoteStyle));
  278. }
  279. /**
  280. * Convenience method for html_entity_decode
  281. *
  282. * @param string $text Text to wrap through htmlspecialchars_decode
  283. * @return string Wrapped text
  284. * 2011-04-03 ms
  285. */
  286. function entDec($text, $quoteStyle = ENT_QUOTES) {
  287. if (is_array($text)) {
  288. return array_map('entDec', $text);
  289. }
  290. return (!empty($text) ? trim(html_entity_decode($text, $quoteStyle, 'UTF-8')) : '');
  291. }
  292. /**
  293. * focus is on the filename (without path)
  294. * 2011-06-02 ms
  295. */
  296. function extractFileInfo($type = null, $filename) {
  297. if ($info = extractPathInfo($type, $filename)) {
  298. return $info;
  299. }
  300. $pos = strrpos($filename, '.');
  301. $res = '';
  302. switch ($type) {
  303. case 'extension':
  304. case 'ext':
  305. $res = ($pos !== false) ? substr($filename, $pos+1) : '';
  306. break;
  307. case 'filename':
  308. case 'file':
  309. $res = ($pos !== false) ? substr($filename, 0, $pos) : '';
  310. break;
  311. default:
  312. break;
  313. }
  314. return $res;
  315. }
  316. /**
  317. * uses native PHP function to retrieve infos about a filename etc.
  318. * @param string type (extension/ext, filename/file, basename/base, dirname/dir)
  319. * @param string filename to check on
  320. * //TODO: switch parameters!!!
  321. * 2009-01-22 ms
  322. */
  323. function extractPathInfo($type = null, $filename) {
  324. switch ($type) {
  325. case 'extension':
  326. case 'ext':
  327. $infoType = PATHINFO_EXTENSION;
  328. break;
  329. case 'filename':
  330. case 'file':
  331. $infoType = PATHINFO_FILENAME;
  332. break;
  333. case 'basename':
  334. case 'base':
  335. $infoType = PATHINFO_BASENAME;
  336. break;
  337. case 'dirname':
  338. case 'dir':
  339. $infoType = PATHINFO_DIRNAME;
  340. break;
  341. default:
  342. $infoType = null;
  343. }
  344. return pathinfo($filename, $infoType);
  345. }
  346. /**
  347. * Shows pr() messages, even with debug=0
  348. *
  349. * @param mixed $content
  350. * @param bool $collapsedAndExpandable
  351. * @param array $options
  352. * - class, showHtml, showFrom, jquery, returns, debug
  353. * 2011-01-19 ms
  354. */
  355. function pre($var, $collapsedAndExpandable = false, $options = array()) {
  356. $defaults = array(
  357. 'class' => 'cake-debug',
  358. 'showHtml' => false, # escape < and > (or manually escape with h() prior to calling this function)
  359. 'showFrom' => false, # display file + line
  360. 'jquery' => null, # auto - use jQuery (true/false to manually decide),
  361. 'returns' => false, # returns(),
  362. 'debug' => false # showOnlyOnDebug
  363. );
  364. $options = array_merge($defaults, $options);
  365. if ($options['debug'] && !Configure::read('debug')) {
  366. return '';
  367. }
  368. $res = '<div class="'.$options['class'].'">';
  369. $pre = '';
  370. if ($collapsedAndExpandable) {
  371. $js = 'if (this.parentNode.getElementsByTagName(\'pre\')[0].style.display==\'block\') {this.parentNode.getElementsByTagName(\'pre\')[0].style.display=\'none\'} else {this.parentNode.getElementsByTagName(\'pre\')[0].style.display=\'block\'}';
  372. $jsJquery = 'jQuery(this).parent().children(\'pre\').slideToggle(\'fast\')';
  373. if ($options['jquery'] === true) {
  374. $js = $jsJquery;
  375. } elseif ($options['jquery'] !== false) {
  376. # auto
  377. $js = 'if (typeof jQuery == \'undefined\') {'.$js.'} else {'.$jsJquery.'}';
  378. }
  379. $res .= '<span onclick="'.$js.'" style="cursor: pointer; font-weight: bold">Debug</span>';
  380. if ($options['showFrom']) {
  381. $calledFrom = debug_backtrace();
  382. $from = '<em>' . substr(str_replace(ROOT, '', $calledFrom[0]['file']), 1) . '</em>';
  383. $from .= ' (line <em>' . $calledFrom[0]['line'] . '</em>)';
  384. $res .= '<div>'.$from.'</div>';
  385. }
  386. $pre = ' style="display: none"';
  387. }
  388. if ($options['returns']) {
  389. $var = returns($var);
  390. } else {
  391. $var = print_r($var, true);
  392. }
  393. $res .= '<pre' . $pre . '>' . $var . '</pre>';
  394. $res .= '</div>';
  395. return $res;
  396. }
  397. /**
  398. * Checks if the string [$haystack] contains [$needle]
  399. * @param string $haystack Input string.
  400. * @param string $needle Needed char or string.
  401. * @return boolean
  402. */
  403. function contains($haystack, $needle, $caseSensitive = false) {
  404. $result = !$caseSensitive ? stripos($haystack, $needle) : strpos($haystack, $needle);
  405. return ($result !== false);
  406. }
  407. /**
  408. * Checks if the string [$haystack] starts with [$needle]
  409. * @param string $haystack Input string.
  410. * @param string $needle Needed char or string.
  411. * @return boolean
  412. */
  413. function startsWith($haystack, $needle, $caseSensitive = false) {
  414. if ($caseSensitive) {
  415. return (mb_strpos($haystack, $needle) === 0);
  416. }
  417. return (mb_stripos($haystack, $needle) === 0);
  418. }
  419. /**
  420. * Checks if the String [$haystack] ends with [$needle]
  421. * @param string $haystack Input string.
  422. * @param string $needle Needed char or string
  423. * @return boolean
  424. */
  425. function endsWith($haystack, $needle, $caseSensitive = false) {
  426. if ($caseSensitive) {
  427. return mb_strrpos($haystack, $needle) === mb_strlen($haystack) - mb_strlen($needle);
  428. }
  429. return mb_strripos($haystack, $needle) === mb_strlen($haystack) - mb_strlen($needle);
  430. }
  431. /**
  432. * base64 encode and replace chars base64 uses that would mess up the url
  433. * @return string or NULL
  434. */
  435. function base64UrlEncode($fieldContent) {
  436. if (empty($fieldContent)) {
  437. return null;
  438. }
  439. $tmp = base64_encode($fieldContent);
  440. return str_replace(array('/', '='), array('-', '_'), $tmp);
  441. }
  442. /**
  443. * base64 decode and undo replacing of chars base64 uses that would mess up the url
  444. * @return string or NULL
  445. */
  446. function base64UrlDecode($fieldContent) {
  447. if (empty($fieldContent)) {
  448. return null;
  449. }
  450. $tmp = str_replace(array('-', '_'), array('/', '='), $fieldContent);
  451. return base64_decode($tmp);
  452. }
  453. /**
  454. * prettyJson
  455. *
  456. * @link https://github.com/ndejong/pretty_json/blob/master/pretty_json.php
  457. * @param string $json - the original JSON string
  458. * @param string $ind - the string to indent with
  459. * @return string
  460. */
  461. function prettyJson($json, $ind = "\t") {
  462. // Replace any escaped \" marks so we don't get tripped up on quotemarks_counter
  463. $tokens = preg_split('|([\{\}\]\[,])|', str_replace('\"', '~~PRETTY_JSON_QUOTEMARK~~', $json), -1, PREG_SPLIT_DELIM_CAPTURE);
  464. $indent = 0;
  465. $result = '';
  466. $quotemarks_counter = 0;
  467. $next_token_use_prefix = true;
  468. foreach ($tokens as $token) {
  469. $quotemarks_counter = $quotemarks_counter + (count(explode('"', $token)) - 1);
  470. if ($token === '') {
  471. continue;
  472. }
  473. if ($next_token_use_prefix) {
  474. $prefix = str_repeat($ind, $indent);
  475. } else {
  476. $prefix = null;
  477. }
  478. // Determine if the quote marks are open or closed
  479. if ($quotemarks_counter & 1) {
  480. // odd - thus quotemarks open
  481. $next_token_use_prefix = false;
  482. $new_line = null;
  483. } else {
  484. // even - thus quotemarks closed
  485. $next_token_use_prefix = true;
  486. $new_line = "\n";
  487. }
  488. if ($token === "{" || $token === "[") {
  489. $indent++;
  490. $result .= $token . $new_line;
  491. } elseif ($token === "}" || $token === "]") {
  492. $indent--;
  493. if ($indent >= 0) {
  494. $prefix = str_repeat($ind, $indent);
  495. }
  496. if ($next_token_use_prefix) {
  497. $result .= $new_line . $prefix . $token;
  498. } else {
  499. $result .= $new_line . $token;
  500. }
  501. } elseif ($token === ",") {
  502. $result .= $token . $new_line;
  503. } else {
  504. $result .= $prefix . $token;
  505. }
  506. }
  507. $result = str_replace('~~PRETTY_JSON_QUOTEMARK~~', '\"', $result);
  508. return $result;
  509. }