Skip to content
Snippets Groups Projects
Select Git revision
  • 486eefe643fd995c9698dad04a0f13e2f46b6edd
  • main default protected
  • studip-rector
  • ci-opt
  • course-members-export-as-word
  • data-vue-app
  • pipeline-improvements
  • webpack-optimizations
  • rector
  • icon-renewal
  • http-client-and-factories
  • jsonapi-atomic-operations
  • vueify-messages
  • tic-2341
  • 135-translatable-study-areas
  • extensible-sorm-action-parameters
  • sorm-configuration-trait
  • jsonapi-mvv-routes
  • docblocks-for-magic-methods
19 results

URLHelper.php

Blame
  • Forked from Stud.IP / Stud.IP
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    URLHelper.php 6.95 KiB
    <?php
    # Lifter007: TODO
    # Lifter003: TODO
    # Lifter010: TODO
    /**
     * URLHelper.php - utility functions for URL parameter handling
     *
     * Copyright (c) 2008  Elmar Ludwig
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License as
     * published by the Free Software Foundation; either version 2 of
     * the License, or (at your option) any later version.
     */
    
    
    /**
     * The URLHelper class provides several utility functions (as class
     * methods) to ease the transition from using session data to URL
     * parameters.
     *
     * The most important method is URLHelper::getLink(), which appends
     * a number of additional parameters to a given URL. The parameters
     * can be set using the addLinkParam() or bindLinkParam() methods.
     */
    class URLHelper
    {
        /**
         * array of registered parameter values (initially empty)
         */
        private static $params = [];
    
        /**
         * base URL for all links generated from relative URLs
         */
        private static $base_url;
    
        /**
         * Set a base URL to be used when resolving relative URLs passed
         * to URLHelper::getLink() and URLHelper::getURL(). Set this to
         * NULL to use no base URL and skip the URL resolving step.
         *
         * @param string $url  relative or absolute URL (or NULL)
         * @return string old URL
         */
        static function setBaseURL ($url)
        {
            $old = self::$base_url;
            self::$base_url = $url;
            return $old;
        }
    
        /**
         * Resolve the given relative or absolute URL relative to the
         * currently defined base URL (if set). This is a private method.
         *
         * @param string $url    relative or absolute URL
         *
         * @return string modified URL
         */
        private static function resolveURL ($url)
        {
            $base_url = self::$base_url;
    
            if (!isset($base_url) ||
                preg_match('%^[a-z]+:%', $url)) {
                return $url;
            }
    
            if ($url[0] === '/') {
                preg_match('%^[a-z]+://[\w:.-]+%', $base_url, $host);
                $base_url = isset($host) ? $host[0] : '';
            }
    
            return $base_url.$url;
        }
    
        /**
         * Add a new link parameter. If a parameter with this name already
         * exists, its value will be replaced with the new one. All link
         * parameters will be included in the link returned by getLink().
         *
         * @param string $name  parameter name
         * @param mixed  $value parameter value
         */
        static function addLinkParam ($name, $value)
        {
            self::$params[$name] = $value;
        }
    
        /**
         * Bind a new link parameter to a variable. If a parameter with this
         * name already exists, its value will re replaced with the binding.
         *
         * This method differs from addLinkParam() in two respects:
         *
         * - The bound variable is initialized with the parameter value in
         *   the current request.
         * - The parameter value is the value of the bound variable at the
         *   time getLink() is called.
         *
         * @param string $name  parameter name
         * @param mixed  $var   variable to bind
         */
        static function bindLinkParam ($name, &$var)
        {
            if (isset($_REQUEST[$name])) {
                $var = $_REQUEST[$name];
            }
    
            self::$params[$name] = &$var;
        }
    
        /**
         * Get the list of currently registered link parameters.
         *
         * @return array list of registered link parameters
         */
        static function getLinkParams ()
        {
            return self::$params;
        }
    
        /**
         * Remove a link parameter.
         *
         * @param string $name  parameter name
         */
        static function removeLinkParam ($name)
        {
            unset(self::$params[$name]);
        }
    
        /**
         * Augment the given URL by appending all registered link parameters.
         * Note that for each bound variable, its current value is used. You
         * can use the second parameter to add futher URL parameters to this
         * link without adding them globally. Any parameters included in the
         * argument list take precedence over registered link parameters of
         * the same name. This method is identical to getURL() except that it
         * returns an entity encoded URL suitable for use in HTML attributes.
         *
         * @param string $url    relative or absolute URL
         * @param array  $params array of additional link parameters to add
         * @param bool $ignore_registered_params do not add registered params
         *
         * @return string modified URL (entity encoded)
         */
        static function getLink ($url = '', $params = NULL, $ignore_registered_params = false)
        {
            return htmlReady(self::getURL($url, $params, $ignore_registered_params));
        }
    
        /**
         * Augment the given URL by appending all registered link parameters.
         * Note that for each bound variable, its current value is used. You
         * can use the second parameter to add futher URL parameters to this
         * link without adding them globally. Any parameters included in the
         * argument list take precedence over registered link parameters of
         * the same name.
         *
         * @param string $url    relative or absolute URL
         * @param array  $params array of additional link parameters to add
         * @param bool $ignore_registered_params do not add registered params
         *
         * @return string modified URL
         */
        static function getURL ($url = '', $params = NULL, $ignore_registered_params = false)
        {
            $link_params = $ignore_registered_params ? [] : self::$params;
    
            list($url, $fragment) = explode('#', $url);
            list($url, $query)    = explode('?', $url);
    
            if ($url !== '') {
                $url = self::resolveURL($url);
            }
    
            if (isset($query)) {
                parse_str($query, $query_params);
                $link_params = array_merge($link_params, $query_params);
            }
    
            if (isset($params)) {
                $link_params = array_merge($link_params, $params);
            }
    
            $query_string = http_build_query($link_params);
    
            if (mb_strlen($query_string) || $url === '') {
                $url .= '?'.$query_string;
            }
    
            if (isset($fragment)) {
                $url .= '#'.$fragment;
            }
    
            return $url;
        }
    
        /**
         * Augment the given URL by adding URL parameters from the second parameter,
         * without bound parameters
         *
         * @param string $url    relative or absolute URL
         * @param array  $params array of additional link parameters to add
         *
         * @return string modified URL
         */
        static function getScriptURL ($url = '', $params = NULL)
        {
            return self::getURL($url, $params, true);
        }
    
        /**
         * This method is identical to getScriptURL() except that it
         * returns an entity encoded URL suitable for use in HTML attributes.
         *
         * @param string $url    relative or absolute URL
         * @param array  $params array of additional link parameters to add
         *
         * @return string modified URL (entity encoded)
         */
        static function getScriptLink ($url = '', $params = NULL)
        {
            return self::getLink($url, $params, true);
        }
    }
    ?>