ILIAS  trunk Revision v13.0_alpha-62-g3b72d83f2e5
ilLTIDataConnector Class Reference

Stores what celtic/lti keeps of the platforms that launch ILIAS in the lti2_* tables of ILIAS, through ilDB. More...

+ Inheritance diagram for ilLTIDataConnector:
+ Collaboration diagram for ilLTIDataConnector:

Public Member Functions

 __construct ()
 
 loadPlatform (Platform $platform)
 By record id, by issuer, client id and deployment id for an LTI Advantage launch, or by consumer key for an LTI 1.1 launch. More...
 
 savePlatform (Platform $platform)
 A launch only updates what the platform tells about itself, and the public key celtic/lti fetched from the key set of an LTI Advantage platform, which it keeps with its kid. More...
 
 loadContext (Context $context)
 
 saveContext (Context $context)
 
 loadResourceLink (ResourceLink $resourceLink)
 By record id, or by its id at the platform within its context or directly within its platform. More...
 
 saveResourceLink (ResourceLink $resourceLink)
 
 loadUserResult (UserResult $userresult)
 
 saveUserResult (UserResult $userresult)
 
 loadPlatformNonce (PlatformNonce $nonce)
 A nonce is found while it has not expired, which is what protects against replayed requests. More...
 
 savePlatformNonce (PlatformNonce $nonce)
 
 deletePlatformNonce (PlatformNonce $nonce)
 
 loadAccessToken (AccessToken $accessToken)
 The access token ILIAS got from an LTI Advantage platform for its services, one per platform. More...
 
 saveAccessToken (AccessToken $accessToken)
 

Private Member Functions

 fetchAdvantagePlatform (Platform $platform)
 The registration of the platform (ref_id 0) comes first. More...
 
 fetch (string $table, string $column, int|string $value, string $type, string $order_by='')
 
 decodeSettings (?string $settings)
 Earlier releases stored some settings serialized instead of as JSON. More...
 
 toTimestamp (?string $date)
 

Private Attributes

const string DATE_FORMAT = 'Y-m-d H:i:s'
 
readonly ilDBInterface $database
 

Detailed Description

Stores what celtic/lti keeps of the platforms that launch ILIAS in the lti2_* tables of ILIAS, through ilDB.

The library decides by the data whether a launch is LTI 1.1 or LTI Advantage.

The tables are the ones of the library with three differences: the ids come from sequences, the id of lti2_user_result is user_pk, and a resource link always keeps its platform (consumer_pk), which the learning progress sent back to the platform relies on.

Only what a launch and the outcome services use is implemented. The rest of the methods of the library keep their defaults, which store nothing.

Author
Saúl Díaz sdiaz.nosp@m.@sur.nosp@m.labs..nosp@m.com

Definition at line 45 of file class.ilLTIDataConnector.php.

Constructor & Destructor Documentation

◆ __construct()

ilLTIDataConnector::__construct ( )

Definition at line 51 of file class.ilLTIDataConnector.php.

52 {
53 global $DIC;
54
55 // every platform, tool and service of the library gets its storage here, so it logs to ILIAS from here on
57 $this->database = $DIC->database();
59 }
static register()
Makes celtic/lti log to the LTI component from here on in this request, and time its calls.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
global $DIC
Definition: shib_login.php:26

References $DIC, ILIAS\GlobalScreen\Provider\__construct(), ILIAS\Repository\database(), and ilLTILibraryLogger\register().

+ Here is the call graph for this function:

Member Function Documentation

◆ decodeSettings()

ilLTIDataConnector::decodeSettings ( ?string  $settings)
private

Earlier releases stored some settings serialized instead of as JSON.

Parameters
string | null$settings
Returns
array

Definition at line 428 of file class.ilLTIDataConnector.php.

428 : array
429 {
430 if ($settings === null || $settings === '') {
431 return [];
432 }
433 $decoded = Util::jsonDecode($settings, true);
434 if (!is_array($decoded)) {
435 $decoded = @unserialize($settings, ['allowed_classes' => false]);
436 }
437
438 return is_array($decoded) ? $decoded : [];
439 }
$settings
Definition: index.php:44

References $settings.

Referenced by loadContext(), loadPlatform(), and loadResourceLink().

+ Here is the caller graph for this function:

◆ deletePlatformNonce()

