Varlıktan paket etiketi nasıl alınır


15

Yüklü bir varlıktan bir demetin insan tarafından okunabilir etiketini nasıl alabilirim?

Diyelim ki "my myarticle " paketinin bir düğümünün etiketini almak istiyorum.

// Load a node
$node = Drupal::entityManager()->getStorage('node')->load(4);

print $node->bundle(); // prints the machine-readable name. e.g. 'my_article'.

print $node->getEntityType()->getBundleLabel(); // prints 'content type'.

Yalnızca paketin makine tarafından okunabilir adını veya varlık etiketini ("içerik türü", "sınıflandırma terimi" vb.) Alabilirim, ancak paketin etiketini nasıl alabilirim?

PS Kullanımdan kaldırılmış sınıfları / işlevleri kullanmamayı tercih ederim

Yanıtlar:


24

Doğrudan bir şey göremiyorum, düğüm türü varlık kendisini yükleme olsa da bir seçenektir:

$bundle_label = \Drupal::entityTypeManager()
  ->getStorage('node_type')
  ->load($node->bundle())
  ->label();

Veya Berdir'in yorumlarda belirttiği gibi, varlık referans alanında daha hızlı bir yol var:

$bundle_label = $node->type->entity->label();

1
Teşekkürler, işe yarıyor. Ben sadece kullanımdan kaldırılmış entityManager yerine entityTypeManager kullanın.
Linus

1
Benim hatam, kullanımdan kaldırılmış olduğunun farkında değildim. İt up Sabit
Clive

9
Bir yöntem olarak mevcut değildir, ancak tür bir varlık başvurusudur, bu yüzden bunu da yapabilirsiniz: $ node-> type->
entity-

1
Bu sadece düğüm tipini cevaplıyor .. ve genel olarak varlıkları değil ..
ssibal

2
@ssibal Yep, soruya göre. Paket anahtarı varlık türü başına farklı olacaktır (ancak meta verilerden de alınabilir)
Clive

9

Kabul edilen yanıtın özellikle düğüm varlıkları için geçerli olduğunu, ancak tüm varlıkların paketlerinin olduğunu unutmayın. userVeya menu_link_content(özel menü bağlantıları için) gibi birçok varlığın yalnızca varlık türünün kendisine karşılık gelen bir paketi vardır.

entity_type.bundle.infoTarafından uygulanan servis, Drupal \ Çekirdek \ Varlık \ EntityTypeBundleInfo , varlık demeti bilgilere erişim sağlar. Yöntemleri getAllBundleInfo()ve getBundleInfo($entity_type_id)sırasıyla varlık türüne ve paket makine adına göre anahtarlanmış bir dizi döndürür; ilk olarak daha sonra paket makine adına göre anahtarlanmış bir dizi paket içerir. Her paketin labelçevrilmiş paket kolay adına sahip bir anahtarı vardır.

Aşağıda, içerik varlığı makine adları, etiketler, paket makine adları ve paket etiketleri arasındaki farkı gösteren bir örnek bulunmaktadır. Kod, kimliğine sahip en az bir özel menü bağlantısı olduğunu varsayar 1. Ayrıca bir articledüğüm tipi (demet) olduğunu, kimliğine sahip en az bir düğümün 1olduğunu ve düğümün düğüm tipinde (demet) olduğunu varsayar article.

<?php

$entity_type_manager = \Drupal::entityTypeManager();
$bundle_info = \Drupal::service("entity_type.bundle.info")->getAllBundleInfo();

$current_user = \Drupal::currentUser()->getAccount();

// Prints "user".
print $current_user->getEntityTypeId() . PHP_EOL;

// Prints "User".
print $current_user->getEntityType()->getLabel() . PHP_EOL;

// Prints "user".
print $current_user->bundle() . PHP_EOL;

// Prints "User".
print $bundle_info[$current_user->getEntityTypeId()][$current_user->bundle()]['label'] . PHP_EOL;

$my_menu_link = $entity_type_manager->getStorage('menu_link_content')->load(1);

// Prints "menu_link_content".
print $my_menu_link->getEntityTypeId() . PHP_EOL;

// Prints "Custom menu link".
print $my_menu_link->getEntityType()->getLabel() . PHP_EOL;

// Prints "menu_link_content".
print $my_menu_link->bundle() . PHP_EOL;

// Prints "Custom menu link".
print $bundle_info[$my_menu_link->getEntityTypeId()][$my_menu_link->bundle()]['label'] . PHP_EOL;

$my_article = $entity_type_manager->getStorage('node')->load(1);

// Prints "node".
print $my_article->getEntityTypeId() . PHP_EOL;

// Prints "Content".
print $my_article->getEntityType()->getLabel() . PHP_EOL;

// Prints "article".
print $my_article->bundle() . PHP_EOL;

// Prints "Article".
print $bundle_info[$my_article->getEntityTypeId()][$my_article->bundle()]['label'] . PHP_EOL;

Sınıfın statik yöntemlerine güvenmek yerine kodunuzda mümkünse bağımlılık enjeksiyonu kullandığınızdan emin olun Drupal.


Tüm varlık türleri için çalışan bir cevap almak çok yararlı. Teşekkürler.
JamesWilson


3

Türden emin değilseniz, şunlar $entityolabilir:

if ($entity->bundle()) {
  $bundle_type_id = $entity->getEntityType()->getBundleEntityType();
  $bundle_label = \Drupal::entityTypeManager()
    ->getStorage($bundle_type_id)
    ->load($entity->bundle())
    ->label();
}

Bu doğru cevap olmalıdır: bir düğümün paket etiketi değil, "varlık paket etiketi" soran orijinal soru ..
ssibal

1

En verimli çözüm değil, ancak eksiksizlik adına, bu işe yarar:

\Drupal::token()->replace('[node:type-name]', ['node' => $node]);

veya

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.