क्या एक कार्य क्षेत्र विजेट फॉर्म को अपने आप प्रदर्शित करना संभव है?


21

मैं एक फील्ड विजेट फॉर्म को पूरे नोड एडिट फॉर्म के संदर्भ में एम्बेड करने में रुचि रखता हूं।

मैंने drupal_get_form का उपयोग करके अतीत में पूर्ण फ़ॉर्म प्रदर्शित किए हैं, लेकिन यह एकान्त फ़ील्ड फ़ॉर्म के लिए लागू नहीं होता है।

क्या एक कार्य क्षेत्र विजेट फॉर्म प्रदर्शित करना संभव है? ऐसा करने का सबसे अच्छा तरीका क्या होगा?

फ़ील्ड विजेट और "सामान्य" दोनों रूप बहुत समान लगते हैं, इसलिए यदि यह संभव नहीं है, तो विजेट फॉर्म को सामान्य रूप में "बदलने" के लिए क्या आवश्यक होगा?

यह प्रश्न कुछ इसी तरह का प्रश्न करता प्रतीत होता है, लेकिन मुझे इसका उत्तर समझ में नहीं आता है। वह उत्तर हुक_फ़ील्ड_विजेट_फॉर्म_ल्टर का उपयोग करके निर्दिष्ट करता है ; मुझे समझ में नहीं आता है कि फ़ील्ड फॉर्म को कैसे प्राप्त किया जाए, यह प्रदर्शित करने के लिए नहीं कि इसे एक बार कैसे बनाया जाए।

जवाबों:


18

VBO कुछ इस तरह से संशोधन करता है ।action.inc:

$form_key = 'bundle_' . $bundle_name;
$form[$form_key] = array(
  '#type' => 'fieldset',
  '#title' => $label,
  '#parents' => array($form_key),
);  
field_attach_form($context['entity_type'], $entity, $form[$form_key], $form_state, LANGUAGE_NONE);  

तो, आपको इकाई प्रकार की आवश्यकता है, इकाई (जो केवल बंडल कुंजी सेट के साथ एक रिक्त वस्तु हो सकती है, जो कि वास्तव में उपयोग की जाती है), वह प्रपत्र जहां विजेट जोड़े जाते हैं, और भाषा। यदि आप विजेट को फ़ॉर्म में ($ फ़ॉर्म में नहीं, बल्कि $ फॉर्म [$ फ़ॉर्म_की] जैसा मैंने किया था, या उससे भी अधिक) में एम्बेड करना चाहते हैं, तो उस फॉर्म सरणी को #parents सेट करना होगा।

बेशक, ध्यान दें कि यह उस इकाई प्रकार और बंडल से संबंधित सभी फ़ील्ड के विजेट को एम्बेड करेगा। यह कैसे संलग्न कार्य लिखा गया था। इसके आसपास जाने से आपको बहुत सारे कोड को फिर से बनाना होगा; वास्तविक कोड देखें जो भारी उठाने का काम करता है। मैं जो करता हूं वह फील्ड इंस्टेंसेस से गुजरता है, प्रत्येक $ field_name प्राप्त करता है, और यदि वह फील्ड टाइप मुझे रुचि नहीं देता है, तो मैं सेट $form[$form_key][$field_name]['#access'] = FALSE; करता हूं जो उन विजेट्स को दृष्टि से छिपाता है।

संपादित करें: ठीक है, ctools में ctools_field_invoke_field () है जो सिद्धांत में आपको प्रति-क्षेत्र के आधार पर काम करने की अनुमति दे सकता है। मैंने हालांकि इसका इस्तेमाल कभी नहीं किया। ऊपर दिया गया पाठ मेरा प्रत्यक्ष अनुभव है।


बहुत बढ़िया जवाब। मैंने इसके साथ काम करते हुए एक दिन का बेहतर हिस्सा बिताया, और यह वैसा ही काम किया जैसा मैं चाहता था। बाउंटी से सम्मानित किया गया है, और मैं ओपी को इसे सही उत्तर के रूप में स्वीकार करने की सलाह देता हूं। मैंने एक डमी कंटेंट प्रकार का निर्माण किया ताकि मैं #access = FALSEइस संदर्भ में हैक करने वाले प्रतीत होने वाले सेटिंग के बजाय किसी अन्य सामग्री प्रकार की तरह अपने फ़ील्ड्स को नियंत्रित कर सकूं।
लेटेरियन

यह पुष्टि करने के लिए धन्यवाद कि मैंने क्या आशंका जताई थी: कि एकल फ़ील्ड विजेट व्यावहारिक रूप से अपने आप में उपयोग करने योग्य नहीं है।
SMTF

7

मैं ttk द्वारा सुझाए गए फ़ंक्शन का गहनता से उपयोग कर रहा था, लेकिन मुझे लगता है कि हाल ही में अपडेट ने चीजों को गड़बड़ कर दिया ...

यहां पिछले समाधान का एक नया संस्करण है जो Drupal 7.22 और ctools 7.x-1.3 के साथ अच्छी तरह से काम करता है।

तो, पिछले पोस्ट की तरह, आप अपने कस्टम फ़ंक्शन को इस तरह कहते हैं:

my_field_attach_form('field_body', 'node', 'blog',  $node, $form, $form_state, LANGUAGE_NONE);

