@blackcube/aurelia2-bleet 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blackcube-aurelia2-bleet-1.0.0.tgz +0 -0
- package/dist/index.es.js +4514 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.js +4549 -0
- package/dist/index.js.map +1 -0
- package/dist/types/attributes/ajaxify-trigger.d.ts +36 -0
- package/dist/types/attributes/ajaxify-trigger.d.ts.map +1 -0
- package/dist/types/attributes/alert.d.ts +15 -0
- package/dist/types/attributes/alert.d.ts.map +1 -0
- package/dist/types/attributes/badge.d.ts +13 -0
- package/dist/types/attributes/badge.d.ts.map +1 -0
- package/dist/types/attributes/burger.d.ts +11 -0
- package/dist/types/attributes/burger.d.ts.map +1 -0
- package/dist/types/attributes/drawer-trigger.d.ts +16 -0
- package/dist/types/attributes/drawer-trigger.d.ts.map +1 -0
- package/dist/types/attributes/dropdown.d.ts +38 -0
- package/dist/types/attributes/dropdown.d.ts.map +1 -0
- package/dist/types/attributes/index.d.ts +16 -0
- package/dist/types/attributes/index.d.ts.map +1 -0
- package/dist/types/attributes/menu.d.ts +32 -0
- package/dist/types/attributes/menu.d.ts.map +1 -0
- package/dist/types/attributes/modal-trigger.d.ts +16 -0
- package/dist/types/attributes/modal-trigger.d.ts.map +1 -0
- package/dist/types/attributes/pager.d.ts +13 -0
- package/dist/types/attributes/pager.d.ts.map +1 -0
- package/dist/types/attributes/password.d.ts +15 -0
- package/dist/types/attributes/password.d.ts.map +1 -0
- package/dist/types/attributes/profile.d.ts +24 -0
- package/dist/types/attributes/profile.d.ts.map +1 -0
- package/dist/types/attributes/select.d.ts +24 -0
- package/dist/types/attributes/select.d.ts.map +1 -0
- package/dist/types/attributes/tabs.d.ts +16 -0
- package/dist/types/attributes/tabs.d.ts.map +1 -0
- package/dist/types/attributes/toaster-trigger.d.ts +19 -0
- package/dist/types/attributes/toaster-trigger.d.ts.map +1 -0
- package/dist/types/attributes/upload.d.ts +57 -0
- package/dist/types/attributes/upload.d.ts.map +1 -0
- package/dist/types/codecs/ajaxify-codec.d.ts +5 -0
- package/dist/types/codecs/ajaxify-codec.d.ts.map +1 -0
- package/dist/types/codecs/csrf-codec.d.ts +7 -0
- package/dist/types/codecs/csrf-codec.d.ts.map +1 -0
- package/dist/types/codecs/request-codec.d.ts +5 -0
- package/dist/types/codecs/request-codec.d.ts.map +1 -0
- package/dist/types/components/bleet-ajaxify.d.ts +17 -0
- package/dist/types/components/bleet-ajaxify.d.ts.map +1 -0
- package/dist/types/components/bleet-ajaxify.html.d.ts +3 -0
- package/dist/types/components/bleet-ajaxify.html.d.ts.map +1 -0
- package/dist/types/components/bleet-drawer.d.ts +40 -0
- package/dist/types/components/bleet-drawer.d.ts.map +1 -0
- package/dist/types/components/bleet-drawer.html.d.ts +3 -0
- package/dist/types/components/bleet-drawer.html.d.ts.map +1 -0
- package/dist/types/components/bleet-modal.d.ts +46 -0
- package/dist/types/components/bleet-modal.d.ts.map +1 -0
- package/dist/types/components/bleet-modal.html.d.ts +3 -0
- package/dist/types/components/bleet-modal.html.d.ts.map +1 -0
- package/dist/types/components/bleet-overlay.d.ts +21 -0
- package/dist/types/components/bleet-overlay.d.ts.map +1 -0
- package/dist/types/components/bleet-quilljs.d.ts +19 -0
- package/dist/types/components/bleet-quilljs.d.ts.map +1 -0
- package/dist/types/components/bleet-quilljs.html.d.ts +3 -0
- package/dist/types/components/bleet-quilljs.html.d.ts.map +1 -0
- package/dist/types/components/bleet-toast.d.ts +26 -0
- package/dist/types/components/bleet-toast.d.ts.map +1 -0
- package/dist/types/components/bleet-toast.html.d.ts +3 -0
- package/dist/types/components/bleet-toast.html.d.ts.map +1 -0
- package/dist/types/components/bleet-toaster-trigger.d.ts +20 -0
- package/dist/types/components/bleet-toaster-trigger.d.ts.map +1 -0
- package/dist/types/components/bleet-toaster.d.ts +15 -0
- package/dist/types/components/bleet-toaster.d.ts.map +1 -0
- package/dist/types/components/bleet-toaster.html.d.ts +3 -0
- package/dist/types/components/bleet-toaster.html.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +9 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/configure.d.ts +35 -0
- package/dist/types/configure.d.ts.map +1 -0
- package/dist/types/enums/api.d.ts +11 -0
- package/dist/types/enums/api.d.ts.map +1 -0
- package/dist/types/enums/event-aggregator.d.ts +123 -0
- package/dist/types/enums/event-aggregator.d.ts.map +1 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces/api.d.ts +56 -0
- package/dist/types/interfaces/api.d.ts.map +1 -0
- package/dist/types/interfaces/dialog.d.ts +18 -0
- package/dist/types/interfaces/dialog.d.ts.map +1 -0
- package/dist/types/interfaces/event-aggregator.d.ts +75 -0
- package/dist/types/interfaces/event-aggregator.d.ts.map +1 -0
- package/dist/types/services/api-service.d.ts +64 -0
- package/dist/types/services/api-service.d.ts.map +1 -0
- package/dist/types/services/http-service.d.ts +22 -0
- package/dist/types/services/http-service.d.ts.map +1 -0
- package/dist/types/services/socketio-service.d.ts +23 -0
- package/dist/types/services/socketio-service.d.ts.map +1 -0
- package/dist/types/services/storage-service.d.ts +13 -0
- package/dist/types/services/storage-service.d.ts.map +1 -0
- package/dist/types/services/svg-service.d.ts +17 -0
- package/dist/types/services/svg-service.d.ts.map +1 -0
- package/dist/types/services/transition-service.d.ts +13 -0
- package/dist/types/services/transition-service.d.ts.map +1 -0
- package/dist/types/services/trap-focus-service.d.ts +28 -0
- package/dist/types/services/trap-focus-service.d.ts.map +1 -0
- package/doc/bleet-api-reference.md +1333 -0
- package/doc/bleet-model-api-reference.md +379 -0
- package/doc/bleet-typescript-api-reference.md +1037 -0
- package/package.json +43 -0
- package/resource.d.ts +22 -0
- package/src/attributes/ajaxify-trigger.ts +218 -0
- package/src/attributes/alert.ts +55 -0
- package/src/attributes/badge.ts +39 -0
- package/src/attributes/burger.ts +36 -0
- package/src/attributes/drawer-trigger.ts +53 -0
- package/src/attributes/dropdown.ts +377 -0
- package/src/attributes/index.ts +15 -0
- package/src/attributes/menu.ts +179 -0
- package/src/attributes/modal-trigger.ts +53 -0
- package/src/attributes/pager.ts +43 -0
- package/src/attributes/password.ts +47 -0
- package/src/attributes/profile.ts +112 -0
- package/src/attributes/select.ts +214 -0
- package/src/attributes/tabs.ts +99 -0
- package/src/attributes/toaster-trigger.ts +54 -0
- package/src/attributes/upload.ts +380 -0
- package/src/codecs/ajaxify-codec.ts +16 -0
- package/src/codecs/csrf-codec.ts +41 -0
- package/src/codecs/request-codec.ts +16 -0
- package/src/components/bleet-ajaxify.html.ts +4 -0
- package/src/components/bleet-ajaxify.ts +62 -0
- package/src/components/bleet-drawer.html.ts +36 -0
- package/src/components/bleet-drawer.ts +236 -0
- package/src/components/bleet-modal.html.ts +30 -0
- package/src/components/bleet-modal.ts +274 -0
- package/src/components/bleet-overlay.ts +111 -0
- package/src/components/bleet-quilljs.html.ts +4 -0
- package/src/components/bleet-quilljs.ts +73 -0
- package/src/components/bleet-toast.html.ts +44 -0
- package/src/components/bleet-toast.ts +133 -0
- package/src/components/bleet-toaster-trigger.ts +66 -0
- package/src/components/bleet-toaster.html.ts +11 -0
- package/src/components/bleet-toaster.ts +72 -0
- package/src/components/index.ts +8 -0
- package/src/configure.ts +121 -0
- package/src/enums/api.ts +12 -0
- package/src/enums/event-aggregator.ts +131 -0
- package/src/index.ts +220 -0
- package/src/interfaces/api.ts +64 -0
- package/src/interfaces/dialog.ts +25 -0
- package/src/interfaces/event-aggregator.ts +88 -0
- package/src/services/api-service.ts +387 -0
- package/src/services/http-service.ts +166 -0
- package/src/services/socketio-service.ts +138 -0
- package/src/services/storage-service.ts +36 -0
- package/src/services/svg-service.ts +35 -0
- package/src/services/transition-service.ts +39 -0
- package/src/services/trap-focus-service.ts +213 -0
- package/src/types/css.d.ts +4 -0
- package/src/types/html.d.ts +12 -0
- package/src/types/svg.d.ts +4 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
# BleetModel & ElasticModel API Reference
|
|
2
|
+
|
|
3
|
+
Documentation des classes de modèle formulaire Bleet pour Yii3.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
FormModel (Yiisoft)
|
|
9
|
+
└── BleetModel
|
|
10
|
+
└── ElasticModel
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## BleetModel
|
|
16
|
+
|
|
17
|
+
Modèle formulaire abstrait avec support scénarios et intégration Elastic optionnelle.
|
|
18
|
+
|
|
19
|
+
```php
|
|
20
|
+
namespace Blackcube\Bleet\Model;
|
|
21
|
+
|
|
22
|
+
abstract class BleetModel extends FormModel implements RulesProviderInterface
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Constantes
|
|
26
|
+
|
|
27
|
+
```php
|
|
28
|
+
BleetModel::ALL_REGULAR_FIELDS // Inclut toutes les propriétés publiques
|
|
29
|
+
BleetModel::NO_REGULAR_FIELDS // Exclut toutes les propriétés publiques
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### API Publique
|
|
33
|
+
|
|
34
|
+
```php
|
|
35
|
+
// Form name (support formulaires imbriqués/tabulaires)
|
|
36
|
+
->setFormName(string $formName): static
|
|
37
|
+
->getFormName(): string
|
|
38
|
+
|
|
39
|
+
// Scénarios
|
|
40
|
+
->setScenario(string $scenario): static
|
|
41
|
+
->getScenario(): ?string
|
|
42
|
+
|
|
43
|
+
// Chargement données
|
|
44
|
+
->load(mixed $data, ?string $scope = null): bool
|
|
45
|
+
static::loadMultiple(array $models, array $data, ?string $formName = null): bool
|
|
46
|
+
|
|
47
|
+
// Validation
|
|
48
|
+
->validate(): bool
|
|
49
|
+
->getRules(): iterable
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Méthodes à surcharger
|
|
53
|
+
|
|
54
|
+
```php
|
|
55
|
+
// Définir les scénarios (retourner [] = pas de filtrage)
|
|
56
|
+
public function scenarios(): array
|
|
57
|
+
{
|
|
58
|
+
return [
|
|
59
|
+
'create' => ['name', 'email', 'password'],
|
|
60
|
+
'update' => ['name', 'email'],
|
|
61
|
+
'admin' => [self::ALL_REGULAR_FIELDS],
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Définir les règles de validation
|
|
66
|
+
protected function rules(): iterable
|
|
67
|
+
{
|
|
68
|
+
return [
|
|
69
|
+
'email' => [new Required(), new Email()],
|
|
70
|
+
'name' => [new Required(), new Length(min: 2, max: 100)],
|
|
71
|
+
];
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Comportement scénarios
|
|
76
|
+
|
|
77
|
+
| Scénario | Comportement |
|
|
78
|
+
|----------|--------------|
|
|
79
|
+
| `null` (non défini) | Pas de filtrage, tous les champs actifs |
|
|
80
|
+
| `[]` (scenarios() vide) | Pas de filtrage, tous les champs actifs |
|
|
81
|
+
| Scénario inexistant | `InvalidArgumentException` |
|
|
82
|
+
| Scénario défini | Seuls les champs listés sont chargés/validés |
|
|
83
|
+
|
|
84
|
+
### Exemple usage
|
|
85
|
+
|
|
86
|
+
```php
|
|
87
|
+
class UserForm extends BleetModel
|
|
88
|
+
{
|
|
89
|
+
public string $name = '';
|
|
90
|
+
public string $email = '';
|
|
91
|
+
public string $password = '';
|
|
92
|
+
|
|
93
|
+
public function scenarios(): array
|
|
94
|
+
{
|
|
95
|
+
return [
|
|
96
|
+
'register' => ['name', 'email', 'password'],
|
|
97
|
+
'profile' => ['name', 'email'],
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
protected function rules(): iterable
|
|
102
|
+
{
|
|
103
|
+
return [
|
|
104
|
+
'name' => [new Required()],
|
|
105
|
+
'email' => [new Required(), new Email()],
|
|
106
|
+
'password' => [new Required(), new Length(min: 8)],
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Usage
|
|
112
|
+
$form = new UserForm();
|
|
113
|
+
$form->setScenario('profile');
|
|
114
|
+
$form->load($request->getParsedBody()); // password ignoré
|
|
115
|
+
$form->validate(); // password non validé
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Formulaires tabulaires
|
|
119
|
+
|
|
120
|
+
```php
|
|
121
|
+
// Données POST : UserForm[0][name], UserForm[1][name], etc.
|
|
122
|
+
$models = [new UserForm(), new UserForm()];
|
|
123
|
+
BleetModel::loadMultiple($models, $_POST);
|
|
124
|
+
|
|
125
|
+
// Formulaires imbriqués
|
|
126
|
+
$form->setFormName('ParentForm[children][0]');
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Intégration Elastic automatique
|
|
130
|
+
|
|
131
|
+
Si la classe porte l'attribut `#[Elastic]`, les règles JSON Schema sont automatiquement fusionnées avec `rules()`. Les règles PHP ont priorité.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## ElasticModel
|
|
136
|
+
|
|
137
|
+
Extension de BleetModel pour les AR avec ElasticTrait. Gère les propriétés fixes (réflexion) + propriétés élastiques (JSON Schema).
|
|
138
|
+
|
|
139
|
+
```php
|
|
140
|
+
namespace Blackcube\Bleet\Model;
|
|
141
|
+
|
|
142
|
+
#[Elastic]
|
|
143
|
+
abstract class ElasticModel extends BleetModel implements DataSetInterface
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Constantes additionnelles
|
|
147
|
+
|
|
148
|
+
```php
|
|
149
|
+
ElasticModel::ALL_ELASTIC_FIELDS // Inclut toutes les propriétés élastiques
|
|
150
|
+
ElasticModel::NO_ELASTIC_FIELDS // Exclut toutes les propriétés élastiques
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### API Publique
|
|
154
|
+
|
|
155
|
+
```php
|
|
156
|
+
// Hérité de BleetModel
|
|
157
|
+
->setFormName(string): static
|
|
158
|
+
->getFormName(): string
|
|
159
|
+
->setScenario(string): static
|
|
160
|
+
->getScenario(): ?string
|
|
161
|
+
->load(mixed $data, ?string $scope = null): bool
|
|
162
|
+
->validate(): bool
|
|
163
|
+
->getRules(): iterable
|
|
164
|
+
|
|
165
|
+
// Spécifique ElasticModel
|
|
166
|
+
->getSchema(): ?Schema // JSON Schema Swaggest
|
|
167
|
+
->getElasticValues(): array // Valeurs propriétés élastiques
|
|
168
|
+
->getElasticPropertyMeta(): array // Métadonnées champs élastiques
|
|
169
|
+
->getPropertyValue(string $property): mixed // Accès unifié fixe+élastique
|
|
170
|
+
->getData(): array // Toutes les données (DataSetInterface)
|
|
171
|
+
->hasProperty(string $property): bool // Existence propriété
|
|
172
|
+
->populateActiveRecord(object $ar, bool $isNew = false): void
|
|
173
|
+
|
|
174
|
+
// Magic methods (accès transparent propriétés élastiques)
|
|
175
|
+
->__get(string $name): mixed
|
|
176
|
+
->__set(string $name, mixed $value): void
|
|
177
|
+
->__isset(string $name): bool
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Méthodes protégées (pour sous-classes)
|
|
181
|
+
|
|
182
|
+
```php
|
|
183
|
+
// Initialisation depuis AR
|
|
184
|
+
protected function initFromAr(object $ar): void
|
|
185
|
+
protected function initElasticFromAr(object $ar): void
|
|
186
|
+
|
|
187
|
+
// Population vers AR
|
|
188
|
+
protected function populateToAr(object $ar, bool $isNew = false): void
|
|
189
|
+
protected function populateElasticToAr(object $ar): void
|
|
190
|
+
|
|
191
|
+
// Exclusions
|
|
192
|
+
protected static function excludedProperties(): array // À surcharger si besoin
|
|
193
|
+
|
|
194
|
+
// Helpers
|
|
195
|
+
protected function isElasticProperty(string $name): bool
|
|
196
|
+
protected function getActiveFields(): ?array
|
|
197
|
+
protected function getRegularFieldNames(): array
|
|
198
|
+
protected function getFormProperties(): array
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Métadonnées élastiques
|
|
202
|
+
|
|
203
|
+
`getElasticPropertyMeta()` retourne pour chaque propriété :
|
|
204
|
+
|
|
205
|
+
```php
|
|
206
|
+
[
|
|
207
|
+
'propertyName' => [
|
|
208
|
+
'field' => 'text|textarea|wysiwyg|email|date|datetime-local|number|checkbox|radio|radiolist|dropdownlist|file|files',
|
|
209
|
+
'label' => 'Label affiché',
|
|
210
|
+
'fileType' => 'image|document|...', // si file/files
|
|
211
|
+
'imageWidth' => 800, // si image
|
|
212
|
+
'imageHeight' => 600, // si image
|
|
213
|
+
'options' => [...], // options wysiwyg, etc.
|
|
214
|
+
'items' => [ // radiolist/dropdownlist
|
|
215
|
+
['title' => 'Option 1', 'value' => '1', 'description' => '...'],
|
|
216
|
+
],
|
|
217
|
+
],
|
|
218
|
+
]
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Exemple complet
|
|
222
|
+
|
|
223
|
+
```php
|
|
224
|
+
class ArticleForm extends ElasticModel
|
|
225
|
+
{
|
|
226
|
+
public string $title = '';
|
|
227
|
+
public string $slug = '';
|
|
228
|
+
public bool $active = true;
|
|
229
|
+
// + propriétés élastiques depuis JSON Schema AR
|
|
230
|
+
|
|
231
|
+
protected static function excludedProperties(): array
|
|
232
|
+
{
|
|
233
|
+
return ['id', 'dateCreate', 'dateUpdate'];
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
public function scenarios(): array
|
|
237
|
+
{
|
|
238
|
+
return [
|
|
239
|
+
'create' => [
|
|
240
|
+
self::ALL_REGULAR_FIELDS,
|
|
241
|
+
self::ALL_ELASTIC_FIELDS,
|
|
242
|
+
],
|
|
243
|
+
'update' => [
|
|
244
|
+
'title', 'active',
|
|
245
|
+
self::ALL_ELASTIC_FIELDS,
|
|
246
|
+
],
|
|
247
|
+
'publish' => [
|
|
248
|
+
'active',
|
|
249
|
+
self::NO_ELASTIC_FIELDS,
|
|
250
|
+
],
|
|
251
|
+
];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
protected function rules(): iterable
|
|
255
|
+
{
|
|
256
|
+
return [
|
|
257
|
+
'title' => [new Required(), new Length(max: 255)],
|
|
258
|
+
'slug' => [new Required(), new Regex('/^[a-z0-9-]+$/')],
|
|
259
|
+
];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
public static function fromActiveRecord(Article $ar): static
|
|
263
|
+
{
|
|
264
|
+
$form = new static();
|
|
265
|
+
$form->initFromAr($ar);
|
|
266
|
+
return $form;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
public function populateActiveRecord(Article $ar, bool $isNew = false): void
|
|
270
|
+
{
|
|
271
|
+
parent::populateActiveRecord($ar, $isNew);
|
|
272
|
+
// Logique supplémentaire si besoin
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Usage
|
|
277
|
+
$article = Article::findOne($id);
|
|
278
|
+
$form = ArticleForm::fromActiveRecord($article);
|
|
279
|
+
$form->setScenario('update');
|
|
280
|
+
|
|
281
|
+
if ($form->load($request->getParsedBody()) && $form->validate()) {
|
|
282
|
+
$form->populateActiveRecord($article);
|
|
283
|
+
$article->save();
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Accès propriétés élastiques
|
|
288
|
+
|
|
289
|
+
```php
|
|
290
|
+
// Via magic methods (transparent)
|
|
291
|
+
$form->elasticPropertyName = 'value';
|
|
292
|
+
$value = $form->elasticPropertyName;
|
|
293
|
+
|
|
294
|
+
// Via getPropertyValue (unifié)
|
|
295
|
+
$value = $form->getPropertyValue('anyProperty');
|
|
296
|
+
|
|
297
|
+
// Via getElasticValues (toutes les élastiques)
|
|
298
|
+
$elasticData = $form->getElasticValues();
|
|
299
|
+
|
|
300
|
+
// Via getData (tout, pour validation)
|
|
301
|
+
$allData = $form->getData();
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Comportement scénarios ElasticModel
|
|
305
|
+
|
|
306
|
+
| Constante | Effet |
|
|
307
|
+
|-----------|-------|
|
|
308
|
+
| `ALL_REGULAR_FIELDS` | Toutes les propriétés publiques PHP |
|
|
309
|
+
| `NO_REGULAR_FIELDS` | Aucune propriété publique PHP |
|
|
310
|
+
| `ALL_ELASTIC_FIELDS` | Toutes les propriétés JSON Schema |
|
|
311
|
+
| `NO_ELASTIC_FIELDS` | Aucune propriété JSON Schema |
|
|
312
|
+
|
|
313
|
+
Les champs explicites sont auto-détectés (regular vs elastic) :
|
|
314
|
+
|
|
315
|
+
```php
|
|
316
|
+
'scenario' => [
|
|
317
|
+
'title', // → regular (propriété PHP)
|
|
318
|
+
'elasticDescription', // → elastic (propriété JSON Schema)
|
|
319
|
+
self::ALL_ELASTIC_FIELDS, // → toutes les élastiques
|
|
320
|
+
]
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Normalisation automatique
|
|
326
|
+
|
|
327
|
+
BleetModel normalise automatiquement les valeurs vides pour les types nullable :
|
|
328
|
+
|
|
329
|
+
| Type propriété | Valeur `''` | Résultat |
|
|
330
|
+
|----------------|-------------|----------|
|
|
331
|
+
| `string` | `''` | `''` (inchangé) |
|
|
332
|
+
| `?string` | `''` | `''` (inchangé) |
|
|
333
|
+
| `?int` | `''` | `null` |
|
|
334
|
+
| `?float` | `''` | `null` |
|
|
335
|
+
| `?bool` | `''` | `null` |
|
|
336
|
+
|
|
337
|
+
Évite le cast PHP `'' → 0` pour les entiers nullable.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## Fusion règles Elastic
|
|
342
|
+
|
|
343
|
+
Quand `#[Elastic]` est présent, les règles sont fusionnées :
|
|
344
|
+
|
|
345
|
+
1. Règles PHP (`rules()`) ont priorité
|
|
346
|
+
2. Règles Elastic ajoutées si propriété absente de PHP
|
|
347
|
+
3. Pas de doublon de type (ex: pas 2× `Required`)
|
|
348
|
+
|
|
349
|
+
```php
|
|
350
|
+
// PHP rules
|
|
351
|
+
protected function rules(): iterable
|
|
352
|
+
{
|
|
353
|
+
return [
|
|
354
|
+
'title' => [new Required(), new Length(max: 100)],
|
|
355
|
+
];
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// JSON Schema définit : title (required, maxLength: 255), description (required)
|
|
359
|
+
// Résultat fusionné :
|
|
360
|
+
// - title: Required (PHP), Length(100) (PHP) — Elastic ignoré
|
|
361
|
+
// - description: Required (Elastic)
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Interfaces implémentées
|
|
367
|
+
|
|
368
|
+
### BleetModel
|
|
369
|
+
|
|
370
|
+
```php
|
|
371
|
+
RulesProviderInterface // Yiisoft\Validator
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### ElasticModel
|
|
375
|
+
|
|
376
|
+
```php
|
|
377
|
+
RulesProviderInterface // Yiisoft\Validator
|
|
378
|
+
DataSetInterface // Yiisoft\Validator (getData(), hasProperty())
|
|
379
|
+
```
|