मेनू आइटम में फ़ील्ड कैसे जोड़ें


11

मुझे एक मुख्य मेनू बनाने की आवश्यकता है जो नियमित मेनू का सबसेट है। डिज़ाइन टीम को लगता है कि उपयोगकर्ता के लिए मुख्य मेनू में केवल सबसे महत्वपूर्ण लिंक होना और सब कुछ नहीं होना बेहतर होगा। कुछ लिंक शीर्ष स्तर मेनू हैं और कुछ उप मेनू हैं। इसके लिए मैं ड्रॉप डाउन के रूप में मेनू लिंक आइटम फॉर्म में फ़ील्ड जोड़ने में सक्षम होने की उम्मीद कर रहा था। लिंक बनाते समय उपयोगकर्ता इस ड्रॉपडाउन का उपयोग "PromToMainMenuAsBigLink" या "PromToMainMenuAsSmallLink" के रूप में कर सकता है या मुख्य मेनू पर आइटम नहीं दिखाने के लिए छोड़ सकता है।

मैं इस Drupal 7 समाधान के रूप में एक समान समाधान के लिए देख रहा हूँ, लेकिन Drupal 8 के लिए।

मुझे उम्मीद थी कि 'विस्तारित' के बगल में टेबल मेनू_लिंक_कंटेंट_डाटा में एक कॉलम जोड़ने में सक्षम होगा। मैं उम्मीद कर रहा था कि इस जानकारी को किसी अन्य तालिका में दर्ज न किया जाए जैसे कि d7 समाधान में दिखाया गया है।

मैं अपने द्वारा बनाए गए कस्टम मॉड्यूल में लिंक फॉर्म में एक फ़ील्ड जोड़ने में सक्षम था, परीक्षण के उद्देश्य से मैंने केवल एक पाठ फ़ील्ड जोड़ा था जिसे शुरू करने के लिए:

custom_menu.module:

function custom_menu_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if($form_id == 'menu_link_content_menu_link_content_form') {
    $form['promoteToMainMenu'] = array(
      '#type' => 'textfield',
      '#title' => t('Promote to main menu'),
      '#description' => t('Promote link menu to main menu.'),
      '#default_value' => '',
      '#weight' => -9
    );
  }
}

फ़ील्ड वास्तव में लिंक फॉर्म में दिखाया गया है लेकिन यह कभी भी रिकॉर्ड नहीं किया जाता है।

क्या कोई इस में मेरी मदद कर सकता है?


जैसा लगता है कि इसकी संभावना नहीं है, कस्टम मेनू लिंक आइटम सामग्री इकाइयां हैं ( api.drupal.org/api/drupal/… )। इसका मतलब है कि आपको फ़ील्ड जोड़ने के लिए एक हुक का उपयोग करने की आवश्यकता है (शायद api.drupal.org/api/drupal/… ) और फिर स्कीमा को अद्यतन करने के लिए एक अद्यतन फ़ंक्शन चलाएं।
ईयाल

जवाबों:


14

मेनू आइटम एक्स्ट्रा मॉड्यूल की जाँच करें ।


2
यह निश्चित रूप से जाने का रास्ता है, क्योंकि इस मॉड्यूल का v2.0 मेनू लिंक को पूरी तरह से फील्ड में प्रवेश करता है। Colossal मेनू की तुलना में बेहतर समाधान क्योंकि यह कोर मेनू सिस्टम को बदलने के बजाय बढ़ाता है।
हुदरी

1
मेनू बार में आज की तारीख को शामिल करने के लिए +1 महान, उदाहरण के लिए
therobyouknow

1
सभी सुविधाओं के बारे में लेख है lembergsolutions.com/blog/…
Mykhailo Gurei

11

आप निम्नलिखित कोड के साथ इकाई में hook_entity_base_field_infoएक अतिरिक्त फ़ील्ड जोड़ने के लिए उपयोग कर सकते हैं menu_link_content:

/**
 * Implements hook_entity_base_field_info().
 */
function HOOK_entity_base_field_info(EntityTypeInterface $entity_type) {
  $fields = [];

  if ($entity_type->id() == 'menu_link_content') {
    $fields['FIELD_NAME'] = BaseFieldDefinition::create('FIELD_TYPE')
      ->setLabel(t('FIELD_LABEL'))
      ->setDescription(t('FIELD_DESCRIPTION '))
      ->setDisplayOptions('form',array('type' => 'FIELD_TYPE', 'weight' => 0));
  }

  return $fields;
}

अधिक जानकारी के लिए https://www.drupal.org/docs/8/api/entity-api/defining-and-using-content-entity-field-definitions देखें BaseFieldDefinition

जिसके बाद, आपको hook_form_menu_link_content_menu_link_content_form_alter()फॉर्म में एक फ़ील्ड जोड़ना होगा ।


5
आपको प्रपत्र परिवर्तन के माध्यम से फ़ील्ड जोड़ना नहीं है। आप बस BaseFieldDefinition->setDisplayOptions()विधि का उपयोग कर सकते हैं ...->setDisplayOptions('form', [ ... ]):।
दूधोवस्की

1
मैं छवि क्षेत्र कैसे बना सकता हूं? मुझे इस फ़ील्ड प्रकार के साथ उदाहरण नहीं मिल रहा है और मुझे इसकी आवश्यकता है। इसका उपयोग करते समय मैं छवि अपलोड फ़ील्ड देख सकता हूं लेकिन जब मैं मेनू आइटम को सहेजने का प्रयास करता हूं तो मुझे मिलता है: Drupal \ Core \ Entity \ EntityStorageException: SQLSTATE [42S22]: कॉलम नहीं मिला: 1054 अज्ञात कॉलम 'फ़ील्ड -menu_image__target_id' जब भी मैं पृष्ठ जोड़ने के लिए ताज़ा करता हूं मेनू आइटम फ़ॉर्म मैं लॉग में देखता हूं: सूचना: अनिर्धारित सूचकांक: फ़ील्ड_मेनू_इमेज__हाइट सूचना: अपरिभाषित सूचकांक: फ़ील्ड_मेनू_इमेज लिफ़्ट और इतने पर ... छवि क्षेत्र प्रकार के लिए कोई उदाहरण? धन्यवाद
Blastoise

5
मैंने इस समस्या को हल कर दिया है। /update.php काम नहीं कर रहा है ताकि कॉलम कभी क्रेट न हो। मैंने db को अपडेट करने के लिए ड्रश का उपयोग किया है: drush updateb --entity-updates
blastoise

1
फ़ील्ड को जोड़ने के लिए आप हुक_फॉर्म_मेनू_लिंक_कंटेंट_मेनु_लिंक_कंटेंट_फॉर्मर () में क्या डालते हैं?
मैट

3

दुर्भाग्य से वास्तव में Drupal 8 में डिफ़ॉल्ट रूप से मेनू लिंक के लिए कोई फ़ील्ड UI नहीं है जैसा @MatthieuScarset ने कहा। लेकिन menu_link_contentDrupal 8 में एक सामग्री इकाई है, इसलिए इसमें फ़ील्ड जोड़ना संभव है।

विकल्प # 1 बेशक आप इसे प्रोग्राम के रूप में कर सकते हैं जैसा कि @Decipher ने सुझाव दिया है।

विकल्प # 2 लेकिन मेनू लिंक अस्थायी के लिए फ़ील्ड UI सक्षम करने के लिए एक और समाधान है:

  1. खुला हुआ Drupal\menu_link_content\Entity\MenuLinkContent
  2. field_ui_base_route = "entity.menu.add_link_form"एनोटेशन में जोड़ें
  3. कैश का पुनर्निर्माण करें
  4. पर जाएँ /admin/structure/menu/manage/main/add/fields
  5. अपने सभी फ़ील्ड, डिस्प्ले प्रबंधित करें
  6. अपनी साइट कॉन्फ़िगरेशन ( drush cex -y) निर्यात करें ।
  7. field_ui_base_route = "entity.menu.add_link_form"पर एनोटेशन से निकालेंDrupal\menu_link_content\Entity\MenuLinkContent
  8. कैश का पुनर्निर्माण करें।

मैंने इस दृष्टिकोण की कोशिश की। पहले तो यह अच्छा लग रहा है, लेकिन जब मैंने नया फ़ील्ड बनाने की कोशिश की तो मुझे त्रुटि मिली: फ़ील्ड बनाने में एक समस्या थी मेनू छवि: एक बंडल के बिना फ़ील्ड 'फ़ील्ड_मेनू_इमेज' बनाने का प्रयास करें। मैं अब इस कार्यक्रम को हासिल करने की कोशिश कर रहा हूं, लेकिन यह बेहतर होगा अगर यह भी काम कर सके।
ब्लास्टोइस


0

"मेनू आइटम एक्स्ट्रा" इसे प्राप्त करने का एक तरीका है, जैसा कि @Mykhailo Gurei ने सुझाव दिया है।

लेकिन मेरे मामले में मुझे अतिरिक्त क्षेत्रों को जोड़ना और मेगा मेनू मॉड्यूल का उपयोग करना था। मैं "हम मेगा मेनू" का उपयोग कर रहा था और इसके साथ "मेनू आइटम एक्स्ट्रा" काम नहीं कर रहा है। बस मेनू को फ्रंट-एंड पर नहीं दिखाया गया है (कुछ टेम्प्लेट ओवरराइड समस्या)।

तो "वी मेगा मेनू" के साथ काम करने वाला अन्य विकल्प "मेनू आइटम सामग्री फ़ील्ड" है:

https://www.drupal.org/project/menu_item_fields

एक ही कार्यक्षमता है और हम मेगा मेनू मॉड्यूल के साथ संघर्ष नहीं है।


-2

दुर्भाग्य से, Drupal 8 कोर डेवलपर्स ने मेनू लिंक को फ़ील्ड योग्य नहीं बनाया है। इसलिए अभी के लिए मेनू लिंक में फ़ील्ड जोड़ना संभव नहीं है।

साइट बिल्डर "वर्क अराउंड" एक कस्टम शब्दावली बनाने के लिए है जिसमें कस्टम फ़ील्ड हो सकते हैं।


4
गलत। MenuLinkContent एक फील्डेबल कंटेंट इकाई है।
दूधोव्स्की

1
आप MenuLinkContent में नए फ़ील्ड कैसे जोड़ेंगे?
MatthieuScarset

1
उपरोक्त उत्तर देखें। वे दोनों बताते हैं कि MenuLinkContent में नए फ़ील्ड कैसे जोड़ें।
दूधोव्स्की

2
मेनू आइटम एक्स्ट्रा
कलाकार

1
तो स्पष्ट होने के लिए @milkovsky सच है। MenuLinkContent एक फील्ड योग्य सामग्री इकाई नहीं है।
MatthieuScarset
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.