ILIAS  release_8 Revision v8.19-1-g4e8f2f9140c
All Data Structures Namespaces Files Functions Variables Modules Pages
ILIAS\UI\URLBuilder Class Reference

URLBuilder. More...

+ Collaboration diagram for ILIAS\UI\URLBuilder:

Public Member Functions

 __construct (URI $uri)
 
 withURI (URI $uri)
 Changes the base URI of the Builder. More...
 
 withFragment (?string $fragment)
 Change the fragment/hash part of the URL. More...
 
 acquireParameter (array $namespace, string $name, ?string $initial_value=null)
 Add a new parameter with a namespace and get its token for subsequent changes. More...
 
 acquireParameters (array $namespace, string ... $names)
 
 deleteParameter (URLBuilderToken $token)
 Delete an acquired parameter if the supplied token is valid. More...
 
 withParameter (URLBuilderToken $token, $value)
 Change an acquired parameter's value if the supplied token is valid. More...
 
 renderTokens (array $tokens)
 Renders a Javascript Map of all given tokens. More...
 
 renderObject (array $tokens)
 Renders a Javascript URLBuilder object with changeable parameters for all given tokens. More...
 
 buildURI ()
 Get a URI representation of the full URL including query string and fragment/hash. More...
 

Data Fields

const URL_MAX_LENGTH = 2048
 A maximum length of 2048 characters should be safe to use in most browsers, even though longer URLs will be supported by some. More...
 
const SEPARATOR = '_'
 Separator for parts of a parameter's namespace. More...
 

Private Member Functions

 buildQuery ()
 Create the query part of the URL from all parameters Claimed parameters overwrite base parameters in array_merge(), numeric indizes of array-parameters are being removed to ensure continous numeration (p[1]=A&p[2]=B –> p[]=A&p[]=B). More...
 
 buildFragment ()
 Create the fragment/hash part of the URL. More...
 
 parameterExists (string $name)
 Check if parameter was already acquired. More...
 
 checkToken (URLBuilderToken $token)
 Check if a token is valid. More...
 
 checkLength (URI $uri)
 Check the full length of the URI against URL_MAX_LENGTH. More...
 

Private Attributes

URI $uri
 Base URI for the URLBuilder. More...
 
