किसी अन्य फ़ील्ड के आधार पर स्वतः भरण फ़ील्ड


10

मेरे पास बहुत जटिल स्थिति है जहां मुझे कुछ सलाह की आवश्यकता है। मेरे पास एक सामग्री प्रकार है my_content, जिसमें एक फ़ील्ड संग्रह फ़ील्ड जुड़ी हुई है field_mycollection, जिसमें उपयोगकर्ता के लिए एक इकाई संदर्भ फ़ील्ड field_my_userreference, एक फ़ोन फ़ील्ड field_my_phone, एक टेक्स्ट फ़ील्ड field_my_textऔर एक अन्य टेक्स्ट फ़ील्ड है field_my_anothertext

My Content
|_ field_mycollection
   |_ field_my_userreference
   |_ field_my_phone
   |_ field_my_text
   |_ field_my_anothertext

उपयोगकर्ता इकाई में फ़ील्ड भी होते हैं field_my_phone, field_my_textऔर field_my_yetanothertextबाद वाले का एक अलग मशीन नाम होता है।

मैं क्या करना चाहता हूं, अगर किसी उपयोगकर्ता को my_contentसंपादित / जोड़ते समय, field_my_userreferenceचयनित उपयोगकर्ता के डेटा से अन्य फ़ील्ड को ऑटो-पॉप्युलेट किया जाना चाहिए। ऑटो-आबादी वाले क्षेत्र अभी भी संपादन योग्य होने चाहिए।

मैं यह लक्ष्य कैसे प्राप्त कर सकता हूं? मैं यह करना चाहूंगा, यदि संभव हो तो, कुछ कोडिंग के साथ, उपयोग करके hook_form_FORM_ID_alter()


क्या आपको फॉर्म पर, या सेव पर लाइव होना चाहिए?
मोलॉट

