सभी drupal रूपों में HTML5 प्लेसहोल्डर जोड़ना


22

मैं अपनी वेबसाइट पर सभी textfields को प्लेसहोल्डर विशेषता जोड़ने की कोशिश कर रहा हूं, लेकिन मुझे कोई भाग्य नहीं है।

मैंने एक मॉड्यूल बनाया है जो ओवरराइड करता है hook_form_alter

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $value['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

मुझे आपको बताना चाहिए कि मैं वेबफॉर्म मॉड्यूल का भी उपयोग कर रहा हूं।

जवाबों:


14

क्योंकि मैं वेबफॉर्म मॉड्यूल का उपयोग कर रहा हूं, मैं सिर्फ ग्लोबल वेबफॉर्म टेम्प्लेट (webform-form.tpl.php) को थीम कर सकता हूं और इसे अपने थीम फ़ोल्डर में रख सकता हूं। मॉड्यूल के साथ चीजों को जटिल करने की आवश्यकता नहीं है।

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}

मैंने इसे टेम्पलेट फ़ाइल के शीर्ष पर रखा है।


3
यह कुछ "अपरिभाषित सूचकांक" त्रुटि उत्पन्न कर सकता है जब फॉर्च लूप करते हैं, तो यह जांचने के लिए याद रखें कि क्या सूचकांक isset ()
Matteo

10

थोड़ा इसे बदलो…।

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $form[$key]['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

$value foreach गुंजाइश है मान प्रकार एक संदर्भ नहीं है।


संपादित करें:

मैंने केवल निम्नलिखित कोड के साथ प्रयोग किया है और मैं उनकी विशेषताओं को संपादित करने के लिए textfields के लिए पूरे फॉर्म को पुनरावृत्ति करने में सफल रहा।

function add_placeholder(&$form){
    foreach($form as $key => $val){
        if(substr($key,0,1) == '#' && $form[$key] == 'textfield'){
            $form['#attributes'] = array('placeholder' => t('some text'));
        }else if(is_array($form[$key])){
            add_placeholder($form[$key]);
        }
    }
}

आपकी सहायताके लिए धन्यवाद! खुद एक है कि देखा जाना चाहिए था। क्योंकि यह मेरी मूल समस्या को हल नहीं कर रहा है, मैं आपको एक सही जवाब नहीं दे सकता।
जोशुआ पेडरसन 16

4

आप शायद ऐसा कर सकते हैं hook_form_alterया "प्लेसहोल्डर" कोhook_form_FORM_ID_alter जोड़ सकते हैं विशेषता

जैसे, अप्रयुक्त, लेकिन कुछ इस तरह:

/**
 * Implements hook_form_FORM_ID_alter
 */
function mymodule_form_webform_client_form_12_alter(&$form, &$form_state) {
  drupal_set_message('<pre>'.print_r($form,1).'</pre>'); // debug form
  $form['submitted']['my_form_component']['#attributes'] = array('placeholder' => 'placeholder 1');
}

फ़ंक्शन नाम के form_idलिए सही फ़ॉर्म आईडी प्राप्त करने के लिए नामित वेबफॉर्म HTML में छिपे हुए फ़ॉर्म तत्व को ढूंढें form_alter


क्या मुझे इसके लिए मॉड्यूल बनाना होगा?

1
आप एक मॉड्यूल कर सकते हैं या सेट कर सकते हैं कि आपके थीम के टेम्पलेट में। टेम्पलेट के मशीन के नाम से mymodule को बदलना।
मारीओमैक

क्या यह कोड D6 के लिए भी काम करेगा?
बाला

4

जोशुआ पेडरसेन कोड के लिए एक बेहतर दृष्टिकोण:

foreach ($form['submitted'] as $key => $value) {
 if (isset($form['submitted'][$key])) {
   $types = array('textfield', 'webform_email', 'textarea');

   if (isset($value['#type']) && in_array($value['#type'], $types)) {
     $form['submitted'][$key]['#attributes']['placeholder'] = t($value['#title']);
   }
 }
}

+1, यह कोड बहुत अच्छा काम कर रहा है, मैंने ड्रुपल 6 के साथ अपने कस्टम मॉड्यूल में सिर्फ कॉपी और पेस्ट किया है, लेकिन मुझे यह त्रुटि चेतावनी मिली है: Foreach () के लिए आपूर्ति की गई अमान्य तर्क C: \ wamp \ www \ r4launch \ साइट्स की सभी लाइन 16 पर \ मॉड्यूल्स \ एडवांस्ड। एडवांस।
बाला

1
मैंने इसे इफ़ेक्ट के अंदर रखकर हल किया। if (isset ($ form_state ['webform'])) {उपरोक्त कोड यहाँ जाता है ..}
बाला

3

अपने कोड में, आप वैरिएबल को बदलते हैं $valueजो कभी भी फिर से वैरिएबल से संबद्ध नहीं होता है$form , जिसे संदर्भ द्वारा पारित किया जाता है।

स्पष्ट रूप से, आप कुछ बदलाव करते हैं लेकिन इसे Drupal में वापस नहीं भेजते हैं।

इसके अलावा, आप इसे ऐसा कर सकते हैं (मैंने इसे परीक्षण नहीं किया है लेकिन सिद्धांत रूप में इसे काम करना चाहिए)।

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $keys = element_children($form);
  foreach ($keys as $key) {
    if (in_array(array('textfield', 'textarea'), $form[$key]['#type'])) {
      if (!empty($form[$key]['#title'])) {
        $placeholder = array('placeholder' => t($form[$key]['#title']));
        if (is_array($form[$key]['#attributes'])) {
          $form[$key]['#attributes'] = array_merge($form[$key]['#attributes'], $placeholder);
        }
        else {
          $form[$key]['#attributes'] = $placeholder;
        }
      }
    }
  }
}