string $fragment = null
 Stores the URL fragment/hash (#) (always changeable due to its usage) More...
 
array $params = []
 Stores all acquired parameters These always take precedence over existing parameters in the base URI. More...
 
array $tokens = []
 Stores all generated tokens for acquired parameters. More...
 

Detailed Description

URLBuilder.

This provides an abstract representation of an URL and its parameters with the option of changing/removing parameters only by providing a token. These tokens are created when a new parameter is acquired and are therefore controlled by the component that added the parameter. This gives us better control over who gets to change which parameter. Besides that, parameters are always given a namespace so that parameters with the same name can exist beside each other. The in- and output of the URLBuilder are objects.

Along with this class, an equivalent Javascript class is provided in UI/Core that offers a similar functionality. The PHP object can be "transferred" to JS in any renderer by using the provided render...() functions to create JS objects/maps.

Definition at line 39 of file URLBuilder.php.

Constructor & Destructor Documentation

◆ __construct()

ILIAS\UI\URLBuilder::__construct ( URI  $uri)

Definition at line 73 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$uri.

74  {
75  $this->uri = $uri;
76  }
URI $uri
Base URI for the URLBuilder.
Definition: URLBuilder.php:53

Member Function Documentation

◆ acquireParameter()

ILIAS\UI\URLBuilder::acquireParameter ( array  $namespace,
string  $name,
?string  $initial_value = null 
)

Add a new parameter with a namespace and get its token for subsequent changes.

The namespace can consists of one or more levels which are noted as an array. They will be joined with the separator (see constant) and used as a prefix for the name, e.g. Namespace: ["ilOrgUnit","filter"] Name: "name" Resulting parameter: "ilOrgUnit_filter_name"

The return value is an array containing both the changed URLBuilder as well as the token for any subsequent changes to the acquired parameter.

Returns
array<URLBuilder,URLBuilderToken>
Exceptions

Definition at line 118 of file URLBuilder.php.

References $name, $token, and ILIAS\UI\URLBuilder\parameterExists().

118  : array
119  {
120  if ($name === '' || empty($namespace)) {
121  throw new \InvalidArgumentException("Parameter name or namespace not set");
122  }
123 
124  $parameter = implode(self::SEPARATOR, $namespace) . self::SEPARATOR . $name;
125  if ($this->parameterExists($parameter)) {
126  throw new \ilException("Parameter '" . $parameter . "' already reserved in URL");
127  }
128 
129  $token = new URLBuilderToken($namespace, $name);
130  $clone = clone $this;
131  $clone->params[$parameter] = ($initial_value) ?? '';
132  $clone->tokens[$parameter] = $token;
133 
134  return [$clone, $token];
135  }
if($err=$client->getError()) $namespace
parameterExists(string $name)
Check if parameter was already acquired.
Definition: URLBuilder.php:250
if($format !==null) $name
Definition: metadata.php:247
$token
Definition: xapitoken.php:70
+ Here is the call graph for this function:

◆ acquireParameters()

ILIAS\UI\URLBuilder::acquireParameters ( array  $namespace,
string ...  $names 
)

Definition at line 137 of file URLBuilder.php.

References $name, $token, and ILIAS\UI\URLBuilder\$tokens.

137  : array
138  {
139  $tokens = [];
140  $builder = $this;
141  foreach ($names as $name) {
142  list($builder, $token) = $builder->acquireParameter($namespace, $name);
143  $tokens[] = $token;
144  }
145  array_unshift($tokens, $builder);
146  return $tokens;
147  }
if($err=$client->getError()) $namespace
if($format !==null) $name
Definition: metadata.php:247
$token
Definition: xapitoken.php:70
array $tokens
Stores all generated tokens for acquired parameters.
Definition: URLBuilder.php:71

◆ buildFragment()

ILIAS\UI\URLBuilder::buildFragment ( )
private

Create the fragment/hash part of the URL.

Definition at line 238 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$fragment.

Referenced by ILIAS\UI\URLBuilder\buildURI().

238  : string
239  {
240  if ($this->fragment !== null) {
241  return ($this->fragment !== '') ? '#' . $this->fragment : '';
242  }
243  $fragment = ($this->uri->getFragment()) ? '#' . $this->uri->getFragment() : '';
244  return $fragment;
245  }
string $fragment
Stores the URL fragment/hash (#) (always changeable due to its usage)
Definition: URLBuilder.php:58
+ Here is the caller graph for this function:

◆ buildQuery()

ILIAS\UI\URLBuilder::buildQuery ( )
private

Create the query part of the URL from all parameters Claimed parameters overwrite base parameters in array_merge(), numeric indizes of array-parameters are being removed to ensure continous numeration (p[1]=A&p[2]=B –> p[]=A&p[]=B).

Definition at line 227 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$params, and $query.

Referenced by ILIAS\UI\URLBuilder\buildURI().

227  : string
228  {
229  $params = array_merge($this->uri->getParameters(), $this->params);
230  $query = (! empty($params)) ? '?' . http_build_query($params) : '';
231  $query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);
232  return $query;
233  }
$query
array $params
Stores all acquired parameters These always take precedence over existing parameters in the base URI...
Definition: URLBuilder.php:65
+ Here is the caller graph for this function:

◆ buildURI()

ILIAS\UI\URLBuilder::buildURI ( )

Get a URI representation of the full URL including query string and fragment/hash.

Definition at line 214 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$uri, ILIAS\UI\URLBuilder\buildFragment(), ILIAS\UI\URLBuilder\buildQuery(), and ILIAS\UI\URLBuilder\checkLength().

Referenced by ILIAS\UI\Implementation\Component\Table\Action\Action\__construct(), and ILIAS\UI\URLBuilder\renderObject().

214  : URI
215  {
216  $uri = new URI($this->uri->getBaseURI() . $this->buildQuery() . $this->buildFragment());
217  $this->checkLength($uri);
218  return $uri;
219  }
URI $uri
Base URI for the URLBuilder.
Definition: URLBuilder.php:53
buildFragment()
Create the fragment/hash part of the URL.
Definition: URLBuilder.php:238
buildQuery()
Create the query part of the URL from all parameters Claimed parameters overwrite base parameters in ...
Definition: URLBuilder.php:227
checkLength(URI $uri)
Check the full length of the URI against URL_MAX_LENGTH.
Definition: URLBuilder.php:277
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ checkLength()

ILIAS\UI\URLBuilder::checkLength ( URI  $uri)
private

Check the full length of the URI against URL_MAX_LENGTH.

Exceptions

Definition at line 277 of file URLBuilder.php.

Referenced by ILIAS\UI\URLBuilder\buildURI().

277  : void
278  {
279  if (! (strlen((string) $uri) <= self::URL_MAX_LENGTH)) {
280  throw new \LengthException("The final URL is longer than " . self::URL_MAX_LENGTH . " and will not be valid.");
281  }
282  }
URI $uri
Base URI for the URLBuilder.
Definition: URLBuilder.php:53
+ Here is the caller graph for this function:

◆ checkToken()

ILIAS\UI\URLBuilder::checkToken ( URLBuilderToken  $token)
private

Check if a token is valid.

Exceptions

Definition at line 261 of file URLBuilder.php.

References ILIAS\UI\URLBuilderToken\getName(), ILIAS\UI\URLBuilderToken\getToken(), and ILIAS\UI\URLBuilder\parameterExists().

Referenced by ILIAS\UI\URLBuilder\deleteParameter(), and ILIAS\UI\URLBuilder\withParameter().

261  : void
262  {
263  if (! in_array($token, $this->tokens)
264  || $this->tokens[$token->getName()]->getToken() !== $token->getToken()) {
265  throw new \DomainException("Token for '" . $token->getName() . "' is not valid");
266  }
267  if (! $this->parameterExists($token->getName())) {
268  throw new \ilException("Parameter '" . $token->getName() . "' does not exist in URL");
269  }
270  }
parameterExists(string $name)
Check if parameter was already acquired.
Definition: URLBuilder.php:250
$token
Definition: xapitoken.php:70
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ deleteParameter()

ILIAS\UI\URLBuilder::deleteParameter ( URLBuilderToken  $token)

Delete an acquired parameter if the supplied token is valid.

Definition at line 152 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\checkToken(), and ILIAS\UI\URLBuilderToken\getName().

152  : self
153  {
154  $this->checkToken($token);
155  $clone = clone $this;
156  unset($clone->params[$token->getName()]);
157  unset($clone->tokens[$token->getName()]);
158 
159  return $clone;
160  }
$token
Definition: xapitoken.php:70
checkToken(URLBuilderToken $token)
Check if a token is valid.
Definition: URLBuilder.php:261
+ Here is the call graph for this function:

◆ parameterExists()

ILIAS\UI\URLBuilder::parameterExists ( string  $name)
private

Check if parameter was already acquired.

Definition at line 250 of file URLBuilder.php.

Referenced by ILIAS\UI\URLBuilder\acquireParameter(), and ILIAS\UI\URLBuilder\checkToken().

250  : bool
251  {
252  return array_key_exists($name, $this->params);
253  }
if($format !==null) $name
Definition: metadata.php:247
+ Here is the caller graph for this function:

◆ renderObject()

ILIAS\UI\URLBuilder::renderObject ( array  $tokens)

Renders a Javascript URLBuilder object with changeable parameters for all given tokens.

Note: By providing only the tokens that need to be changed on the JS side, all other parameters will be passed as unchangeable.

Parameters
array<URLBuilderToken>$tokens

Definition at line 205 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\buildURI(), and ILIAS\UI\URLBuilder\renderTokens().

205  : string
206  {
207  $output = 'new il.UI.core.URLBuilder(new URL("' . $this->buildURI() . '"), ' . $this->renderTokens($tokens) . ')';
208  return $output;
209  }
buildURI()
Get a URI representation of the full URL including query string and fragment/hash.
Definition: URLBuilder.php:214
renderTokens(array $tokens)
Renders a Javascript Map of all given tokens.
Definition: URLBuilder.php:185
array $tokens
Stores all generated tokens for acquired parameters.
Definition: URLBuilder.php:71
+ Here is the call graph for this function:

◆ renderTokens()

ILIAS\UI\URLBuilder::renderTokens ( array  $tokens)

Renders a Javascript Map of all given tokens.

Note: Only the tokens needed for changing parameters on the JS side should be used here.

Parameters
array<URLBuilderToken>$tokens

Definition at line 185 of file URLBuilder.php.

References $token.

Referenced by ILIAS\UI\URLBuilder\renderObject().

185  : string
186  {
187  $token_render = [];
188  foreach ($tokens as $token) {
189  $token_render[] = '["' . $token->getName() . '",' . $token->render() . ']';
190  }
191  $output = 'new Map([' . implode(',', $token_render) . '])';
192  return $output;
193  }
$token
Definition: xapitoken.php:70
array $tokens
Stores all generated tokens for acquired parameters.
Definition: URLBuilder.php:71
+ Here is the caller graph for this function:

◆ withFragment()

ILIAS\UI\URLBuilder::withFragment ( ?string  $fragment)

Change the fragment/hash part of the URL.

Definition at line 91 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$fragment.

91  : self
92  {
93  $clone = clone $this;
94  $clone->fragment = $fragment;
95  return $clone;
96  }
string $fragment
Stores the URL fragment/hash (#) (always changeable due to its usage)
Definition: URLBuilder.php:58

◆ withParameter()

ILIAS\UI\URLBuilder::withParameter ( URLBuilderToken  $token,
  $value 
)

Change an acquired parameter's value if the supplied token is valid.

Definition at line 165 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\checkToken(), and ILIAS\UI\URLBuilderToken\getName().

165  : self
166  {
167  if(! is_string($value) && ! is_array($value)) {
168  throw new \InvalidArgumentException('Parameter must be of type string or array');
169  }
170  $this->checkToken($token);
171  $clone = clone $this;
172  $clone->params[$token->getName()] = $value;
173 
174  return $clone;
175  }
$token
Definition: xapitoken.php:70
checkToken(URLBuilderToken $token)
Check if a token is valid.
Definition: URLBuilder.php:261
+ Here is the call graph for this function:

◆ withURI()

ILIAS\UI\URLBuilder::withURI ( URI  $uri)

Changes the base URI of the Builder.

Definition at line 81 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$uri.

81  : self
82  {
83  $clone = clone $this;
84  $clone->uri = $uri;
85  return $clone;
86  }
URI $uri
Base URI for the URLBuilder.
Definition: URLBuilder.php:53

Field Documentation

◆ $fragment

string ILIAS\UI\URLBuilder::$fragment = null
private

Stores the URL fragment/hash (#) (always changeable due to its usage)

Definition at line 58 of file URLBuilder.php.

Referenced by ILIAS\UI\URLBuilder\buildFragment(), and ILIAS\UI\URLBuilder\withFragment().

◆ $params

array ILIAS\UI\URLBuilder::$params = []
private

Stores all acquired parameters These always take precedence over existing parameters in the base URI.

array<string, string>

Definition at line 65 of file URLBuilder.php.

Referenced by ILIAS\UI\URLBuilder\buildQuery().

◆ $tokens

array ILIAS\UI\URLBuilder::$tokens = []
private

Stores all generated tokens for acquired parameters.

array<string, URLBuilderToken>

Definition at line 71 of file URLBuilder.php.

Referenced by ILIAS\UI\URLBuilder\acquireParameters().

◆ $uri

URI ILIAS\UI\URLBuilder::$uri
private

◆ SEPARATOR

◆ URL_MAX_LENGTH

const ILIAS\UI\URLBuilder::URL_MAX_LENGTH = 2048

A maximum length of 2048 characters should be safe to use in most browsers, even though longer URLs will be supported by some.

Definition at line 45 of file URLBuilder.php.

Referenced by ILIAS\UI\URLBuilderTest\testUrlTooLong().


The documentation for this class was generated from the following file: