มีวิธีการแปลงแบบฟอร์มปกติและเพิ่มตัวแทนที่มีโมดูลหรือควรจะทำกับแม่แบบฟอร์มหรือกับ jQuery?
มีวิธีการแปลงแบบฟอร์มปกติและเพิ่มตัวแทนที่มีโมดูลหรือควรจะทำกับแม่แบบฟอร์มหรือกับ jQuery?
คำตอบ:
นี่คือตัวยึด HTML5 คุณสามารถเพิ่มมันเป็นแอตทริบิวต์ขององค์ประกอบใดก็ได้และเบราว์เซอร์ที่เปิดใช้งาน HTML5 จะตอบสนองตามนั้น:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
ฟังก์ชั่นเรียกซ้ำสั้น ๆ เช่นนี้อาจเป็นประโยชน์ถ้าคุณต้องการเพิ่มตัวยึดตำแหน่งโดยอัตโนมัติสำหรับทุกฟิลด์ข้อความในแบบฟอร์ม (ตามชื่อของฟิลด์ในตัวอย่างนี้):
function MYMODULE_auto_placeholders(&$element) {
if ( isset($element['#type']) && $element['#type'] == 'textfield') {
// set placeholder
$element['#attributes']['placeholder'] = $element['#title'];
// hide label
$element['#title_display'] = 'invisible';
}
foreach (element_children($element) as $key) {
MYMODULE_auto_placeholders($element[$key]);
}
}
จากนั้นในฟังก์ชั่นการเปลี่ยนแปลงรูปแบบของคุณเพียงแค่โทร
MYMODULE_auto_placeholders($form);
วิธีการนั้นจะใช้ได้กับทุกฟิลด์ข้อความในแบบฟอร์มยกเว้นการเพิ่มใน#process
ฟังก์ชั่น (เช่น alt และชื่อฟิลด์ข้อความของฟิลด์รูปภาพเป็นต้น)
ฉันลองคำตอบของคลีฟ:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
แต่ด้วยความประหลาดใจของฉันฉันได้รับตัวยึดตำแหน่งในห่อของ textfield ไม่ใช่ textfield เอง จากนั้นฉันก็ลองชุดรูปแบบดังนี้ใช้งานได้!
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['und'][0]['value']['#attributes']['placeholder'] = t('Placeholder text');
}
}
เพียงเพิ่มตัวยึดตำแหน่งในอาร์เรย์ #attributes สำหรับองค์ประกอบเขตข้อมูลฟอร์มเช่นในรหัสต่อไปนี้
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
สะดุดกับสิ่งนี้และคิดว่าคำตอบของคลีฟดูเหมือนดีที่จะเพิ่มตัวยึดตำแหน่งโดยอัตโนมัติ
ท่านจำเป็นต้องทำการเปลี่ยนแปลงเล็กน้อยเพื่อให้ถูกต้องใน drupal 8 ดังนั้นนี่เป็นคำตอบที่ค่อนข้างเหมือนกัน แต่เหมาะสำหรับธีม Drupal 8 ของคุณ
/**
* Implements hook_form_alter
*/
function THEME_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
add_placeholders($form);
}
/**
* Add placeholders to suitable form elements -> textfield, password, email, textarea
*/
function add_placeholders(&$element) {
if(isset($element['#type']) && in_array($element['#type'], ['textfield', 'password', 'email', 'textarea'])) {
$element['#attributes']['placeholder'] = $element['#title'];
}
foreach(\Drupal\Core\Render\Element::children($element) as $key) {
add_placeholders($element[$key]);
}
}
หากคุณต้องการกำหนดเป้าหมายอินสแตนซ์ของฟอร์มโดยตรงให้ใช้ hook_form_FORM_ID_alter อาจเป็นระเบียบเรียบร้อยกว่าการใช้แบบมีเงื่อนไข โซลูชันของฉันสำหรับการกำหนดเป้าหมายอินสแตนซ์บล็อกของฟอร์มการค้นหาเท่านั้น
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}