मैं सिर्फ आलसी था fieldsetऔर बच्चों के लिए प्लेसहोल्डर को जोड़ने के लिए एक आलसी था । लेकिन मुझे लगता है कि आप इसे बहुत आसानी से बदल सकते हैं।


3

@ जोशुआ के टेम्प्लेट फ़ाइल समाधान में थोड़ा सुधार: यह कोड प्लेसहोल्डर टेक्स्ट को वेबफॉर्म ईमेल फेयल्ड्स में भी जोड़ेगा।

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    }
    if($value['#type'] == "webform_email") {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}

एक सच्चा सुधार होने के लिए आपको 2 चीजें करनी चाहिए: 1) 2 सेट होने वाले इंडेक्स की जांच करें) अलग-अलग मामलों की जांच के लिए एक बेहतर सिंटैक्स का उपयोग करें
Matteo

2

हुक_फॉर्म_ल्टर का उपयोग करके यह प्रयास करें

function mymodule_survey_builder_form_alter(&$form, &$form_state, $form_id) {    
 if ($form_id == 'form_builder_field_configure') {
        $form['title']['#attributes']=array('placeholder' => t('Please enter the Qustion(English) name here.'));
}
}

1

Drupal के वेबफॉर्म मॉड्यूल के पुराने या पुराने संस्करण का उपयोग करने वाले किसी भी व्यक्ति के लिए , यह ध्यान देने योग्य है कि प्लेसहोल्डर समर्थन (जून 2013) में जोड़ा गया था7.x-4.x branch

इस प्रकार, HTML5 प्लेसहोल्डर कार्यक्षमता अब एक देशी, बिल्ट-इन विकल्प के साथ-साथ कस्टम सीएसएस कक्षाओं के लिए घटक और कई अन्य लंबे अनुरोध वाली विशेषताएं हैं।

नई कार्यक्षमता कैसे दिखाई देती है, इसका स्क्रीनशॉट यहां दिया गया है:

Drupal Webform घटक सेटिंग HTML5 प्लेसहोल्डर समर्थन दिखा रहा है


0

ज्यादातर मामलों में, मुझे लगता है कि कोई केवल कुछ रूपों में प्लेसहोल्डर विशेषताओं को जोड़ना चाहेगा।

यदि आप सभी वेबफ़ॉर्म में प्लेसहोल्डर जोड़ना चाहते हैं, तो आप इसे इस तरह से कर सकते हैं:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  // If webform, add "placeholder" attributes to all textfields
  // got code here:http://drupal.stackexchange.com/questions/12706/adding-html5-placeholder-to-all-drupal-forms
  if (isset($form['#node']->type) && ($form['#node']->type == 'webform')) {
    foreach ($form["submitted"] as $key => $value) {
      switch ($value["#type"]) {
        case 'textfield':
        case 'textarea':
        case 'webform_email':
          $form["submitted"][$key]['#attributes']["placeholder"] = $value["#title"];
          break;
      } 
    }
  }
}

0

बस इसके लिए मॉड्यूल का उपयोग करें: वेबफॉर्म संकेत

इसकी ठीक वही है जो आपको चाहिए। इसका प्रबंधन करना आसान है और कस्टम कोड की कोई आवश्यकता नहीं है। यह मॉड्यूल विरासत ब्राउज़रों के लिए भी समर्थन प्रदान करता है जो प्लेसहोल्डर विशेषता का समर्थन नहीं करते हैं।

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