फार्म पर रहते हैं। मैंने इसे पहले ही लागू कर दिया है कि सहेजने पर, डेटा खाली रहने पर उपयोगकर्ता इकाई से लिया जाएगा। लेकिन असल में मुझे इसके फॉर्म पर क्या चाहिए :(
Йлин '

ठीक है, मेरा जवाब दिया गया।
मोलॉट

जवाबों:


11

यदि आप चाहते हैं कि यह लाइव हो, और सभी फ़ील्ड पहले से ही फ़ॉर्म में हैं, तो फ़ॉर्म का hook_form_FORM_ID_alter()अनुसरण करने के लिए सबसे सुरक्षित तरीका होगा :

$form['#attached']['js'] = array(
  drupal_get_path('module', 'module_name') . '/js/copy_field_value.js',
);

फिर copy_field_value.jsव्यवहार बनाएँ:

(function($) {
  Drupal.behaviors.moduleNameCopyFieldValue = {
    attach: function (context, settings) {

      // Repeat this for all fields as needed
      $('#source', context).on('blur', function () { 
        // above you can use change instead of blur if element is not changed by another js
        if (!$('#destination').val() || 0 === $('#destination').val().length) {
          $('#destination').val($(this).val());
          // wrap line above in "if no value" like I did, or other condition you like
        }
      });
      // end of "repeat this"
    }
  };
})(jQuery);

आप स्रोत फ़ील्ड में पैरामीटरhook_form_FORM_ID_alter() जोड़ने के लिए भी उपयोग कर सकते हैं , लेकिन यह आपके फॉर्म को प्रत्येक फ़ील्ड कॉपी पर सर्वर को कॉल करने के लिए बनाएगा। यदि आपको वास्तव में डेटाबेस को क्वेरी करने की आवश्यकता है, तो यह जाने का तरीका है। यह यहाँ वर्णन करने के लिए बहुत व्यापक होगा। उपयोगकर्ता द्वारा देखे गए वास्तविक मूल्यों को अपडेट करने के लिए आपको सरणी को बदलने की आवश्यकता है। नोटिस बनाने से बचने के लिए इसे लपेटकर इसे फंक्शन क्रिएशन के रूप में करें ।#ajax$form_state["input"]isset

यदि आपका फॉर्म एलिमेंट है $form["something"]["something"]["element"], तो उसका मूल्य होगा $form_state["input"]["something"]["something"]["element"]- और आप इसे hook_form_alterसभी में सेट कर सकते हैं , बस दोनों को $formऔर $form_stateसंदर्भ द्वारा याद रखें ।

नोट : .on()विधि jQuery 1.7 में जोड़ी गई थी, इसलिए आपको सीधे इस उत्तर का उपयोग करने के लिए jQuery अपडेट की आवश्यकता होगी , या उपयोग करने के लिए मेरे कोड का अनुवाद करें .change()या .blur()विधि।


निर्देश के लिए बहुत धन्यवाद! मैं Drupal के JS API पर बहुत अच्छी तरह से नहीं हूँ। क्या आप बताएंगे कि मुझे उपयोगकर्ता इकाई से फ़ील्ड मान कैसे मिलेगा? उदाहरण के लिए, यदि कोई उपयोगकर्ता चुना गया है, तो मैं इस उपयोगकर्ता की जानकारी के साथ अगले फ़ील्ड्स को कैसे आबाद कर सकता हूं?
Елин Й

1
@ ЕлинЙ। यहाँ चाल php पृष्ठभूमि के बारे में परवाह नहीं है। बस <input>अपने पसंदीदा ब्राउज़र के लिए फायरबग या इसी तरह के टूल का उपयोग करके टैग के आईडी मापदंडों की पहचान करें। या किसी अन्य jQuery चयनकर्ता का उपयोग करें। यह केवल ब्राउज़र में होगा, इसलिए आपके पास स्क्रीन पर जो भी होगा। दूसरी ओर अगर आपको वास्तव में क्वेरी डेटाबेस की आवश्यकता है (ऐसा लगता है कि मैं चूक गया), #ajaxजाने का रास्ता है। लेकिन यह बहुत व्यापक होगा। $form_state["values"]उपयोगकर्ता द्वारा देखे गए वास्तविक मूल्यों को अपडेट करने के लिए आपको सरणी को बदलने की आवश्यकता है। issetनोटिस बनाने से बचने के लिए इसे लपेटकर, इसे फंक्शन क्रिएशन के रूप में करें ।
मोलॉट

धन्यवाद फिर से @ Mołot, मैं इसे लागू करने की कोशिश करेंगे कल, या शायद आज शाम। ऐसा लगता है कि मुझे वास्तव में काम करने के लिए कुछ घंटों की आवश्यकता होगी, यदि अधिक नहीं।
Елин Й

@ ЕлинЙ। सौभाग्य, अधिक सवालों के साथ वापस लौटने के लिए स्वतंत्र महसूस करें और यदि वे जुड़े हुए हैं तो उन्हें टिप्पणियों में यहां लिंक करें। अपडेट किया गया जवाब थोड़ा, btw।
12

1
ठीक है, मैं इसे थोड़ा प्रयोग करूंगा और अपने अनुभव लिखूंगा।
Елин Й

4

आप इसे गणना क्षेत्र मॉड्यूल का उपयोग करके कर सकते हैं

कंप्यूटेड फ़ील्ड एक बहुत शक्तिशाली CCK फ़ील्ड मॉड्यूल है जो आपको अपने सामग्री प्रकारों में एक कस्टम "गणना फ़ील्ड" जोड़ने देता है। ये गणना किए गए फ़ील्ड उन मानों से आबाद हैं, जिन्हें आप PHP कोड के माध्यम से परिभाषित करते हैं। आप अन्य क्षेत्रों, वर्तमान उपयोगकर्ता, डेटाबेस तालिकाओं सहित, Drupal के लिए उपलब्ध किसी भी चीज़ पर आकर्षित कर सकते हैं। (अभी तक शक्ति महसूस कर रहे हैं! :)) आप यह भी चुन सकते हैं कि डेटाबेस में अपने गणना किए गए फ़ील्ड मानों को अन्य सामग्री फ़ील्ड के साथ संग्रहीत करें या नोड व्यू के दौरान उन्हें "गणना" करें। (यद्यपि आपको ध्यान देना चाहिए कि दृश्य उपयोग के लिए डेटाबेस संग्रहीत मानों की आवश्यकता होती है।) यह क्षेत्र वस्तुतः CCK क्षेत्रों की स्विस सेना का चाकू है। तो अपने PHP आधारित मूल्यों को पकाना शुरू करें!


