Answers:
那是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]);
}
}
然后在您的表单alter函数中调用
MYMODULE_auto_placeholders($form);
除了在#process
函数中添加的文本字段(例如,图像字段的alt和title文本字段)外,该方法几乎适用于表单上的每个文本字段。
我尝试了克莱夫的答案:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
但是令我惊讶的是,我将占位符放在文本字段的包装中,而不是文本字段本身。然后我尝试了如下变体,它奏效了!
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');
}
}
偶然发现此问题,并认为自动添加占位符的Clive答案似乎不错。
您需要对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]);
}
}