ilLTIDataConnector::deletePlatformNonce ( PlatformNonce  $nonce)

Definition at line 331 of file class.ilLTIDataConnector.php.

331 : bool
332 {
333 $this->database->manipulateF(
334 'DELETE FROM lti2_nonce WHERE consumer_pk = %s AND value = %s',
335 ['integer', 'text'],
336 [$nonce->getPlatform()->getRecordId() ?? 0, $nonce->getValue()]
337 );
338
339 return true;
340 }

References ILIAS\Repository\database().

+ Here is the call graph for this function:

◆ fetch()

ilLTIDataConnector::fetch ( string  $table,
string  $column,
int|string  $value,
string  $type,
string  $order_by = '' 
)
private
Parameters
string$table
string$column
int | string$value
string$type
string$order_bywhich row wins when several match
Returns
array|null

Definition at line 411 of file class.ilLTIDataConnector.php.

411 : ?array
412 {
413 $this->database->setLimit(1);
414
415 return $this->database->fetchAssoc($this->database->queryF(
416 'SELECT * FROM ' . $table . ' WHERE ' . $column . ' = %s' . ($order_by !== '' ? ' ORDER BY ' . $order_by : ''),
417 [$type],
418 [$value]
419 ));
420 }

References ILIAS\Repository\database().

Referenced by loadAccessToken(), loadContext(), loadPlatform(), loadResourceLink(), and loadUserResult().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fetchAdvantagePlatform()

ilLTIDataConnector::fetchAdvantagePlatform ( Platform  $platform)
private

The registration of the platform (ref_id 0) comes first.

Earlier releases registered an LTI Advantage platform once per released object (ref_id > 0): those rows are the fallback. The library leaves out client id and deployment id when the request does not give them.

Parameters
Platform$platform
Returns
array|null

Definition at line 385 of file class.ilLTIDataConnector.php.

385 : ?array
386 {
387 $where = ['platform_id = ' . $this->database->quote($platform->platformId, 'text')];
388 if ($platform->clientId !== null && $platform->clientId !== '') {
389 $where[] = 'client_id = ' . $this->database->quote($platform->clientId, 'text');
390 if ($platform->deploymentId !== null && $platform->deploymentId !== '') {
391 $where[] = 'deployment_id = ' . $this->database->quote($platform->deploymentId, 'text');
392 }
393 }
394 $this->database->setLimit(1);
395
396 return $this->database->fetchAssoc($this->database->query(
397 'SELECT * FROM lti2_consumer WHERE ' . implode(' AND ', $where)
398 . ' AND lti_version = ' . $this->database->quote(LtiVersion::V1P3->value, 'text')
399 . ' ORDER BY ref_id, consumer_pk'
400 ));
401 }

References ILIAS\Repository\database().

Referenced by loadPlatform().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ loadAccessToken()

ilLTIDataConnector::loadAccessToken ( AccessToken  $accessToken)

The access token ILIAS got from an LTI Advantage platform for its services, one per platform.

Definition at line 345 of file class.ilLTIDataConnector.php.

345 : bool
346 {
347 $row = $this->fetch('lti2_access_token', 'consumer_pk', (int) $accessToken->getPlatform()->getRecordId(), 'integer');
348 if ($row === null) {
349 return false;
350 }
351
352 $scopes = Util::jsonDecode((string) $row['scopes'], true);
353 $accessToken->scopes = is_array($scopes) ? $scopes : [];
354 $accessToken->token = (string) $row['token'];
355 $accessToken->expires = $this->toTimestamp($row['expires']);
356 $accessToken->created = $this->toTimestamp($row['created']);
357 $accessToken->updated = $this->toTimestamp($row['updated']);
358
359 return true;
360 }
fetch(string $table, string $column, int|string $value, string $type, string $order_by='')
if(strtoupper($request->getMethod()) !=='POST') if(( $body[ 'grant_type'] ?? '') !=='client_credentials') if(($body['client_assertion_type'] ?? '') !=='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'||!is_string($body['client_assertion'] ?? null)) $scopes
Definition: ltitoken.php:60

References $scopes, fetch(), and toTimestamp().

+ Here is the call graph for this function:

◆ loadContext()

ilLTIDataConnector::loadContext ( Context  $context)

Definition at line 134 of file class.ilLTIDataConnector.php.

