ILIAS  trunk Revision v11.0_alpha-1769-g99a433fe2dc
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator 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, string|array $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 40 of file URLBuilder.php.

Constructor & Destructor Documentation

◆ __construct()

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

Definition at line 74 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$uri.

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

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 119 of file URLBuilder.php.

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

Referenced by ILIAS\components\ResourceStorage\Container\View\ActionBuilder\appendNamespaceToURIBuilder(), and ILIAS\Test\Results\Presentation\AttemptResultsTable\getViewControls().

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

◆ acquireParameters()

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

Definition at line 138 of file URLBuilder.php.

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

Referenced by ILIAS\Test\Scoring\Manual\TestScoringByQuestionGUI\__construct(), ILIAS\Test\Scoring\Marks\MarkSchemaGUI\__construct(), ilStudyProgrammeTypeGUI\__construct(), ilLPPersonalGUI\buildViewControls(), ILIAS\AdministrativeNotification\Table\initURIBuilder(), and ILIAS\Bibliographic\FieldFilter\Table\initURIBuilder().

138  : array
139  {
140  $tokens = [];
141  $builder = $this;
142  foreach ($names as $name) {
143  list($builder, $token) = $builder->acquireParameter($namespace, $name);
144  $tokens[] = $token;
145  }
146  array_unshift($tokens, $builder);
147  return $tokens;
148  }
if($err=$client->getError()) $namespace
$token
Definition: xapitoken.php:70
array $tokens
Stores all generated tokens for acquired parameters.
Definition: URLBuilder.php:72
+ Here is the caller graph for this function:

◆ buildFragment()

ILIAS\UI\URLBuilder::buildFragment ( )
private

Create the fragment/hash part of the URL.

Definition at line 236 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$fragment, and null.

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

236  : string
237  {
238  if ($this->fragment !== null) {
239  return ($this->fragment !== '') ? '#' . $this->fragment : '';
240  }
241  $fragment = ($this->uri->getFragment()) ? '#' . $this->uri->getFragment() : '';
242  return $fragment;
243  }
string $fragment
Stores the URL fragment/hash (#) (always changeable due to its usage)
Definition: URLBuilder.php:59
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
+ 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 225 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$params.

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

225  : string
226  {
227  $params = array_merge($this->uri->getParameters(), $this->params);
228  $query = (! empty($params)) ? '?' . http_build_query($params) : '';
229  $query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);
230  return $query;
231  }
array $params
Stores all acquired parameters These always take precedence over existing parameters in the base URI...
Definition: URLBuilder.php:66
+ 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 212 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(), ILIAS\Test\Participants\ParticipantTableDeleteParticipantAction\getModal(), ILIAS\Test\Participants\ParticipantTableIpRangeAction\getModal(), ILIAS\Test\Participants\ParticipantTableDeleteResultsAction\getModal(), ILIAS\Test\Participants\ParticipantTableExtraTimeAction\getModal(), ILIAS\Test\Participants\ParticipantTableFinishTestAction\getModal(), ilStudyProgrammeTypeGUI\getUrl(), ilObjLanguageFolderGUI\getUrl(), ILIAS\Test\Results\Presentation\AttemptResultsTable\getViewControls(), and ILIAS\UI\URLBuilder\renderObject().

212  : URI
213  {
214  $uri = new URI($this->uri->getBaseURI() . $this->buildQuery() . $this->buildFragment());
215  $this->checkLength($uri);
216  return $uri;
217  }
URI $uri
Base URI for the URLBuilder.
Definition: URLBuilder.php:54
buildFragment()
Create the fragment/hash part of the URL.
Definition: URLBuilder.php:236
buildQuery()
Create the query part of the URL from all parameters Claimed parameters overwrite base parameters in ...
Definition: URLBuilder.php:225
checkLength(URI $uri)
Check the full length of the URI against URL_MAX_LENGTH.
Definition: URLBuilder.php:275
+ 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 275 of file URLBuilder.php.

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

275  : void
276  {
277  if (! (strlen((string) $uri) <= self::URL_MAX_LENGTH)) {
278  throw new \LengthException("The final URL is longer than " . self::URL_MAX_LENGTH . " and will not be valid.");
279  }
280  }
URI $uri
Base URI for the URLBuilder.
Definition: URLBuilder.php:54
+ 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 259 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().

259  : void
260  {
261  if (! in_array($token, $this->tokens)
262  || $this->tokens[$token->getName()]->getToken() !== $token->getToken()) {
263  throw new \DomainException("Token for '" . $token->getName() . "' is not valid");
264  }
265  if (! $this->parameterExists($token->getName())) {
266  throw new \ilException("Parameter '" . $token->getName() . "' does not exist in URL");
267  }
268  }
parameterExists(string $name)
Check if parameter was already acquired.
Definition: URLBuilder.php:248
$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 153 of file URLBuilder.php.

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

153  : self
154  {
155  $this->checkToken($token);
156  $clone = clone $this;
157  unset($clone->params[$token->getName()]);
158  unset($clone->tokens[$token->getName()]);
159 
160  return $clone;
161  }
$token
Definition: xapitoken.php:70
checkToken(URLBuilderToken $token)
Check if a token is valid.
Definition: URLBuilder.php:259
+ 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 248 of file URLBuilder.php.

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

248  : bool
249  {
250  return array_key_exists($name, $this->params);
251  }
+ 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 203 of file URLBuilder.php.

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

203  : string
204  {
205  $output = 'new il.UI.core.URLBuilder(new URL("' . $this->buildURI() . '"), ' . $this->renderTokens($tokens) . ')';
206  return $output;
207  }
buildURI()
Get a URI representation of the full URL including query string and fragment/hash.
Definition: URLBuilder.php:212
renderTokens(array $tokens)
Renders a Javascript Map of all given tokens.
Definition: URLBuilder.php:183
array $tokens
Stores all generated tokens for acquired parameters.
Definition: URLBuilder.php:72
+ 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 183 of file URLBuilder.php.

References $token.

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

183  : string
184  {
185  $token_render = [];
186  foreach ($tokens as $token) {
187  $token_render[] = '["' . $token->getName() . '",' . $token->render() . ']';
188  }
189  $output = 'new Map([' . implode(',', $token_render) . '])';
190  return $output;
191  }
$token
Definition: xapitoken.php:70
array $tokens
Stores all generated tokens for acquired parameters.
Definition: URLBuilder.php:72
+ 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 92 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$fragment.

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

◆ withParameter()

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

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

Definition at line 166 of file URLBuilder.php.

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

Referenced by ilMediaCastManageTableGUI\get(), ILIAS\Badge\ilBadgeImageTemplateTableGUI\getActions(), ILIAS\Badge\ilBadgeTypesTableGUI\getActions(), ilBadgePersonalTableGUI\getActions(), ILIAS\Badge\ilBadgeTableGUI\getActions(), ILIAS\Badge\ilObjectBadgeTableGUI\getActions(), ILIAS\Badge\ilBadgeUserTableGUI\getActions(), ILIAS\Test\Participants\ParticipantTableShowResultsAction\getTableAction(), ILIAS\Test\Participants\ParticipantTableDeleteParticipantAction\getTableAction(), ILIAS\Test\Participants\ParticipantTableIpRangeAction\getTableAction(), ILIAS\Test\Participants\ParticipantTableDeleteResultsAction\getTableAction(), ILIAS\Test\Participants\ParticipantTableExtraTimeAction\getTableAction(), ILIAS\Test\Participants\ParticipantTableFinishTestAction\getTableAction(), ilStudyProgrammeTypeGUI\getUrl(), ilObjLanguageFolderGUI\getUrl(), ILIAS\Test\Results\Presentation\AttemptResultsTable\getViewControls(), ilOrgUnitTypeGUI\setSubTabsEdit(), and ILIAS\Test\Participants\ParticipantTableActions\showModal().

166  : self
167  {
168  $this->checkToken($token);
169  $clone = clone $this;
170  $clone->params[$token->getName()] = $value;
171 
172  return $clone;
173  }
$token
Definition: xapitoken.php:70
checkToken(URLBuilderToken $token)
Check if a token is valid.
Definition: URLBuilder.php:259
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ withURI()

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

Changes the base URI of the Builder.

Definition at line 82 of file URLBuilder.php.

References ILIAS\UI\URLBuilder\$uri.

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

Field Documentation

◆ $fragment

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

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

Definition at line 59 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 66 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 72 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 46 of file URLBuilder.php.

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


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