फ़ील्ड-प्रकार की सूची कैसे प्राप्त करें?


10

मैं Drupal 7 से Drupal 8 में एक मॉड्यूल पोर्ट कर रहा हूं। इस मॉड्यूल की कॉन्फ़िगरेशन सेटिंग्स में मुझे वर्तमान में मौजूद फ़ील्ड-प्रकारों की सूची प्राप्त करने की आवश्यकता है।

Drupal 7 में, यह field_info_field_types()फ़ंक्शन का उपयोग करके हासिल किया गया था ।

Drupal 8 (8.0.0-rc3) में, मुझे एक त्रुटि मिलती है "फ़ंक्शन मौजूद नहीं है", Drupal API संदर्भ सहायता पृष्ठ द्वारा बताई गई जानकारी के बावजूद , स्पष्ट रूप से पुराना है।

फिर जांच करने पर मुझे एक DrupalContrib पृष्ठ मिला , जहां फ़ंक्शन को पदावनत घोषित किया गया है, और अब उपयोग करने का प्रस्ताव है Drupal::service('plugin.manager.entity.field.field_type')->getDefinitions()

लेकिन इसका उपयोग करने से एक और त्रुटि "अज्ञात सेवा plugin.manager.entity.field.field_type", सौभाग्य से सुझाव से जुड़ी है "क्या आपका मतलब plugin.manager.field.field_type है?"

इसलिए मैंने उपयोग करने की कोशिश की Drupal::service('plugin.manager.field.field_type')->getDefinitions()और वाह: मुझे फील्ड-प्रकारों की अपेक्षित सरणी मिली।

लेकिन प्रत्येक सरणी सदस्य (एक फ़ील्ड-प्रकार) अब एक ऑब्जेक्ट (एक चाइल्ड एरे के बजाय) है, और मैं जो डेटा देख रहा हूं वह संरक्षित गुणों के भीतर नेस्टेड है, इसलिए मैं उन्हें एक्सेस नहीं कर सकता।

इस स्तर पर, मैं फंस गया हूँ। मैंने माना कि इन डेटा के माध्यम से नेविगेट करने के लिए मैं कुछ वर्ग का विस्तार कर सकता हूं, लेकिन कोई भाग्य नहीं: मैं विशेष रूप से यह भी पता नहीं लगा सका कि ड्रुपल 8 में कौन सा घटक है जहां फ़ील्ड-प्रकार की परिभाषाएं केंद्रीकृत हैं।


यह बेहतर है कि आप api.drupal.org को देखें, जो अधिक अपडेट है। वास्तव में, उस फ़ंक्शन के लिए कोई पृष्ठ नहीं है
kiamlaluno

टिप के लिए धन्यवाद "api.drupal.org को देखें"। दूसरे हाथ में (और यह मेटा प्रासंगिक है, क्षमा करें), अगर मैं आसानी से समझ गया कि आपने मेरे संक्षिप्तीकरण (D7 -> Drupal 7) को संपादित किया है, तो मैं सोच रहा हूं कि आपने "Drupal 8" को शीर्षक में क्यों छोड़ा? मुझे लगता है कि यह कहते हुए कोई नियम होगा कि यह "8" टैग के साथ निरर्थक है। लेकिन एक पाठक के रूप में मैं मुझे टैग की तुलना में शीर्षक से बहुत अधिक निश्चित रूप से सूचित करने के लिए उपयोग करता हूं: मेरी नजर में, टैग अनिवार्य रूप से खोज प्रक्रिया को संबोधित करते हैं, जबकि क्रमिक रूप से पढ़ने पर मैं शायद ही कभी उन पर ध्यान देता हूं।
cFreed

शीर्षक में टैग दोहराने की कोई आवश्यकता नहीं है, क्योंकि वे हमेशा दिखाई देते हैं जहां कोई प्रश्न सूचीबद्ध होता है। स्टैक एक्सचेंज उपयोगकर्ता टैग पर ध्यान देते हैं।
kiamlaluno

जवाबों:


