Skip to content

Commit e57d2b5

Browse files
DanielWeitenauerskerbis
authored andcommitted
Hinweise zu REX_ARTICLE_ID (redaxo#63)
* Basis für rex_api_function * Hinweis zu REX_ARTICLE_ID closes redaxo#59
1 parent 2c83ba8 commit e57d2b5

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

api.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,112 @@
11
# Api
2+
3+
Über `rex_api_function` können AddOns eine zentrale API zur Verfügung stellen. Die Funktionen dieser API lassen sich jeweils über eine URL aufrufen. Sie dienen dazu, bestimmte Vorgaben, wie z.B. Nutzerrechte oder System-Einstellungen zu prüfen und den Aufruf bei Bedarf an einen dahinterliegenden Service (PHP-Klasse zur Verarbeitung) weiterzureichen. Rückmeldungen der Services können geprüft und als ausführliche Fehler- oder Erfolgsmedlung zurückgegeben werden, die dann von der aufrufenden Stelle ausgegeben werden können.
4+
5+
Da API-Funktionen über einen URL-Request aufgerufen werden, ist es möglich, sie über AJAX-Requests anzusprechen. Mit jedem Request kann nur eine API-Funktion aufgerufen werden.
6+
7+
## Aufruf
8+
Der Aufruf einer API-Funktion kann auf jeder beliebigen Seite erfolgen. Um den Aufruf zu kennzeichnen ist der Parameter `rex-api-function` nötig, über den der Name der auzurufenden API-Funktion übergeben wird: `index.php?...&rex-api-call=function_name`. Der übergebene Name enstpricht dabei dem Klassennamen ohne das vorangestellte `rex_api_`. Mit dem Aufruf können beliebige weitere Parameter zur Verabrietung übergeben werden.
9+
10+
## Implementierung
11+
- Jede API-Funktion wird durch eine PHP-Klasse repräsentiert. Der Klassenname muss mit `rex_api_` beginnen und die abstrakte Basisklasse `rex_api_function` erweitern. Es muss mindestens die Methode execute() definiert sein.
12+
- Für die Fehlerausgabe gibt es die Exception-Klasse `rex_api_exception`.
13+
- Für Rückmeldungen dient die Klasse `rex_api_result`.
14+
15+
```
16+
/**
17+
* Beispiel einer einfachen rex_api_function Implementierung
18+
*
19+
* Über diese API-Funktion kann der Name einer Kategorie ausgegeben werden, deren ID mit übergeben wird.
20+
* Falls die Kategorie nicht existiert, wird eine Fehlermeldung erzeugt.
21+
* Aufruf: index.php?rex-api-call=demo&category_id=XX
22+
*/
23+
class rex_api_demo extends rex_api_function
24+
{
25+
public function execute()
26+
{
27+
// Hier wird die Kategorie anhand einer übergebenen ID ausgelesen
28+
$category_id = rex_request('category_id', 'int');
29+
$category = rex_category::get($category_id);
30+
31+
// Falls die Kategorie nicht existiert, wird eine Fehlermeldung ausgelöst
32+
if (!$category instanceof rex_category) {
33+
throw new rex_api_exception('Kategorie existiert nicht!');
34+
}
35+
36+
// Existiert die Kategorie, wird eine Meldung mit dem Namen der Kategorie zurückgegeben
37+
return new rex_api_result(true, 'Der Kategorie-Name lautet: '.$category->getName());
38+
}
39+
}
40+
```
41+
42+
## Die Methoden der Klassen
43+
### rex_api_function
44+
45+
#### Methoden zur Verwendung innerhalb von rex_api_function
46+
```
47+
// Funktioniert nur innerhalb von rex_api_function
48+
// Gibt Namen der Funktion und ein CSRF Token zurück
49+
$url_params = rex_api_function::getUrlParams();
50+
51+
// Funktioniert nur innerhalb von rex_api_function
52+
// Gibt den Namen der Funktion und ein CSRF-Token als verstecktes <input> feld zurück
53+
echo rex_api_function::getHiddenFields();
54+
```
55+
56+
### rex_api_result
57+
Diese Klasse repräsentiert das Ergebnis einer API-Funktion. Sie stellt mehrere Methoden zur Definition des Ergebnisses bereit.
58+
Das Ergebnis kann von der API-Funktion per `return` Statement zurückgegeben werden. Ein Ergebnis kann positiv (Ausführung erfolgreich) oder negativ (Ausführung fehlgeschlagen) sein.
59+
60+
#### Ergebnis erzeugen
61+
```
62+
$result = new rex_api_result($status, $message);
63+
```
64+
65+
Parameter | Beschreibung
66+
$status | Status des Ergebnisses. `true` = Ausführung erfolgreich, `false` = Ausführung fehlgeschlagen.
67+
$message | _optional:_ Ausführlicher Nachricht. Z.B. zur Ausgabe für den Nutzer.
68+
69+
#### Status des Ergebnisses abfragen
70+
```
71+
// Der Status ist bei Erfolg 'true'
72+
$status = $result->isSuccessfull()
73+
```
74+
75+
#### Nachricht ausgeben
76+
```
77+
// Gibt die Nachricht ohne zusätzliche Formatierung aus
78+
echo $result->getMessage();
79+
80+
// Gibt die Nachricht anhand des Parameters $status formatiert aus
81+
// Erfolgsmeldungen werden mit rex_view::success() formatiert,
82+
// Fehlschläge werden mit rex_view::error() formatiert
83+
echo $result->getFormattedMessage();
84+
```
85+
86+
#### Vor der Rückmeldung einen erneuten Request ausführen
87+
```
88+
// Falls die Rückmeldung einen zusätzlichen Request erfordert, um z.B. Low-Level-Änderungen zu übernehmen, kann ein
89+
// Flag gesetzt werden:
90+
$result->setRequiresReboot($requires_reboot);
91+
92+
// Der Flag kann so abgefragt werden:
93+
$result->requiresReboot();
94+
```
95+
96+
Parameter | Beschreibung
97+
$requires_reboot | `false` = keinen neuen Request vor Rückgabe ausführen (Standard). `true` = einen neuen Request vor Rückgabe ausführen. Der zusätzliche Request wird automatisch von rex_api_function ausgeführt.
98+
99+
#### Ergebnis JSON kodieren
100+
```
101+
// Ergebnis kodieren
102+
// Wandelt die Daten eines rex_api_result Objektes in einen JSON-String
103+
$json = $result->toJSON();
104+
105+
// Ergebnis dekodieren
106+
// Wandelt ein JSON kodiertes Ergebnis zurück in ein rex_api_result Objekt.
107+
$result = rex_api_result::fromJSON($json);
108+
```
109+
110+
### rex_api_exception
111+
Diese Exception kann abgefangen werden. Im Normalfall wird sie von REDAXO als Whoops-Meldung ausgeben.
112+

redaxo-variablen.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,10 @@ Shortcut für `rex_article::getCurrentId()`.
387387

388388
**Hinweis:** Wird vom `structure`-Plugin `content` bereitgestellt.*
389389

390+
Wird innerhalb eines Artikels ein anderer Artikel über `rex_article_content` eingebunden, unterscheidet sich die Rückgabe von `rex_article::getCurrentId()` und `REX_ARTICLE_ID`:
391+
- `rex_article::getCurrentId()` gibt stets die ID des einbindenden Artikels zurück, auch beim Aufruf im eingebundenen Artikel
392+
- `REX_ARTICLE_ID` gibt jeweils die ID des Artikels zurück, in dem es aufgerufen wird
393+
390394
#### Syntax
391395

392396
```

0 commit comments

Comments
 (0)