Mam więc ten Węzeł:
object(Drupal\node\Entity\Node)[1862]
protected 'values' =>
array (size=17)
'vid' =>
array (size=1)
'x-default' => string '7' (length=1)
'langcode' =>
array (size=1)
'x-default' =>
array (size=1)
0 =>
array (size=1)
'value' => string 'en' (length=2)
... (more fields)
'field_image' =>
array (size=1)
'x-default' =>
array (size=1)
0 =>
array (size=5)
'target_id' => string '1' (length=1)
'alt' => string '' (length=0)
'title' => string '' (length=0)
'width' => string '150' (length=3)
'height' => string '120' (length=3)
Teraz field_image ma tablicę z x-default i podstawowymi danymi obrazu. Jak wyświetlić obraz lub utworzyć łącze do obrazu w szablonie Twig?
url(node.field_image.0.entity.uri)
( istotny problem )Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string
więc spróbowałem z tym:url(node.field_image.0.entity.uri.value)
ale potem to po prostu mówi mi to:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
FieldItemList
s w ciąg znaków (którego nie mogę znaleźć)url()
chce trasy. Jak ourl_from_path(node.field_image.0.entity.uri.value)
?url_from_path()
wydaje się to generować:http://mywebsite.local/public%3A//image.png
więc wydaje się, że jest to urlencoding i dołączanie dokładnej wartości do adresuOdpowiedzi:
Oto zaktualizowana wersja tej odpowiedzi po wersji 8.0.x. Ta baza jest oparta na komentarzu @joelpittet .
źródło
url()
metodę, więc możesz po prostu zadzwonićentity.url()
zamiast przekazaćentity.fileuri
dofile_url()
Nie wiem o Twig, ale dostajesz identyfikator URI pliku
$node->field_image->entity->getFileUri()
w PHP i musisz to wywołaćfile_create_url()
:Nie wiem, czy to możliwe z gałązki. Jeśli nie jest to możliwe, zawsze możesz obliczyć go w procesie wstępnym i dodać jako nową zmienną.
źródło
Jeśli ktoś potrzebuje stylizowanego obrazu:
źródło
use Drupal\image\Entity\ImageStyle;
$relative = file_url_transform_relative($styled_image_url);
aby upewnić się, że jest względna. API tutajŻadne z powyższych rozwiązań dla gałązek nie działało dla mnie (być może te działały dla starszych wersji 8.x, ale nie dla wersji 8.5
UWAGA: powinien działać dla Drupal 8.5+
źródło
Tak więc znalazłem odpowiedź z pomocą Clive .
Uzyskiwanie obrazu URI w Twig odbywa się za pomocą
node.field_image.0.entity.uri.value
Uzyskanie pełnego adresu URL obrazu można wykonać za pomocą
file_create_url(node.field_image.0.entity.uri.value)
Robienie tego w Twig nie jest jeszcze możliwe, ale pracują nad tym -> patrz tutaj
źródło
To, co zakończyło się dla mnie pracą w D8, to:
Używanie
kint($node->get('field_image')->entity)
i przeglądanie tablicy było bardzo pomocneNastępnie w moim pliku gałązki użyłem:
źródło
możesz uzyskać adres URL bezpośrednio, używając field_image.entity.url
źródło
Zawsze używam funkcji pomocnika
źródło
W ten sposób chcesz uzyskać adres URL obrazu ze skojarzonym stylem obrazu dla dowolnego pola obrazu w szablonie gałązki:
Najpierw zainstaluj moduł Twig Tweak
Następnie ustaw identyfikator URI obrazu jako zmienną. Za pomocą identyfikatora URI można użyć wzoru poprawek gałązek, aby uzyskać ścieżkę w dowolnym stylu obrazu. Patrz poniżej:
Twig Tweak v2.4 + oferuje
file_url
filtr do wyodrębnienia adresu URL pliku z encji.źródło
Miałem ten sam problem, więc utworzyłem funkcję
get_image_path()
Twig i dodałem ją z kilkoma innymi przydatnymi rzeczami do mojego modułu startowego:https://github.com/brynj-digital/starter
Funkcja akceptuje pole obrazu i nazwę maszyny stylu obrazu, a następnie zwraca tę ścieżkę obrazu.
To działa w wielu kontekstach - można przejść
node.field_name
,content.field_name
lubrow._entity.field_name
(w przypadku Widok pól szablonu).źródło
Boże, właściwie zajęło mi to całe wieki, aby dowiedzieć się, dlaczego moje wynikowe adresy URL nie działają. Wszyscy 404. Najpierw musisz utworzyć pochodną, jeśli jeszcze nie istnieje .
Na przykład, jeśli dodasz styl obrazu później, po przesłaniu oryginalnego obrazu, nie ma jeszcze pliku ze stylizowanym obrazem (pochodna obrazu). Najpierw należy go utworzyć.
Wymień
field_MYIMAGE
iMYSTYLE
jak potrzebujesz.Chciałbym, żeby stało się to automatycznie.
źródło
nieco spokrewnione, oto, czego użyłem (dzięki wszystkim poprzednim odpowiedziom, aby mnie tam dostać), aby uzyskać adres URL pliku obrazu z pola obrazu encji medialnej w gałązce:
teraz mogę użyć tej zmiennej w moim szablonie gałązki
źródło
Aby uzyskać atrybut obrazu, taki jak URI, alt, tytuł itp., Użyj składni jak poniżej szablonu
W szablonie gałązki węzła
W polu szablon gałązka
W innym polu szablon gałązki
UWAGA: Należy również sprawdzić twig_tweaks moduł Ściągawka do szczegółów związanych z gałązka powiązanego problemu.
źródło
Możesz użyć
url()
metody znajdującej się w klasie File jako skrótu, aby:można skrócić do:
Działa to w funkcjach wstępnego przetwarzania, ale wyzwala
Twig_Sandbox_SecurityError
wywołanie w szablonie gałązki.Jeśli otrzymasz
Twig_Sandbox_SecurityError
, możesz powiedzieć gałązce, aby zezwoliłaurl
w pliku settings.php, jak wspomniano w tym poście StackoverflowZobacz dokumentację dotyczącą File :: Url () https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3Aurl/8.6.x
źródło
Możesz to zrobić na dwa sposoby!
1) file_create_url (---------) // wewnątrz napisz ścieżkę do węzła
2) file_url (-------) // wewnątrz napisz ścieżkę do węzła
źródło