16

पहला स्तर एक सरणी है। चाबियाँ प्लगइन आईडी हैं। आप उन्हें सूचीबद्ध कर सकते हैं:

$defs = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $defs as $key => $value ) {
   echo $key, "\n";
}

यह परिणाम है:

comment
datetime
file
image
link
list_string
list_float
list_integer
path
text_with_summary
text
text_long
email
boolean
created
changed
timestamp
string_long
language
decimal
uri
float
password
string
integer
entity_reference
uuid
map
taxonomy_term_reference

आप एक चुन सकते हैं और प्लगइन परिभाषा को डंप कर सकते हैं।

var_dump($defs['comment']);

यदि आप एक विशेष वस्तु में रुचि रखते हैं, तो आप api.drupal.org की मदद से गहरी खुदाई कर सकते हैं। लेकिन यह आसान होगा, यदि आप कोर निर्देशिका में प्लगइन की खोज करते हैं।

किसी ऑब्जेक्ट तक पहुँचने के लिए, इसे var_dump में ढूँढें और एक विधि का उपयोग करें:

$defs['comment']['description']->render();

इस मामले में यह ऑब्जेक्ट ट्रांसलेटेबलमर्कअप है , जिसमें अनुवादित स्ट्रिंग तक पहुंचने के लिए रेंडर विधि है।


धन्यवाद, लेकिन यह वही है जो मैंने पहले ही किया था। इसके अलावा, मेरी समस्या बनी हुई है: मैं इन वस्तुओं के अंदर डेटा तक कैसे पहुंच बना सकता हूं ?
cFreed