134 : bool
135 {
136 $row = $context->getRecordId() !== null
137 ? $this->fetch('lti2_context', 'context_pk', $context->getRecordId(), 'integer')
138 : $this->database->fetchAssoc($this->database->queryF(
139 'SELECT * FROM lti2_context WHERE consumer_pk = %s AND lti_context_id = %s',
140 ['integer', 'text'],
141 [$context->getPlatform()->getRecordId(), $context->ltiContextId]
142 ));
143 if ($row === null) {
144 return false;
145 }
146
147 $context->setRecordId((int) $row['context_pk']);
148 $context->setPlatformId((int) $row['consumer_pk']);
149 $context->title = $row['title'];
150 $context->ltiContextId = $row['lti_context_id'];
151 $context->type = $row['type'];
152 $context->setSettings($this->decodeSettings($row['settings']));
153 $context->created = $this->toTimestamp($row['created']);
154 $context->updated = $this->toTimestamp($row['updated']);
155
156 return true;
157 }
decodeSettings(?string $settings)
Earlier releases stored some settings serialized instead of as JSON.

References ILIAS\Repository\database(), decodeSettings(), fetch(), and toTimestamp().

+ Here is the call graph for this function:

◆ loadPlatform()

ilLTIDataConnector::loadPlatform ( Platform  $platform)

By record id, by issuer, client id and deployment id for an LTI Advantage launch, or by consumer key for an LTI 1.1 launch.

Definition at line 65 of file class.ilLTIDataConnector.php.

65 : bool
66 {
67 $row = match (true) {
68 $platform->getRecordId() !== null => $this->fetch('lti2_consumer', 'consumer_pk', $platform->getRecordId(), 'integer'),
69 $platform->platformId !== null && $platform->platformId !== '' => $this->fetchAdvantagePlatform($platform),
70 // earlier releases took the last of the platforms that share a consumer key
71 $platform->getKey() !== null && $platform->getKey() !== '' => $this->fetch('lti2_consumer', 'consumer_key', $platform->getKey(), 'text', 'consumer_pk DESC'),
72 default => null,
73 };
74 if ($row === null) {
75 return false;
76 }
77
78 $platform->setRecordId((int) $row['consumer_pk']);
79 $platform->name = (string) $row['name'];
80 $platform->setKey($row['consumer_key']);
81 $platform->secret = (string) $row['secret'];
82 $platform->platformId = $row['platform_id'];
83 $platform->clientId = $row['client_id'];
84 $platform->deploymentId = $row['deployment_id'];
85 $platform->rsaKey = $row['public_key'];
86 $platform->ltiVersion = LtiVersion::tryFrom((string) $row['lti_version']);
87 $platform->signatureMethod = (string) ($row['signature_method'] ?: 'HMAC-SHA1');
88 $platform->consumerName = $row['consumer_name'];
89 $platform->consumerVersion = $row['consumer_version'];
90 $platform->consumerGuid = $row['consumer_guid'];
91 $platform->setSettings($this->decodeSettings($row['settings']));
92 $platform->protected = (int) $row['protected'] === 1;
93 $platform->enabled = (int) $row['enabled'] === 1;
94 $platform->enableFrom = $this->toTimestamp($row['enable_from']);
95 $platform->enableUntil = $this->toTimestamp($row['enable_until']);
96 $platform->lastAccess = $this->toTimestamp($row['last_access']);
97 $platform->created = $this->toTimestamp($row['created']);
98 $platform->updated = $this->toTimestamp($row['updated']);
99 $this->fixPlatformSettings($platform, false);
100 // platforms that do not register a token URL for their services may send it as a custom parameter
101 $platform->accessTokenUrl = $platform->accessTokenUrl ?: ($platform->getSetting('custom_oauth2_access_token_url') ?: null);
102
103 return true;
104 }
fetchAdvantagePlatform(Platform $platform)
The registration of the platform (ref_id 0) comes first.

References decodeSettings(), fetch(), fetchAdvantagePlatform(), ILIAS\Repository\int(), and toTimestamp().

+ Here is the call graph for this function:

◆ loadPlatformNonce()

ilLTIDataConnector::loadPlatformNonce ( PlatformNonce  $nonce)

A nonce is found while it has not expired, which is what protects against replayed requests.

ILIAS as platform has no record of its own, so the nonces of the messages tools send it are kept under 0.

Definition at line 305 of file class.ilLTIDataConnector.php.

