Hook_form_alter में "und" के लिए भाषा कुंजी के लिए सबसे अच्छा अभ्यास


30

मैं अपने कस्टम मॉड्यूल में एक रूप में संशोधन कर रहा हूं। कोड जैसा दिखता है:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

हालांकि, मुझे लगता है कि हार्ड-कोडिंग undखराब है। इस मामले में फॉर्म फ़ील्ड को ठीक से संशोधित करने का उचित तरीका क्या होना चाहिए?


यह टिप्पणी शायद अप्रासंगिक है क्योंकि यह एक लंबे समय से पहले पूछा गया है। एक सरल तरीका है कि मैं एक foreachलूप का उपयोग करके इसका उपयोग करता हूं । यदि यह सिर्फ LANGUAGE_NONE है, तो यह एक ही रन है। Form_alter अर्थ में, यह तकनीकी रूप से जो भी भाषा है, उसे बदलना चाहिए।
आयुष

जवाबों:


40

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

अनुवाद योग्य फ़ील्ड में भाषा कोड होता है, जो वास्तव में समझ में आता है। लेकिन यदि क्षेत्र अनुवाद योग्य नहीं है, तो भाषा कोड हमेशा (और सभी सामग्री प्रकार, निकाय, आदि के लिए) होगा - LANGUAGE_NONE(निरंतर LANGUAGE_NONEऔर स्ट्रिंग का उपयोग करने के लिए सबसे अच्छा 'und')।
तो अपने समाधान के साथ आप एक स्थिति प्राप्त कर सकते हैं जब एक नोड रूसी है, लेकिन नोड का एक क्षेत्र उपयोग करता है LANGUAGE_NONE
खुशी से, फ़ील्ड '#language'कुंजी के साथ फ़ॉर्म से जुड़ी होती हैं , जिसमें हमेशा सही भाषा कोड होता है।

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

यदि आपके पास संलग्न फ़ॉर्म तक पहुंच नहीं है, तो फ़ील्ड भाषा एपीआई फ़ंक्शन उपयोगी हो सकते हैं।


4
इस सूत्र में यह एकमात्र सही उत्तर है।
बोजान ज़िवानोविक

नोड / सामग्री-प्रकार के छवि फ़ील्ड पथ को पुनर्प्राप्त करते समय इस पद्धति का उपयोग भी किया जा सकता है। धन्यवाद
जयराम आर

10

यदि आप जानते हैं कि इकाई प्रकार और बंडल निम्नलिखित कोड की तरह कुछ का उपयोग करते हैं, जिसे field_language () कहते हैं

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

यह सही भाषा का पता लगाएगा, और बहुभाषी साइटों में काम करेगा।

Field_get_items () पर एक नज़र डालें ।


यह एपीआई रास्ते के रूप में सही है।
निकित

यदि नोड नहीं बनाया गया है तो क्या होगा?
आगा

@Nikit मुझे यकीन नहीं है, क्योंकि प्रदर्शन भाषा और फ़ॉर्म भाषा समान नहीं हैं। लेखक कुछ रूप बदल देता है और यह नया नोड बनाने या मौजूदा नोड के नए अनुवाद को जोड़ने के लिए हो सकता है।
कलाब्रो

@kalabro - प्रदर्शन भाषा और रूप भाषा - वर्तमान संदर्भ में समान।
निकित

4

पूरा und सौदा Drupal 7 में अधिक कष्टप्रद चीजों में से एक है जो अभ्यास में तब भी काम नहीं करता था जब इसे डिजाइन किया गया था।

वैसे भी आप array_keysइस तरह से पहली भाषा का उपयोग कर सकते हैं :

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

वह हर समय काम करना चाहिए।


आपके उत्तर के लिए धन्यवाद। मैं इस मुद्दे को दूसरे उत्तर में ठीक करने के लिए जो कुछ भी कर रहा हूं उसे चिपका रहा हूं। :)
शफीउल

क्या मैं फॉर्म_स्टेट में भी उसी क्षेत्र के मूल्य तक पहुँचने के लिए $ लैंग्स का उपयोग कर सकता हूँ?
आगा

क्या यह वास्तव में सुरक्षित है? क्या आप सुनिश्चित हो सकते हैं कि $ langs [0] हमेशा सही सरणी आइटम हो?
रौबी

0

(यदि यह किसी की मदद करता है तो मेरे अपने प्रश्न का उत्तर देना। उत्तर मेरे लिए काम करता है।)

मैं भाषा प्राप्त करने के लिए निम्नलिखित पंक्ति लिख सकता हूं:

$lang = $form['language']['#value'];    //  Instead of "und"


0

पुन: कलाब्रो का जवाब

उसका कोड मेरे लिए काम नहीं करता था - मेरा कोड थोड़ा अलग है

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ लैंग] [०] "यू" लौटाया लेकिन [$ लैंग] का पूरा मूल्य "und" है और मुझे ['मूल्य'] की भी आवश्यकता नहीं थी, क्योंकि $ फॉर्म [EL FIELDNAME ’] [# भाषा] ] एक सरणी नहीं थी, यह एक स्ट्रिंग थी।


1
Character und ’का 0 वां वर्ण 'u’ है। आप एक छोटे से मार्ग से, सभी सरणियों के चक्रव्यूह में हैं।
क्रिस बर्गेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.