शीघ्र जवाब देने के लिए ध्न्यवाद। यह बहुत ही आशाजनक लगता है। हालाँकि, मैं इसके लिए एक मॉड्यूल स्थापित नहीं करना चाहता, लेकिन बस कुछ कोड लिखता हूं, क्योंकि मुझे केवल उस फॉर्म पर इस तरह की कार्यक्षमता की आवश्यकता है, और वास्तविक प्रणाली पहले से ही बहुत बड़ी है और विविध कार्यात्मकताओं के लिए कई मॉड्यूल स्थापित हैं।
Елин Й

दूसरे, क्या यह मॉड्यूल का उपयोग करना संभव है, उपयोगकर्ता के लिए जो ऑटो-आबादी वाले क्षेत्रों को मैन्युअल रूप से ओवरराइड करने और सहेजने के लिए नोड बना रहा है या संपादित कर रहा है? ताकि, उपयोगकर्ता इकाई और my_content में भिन्न मूल्य सहेजे जाते हैं।
Елин Й

यह सेटअप के तरीके पर निर्भर करेगा
4life

धन्यवाद @ 4 लाइफ, मैं यह भी कोशिश करूंगा कि अगर मैं इसे मोलॉट के निर्देशों का उपयोग करके कोडिंग के साथ प्राप्त नहीं कर सकता हूं।
Елин Й

2

मैं पोस्ट करना चाहता हूं कि मैंने @ Mołot की महान मदद के लिए इसे कैसे प्राप्त किया।

  1. हुक_फॉर्म_फ़ॉर्म_आईडी_अल्टर () लागू किया गया ।
  2. क्षेत्र संग्रह के चारों ओर एक रैपिंग डिव जोड़ा।
  3. चूंकि मेरा फ़ील्ड संग्रह एक बहु-मूल्य फ़ील्ड है, इसलिए इस पर पुनरावृत्त और #ajaxफ़ील्ड के लिए गुण सेट करें field_my_userreference
  4. एक कॉलबैक फ़ंक्शन बनाया गया जो केवल फ़ील्ड संग्रह आइटम वापस करता है।
  5. हुक_फॉर्म_फ़ॉर्म_आईडी_अल्टर () कार्यान्वयन में जांच की जाती है, यदि फ़ील्ड संग्रह के लिए $ form_state सेट है। यदि हाँ, उपयोगकर्ता इकाई से मान प्राप्त करें और उन मानों के साथ प्रपत्र इनपुट फ़ील्ड को पॉप्युलेट करें।

मेरा कोड ऐसा दिखता है:

function MYMODULE_form_my_content_node_form_alter(&$form, &$form_state, $form_id) {
  $form['field_mycollection']['#prefix'] = '<div id="mycollection-wrapper">';
  $form['field_mycollection']['#suffix'] = '</div>';
  foreach ($form['field_mycollection']['und'] as $key => $fc_mycollection) {
    if (is_numeric($key)) {
      $form['field_mycollection']['und'][$key]['field_my_userreference']['und']['#ajax'] = array(
        'callback' => 'MYMODULE_mycollection_callback',
        'wrapper' => 'mycollection-wrapper',
      );
      if (isset($form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id'])) {
        $user_wrapper = entity_metadata_wrapper('user', $form_state['values']['field_mycollection']['und'][$key]['field_my_userreference']['und'][0]['target_id']);
        $form_state['input']['field_mycollection']['und'][$key]['field_my_text']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_text->value() : '';
        $form_state['input']['field_mycollection']['und'][$key]['field_my_anothertext']['und'][0]['value'] = $user_wrapper->field_my_text->value() ? $user_wrapper->field_my_yetanothertext->value() : '';
      }
    }
  }
}

function MYMODULE_mycollection_callback($form, &$form_state) {
  return $form['field_mycollection'];
}

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