การเพิ่มตัวยึดตำแหน่ง HTML5 ให้กับฟอร์ม drupal ทั้งหมด


22

ฉันกำลังพยายามเพิ่มคุณลักษณะตัวยึดตำแหน่งลงในฟิลด์ข้อความทั้งหมดในเว็บไซต์ของฉัน แต่ฉันไม่มีโชค

ฉันได้สร้างโมดูลที่แทนที่ 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
สิ่งนี้สามารถสร้างข้อผิดพลาด "ดัชนีที่ไม่ได้กำหนด" บางอย่างเมื่อทำการวนลูป foreach อย่าลืมตรวจสอบว่าผู้ออกดัชนี ()
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 เป็นประเภทค่าไม่ใช่การอ้างอิง


แก้ไข:

ฉันเพิ่งทดลองใช้โค้ดต่อไปนี้และฉันประสบความสำเร็จในการวนซ้ำฟอร์มทั้งหมดสำหรับฟิลด์ข้อความเพื่อแก้ไขคุณลักษณะของพวกเขา

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]);
        }
    }
}

ขอบคุณสำหรับความช่วยเหลือของคุณ! น่าจะมีคนเห็นว่าตัวเอง เพราะมันไม่ได้แก้ปัญหาเดิมของฉันฉันไม่สามารถให้รางวัลคุณด้วยคำตอบที่ถูกต้อง
Josua Pedersen

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');
}

ค้นหาองค์ประกอบของรูปแบบที่ซ่อนอยู่ใน webform HTML ที่มีชื่อform_idเพื่อรับรหัสรูปแบบที่ถูกต้องสำหรับform_alterชื่อฟังก์ชั่น


ฉันจะต้องสร้างโมดูลสำหรับสิ่งนี้หรือไม่?

1
คุณสามารถทำโมดูลหรือตั้งค่าใน template.php ของชุดรูปแบบของคุณเปลี่ยน mymodule ด้วยชื่อเครื่องของแม่แบบ
mariomc

รหัสนี้จะใช้งานได้กับ D6 ด้วยหรือไม่
บาลา

4

วิธีที่ดีกว่าสำหรับรหัสของ Josua Pedersen:

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 รหัสนี้ใช้งานได้ดีฉันเพิ่งคัดลอกและวางในโมดูลที่กำหนดเองของฉันกับ drupal 6 แต่ฉันได้รับคำเตือนข้อผิดพลาดนี้: อาร์กิวเมนต์ไม่ถูกต้องสำหรับ foreach () ใน C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module ที่บรรทัดที่ 16
Bala

1
ฉันแก้ไขมันโดยการวางไว้ภายในเงื่อนไขถ้า (isset ($ form_state [ 'เว็บฟอร์ม'])) {รหัสข้างต้นที่นี่ .. ถ้า}
บาลา

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

การปรับปรุงเล็กน้อยสำหรับโซลูชันไฟล์เทมเพลตของ @ Josua: รหัสนี้จะเพิ่มข้อความตัวยึดตำแหน่งให้กับอีเมลฟอร์มเว็บ

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


1

สำหรับทุกคนที่ใช้โมดูล Webform ของ Drupalรุ่นเก่าหรือล้าสมัยเป็นสิ่งที่น่าสังเกตว่ามีการเพิ่มตัวยึดตำแหน่งไว้ใน7.x-4.x branch(มิถุนายน 2013)

ดังนั้นฟังก์ชันการทำงานของตัวยึดตำแหน่ง HTML5 จึงเป็นตัวเลือกพื้นฐานที่มาพร้อมกับคลาส CSS ที่กำหนดเองสำหรับส่วนประกอบและคุณสมบัติอื่น ๆ ที่มีการร้องขอยาว

นี่คือภาพหน้าจอว่าลักษณะการทำงานใหม่ปรากฏขึ้นอย่างไร:

การตั้งค่าองค์ประกอบเว็บฟอร์มของ Drupal แสดงการสนับสนุนตัวยึด 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

เพียงแค่ใช้โมดูลเพื่อ: Webform Hints

มันเป็นสิ่งที่คุณต้องการ ง่ายต่อการจัดการและไม่จำเป็นต้องใช้รหัสที่กำหนดเอง โมดูลนี้ยังให้การสนับสนุนเบราว์เซอร์รุ่นเก่าที่ไม่รองรับแอตทริบิวต์ตัวยึดตำแหน่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.