forked from jelix/jelix-manuel-fr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreer_response.gtw
130 lines (97 loc) · 4.68 KB
/
creer_response.gtw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
~~LANG:EN@enman:creating-response~~
Il est possible que Jelix ne fournisse pas le moyen de générer du contenu dans
un format spécifique voulu. Aussi, il vous faut dans ce cas créer votre propre
réponse.
Cela consiste à :
- créer une classe héritant de @@C@jResponse@@ (ou d'une autre réponse
existante), et qui doit implémenter les méthodes adéquates pour manipuler
le format en question
- stocker cette classe dans le répertoire @@F@responses/@@ de votre
application ou aussi de vos modules.
- déclarer ce type de réponse dans le fichier de configuration
===== Créer la classe =====
Une classe //response// doit posséder au moins deux méthodes : @@M@output()@@ et
@@M@outputErrors()@@. Et redéfinir la propriété @@P@$_type@@ avec un identifiant
propre à votre type de réponse. @@M@output()@@ doit générer le contenu formaté
correctement (en faisant des print ou echo). @@M@outputErrors()@@ est appelé
quand des erreurs bloquantes sont survenues pendant le traitement d'une action.
Il génère alors une réponse différente, voire spécifique au format dans ce
contexte-là. Il ne faut pas oublier non plus d'envoyer un en-tête HTTP
correspondant au type de format.
Exemple d'un format (bidon :-) ):
<code php>
class myFooResponse extends jResponse {
protected $_type = 'foo';
public $content = '';
/**
* génère le contenu et l'envoi au navigateur.
* @return boolean true si la génération est ok, false sinon
*/
public function output(){
$this->_httpHeaders['Content-Type']='text/foo;charset='.jApp::config()->charset;
$this->sendHttpHeaders();
echo "content:\n".$this->content."/content;";
return true;
}
public function outputErrors(){
header('Content-Type: text/foo;charset='.jApp::config()->charset);
echo "errors\n";
foreach (jApp::coord()->errorMessages as $e) {
echo '['.$e[0].' '.$e[1].'] '.$e[2]." \t".$e[3]." \t".$e[4]."\n";
}
echo "/errors;";
}
}
</code>
Comme dans l'exemple ci-dessus avec la propriété @@P@$content@@, vous pouvez
rajouter toutes les propriétés et méthodes nécessaires à une manipulation aisée
de l'objet dans les actions. Par exemple, l'objet @@C@jResponseHtml@@ instancie
d'office un template, contient une propriété pour spécifier le titre d'une page
html, des méthodes pour ajouter des choses dans le @@E@<head>@@ etc..
N'hésitez pas à regarder le code source des fichiers dans
@@F@lib/jelix/core/response/@@. Peut-être d'ailleurs que votre format
s'apparente à un de ceux fournis par Jelix. Dans ce cas, votre objet response
peut hériter de cet objet, ajouter des méthodes, en redéfinir etc.
===== Stockage de la classe =====
Le nom de la classe importe peu, mais il doit être utilisé dans le nom du
fichier, et précéder le suffixe '.class.php'. Dans notre exemple, la classe sera
alors stockée dans le fichier @@[email protected]@@.
Le fichier doit être enregistré dans le répertoire @@F@responses/@@ de votre
application ou de votre module.
===== Déclarer la réponse =====
Pour que la réponse soit utilisable par les actions, il faut la déclarer avec un
code. Et c'est ce code que vous indiquerez à la méthode @@M@getResponse@@ dans
les contrôleurs. Pour cela, vous ajouterez dans la section @@responses@@ du
fichier de configuration, une ligne @@code=classe@@.
Voici un exemple de réponse fournie par votre application :
<code ini>
[responses]
foo=myFooResponse
</code>
Voici un exemple de réponse fournie par votre module :
<code ini>
[responses]
foo="mymodule~myFooResponse"
</code>
Ensuite vous sera à même d'utiliser votre réponse dans les actions de votre contrôleur.
Et dans un contrôleur, cela donne :
<code php>
function index(){
$rep = this->getResponse('foo');
$rep->content='hello world';
return $rep;
}
</code>
Pourquoi ne pas indiquer directement le nom de la classe à @@M@getResponse@@ ?
Parce que cela permet de redéfinir un même type de réponse de façon transparente
pour les actions et modules.
===== À propos des templates =====
Les plugins de templates sont, pour un certain nombre, attribués à un type de
réponse particulier. Aussi, si vous créez un nouveau type de réponse spécifique,
il vous faudra adapter et aussi dupliquer/copier/recréer les plugins de
templates existants pour les autres types de réponses.
Si vous héritez par contre d'un objet response existant (de @@C@jResponseHtml@@
par exemple), ne changez pas la propriété @@P@type@@ de la classe mère, sinon
vous ne pourrez pas réutiliser les plugins de templates existants (à moins de
les redéfinir).
Voir la [[plugins/tpl|doc pour faire des plugins de templates]].