@@ -30,6 +30,9 @@ abstract class RestfulEntityBase extends \RestfulDataProviderEFQ implements \Res
30
30
* content. This can be used for example on a text field with filtered text
31
31
* input format where we would need to do $wrapper->body->value->value().
32
32
* Defaults to FALSE.
33
+ * - "formatter": Used for rendering the value of a configurable field using
34
+ * Drupal field API's formatter. The value is the $display value that is
35
+ * passed to field_view_field().
33
36
* - "wrapper_method": The wrapper's method name to perform on the field.
34
37
* This can be used for example to get the entity label, by setting the
35
38
* value to "label". Defaults to "value".
@@ -302,49 +305,29 @@ public function viewEntity($entity_id) {
302
305
else {
303
306
// Exposing an entity field.
304
307
$ property = $ info ['property ' ];
305
-
306
308
$ sub_wrapper = $ info ['wrapper_method_on_entity ' ] ? $ wrapper : $ wrapper ->{$ property };
307
309
308
310
// Check user has access to the property.
309
311
if ($ property && !$ this ->checkPropertyAccess ('view ' , $ public_field_name , $ sub_wrapper , $ wrapper )) {
310
312
continue ;
311
313
}
312
314
313
- $ method = $ info ['wrapper_method ' ] ? $ info ['wrapper_method ' ] : NULL ;
314
- $ resource = $ info ['resource ' ] ? $ info ['resource ' ] : NULL ;
315
-
316
- if ($ sub_wrapper instanceof EntityListWrapper) {
317
- // Multiple value.
318
- foreach ($ sub_wrapper as $ item_wrapper ) {
319
- if ($ info ['sub_property ' ] && $ item_wrapper ->value ()) {
320
- $ item_wrapper = $ item_wrapper ->{$ info ['sub_property ' ]};
321
- }
322
-
323
- if ($ resource ) {
324
- if ($ value_from_resource = $ this ->getValueFromResource ($ item_wrapper , $ property , $ resource , $ public_field_name , $ wrapper ->getIdentifier ())) {
325
- $ value [] = $ value_from_resource ;
326
- }
315
+ if (empty ($ info ['formatter ' ])) {
316
+ if ($ sub_wrapper instanceof EntityListWrapper) {
317
+ // Multiple values.
318
+ foreach ($ sub_wrapper as $ item_wrapper ) {
319
+ $ value [] = $ this ->getValueFromProperty ($ wrapper , $ item_wrapper , $ info , $ public_field_name );
327
320
}
328
- else {
329
- // Wrapper method.
330
- $ value [] = $ item_wrapper ->{$ method }();
331
- }
332
- }
333
- }
334
- else {
335
- // Single value.
336
- if ($ info ['sub_property ' ] && $ sub_wrapper ->value ()) {
337
- $ sub_wrapper = $ sub_wrapper ->{$ info ['sub_property ' ]};
338
- }
339
-
340
- if ($ resource ) {
341
- $ value = $ this ->getValueFromResource ($ sub_wrapper , $ property , $ resource , $ public_field_name , $ wrapper ->getIdentifier ());
342
321
}
343
322
else {
344
- // Wrapper method .
345
- $ value = $ sub_wrapper ->{ $ method }( );
323
+ // Single value .
324
+ $ value = $ this -> getValueFromProperty ( $ wrapper , $ sub_wrapper , $ info , $ public_field_name );
346
325
}
347
326
}
327
+ else {
328
+ // Get value from field formatter.
329
+ $ value = $ this ->getValueFromFieldFormatter ($ wrapper , $ sub_wrapper , $ info );
330
+ }
348
331
}
349
332
350
333
if ($ value && $ info ['process_callbacks ' ]) {
@@ -363,6 +346,84 @@ public function viewEntity($entity_id) {
363
346
return $ values ;
364
347
}
365
348
349
+ /**
350
+ * Get value from a property.
351
+ *
352
+ * @param EntityMetadataWrapper $wrapper
353
+ * The wrapped entity.
354
+ * @param EntityMetadataWrapper $sub_wrapper
355
+ * The wrapped property.
356
+ * @param array $info
357
+ * The public field info array.
358
+ * @param $public_field_name
359
+ * The field name.
360
+ *
361
+ * @return mixed
362
+ * A single or multiple values.
363
+ */
364
+ protected function getValueFromProperty (\EntityMetadataWrapper $ wrapper , \EntityMetadataWrapper $ sub_wrapper , array $ info , $ public_field_name ) {
365
+ $ property = $ info ['property ' ];
366
+ $ method = $ info ['wrapper_method ' ];
367
+ $ resource = $ info ['resource ' ] ?: NULL ;
368
+
369
+ if ($ info ['sub_property ' ] && $ sub_wrapper ->value ()) {
370
+ $ sub_wrapper = $ sub_wrapper ->{$ info ['sub_property ' ]};
371
+ }
372
+
373
+ if ($ resource ) {
374
+ $ value = $ this ->getValueFromResource ($ sub_wrapper , $ property , $ resource , $ public_field_name , $ wrapper ->getIdentifier ());
375
+ }
376
+ else {
377
+ // Wrapper method.
378
+ $ value = $ sub_wrapper ->{$ method }();
379
+ }
380
+
381
+ return $ value ;
382
+ }
383
+
384
+ /**
385
+ * Get value from a field rendered by Drupal field API's formatter.
386
+ *
387
+ * @param EntityMetadataWrapper $wrapper
388
+ * The wrapped entity.
389
+ * @param EntityMetadataWrapper $sub_wrapper
390
+ * The wrapped property.
391
+ * @param array $info
392
+ * The public field info array.
393
+ *
394
+ * @return mixed
395
+ * A single or multiple values.
396
+ */
397
+ protected function getValueFromFieldFormatter (\EntityMetadataWrapper $ wrapper , \EntityMetadataWrapper $ sub_wrapper , array $ info ) {
398
+ $ property = $ info ['property ' ];
399
+
400
+ if (!field_info_field ($ property )) {
401
+ // Property is not a field.
402
+ throw new \RestfulServerConfigurationException (format_string ('@property is not a configurable field, so it cannot be processed using field API formatter ' , array ('@property ' => $ property )));
403
+ }
404
+
405
+ // Get values from the formatter.
406
+ $ output = field_view_field ($ this ->getEntityType (), $ wrapper ->value (), $ property , $ info ['formatter ' ]);
407
+
408
+ // Unset the theme, as we just want to get the value from the formatter,
409
+ // without the wrapping HTML.
410
+ unset($ output ['#theme ' ]);
411
+
412
+
413
+ if ($ sub_wrapper instanceof EntityListWrapper) {
414
+ // Multiple values.
415
+ foreach (element_children ($ output ) as $ delta ) {
416
+ $ value [] = drupal_render ($ output [$ delta ]);
417
+ }
418
+ }
419
+ else {
420
+ // Single value.
421
+ $ value = drupal_render ($ output );
422
+ }
423
+
424
+ return $ value ;
425
+ }
426
+
366
427
/**
367
428
* Get the "target_type" property from an field or property reference.
368
429
*
@@ -1174,6 +1235,7 @@ public function getPublicFields() {
1174
1235
'sub_property ' => FALSE ,
1175
1236
'wrapper_method ' => 'value ' ,
1176
1237
'wrapper_method_on_entity ' => FALSE ,
1238
+ 'formatter ' => FALSE ,
1177
1239
);
1178
1240
1179
1241
if ($ field = field_info_field ($ info ['property ' ])) {
0 commit comments