305 : bool
306 {
307 $this->database->manipulateF(
308 'DELETE FROM lti2_nonce WHERE expires <= %s',
309 ['timestamp'],
310 [date(self::DATE_FORMAT)]
311 );
312
313 return $this->database->fetchAssoc($this->database->queryF(
314 'SELECT value FROM lti2_nonce WHERE consumer_pk = %s AND value = %s',
315 ['integer', 'text'],
316 [$nonce->getPlatform()->getRecordId() ?? 0, $nonce->getValue()]
317 )) !== null;
318 }

References ILIAS\Repository\database(), and ILIAS\UI\examples\Symbol\Glyph\Date\date().

+ Here is the call graph for this function:

◆ loadResourceLink()

ilLTIDataConnector::loadResourceLink ( ResourceLink  $resourceLink)

By record id, or by its id at the platform within its context or directly within its platform.

Definition at line 189 of file class.ilLTIDataConnector.php.

189 : bool
190 {
191 if ($resourceLink->getRecordId() !== null) {
192 $row = $this->fetch('lti2_resource_link', 'resource_link_pk', $resourceLink->getRecordId(), 'integer');
193 } elseif ($resourceLink->getContext() !== null) {
194 $row = $this->database->fetchAssoc($this->database->queryF(
195 'SELECT * FROM lti2_resource_link WHERE context_pk = %s AND lti_resource_link_id = %s',
196 ['integer', 'text'],
197 [$resourceLink->getContext()->getRecordId(), $resourceLink->getId()]
198 ));
199 } else {
200 $row = $this->database->fetchAssoc($this->database->queryF(
201 'SELECT * FROM lti2_resource_link WHERE context_pk IS NULL AND consumer_pk = %s AND lti_resource_link_id = %s',
202 ['integer', 'text'],
203 [$resourceLink->getPlatform()->getRecordId(), $resourceLink->getId()]
204 ));
205 }
206 if ($row === null) {
207 return false;
208 }
209
210 $resourceLink->setRecordId((int) $row['resource_link_pk']);
211 $resourceLink->setContextId($row['context_pk'] === null ? null : (int) $row['context_pk']);
212 $resourceLink->setPlatformId($row['consumer_pk'] === null ? null : (int) $row['consumer_pk']);
213 $resourceLink->title = $row['title'];
214 $resourceLink->ltiResourceLinkId = $row['lti_resource_link_id'];
215 $resourceLink->setSettings($this->decodeSettings($row['settings']));
216 $resourceLink->primaryResourceLinkId = $row['primary_resource_link_pk'] === null ? null : (int) $row['primary_resource_link_pk'];
217 $resourceLink->shareApproved = $row['share_approved'] === null ? null : (int) $row['share_approved'] === 1;
218 $resourceLink->created = $this->toTimestamp($row['created']);
219 $resourceLink->updated = $this->toTimestamp($row['updated']);
220
221 return true;
222 }

References ILIAS\Repository\database(), decodeSettings(), fetch(), ILIAS\Repository\int(), and toTimestamp().

+ Here is the call graph for this function:

◆ loadUserResult()

ilLTIDataConnector::loadUserResult ( UserResult  $userresult)

Definition at line 253 of file class.ilLTIDataConnector.php.

253 : bool
254 {
255 $row = $userresult->getRecordId() !== null
256 ? $this->fetch('lti2_user_result', 'user_pk', $userresult->getRecordId(), 'integer')
257 : $this->database->fetchAssoc($this->database->queryF(
258 'SELECT * FROM lti2_user_result WHERE resource_link_pk = %s AND lti_user_id = %s',
259 ['integer', 'text'],
260 [$userresult->getResourceLink()->getRecordId(), $userresult->getId(IdScope::IdOnly)]
261 ));
262 if ($row === null) {
263 return false;
264 }
265
266 $userresult->setRecordId((int) $row['user_pk']);
267 $userresult->setResourceLinkId((int) $row['resource_link_pk']);
268 $userresult->ltiUserId = $row['lti_user_id'];
269 $userresult->ltiResultSourcedId = $row['lti_result_sourcedid'];
270 $userresult->created = $this->toTimestamp($row['created']);
271 $userresult->updated = $this->toTimestamp($row['updated']);
272
273 return true;
274 }

References ILIAS\Repository\database(), fetch(), and toTimestamp().

+ Here is the call graph for this function:

◆ saveAccessToken()

ilLTIDataConnector::saveAccessToken ( AccessToken  $accessToken)

Definition at line 362 of file class.ilLTIDataConnector.php.

362 : bool
363 {
364 $consumer_pk = (int) $accessToken->getPlatform()->getRecordId();
365 $now = date(self::DATE_FORMAT);
366 $this->database->replace('lti2_access_token', ['consumer_pk' => ['integer', $consumer_pk]], [
367 'scopes' => ['clob', json_encode($accessToken->scopes, JSON_UNESCAPED_SLASHES)],
368 'token' => ['text', $accessToken->token],
369 'expires' => ['timestamp', date(self::DATE_FORMAT, (int) $accessToken->expires)],
370 'created' => ['timestamp', $accessToken->created === null ? $now : date(self::DATE_FORMAT, $accessToken->created)],
371 'updated' => ['timestamp', $now],
372 ]);
373
374 return true;
375 }

References ILIAS\Repository\database(), ILIAS\UI\examples\Symbol\Glyph\Date\date(), and ILIAS\Repository\int().

+ Here is the call graph for this function:

◆ saveContext()

ilLTIDataConnector::saveContext ( Context  $context)

Definition at line 159 of file class.ilLTIDataConnector.php.

159 : bool
160 {
161 $context->updated = time();
162 $fields = [
163 'title' => ['text', $context->title],
164 'type' => ['text', $context->type],
165 'settings' => ['clob', json_encode($context->getSettings())],
166 'updated' => ['timestamp', date(self::DATE_FORMAT, $context->updated)],
167 ];
168
169 if ($context->getRecordId() === null) {
170 $context->created = $context->updated;
171 $context->setRecordId($this->database->nextId('lti2_context'));
172 $this->database->insert('lti2_context', $fields + [
173 'context_pk' => ['integer', $context->getRecordId()],
174 'consumer_pk' => ['integer', $context->getPlatform()->getRecordId()],
175 'lti_context_id' => ['text', $context->ltiContextId],
176 'created' => ['timestamp', date(self::DATE_FORMAT, $context->created)],
177 ]);
178 return true;
179 }
180
181 $this->database->update('lti2_context', $fields, ['context_pk' => ['integer', $context->getRecordId()]]);
182
183 return true;
184 }

References ILIAS\Repository\database(), and ILIAS\UI\examples\Symbol\Glyph\Date\date().

+ Here is the call graph for this function:

◆ savePlatform()

ilLTIDataConnector::savePlatform ( Platform  $platform)

A launch only updates what the platform tells about itself, and the public key celtic/lti fetched from the key set of an LTI Advantage platform, which it keeps with its kid.

The platforms are defined in the administration and when an object is released, never here.

Definition at line 111 of file class.ilLTIDataConnector.php.

111 : bool
112 {
113 if ($platform->getRecordId() === null) {
114 return false;
115 }
116
117 $platform->updated = time();
118 $this->fixPlatformSettings($platform, true);
119 $settings = $platform->getSettings();
120 $this->fixPlatformSettings($platform, false);
121 $this->database->update('lti2_consumer', [
122 'public_key' => ['clob', $platform->rsaKey],
123 'settings' => ['clob', json_encode($settings, JSON_UNESCAPED_SLASHES)],
124 'consumer_name' => ['text', $platform->consumerName],
125 'consumer_version' => ['text', $platform->consumerVersion],
126 'consumer_guid' => ['text', $platform->consumerGuid],
127 'last_access' => ['timestamp', $platform->lastAccess === null ? null : date(self::DATE_FORMAT, $platform->lastAccess)],
128 'updated' => ['timestamp', date(self::DATE_FORMAT, $platform->updated)],
129 ], ['consumer_pk' => ['integer', $platform->getRecordId()]]);
130
131 return true;
132 }

References $settings, ILIAS\Repository\database(), and ILIAS\UI\examples\Symbol\Glyph\Date\date().

+ Here is the call graph for this function:

◆ savePlatformNonce()

ilLTIDataConnector::savePlatformNonce ( PlatformNonce  $nonce)

Definition at line 320 of file class.ilLTIDataConnector.php.

