Câu trả lời:
Đó là một trình giữ chỗ HTML5, bạn chỉ có thể thêm nó như một thuộc tính cho bất kỳ yếu tố nào và các trình duyệt hỗ trợ HTML5 sẽ phản ứng tương ứng:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Hàm đệ quy ngắn như thế này có thể hữu ích nếu bạn muốn tự động thêm trình giữ chỗ cho mọi trường văn bản trong một biểu mẫu (dựa trên tiêu đề của trường trong ví dụ này):
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]);
}
}
Sau đó, trong chức năng thay đổi hình thức của bạn chỉ cần gọi
MYMODULE_auto_placeholders($form);
Phương thức đó sẽ hoạt động với hầu hết mọi trường văn bản trên một biểu mẫu, ngoại trừ những trường được thêm vào trong các #process
hàm (như trường văn bản alt và tiêu đề của trường hình ảnh chẳng hạn).
Tôi đã thử câu trả lời của Clive:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Nhưng thật ngạc nhiên, tôi đã có trình giữ chỗ trong trình bao bọc của trường văn bản, chứ không phải chính trường văn bản. Sau đó, tôi đã thử một biến thể như sau, nó đã làm việc!
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');
}
}
Chỉ cần thêm trình giữ chỗ trong mảng #attribut cho phần tử trường biểu mẫu, chẳng hạn như trong đoạn mã sau.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Tình cờ gặp phải vấn đề này và nghĩ rằng câu trả lời của Clive có vẻ tốt khi tự động thêm trình giữ chỗ.
Bạn, một vài thay đổi nhỏ là cần thiết để có được nó ngay trong drupal 8, vì vậy đây là câu trả lời khá giống nhau, nhưng phù hợp với chủ đề drupal 8 của bạn.
/**
* 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]);
}
}
Nếu bạn muốn nhắm mục tiêu một thể hiện biểu mẫu trực tiếp, hãy sử dụng hook_form_FORM_ID_alter. Có thể gọn gàng hơn sử dụng điều kiện. Giải pháp của tôi để nhắm mục tiêu chỉ đối tượng khối tìm kiếm.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}