आप क्षेत्र की परिभाषाओं में क्या खोजना चाहते हैं? सामान्य तौर पर आप एपी में किसी वस्तु के गुणों और विधियों को देखते हैं और फिर आप उन्हें `-> 'के साथ एक्सेस करते हैं। फ़ील्ड परिभाषाएँ स्रोत में देखना आसान है।
4k4

मैं उन्हें निकालता हूं label, descriptionऔर moduleउन्हें एक कॉन्फ़िगरेशन रूप में प्रदर्शित करता हूं जहां उपयोगकर्ता उन लोगों की जांच कर सकता है जिनके लिए वह चाहता है कि मेरा मॉड्यूल ( एमएमएस ) संबंधित क्षेत्रों के लिए क्लोन टोकन बनाता है।
cFreed

मैं एक उदाहरण जोड़ता हूं।
4k4

ऊप्स! मैंने आपकी अंतिम टिप्पणी देखी, लेकिन आपके संपादन पर ध्यान नहीं दिया, इसलिए मैं प्रतीक्षा करता रहा। मैं आपके सुझाव की कोशिश करूंगा। धन्यवाद।
cFreed

4

प्रत्येक स्ट्रिंग जो t () से होकर गुज़री है, वह अब एक ऑब्जेक्ट है। आप उन्हें स्ट्रिंग्स के रूप में एक्सेस कर सकते हैं, वास्तव में, आपको ऐसा करना चाहिए।

केवल कुछ अपवाद हैं जहां आप इस तरह की वस्तु का उपयोग नहीं कर सकते हैं, उदाहरण के लिए सरणी कुंजियाँ, उन लोगों के लिए, आपको उन्हें एक स्ट्रिंग में डालने की आवश्यकता है। और कुछ भी बस काम करना चाहिए।

पुनश्च: आधिकारिक एपीआई प्रलेखन http://api.drupal.org/api/drupal/8 है । कोर के लिए उपयोग करें।

एक और अच्छा संसाधन परिवर्तन रिकॉर्ड हैं: https://www.drupal.org/list-changes/published?keywords_description=field_info_field_types&to_branch=&version=&created_op=%3E%3D&created%5Bvalue%5D=&created%5Bmin%5min_5 5D =

संपादित करें: आपकी टिप्पणी का जवाब देते हुए, मुझे यह समझ में नहीं आया कि आपका क्या मतलब है। आपके लिए आवश्यक सभी जानकारी वहीं है, बस इसका उपयोग करें।

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print $definition['label'];
  print $definition['description'];
  print $definition['provider'];
}

फिर, बस इस बात को अनदेखा करें कि लेबल / विवरण ऑब्जेक्ट हैं। उनके पास __toString () विधियाँ हैं जो आपके द्वारा प्रिंट / उपयोग करने पर स्वचालित रूप से कॉल की जाती हैं।


इस उत्तर के लिए धन्यवाद। आपका अंतिम प्रस्तावित लिंक बहुत ही आशाजनक लग रहा है और मैं इस जानकारी के आधार पर जांच करूंगा। संक्षेप में कहा, मैं गलत हूँ अगर मैं अपने की जरूरत के लिए लगता है कि (निकालने label, description, moduleप्रत्येक क्षेत्र प्रकार के तार) मैं चाहिए: 1) से सूची प्राप्त Drupal::service('plugin.manager.field.field_type')->getDefinitions()पहले से ही किया जैसे; 2) फिर एक विशिष्ट वर्ग को खोजने के लिए लौटे हुए सरणी (फ़ील्ड-प्रकार नाम) की प्रत्येक कुंजी का उपयोग करें (जो एक, और जहां, मुझे गहराई से जांच करनी चाहिए) जो आवश्यक infos प्राप्त करने के लिए तरीके प्रदान करेगा? इस सटीकता के लिए टी.आई.ए.
cFreed

मेरे उत्तर को अपडेट किया।
बर्दिर

उफ़ ... समझ में नहीं आता! आपने अपने संपादन में जो प्रस्तावित किया है, वह वही है जो मैंने D7 में किया था। और यह डी 8 में काम नहीं करता है, क्योंकि डी 8 $definitionमें तार की एक सरणी नहीं है, लेकिन वस्तुओं की एक सरणी है! मैंने उनकी जांच करने के लिए dpm () का उपयोग किया, और देखा कि प्रत्येक आवश्यक तार इस तरह से नेस्टेड दिखाई देता है 'label' => array(..., 'label' => Drupal\Core\StringTranslation\TranslatableMarkup Object {..., string, ...}, ...):। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?
cFreed

बस खोज की गई (हाल ही में) 4k4 का अंतिम संपादन, जो काम करता है। वास्तव में मेरे लिए मुद्दा यह जानना था कि TranslatableMarkupकक्षा को कहां खोजना है , और render()विधि की लाभप्रदता ,। अंत में मेरा डेटा प्राप्त करने का सही तरीका है print $definition['label']->render();। फिर भी, अपने अन्य informations के लिए धन्यवाद।
19

नहीं, फिर, आपको ज़रूरत नहीं है -> रेंडर ()। $ परिभाषा का उपयोग करें ['लेबल'], यह सिर्फ काम करता है, मुझ पर विश्वास करें :)
बेर्दिर

1

@Berdir उत्तर के लिए अपडेट किया गया संस्करण। खोल में उपयोग करें।

$definitions = Drupal::service('plugin.manager.field.field_type')->getDefinitions();
foreach ( $definitions as $field_type => $definition) {
  print 'Label: '. $definition['label']. PHP_EOL;
  print 'Machine name: '. $field_type. PHP_EOL;
  print 'Descritpion: '. $definition['description']. PHP_EOL;
  print 'Provider: '. $definition['provider']. PHP_EOL . ' ---' . PHP_EOL;
}

यहाँ आउटपुट: https://gist.github.com/sobi3ch/70635cc62defff606242


1

इनकी खोज करते समय Google को यह प्रश्न प्रतीत होता है

यदि आप Drupal Console का उपयोग कर रहे हैं, तो आप भी उपयोग कर सकते हैं:

drupal plugin:debug field.field_type

Drupal.org पर यह भी है जो मदद भी कर सकता है:

सामग्री इकाई क्षेत्र परिभाषाओं को परिभाषित करना और उनका उपयोग करना

हालांकि यह प्रयोग करने में आसान नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.