Thêm trình giữ chỗ biểu mẫu vào các trường nhập văn bản


22

Có cách nào để chuyển đổi một biểu mẫu thông thường và thêm các trình giữ chỗ bằng một mô-đun, hay điều này nên được thực hiện với một mẫu biểu mẫu hoặc với jQuery?

Câu trả lời:


31

Đó 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 #processhàm (như trường văn bản alt và tiêu đề của trường hình ảnh chẳng hạn).


Kết quả: Lỗi: Gọi hàm không xác định Element_children () trong bla_auto_placeholder () (dòng 605 của chủ đề / tùy chỉnh / BLA / bla.theme).
Thomas

15

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

Cảm ơn! Tôi đã bắt đầu phát điên một chút - thậm chí không nghĩ về điều này.
Mike Crittenden

"Some_element" là gì? Là ID của phần tử? Làm thế nào tôi có thể tìm thấy cái này?
sokratis

@sokratis bạn có thể lấy ID của các phần tử theo dpm ($ form), chúng xuất hiện ở cấp độ đầu tiên của mảng $ form. Sau đây là một ví dụ thực tế về việc thay đổi hình thức nhận xét: <code> chức năng MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['topic'] [' các thuộc tính '] [' giữ chỗ '] = t (' Chủ đề '); $ form ['comment_body'] ['und'] [0] ['value'] ['# thuộc tính'] ['giữ chỗ'] = t ('Nội dung'); }} </ code>
Henry

15

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

2
thx, điều này làm việc cho tôi trong Drupal 8.
Không có Sssweat

làm việc độc đáo trong D8.
dresh

5

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

0

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');
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.