इकाई से बंडल लेबल कैसे प्राप्त करें


15

मैं भरी हुई संस्था से बंडल का मानव-पठनीय लेबल कैसे प्राप्त कर सकता हूं।

आइए कहते हैं कि मैं बंडल my_article के नोड का लेबल प्राप्त करना चाहता हूं जो "मेरा भयानक लेख" है

// 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'.

मैं केवल बंडल या मशीन ऑफ लेबल ("कंटेंट टाइप", "टैक्सोनॉमी टर्म", आदि) का मशीन-पठनीय नाम प्राप्त करने में सक्षम हूं, लेकिन मुझे बंडल का लेबल कैसे मिलेगा?

पुनश्च मैं पसंद नहीं करूंगा कि यह वंचित वर्ग / कार्यों का उपयोग न करे

जवाबों:


24

मैं कुछ भी प्रत्यक्ष नहीं देख सकता, हालांकि नोड प्रकार इकाई को लोड करना एक विकल्प है:

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

या जैसा कि बर्दिर ने टिप्पणियों में बताया, इकाई संदर्भ क्षेत्र के माध्यम से एक तेज़ तरीका है:

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

1
धन्यवाद, वह काम करता है। मैं केवल निकाले गए निकाय प्रबंधक के बजाय UnitTypeManager का उपयोग करूंगा।
लिनुस

1
मेरा बुरा, मुझे नहीं पता था कि यह पदावनत हो गया था। यह फिक्स्ड अप
क्लाइव

9
यह एक विधि के रूप में उपलब्ध नहीं है, लेकिन प्रकार एक इकाई संदर्भ है, इसलिए आप बस यह भी कर सकते हैं: $ नोड-> प्रकार-> इकाई-> लेबल ()
Berdir

1
यह केवल नोड प्रकार का उत्तर दे रहा है .. और सामान्य रूप से संस्थाओं का नहीं ..
ssibal

2
प्रश्न के अनुसार @ssibal हां। बंडल कुंजी इकाई प्रकार प्रति अलग होगा (लेकिन यह भी मेटाडाटा से प्राप्त किया जा सकता है)
क्लाइव

9

ध्यान दें कि स्वीकृत उत्तर विशेष रूप से नोड संस्थाओं के लिए लागू होता है, लेकिन सभी संस्थाओं में बंडल होते हैं। कई इकाइयां, जैसे ( userया menu_link_contentकस्टम मेनू लिंक के लिए), केवल एक बंडल है जो इकाई प्रकार से मेल खाती है।

entity_type.bundle.infoसेवा, द्वारा कार्यान्वित Drupal \ कोर \ इकाई \ EntityTypeBundleInfo , इकाई बंडल जानकारी के लिए उपयोग प्रदान करता है। इसके तरीके getAllBundleInfo()और getBundleInfo($entity_type_id)रिटर्न एक प्रकार से क्रमशः इकाई प्रकार और बंडल मशीन के नाम से टाइप किए जाते हैं, जिसमें पूर्व में बंडल मशीन नाम के द्वारा बंडल किए गए बंडलों की एक सरणी होती है। प्रत्येक बंडल में labelअनुवादित बंडल फ्रेंडली नाम के साथ एक कुंजी है।

नीचे एक उदाहरण दिया गया है जो सामग्री इकाई मशीन के नाम, लेबल, बंडल मशीन के नाम और बंडल लेबल के बीच अंतर दिखाता है। कोड मानता है कि आईडी के साथ कम से कम एक कस्टम मेनू लिंक है 1। यह भी मानता है कि एक articleनोड प्रकार (बंडल) है, जिसमें एक आईडी के साथ कम से कम एक नोड 1है और नोड नोड प्रकार (बंडल) का है 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;

कक्षा के स्थिर तरीकों पर निर्भर होने के बजाय अपने कोड में जहां संभव हो वहां निर्भरता इंजेक्शन का उपयोग करना सुनिश्चित करें Drupal


उत्तर देने के लिए बहुत उपयोगी है जो सभी प्रकार की इकाइयों के लिए काम करता है। धन्यवाद।
जेम्सविलसन


3

यदि आप $entityप्रकार के बारे में निश्चित नहीं हैं , तो यह हो सकता है:

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

यह सही उत्तर होना चाहिए: मूल प्रश्न "इकाई के बंडल लेबल" को नोड के बंडल लेबल से नहीं पूछा जा सकता है ..
ssibal

1

सबसे कुशल समाधान नहीं है, लेकिन पूर्णता के लिए, यह काम करता है:

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

या

\Drupal::service('token')->replace('[node:type-name]', ['node' => $node]);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.