bundles/FoxHabbit/BasisBundle/Tool/Url.php line 143

Open in your IDE?
  1. <?php
  2. // declare(strict_types=1);
  3. namespace FoxHabbit\BasisBundle\Tool;
  4. use Pimcore\Log\ApplicationLogger;
  5. class Url
  6. {
  7.     /**
  8.      * Add a scheme to an url
  9.      *
  10.      * @param  string $url     the url
  11.      * @param  string $scheme  the scheme
  12.      * @param  bool   $replace allow to replace an existing scheme
  13.      * @return string the url prefixed with the scheme or the original url, if anything goes wrong
  14.      */
  15.     public static function addScheme(string $urlstring $schemebool $replace false) : string {
  16.         // check input
  17.         if (=== strlen($scheme)) {
  18.             ApplicationLogger::info('No scheme passed. Returning.');
  19.             return $url;
  20.         }
  21.         if (=== strlen($url)) {
  22.             ApplicationLogger::info('No URL passed. Returning.');
  23.             return $url;
  24.         }
  25.         $existingScheme parse_url$url PHP_URL_SCHEME );
  26.         if (false === $existingScheme) {
  27.             ApplicationLogger::warn('Malformed URL "'.$url.'"');
  28.             return $url;
  29.         } else if ('' !== $existingScheme && false === $replace) {
  30.             ApplicationLogger::notice('Replacing scheme prohibited in "'.$url.'"');
  31.             return $url;
  32.         }
  33.         if ('' === $existingScheme) {
  34.             $url preg_replace('@^:?/{2}@'''$url);
  35.             return $scheme.'://'.$url;
  36.         } else {
  37.             $url preg_replace('@^'.$existingScheme.':/{2}@'$scheme.'://'$url);
  38.             return $url;
  39.         }
  40.     }
  41.     /**
  42.      * Add http:// to an url if it is missing
  43.      *
  44.      * @param string $url The url
  45.      *
  46.      * @return string The url having http:// prefixed
  47.      */
  48.     public static function addHttp$url$replace false) {
  49.         return self::addScheme($url'http'$replace);
  50.     }
  51.     /**
  52.      * Add https:// to an url if it is missing
  53.      *
  54.      * @param string $url The url
  55.      *
  56.      * @return string The url having https:// prefixed
  57.      */
  58.     public static function addHttps$url$replace false) {
  59.         return self::addScheme($url'https'$replace);
  60.     }
  61.     /**
  62.      * Remove the http:// prefix from an url
  63.      *
  64.      * @param string $url The url
  65.      *
  66.      * @return string The url having http:// removed
  67.      */
  68.     public static function removeHttp$url) {
  69.         if( ! strlen$url)) {
  70.             return $url;
  71.         }
  72.         if( preg_match'@^https?://(.+)$@'$url$m)) {
  73.             return $m[1];
  74.         } else {
  75.             return $url;
  76.         }
  77.     }
  78.     public static function isExternalLink$target$recursive=true) {
  79.         if( ! $target) {
  80.             return false;
  81.         }
  82.         // Some targets like downloads are forced to be external to be opened in a new tab
  83.         if( is_object$target)) {
  84.             switch( get_class$target)) {
  85.                 case 'Pimcore\Model\Document\Tag\Href':    // bis Pimcore 5.5
  86.                 case 'Pimcore\Model\Document\Tag\Relation':    // ab Pimcore 5.6
  87.                 case 'Pimcore\Model\Document\Editable\Relation':    // ab Pimcore 6.8
  88.                         if( $recursive) {
  89.                         return self::isExternalLink($target->getElement(), $recursive);
  90.                     }
  91.                     break;
  92.                 case 'Pimcore\Model\Asset\Document':
  93.                 case 'Pimcore\Model\Asset\Image':
  94.                         // Diese Downloads in neuem Fenster öffnen
  95.                     return true;
  96.                     break;
  97.             }
  98.         }
  99.         $href self::getHref$target$recursive);
  100.         $href_host parse_url($hrefPHP_URL_HOST);
  101.         $server_host $_SERVER['HTTP_HOST'];
  102.         if( ! $href_host) {
  103.             return false;
  104.         }
  105.         return $href_host !== $server_host;
  106.     }
  107.     public static function getTarget$in$recursive=true) {
  108.         return ( self::isExternalLink($in) ) ? '_blank':'_self';
  109.     }
  110.     public static function isPublished$target$recursive=true) {
  111.         if( is_object$target)) {
  112.             switch( get_class$target)) {
  113.                 case 'Pimcore\Model\Document\Tag\Href':    // bis Pimcore 5.5
  114.                 case 'Pimcore\Model\Document\Tag\Relation':    // ab Pimcore 5.6
  115.                 case 'Pimcore\Model\Document\Editable\Relation':    // ab Pimcore 6.8
  116.                         if( $recursive) {
  117.                         return self::isPublished($target->getElement(), $recursive);
  118.                     } else {
  119.                         return $target->isPublished();
  120.                     }
  121.                     break;
  122.                 case 'Pimcore\Model\Document\Link':
  123.                     if( $target->isPublished()) {
  124.                         if( $recursive) {
  125.                             switch( $target->getLinktype()) {
  126.                                 case 'direct':
  127.                                     // Link enthält eine URL
  128.                                     return true;
  129.                                     break;
  130.                                 case 'internal':
  131.                                     return self::isPublished($target->getObject(), $recursive);
  132.                                     break;
  133.                             }
  134.                         } else {
  135.                             return true;
  136.                         }
  137.                     }
  138.                     break;
  139.                 default:
  140.                     if( $target instanceof \Pimcore\Model\Document) {
  141.                         return $target->isPublished();
  142.                     }
  143.                     if( $target instanceof \Pimcore\Model\Asset) {
  144.                         return true;
  145.                     }
  146.                     exit( 'Website\Tool\Url::isVisible(): unhandled target type "'.get_class$target).'"');
  147.             }
  148.         } else if( is_string$target)) {
  149.             return true;
  150.         }
  151.         return false;
  152.     }
  153.     public static function getHref$target$recursive=true) {
  154.         if( is_object$target)) {
  155.             switch( get_class$target)) {
  156.                 case 'Pimcore\Model\Document\Tag\Href':    // bis Pimcore 5.5
  157.                 case 'Pimcore\Model\Document\Tag\Relation':    // ab Pimcore 5.6
  158.                 case 'Pimcore\Model\Document\Editable\Relation':    // ab Pimcore 6.8
  159.                     if( $recursive) {
  160.                         return self::getHref($target->getElement(), $recursive);
  161.                     } else {
  162.                         return $target->getFullPath();
  163.                     }
  164.                     break;
  165.                 case 'Pimcore\Model\Document\Link':
  166.                     if( $recursive) {
  167.                         switch( $target->getLinktype()) {
  168.                             case 'direct':
  169.                                 // Link enthält eine URL
  170.                                 return $target->getHref();
  171.                                 break;
  172.                             case 'internal':
  173.                                 return self::getHref$target->getObject(), $recursive);
  174.                                 break;
  175.                         }
  176.                     } else {
  177.                         return $target->getHref();
  178.                     }
  179.                     break;
  180.                 case 'Pimcore\Model\Document\Page':
  181.                 case 'Pimcore\Model\Document\Hardlink':
  182.                 case 'Pimcore\Model\Asset\Image':
  183.                 case 'Pimcore\Model\Asset\Document':
  184.                     return $target->getFullPath();
  185.                     break;
  186.                 case 'Pimcore\Navigation\Page\Document':
  187.                     if( $recursive) {
  188.                         return self::getHref$target->getDocument(), $recursive);
  189.                     } else {
  190.                         return $target->getHref();
  191.                     }
  192.                     break;
  193.                 default:
  194.                     return 'Website\Tool\Url::getHref(): unhandled target type "'.get_class$target).'"';
  195.             }
  196.         }
  197.         return $target;
  198.     }
  199. }