320 : bool
321 {
322 $this->database->insert('lti2_nonce', [
323 'consumer_pk' => ['integer', $nonce->getPlatform()->getRecordId() ?? 0],
324 'value' => ['text', $nonce->getValue()],
325 'expires' => ['timestamp', date(self::DATE_FORMAT, $nonce->expires)],
326 ]);
327
328 return true;
329 }

References ILIAS\Repository\database(), and ILIAS\UI\examples\Symbol\Glyph\Date\date().

+ Here is the call graph for this function:

◆ saveResourceLink()

ilLTIDataConnector::saveResourceLink ( ResourceLink  $resourceLink)

Definition at line 224 of file class.ilLTIDataConnector.php.

224 : bool
225 {
226 $resourceLink->updated = time();
227 $fields = [
228 'title' => ['text', $resourceLink->title],
229 'settings' => ['clob', json_encode($resourceLink->getSettings())],
230 'primary_resource_link_pk' => ['integer', $resourceLink->primaryResourceLinkId],
231 'share_approved' => ['integer', $resourceLink->shareApproved === null ? null : (int) $resourceLink->shareApproved],
232 'updated' => ['timestamp', date(self::DATE_FORMAT, $resourceLink->updated)],
233 ];
234
235 if ($resourceLink->getRecordId() === null) {
236 $resourceLink->created = $resourceLink->updated;
237 $resourceLink->setRecordId($this->database->nextId('lti2_resource_link'));
238 $this->database->insert('lti2_resource_link', $fields + [
239 'resource_link_pk' => ['integer', $resourceLink->getRecordId()],
240 'context_pk' => ['integer', $resourceLink->getContext()?->getRecordId()],
241 'consumer_pk' => ['integer', $resourceLink->getPlatform()->getRecordId()],
242 'lti_resource_link_id' => ['text', $resourceLink->getId()],
243 'created' => ['timestamp', date(self::DATE_FORMAT, $resourceLink->created)],
244 ]);
245 return true;
246 }
247
248 $this->database->update('lti2_resource_link', $fields, ['resource_link_pk' => ['integer', $resourceLink->getRecordId()]]);
249
250 return true;
251 }

References ILIAS\Repository\database(), ILIAS\UI\examples\Symbol\Glyph\Date\date(), and ILIAS\Repository\int().

+ Here is the call graph for this function:

◆ saveUserResult()

ilLTIDataConnector::saveUserResult ( UserResult  $userresult)

Definition at line 276 of file class.ilLTIDataConnector.php.

276 : bool
277 {
278 $userresult->updated = time();
279 $fields = [
280 'lti_result_sourcedid' => ['text', (string) $userresult->ltiResultSourcedId],
281 'updated' => ['timestamp', date(self::DATE_FORMAT, $userresult->updated)],
282 ];
283
284 if ($userresult->getRecordId() === null) {
285 $userresult->created = $userresult->updated;
286 $userresult->setRecordId($this->database->nextId('lti2_user_result'));
287 $this->database->insert('lti2_user_result', $fields + [
288 'user_pk' => ['integer', $userresult->getRecordId()],
289 'resource_link_pk' => ['integer', $userresult->getResourceLink()->getRecordId()],
290 'lti_user_id' => ['text', $userresult->getId(IdScope::IdOnly)],
291 'created' => ['timestamp', date(self::DATE_FORMAT, $userresult->created)],
292 ]);
293 return true;
294 }
295
296 $this->database->update('lti2_user_result', $fields, ['user_pk' => ['integer', $userresult->getRecordId()]]);
297
298 return true;
299 }

References ILIAS\Repository\database(), and ILIAS\UI\examples\Symbol\Glyph\Date\date().

+ Here is the call graph for this function:

◆ toTimestamp()

ilLTIDataConnector::toTimestamp ( ?string  $date)
private

Definition at line 441 of file class.ilLTIDataConnector.php.

441 : ?int
442 {
443 return $date === null || $date === '' ? null : (strtotime($date) ?: null);
444 }

Referenced by loadAccessToken(), loadContext(), loadPlatform(), loadResourceLink(), and loadUserResult().

+ Here is the caller graph for this function:

Field Documentation

◆ $database

readonly ilDBInterface ilLTIDataConnector::$database
private

Definition at line 49 of file class.ilLTIDataConnector.php.

◆ DATE_FORMAT

const string ilLTIDataConnector::DATE_FORMAT = 'Y-m-d H:i:s'
private

Definition at line 47 of file class.ilLTIDataConnector.php.


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