/type/Url.class.php

https://github.com/stvvt/ef · PHP · 162 lines · 88 code · 37 blank · 37 comment · 14 complexity · 9f6ccddf465213a8248bc97af7cb5594 MD5 · raw file

  1. <?php
  2. /**
  3. * Клас 'type_Url' - Тип за URL адреси
  4. *
  5. *
  6. * @category ef
  7. * @package type
  8. * @author Yusein Yuseinov <yyuseinov@gmail.com>
  9. * @copyright 2006 - 2012 Experta OOD
  10. * @license GPL 3
  11. * @since v 0.1
  12. */
  13. class type_Url extends type_Varchar {
  14. /**
  15. * Дължина на полето в mySql таблица
  16. */
  17. var $dbFieldLen = 255;
  18. /**
  19. * Преобразуване от вътрешно представяне към вербална стойност
  20. */
  21. function toVerbal($value)
  22. {
  23. // Когато стойността е празна, трябва да върнем NULL
  24. $value = trim($value);
  25. if(empty($value)) return NULL;
  26. $attr['target'] = '_blank';
  27. $attr['class'] = 'out';
  28. $value = HT::createLink($value, $value, FALSE, $attr);
  29. return $value;
  30. }
  31. /**
  32. * Добавя атрибут за тип = url, ако изгледа е мобилен
  33. */
  34. function renderInput_($name, $value = "", &$attr = array())
  35. {
  36. if(Mode::is('screenMode', 'narrow') && empty($attr['type'])) {
  37. $attr['type'] = 'url';
  38. }
  39. return parent::renderInput_($name, $value, $attr);
  40. }
  41. /**
  42. * Превръща URL-то от вербално представяне, към вътрешно представяне
  43. */
  44. function fromVerbal($value)
  45. {
  46. $res = self::isValid($value);
  47. return $value;
  48. }
  49. /**
  50. * Проверява и коригира въведеното URL
  51. */
  52. function isValid($value)
  53. {
  54. $value = trim($value);
  55. $value = strtolower($value);
  56. if(!$value) return NULL;
  57. $value = $this->findSheme($value);
  58. $res = parent::isValid($value);
  59. if (count($res)) {
  60. return $res;
  61. }
  62. if (!URL::isValidUrl($value)) {
  63. $res['error'] = "Невалидно URL.";
  64. return $res;
  65. }
  66. }
  67. /**
  68. * Връща цялото URL
  69. */
  70. function findSheme($value)
  71. {
  72. $pattern = '/^\b[a-z]*\b:\/\//';
  73. preg_match($pattern, $value, $match);
  74. if (!count($match)) {
  75. $pattern = '/^\b[a-z]*\b./';
  76. preg_match($pattern, $value, $matchSub);
  77. $sheme = 'http';
  78. if (count($matchSub)) {
  79. $subDom = $matchSub[0];
  80. if ($subDom == 'ftp.') {
  81. $sheme = 'ftp';
  82. }
  83. }
  84. $sheme = $sheme . '://';
  85. $value = $sheme . $value;
  86. }
  87. return $value;
  88. }
  89. /**
  90. * Ако е зададен параметър, тогава валидираме имейл-а
  91. */
  92. function validate($url, &$result)
  93. {
  94. //Проверяваме дали URL' то е ftp
  95. if (stripos($url, 'ftp://') !== FALSE) {
  96. //Правим опит да се свържем с FTP акаунта.
  97. $parsedFtp = parse_url($url);
  98. $ftp = $parsedFtp['scheme'] . '://' . $parsedFtp['host'];
  99. $ftpId = @ftp_connect($parsedFtp['host'], FALSE, 3);
  100. } else {
  101. //Правим опит да се свържем с http акаунта
  102. $arr = array('http' => array(
  103. 'timeout' => 2)
  104. );
  105. stream_context_set_default ($arr);
  106. $headers = @get_headers($url);
  107. }
  108. //Проверяваме дали има грешки при валидиране
  109. if ((!$headers) && (!$ftpId)) {
  110. $result['warning'] = "URL' то, което сте въвели не може да бъде валидиран.";
  111. }
  112. //Проверяваме хедъри-те за върнатия резултат
  113. if ($headers) {
  114. $explode = explode(' ', $headers[0], 3);
  115. }
  116. //Ако страницата върне 404, тогава показва warning
  117. $number = substr(trim($explode[1]), 0, 1);
  118. if ($number == 4) {
  119. $result['warning'] = "Възможен проблем с това URL.";
  120. }
  121. }
  122. }