Mam obiekt węzła o nazwie pola obrazu field_image
. Kiedy robię
$node
->get('field_image')
->first()
->getValue()
Dostaję tablicę z pewnymi właściwościami zamiast obiektu encji. Tablica wygląda następująco:
'target_id' => string '8' (length=1)
'alt' => string '' (length=0)
'title' => string '' (length=0)
'width' => string '587' (length=3)
'height' => string '458' (length=3)
'_loaded' => boolean true
'_accessCacheability' =>
object(Drupal\Core\Cache\CacheableMetadata)[1092]
protected 'cacheContexts' =>
array (size=0)
...
protected 'cacheTags' =>
array (size=0)
...
protected 'cacheMaxAge' => int -1
Czy muszę ręcznie ładować obiekt encji przy użyciu pliku, target_id
czy istnieje sposób na automatyczne uzyskanie obiektu encji z instancji Drupal\image\Plugin\Field\FieldType\ImageItem
?
Dlaczego przywoływany obiekt nie jest dostępny przez moduł pobierający? Może być leniwie załadowany, jeśli nie jest natychmiast dostępny.
PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget()
.$node->get('imagefield')->referencedEntities()
Działa jednak dzięki temu, że$node->get('imagefield')
zwraca instancję,EntityReferenceFieldItemList
która implementujereferencedEntities()
metodę. Twoje rozwiązanie jest tylko częściowe - działa na listach, ale nie na pojedynczych polach.Odpowiedzi:
Ścieżka do encji odniesienia jest bardzo długa:
Oczywiście nadal można go uzyskać za pomocą jednego wywołania liniowego, ale nadal jest to kłopotliwe i zastanawiam się, dlaczego
EntityReferenceItem
nie zapewnia metody, która zwróciłaby obiekt jednostki referencyjnej.Warto również zauważyć, że dość łatwo jest uzyskać tablicę wszystkich odnośnych encji:
Działa, ponieważ dla pól odwołania do encji
$node->get($field)
zwraca instancję,EntityReferenceFieldItemList
która implementujereferencedEntities()
metodę.źródło
Możesz użyć:
$node->field_image->entity
jeśli chcesz pierwszą wartość
źródło
$node->get('field_image')->entity
zwracaFile
byt.$node->get('field_image')->getEntity()
Zwraca jednakNode
jednostkę nadrzędną ! Rozumiem, że magiczne metody mogą być przydatne, ale są PITA w większych projektach. Po co męczyć się pisaniem interfejsów i kodu oo, skoro i tak jesteśmy zachęcani do używania magii? Napisałeś, że raz łatwo to zapamiętać - nie zgadzam się. Kiedy zaczniesz to robić, rozwiniesz naprawdę zły nawyk, który sprawi, że twój kod będzie mniej czytelny i mniej konserwowalny.Dla mnie zadziałało:
Inne odpowiedzi nie wytworzyły tablicy pól encji, której się spodziewałem
źródło
Aby uzyskać encję z pola, do którego istnieje odwołanie. Im zgadzam się z @SiliconMind w odniesieniu do referencedEntities, zwraca tablicę obiektów encji kluczowanych przez delty elementów pola.
Poprostu:
$node->get('field_name')->referencedEntities();
EntityReferenceFieldItemList :: referencedEntities
źródło