web-dev-qa-db-fra.com

Créez un lien personnalisé vers un champ de fichier dans Twig

J'essaie de personnaliser un lien de téléchargement pour un champ de fichier dans mon entité. Dans une configuration similaire, j'ai pu personnaliser un champ de lien de la manière suivante:

<a href="{{ node.field_publication_link.uri }}"> Link </a>

Donc, pour le champ fichier, j'ai essayé quelque chose de similaire:

<a href="{{ node.field_publication_file.0.uri }}"> Download </a>

Cependant, un champ uri n'est pas disponible. J'ai du mal à déterminer quels champs sont réellement disponibles pour moi à utiliser dans le modèle. J'ai trouvé que kint était beaucoup trop bruyant, j'ai dû restreindre la consommation de mémoire et je n'ai toujours aucune idée des champs utilisables.

Alternativement, j'ai essayé de créer un modèle personnalisé pour le champ de fichier spécifique, appelé field--field-publication-file.html.twig. Les informations de débogage m'indiquent qu'elles sont utilisées pour le rendu. J'ai jeté un œil au champ que mon thème (bootstrap) utilise normalement et j'ai essayé d'imiter son comportement. Plus précisément, je voulais utiliser le champ link, qui est également utilisé dans la version bootstrap. Cependant, ce champ est toujours vide lorsque j'utilise ma version.

Que puis-je essayer de plus?

4
bmurauer

Après plus de recherches, j'ai trouvé la réponse par accident sur la page this . On peut se référer au lien en utilisant:

<a href="{{ file_url (node.field_publication_file.entity.uri.value) }}"> 
  Download
</a>

Les champs définis dans le thème bootstrap ne semblent pas être accessibles dans un sous-thème de bootstrap. Je suis sûr que j'aurais pu écrire un préprocesseur personnalisé pour faire la même chose, mais cette solution fonctionne pour moi et je n'ai pas besoin d'écrire PHP.

2
bmurauer

Vous pouvez le faire de toute façon, en utilisant le fichier_url disponible sur le modèle twig ou vous pouvez utiliser file_create_url($file_uri); dans le préprocesseur, afin que votre modèle puisse facilement consommer la sortie traitée.

Code au niveau de la couche de prétraitement, en supposant que le nœud est l'entité hôte.

function mymodule_preprocess_node($node) {
   if (!$node->your_file_field_machine_name->isEmpty()) {
     $file_entities = $node->get('your_file_field_machine_name')->referencedEntities();
     if(count($file_entities)) {
        foreach($file_entities as $file_entity) {
            $variables['file_renderable'][] = file_create_url($file_entity->getFileUri());
        }
     }
   }
}

L'autre façon est ce que vous avez mentionné, utilisez file_url dans votre modèle twig.

<a href="{{ file_url (node.field_publication_file.entity.uri.value) }}"> 
  Download
</a>
1
arpitr