वहाँ एक फार्म आवरण (div) के रूप में एक वर्ग जोड़ने या बदलने के लिए एक तरीका है?
या यह सिर्फ थीम फ़ंक्शन के साथ किया जाता है?
यदि ऐसा है तो उसे बदलने के लिए किस थीम फ़ंक्शन का उपयोग किया जाता है?
वहाँ एक फार्म आवरण (div) के रूप में एक वर्ग जोड़ने या बदलने के लिए एक तरीका है?
या यह सिर्फ थीम फ़ंक्शन के साथ किया जाता है?
यदि ऐसा है तो उसे बदलने के लिए किस थीम फ़ंक्शन का उपयोग किया जाता है?
जवाबों:
theme_form_element()
यदि आप थीमिंग को विश्व स्तर पर बदलना चाहते हैं तो आप सामान्य रूप से ओवरराइड कर सकते हैं । यदि आप केवल एक विशिष्ट रूप तत्व को संशोधित करने में रुचि रखते हैं तो मुझे कुछ विकल्पों की जानकारी है।
आप जिस विशेष प्रकार के फार्म तत्व में रुचि रखते हैं (जैसे। टेक्स्टफील्ड) के लिए एक नया थीम फ़ंक्शन पंजीकृत कर सकते हैं। फिर आप इस थीम फ़ंक्शन (मूल, उदाहरण के आधार पर theme_textfield()
) बनाते हैं, लेकिन वह theme('form_element', ...)
अंत में कॉल नहीं करता है (आप या तो एक थीम फ़ंक्शन में आवरण और तत्व दोनों को संभाल सकते हैं, या आप एक अलग आवरण थीम फ़ंक्शन बना सकते हैं। और उस का उपयोग करें)। अंत में आप #theme
एक विशेष रूप तत्व में एक संपत्ति जोड़ते हैं, और वह तत्व आपके कस्टम थीम को प्राप्त करेगा।
आप एक टेम्प्लेट फ़ाइल बना सकते हैं, form_element.tpl.php
जिसमें बस डिफ़ॉल्ट व्यवहार है theme_form_element()
और फिर hook_preprocess_form_element()
एक टेम्पलेट सुझाव जोड़ने के लिए उपयोग करें। फिर आप सुझाव से मेल खाने वाले नए टेम्पलेट को बनाते हैं। आपने अक्सर लोगों का उल्लेख करते हुए सुना है कि फ़ंक्शंस की तुलना में टेम्प्लेट थोड़े धीमे होते हैं, और इस तरह के अक्सर उपयोग किए जाने वाले थीम कॉल के लिए मैं एक टेम्प्लेट का उपयोग करके लोगों को गंजा होने की कल्पना कर सकता हूं। हालांकि मैंने इसके लिए कभी कोई माप नहीं किया है। इसके अलावा, आपको सुझाव देने में सक्षम होने के लिए प्रीप्रोसेस स्टेज पर पर्याप्त संदर्भ होना चाहिए।
मुझे पता है कि यह एक सुपर पुराना धागा है, लेकिन मैं सीख रहा हूं कि फार्म तत्वों को कैसे बदलना है और कक्षाएं जोड़ना है। मुझे एक कस्टम मॉड्यूल बनाने के लिए मिला:
function yourtheme_custom_form_alter(&$form, &$form_state, $form_id) {
case'webform_number_whatever':
_yourtheme_form_add_wrapper($form['submitted']['yourfieldhere'], array('form-field-some-style', 'not-label', 'whatever-other-styles-you-want'));
break;
}
function _yourtheme_form_add_wrapper(&$element, $classes = array(), $type = array('form-item', 'form-type-textfield'), $removeTitle = FALSE){
$element['#prefix'] = '<div class="' . implode(" ", $classes) . '"><div class="' . implode(" ", $type) . '">';
$element['#suffix'] = '</div></div>';
}
"आवरण" को बदलने के लिए आपको form_element को ओवरराइड करना होगा। मूल रूप से सभी फॉर्म तत्व फॉर्म_लेमेंट थीम theme_form_element($element,$value);
(form.inc फ़ाइल) के साथ प्रदान किए जाते हैं
तो यह बदलने के लिए कि यह आपके फ़ॉर्म तत्वों को कैसे प्रस्तुत करता है, आप बस उस फ़ंक्शन को अपने टेम्पलेट में कॉपी कर सकते हैं। फ़ोल्डर को इसका नाम दें और उसका नाम बदलें: phptemplate_form_element($element,$value)
अब आप कोई भी परिवर्तन कर सकते हैं और मूल फ़ंक्शन के बजाय उनका उपयोग किया जाएगा
theme_form_element($element,$value);
Form.inc से कॉपी करेंphptemplate_form_element($element,$value)
आप संपत्ति में रैपर_एट्यूएंट्स का उपयोग कर सकते हैं।
$form['example'] = [
'#type' => 'textfield',
'#title' => $this->t('Example'),
'#wrapper_attributes' => ['class' => ['wrapper-class']],
];
महत्वपूर्ण रूप से, theme_form_element केवल प्रत्यक्ष अभिभावक आवरण div को संशोधित करेगा और यह CSS प्रभावों के लिए लक्षित लक्ष्य नहीं हो सकता है।
[हालांकि प्रोग्रामेटिक नहीं है, अगर कोई बस एक नोड क्षेत्र के शीर्ष-आवरण के लिए एक वर्ग को लागू करना चाहता है (यह आवरण, आवरण, आवरण) है तो क्या मैं मान सकता हूं कि किसी विशेष सामग्री प्रकार के लिए "फ़ील्ड प्रबंधित करें" का चयन करके "फ़ील्ड समूह" मॉड्यूल का उपयोग करें और एक साधारण DIV के रूप में "नया समूह जोड़ें" चुनें। फिर लेबल को हटा दिया जा सकता है और वांछित वर्गों को अतिरिक्त आवरण को सौंपा जा सकता है (लेकिन अब हमारे पास और भी आवरण हैं) - असीमित घोंसले के शिकार के साथ]
आवरण विशेषताओं को विन्यास योग्य बनाएं!
अपने विषय में अपने स्वयं के तत्व-तत्व थीम फ़ंक्शन बनाएं ...
sites/all/themes/MY_THEME/theme/form-element.theme.inc
function my_theme_form_element($variables) {
$element = &$variables['element'];
$attributes = isset($element['#my_theme_wrapper_attributes']) ?
$element['#my_theme_wrapper_attributes'] : array();
...
$output = '<div' . drupal_attributes($attributes) . '>' . "\n";
...
}
फिर आप इस तरह से सामान कर सकते हैं ...
function my_module_form_alter(&$form, &$form_state, $form_id) {
$form['account']['mail']['#my_theme_wrapper_attributes']['class'][] = 'form-field--inline';
}
ऐसे मामले आते हैं जिनमें न तो वांछित परिणाम मिलते हैं #prefix/#suffix
और न ही #attributes => array('class')
। मेरा विशेष मामला ajax-wrapper div में एक प्रबंधित_फाइल तत्व के चारों ओर एक वर्ग जोड़ रहा है। #prefix/#suffix
एक नया कंटेनर बनाता है और #attributes/'class'
एक आंतरिक तत्व के वर्ग को संशोधित करता है, न कि सबसे बाहरी।
सामान्य बाहरी div सिर्फ है
<div id="edit-doc1--XX-ajax-wrapper">
जो सीएसएस में लक्षित करना मुश्किल है। मैं लक्ष्य [id^="edit-doc"]
या [id$="-ajax-wrapper"]
इन दोनों को लक्षित कर सकता हूं , केवल उन तत्वों से अधिक जो मैं चाहता था।
मैं जिस समाधान के साथ आया था वह #process
तत्व को फॉर्म में जोड़ना है और तत्व के कोड को मैन्युअल रूप से जोड़ना है । यहाँ #process
फॉर्म आइटम की घोषणा में जोड़ा गया गुण है:
$form['doc1'] = array(
'#type' => 'managed_file',
'#process' => array('mymodule_managed_file_process'),
);
और यहाँ mymodule_managed_file_process()
समारोह है:
function mymodule_managed_file_process($element, &$form_state, $form) {
// Call the original function to perform its processing.
$element = file_managed_file_process($element, $form_state, $form);
// Add our own class for theming.
$element['#prefix'] = str_replace(
'id=',
'class="managed-file-wrapper" id=',
$element['#prefix']
);
return $element;
}
स्ट्रिंग प्रतिस्थापन पर भरोसा बहुत पोर्टेबल नहीं है, इसलिए str_replace
अपने जोखिम पर उपयोग करें। हालाँकि, यह कोड वास्तव में आवश्यक वर्ग को जोड़ने के लिए सबसे बाहरी DIV को बदल देता है:
<div class="managed-file-wrapper" id="edit-doc1--XX-ajax-wrapper">
<?php
$form['#attributes'] = array('class' => 'your-class-name');
?>
आप फार्म तत्व पर एक वर्ग जोड़ने के लिए उपरोक्त तरीके का उपयोग कर सकते हैं।