ध्यान दें कि इकाई बंडल अब एक पैरामीटर है। मैंने ऐसा इसलिए किया क्योंकि मैं इस फ़ंक्शन का उपयोग उपयोगकर्ताओं को संपादित करने के लिए भी कर रहा था। इस तरह, यह भी करदाता शब्द, या किसी अन्य संस्था के लिए इस्तेमाल किया जा सकता है।

और इस my_field_attach_formरूप में परिभाषित किया गया है:

function my_field_attach_form($field_name, $entity_type, $bundle, $entity, &$form, &$form_state, $langcode = NULL) {

  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );

  // Append to the form
  ctools_include('fields');
  $field_instance = field_info_instance($entity_type, $field_name, $bundle);
  $form += (array) ctools_field_invoke_field($field_instance, 'form', $entity_type, $entity, $form, $form_state, $options);
}

इस फ़ंक्शन ने मुझे बहुत समय बचाया, आशा है कि यह आपके लिए भी होगा!


5

यहाँ ctools_field_invoke_field()विधि का उपयोग कर समाधान है । अपने कस्टम फ़ॉर्म फ़ंक्शन में, जोड़ें:

$form = array();
$node = new stdClass();
$node->type = 'blog';
my_field_attach_form('field_body', 'node', $node, $form, $form_state, LANGUAGE_NONE);

जहां my_field_attach_formफ़ंक्शन के रूप में परिभाषित किया गया है

function my_field_attach_form($field_name, $entity_type, $entity, &$form, &$form_state, $langcode = NULL) {
  // Set #parents to 'top-level' if it doesn't exist.
  $form += array('#parents' => array());

  // If no language is provided use the default site language.
  $options = array(
    'language' => field_valid_language($langcode),
    'default' => TRUE,
  );
  module_load_include("inc","ctools","includes/fields");
  $form += (array) ctools_field_invoke_field($field_name, 'form', $entity_type, $entity, $form, $form_state, $options);
}

ध्यान दें, कि आपकी साइट को ctools सक्षम होना चाहिए। यह बहुत बुरा है कि Drupal डिफ़ॉल्ट रूप से इस तरह एक सहायक फ़ंक्शन को शामिल नहीं करता है।


2

मैं ctools विधि काम करने में असमर्थ था और इसके बजाय इसे इस तरह करने का फैसला किया।

यह कोड एक फॉर्म फंक्शन के अंदर होगा, इसलिए $ फॉर्म और $ फॉर्म_स्टेट पहले ही पास हो जाएंगे।

function form_function($form, &$form_state) {

पहले एक प्रकार का एक खाली नोड बनाएं जिसमें वह फ़ील्ड है जिसे आप प्रस्तुत करना चाहते हैं।

    $entity = new stdClass();
    $entity->title = "Temp Object";
    $entity->type = "node_type";
    node_object_prepare($entity);

मैंने फॉर्म वैरिएबल को डुप्लिकेट किया था इसलिए मैं मूल को नहीं खोलूंगा।

    $temp_form       = $form;
    $temp_form_state = $form_state;
    field_attach_form("node", $entity, $temp_form, $temp_form_state);

जिस फ़ील्ड को आप खोज रहे हैं उसे बाहर खींचकर फ़ॉर्म में जोड़ें।

    $form["field"] = $temp_form["existing_field"];
}

मैंने इस विधि का उपयोग टैक्सोनॉमी सेलेक्ट विजेट, टैक्सोनॉमी चेकबॉक्स विजेट और कस्टम रूप पर श्रेणीबद्ध चयन विजेट को प्रस्तुत करने के लिए किया था । (वर्गीकरण स्वायत्त विजेट रेंडर करता है, लेकिन सबमिट में त्रुटि फेंकता है)

अंत में प्रस्तुत करें और प्रिंट करें

drupal_render(drupal_get_form("form_function"))

कस्टम रूप में फ़ील्ड विजेट का उपयोग करने का यह एक आसान तरीका लगता है। यह एक मौजूदा बंडल पर निर्भर करता है। मेरे मामले में मैं एक डमी सामग्री प्रकार का उपयोग करता हूं जहां मैं आवश्यकतानुसार फ़ील्ड बनाता हूं और कॉन्फ़िगर करता हूं। यह थोड़ा आसान है, लेकिन अन्य तरीकों के लिए भी आवश्यक है। बस ध्यान दें: ctools_field_invoke_field()ऊपर वर्णित विधि भी काम करती है।
बर्नहार्ड फुरस्ट

0

मैंने प्रयोग करके इंडिविजुअल फील्ड से फॉर्म बनाए हैं

field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $form, $form_state);

यह आवश्यक विजेट फॉर्म वापस करना चाहिए जिसे किसी भी रूप में उपयोग किया जा सकता है

 $custom_form['form_element_to_display'] = field_default_form('entity_type', $entity, $field,$field_instance,LANGUAGE_NONE,$default_value, $custom_form, $custom_form_state);

उपयोग के ऊपर 2 पैरामीटर के लिए मान प्राप्त करने के लिए:

$field = field_info_field($field_name);
$field_instance = field_info_instance('node', $field_name, $node_type);

अन्य मापदंडों के लिए आप एपीआई लिंक यहां देख सकते हैं

यह सामग्री प्रकार फ़ील्ड पर परिभाषित डिफ़ॉल्ट विजेट फ़ॉर्म लौटाता है।

आशा है कि यह किसी की मदद करता है :)

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