Ajouter un commentaire

Soumis par Lasserre Adrie… (non vérifié) le 01/06/2016 à 15:40 - Permalien

Bonjour,

votre article m'a vraiment beaucoup aidé dans mon développement ... jusqu'au moment où j'ai essayé de mettre en forme mon Entity de façon publique (avoir une url publique à la manière de /node/{node_id} ).
Et là, aucune information sur internet (ou très peu), il est vrai que les Entity sont généralement conçues pour êtres des éléments de support (stocker des informations, commandes etc ...) réutilisables dans des modules ou autres.
Mais, pour ceux qui comme moi aimeraient néanmoins proposer une vue publique propre, voici le process. Il manque pas grand chose :

1. Dans le fichier example.routing.yml, ajouter :

example.note.public_view:
path: '/note/{note}'
defaults:
_entity_view: 'note'
requirements:
_permission: 'access content'

Ce qui est important ici, c'est le "{note}" donné en argument du chemin : il faut que le nom soit le même que l'id donné dans les annotations de la classe Entity\Note :
"@ContentEntityType(
id = "note", "
Après, tout le reste c'est à mettre à votre sauce.

C'est ensuite la classe EntityViewBuilder (controlleur de vue par défaut des Entity) qui prend la main, c'est encore une fois défini dans ces annotations @ContentEntityType en préambule de Entity\Note :
"handlers = {
"view_builder" = "Drupal\Core\Entity\EntityViewBuilder","

Vous pouvez créer votre propre surcharge si vous en sentez le besoin .. (cf http://blog.kaliop.com/blog/2016/03/02/drupal-8-controller/)

Ne pas oublier un petit "drush cr" .. et poum.

2. Bon, cela crée une page, mais comment la lier au template (templates/note.htlml.twig + note.page.inc) que nous a généreusement donné la commande 'module generate:entity:content' ? Et là, encore quelques heures de recherches .. En creusant dans le code de EntityViewBuilder on voit qu'il charge la vue de l'Entity en faisant appel à une fonction de theme dont le nom est le même que le nom machine de l'entité. I.e, pour 'note' ce sera .. 'note'.

Il manque donc ce morceau de code dans le fichier example.module, un drush cr, et bam ! ça marche :

"function example_theme() {
return array(
'note' => array(
'render element' => 'elements',
'file' => 'note.page.inc',
'template' => 'note',
),
);
}"

Et voilà.
Bon code à tous.