it-swarm.com.de

Erstellen Sie einen benutzerdefinierten Link zu einem Dateifeld in Twig

Ich versuche, einen Download-Link für ein Dateifeld in meiner Entität anzupassen. In einem ähnlichen Setup konnte ich ein Linkfeld folgendermaßen anpassen:

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

Also habe ich für das Dateifeld etwas Ähnliches versucht:

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

Es ist jedoch kein uri -Feld verfügbar. Es fällt mir schwer herauszufinden, welche Felder tatsächlich für mich zur Verwendung in der Vorlage verfügbar sind. Ich fand kint viel zu laut, ich musste den Speicherverbrauch einschränken und habe immer noch keine Ahnung, welche Felder verwendbar sind.

Alternativ habe ich versucht, eine benutzerdefinierte Vorlage für das jeweilige Dateifeld mit dem Namen field--field-publication-file.html.twig Zu erstellen. Die Debug-Informationen sagen mir, dass es zum Rendern verwendet wird. Ich habe mir das Feld angesehen, das mein Thema (Bootstrap) normalerweise verwendet, und versucht, sein Verhalten nachzuahmen. Insbesondere wollte ich das Feld link verwenden, das auch in der Version bootstrap) verwendet wird. Dieses Feld ist jedoch immer leer, wenn ich meine Version verwende.

Was könnte ich noch versuchen?

4
bmurauer

Nach weiteren Recherchen fand ich die Antwort zufällig auf this Seite. Man kann auf den Link verweisen, indem man verwendet:

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

Die Felder, die im bootstrap -Thema definiert wurden, scheinen in einem Unterthema von Bootstrap nicht zugänglich zu sein. Ich bin sicher, ich hätte einen benutzerdefinierten Präprozessor schreiben können, um dasselbe zu tun. Aber diese Lösung funktioniert für mich und ich muss nicht PHP Code) schreiben.

2
bmurauer

Sie können dies so oder so tun, indem Sie die Datei file_url verwenden, die in der Vorlage twig template) verfügbar ist, oder Sie können file_create_url($file_uri); im Präprozessor verwenden, damit Ihre Vorlage die verarbeitete Ausgabe problemlos nutzen kann.

Code auf der Vorverarbeitungsebene unter der Annahme, dass der Knoten die Host-Entität ist.

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());
        }
     }
   }
}

Ein anderer Weg ist, was Sie erwähnt haben, verwenden Sie file_url an Ihrer twig Vorlage.

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