Thêm trình giữ chỗ HTML5 vào tất cả các hình thức drupal


22

Tôi đang cố gắng thêm thuộc tính giữ chỗ cho tất cả các trường văn bản trên trang web của mình, nhưng tôi không gặp may.

Tôi đã tạo một mô-đun ghi đè 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"]);
        }
    }
}

Tôi nên nói với bạn rằng tôi cũng đang sử dụng mô-đun webform.

Câu trả lời:


14

Bởi vì tôi đang sử dụng mô-đun biểu mẫu web, tôi chỉ có thể tạo chủ đề cho mẫu biểu mẫu web toàn cầu (webform-form.tpl.php) và đặt nó vào thư mục chủ đề của mình. Không cần phức tạp hóa mọi thứ với một mô-đun.

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}

Tôi đặt cái này ở đầu tập tin mẫu.


3
Điều này có thể tạo ra một số lỗi "chỉ mục không xác định" khi thực hiện vòng lặp foreach, hãy nhớ kiểm tra xem chỉ mục isset ()
Matteo

10

Hơi thay đổi nó thành ....

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 trong phạm vi foreach là loại giá trị không phải là một tài liệu tham khảo.


CHỈNH SỬA:

Tôi vừa thử nghiệm mã sau đây và tôi đã thành công khi lặp lại toàn bộ biểu mẫu cho các trường văn bản để chỉnh sửa các thuộc tính của chúng.

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

Cảm ơn bạn đã giúp đỡ! Nên đã phát hiện ra rằng một mình. Bởi vì nó không giải quyết được vấn đề ban đầu của tôi, tôi không thể trao cho bạn câu trả lời đúng.
Josua Pedersen

4

Bạn có thể làm điều đó với hook_form_alterhoặc hook_form_FORM_ID_alterthêm thuộc tính "giữ chỗ"

ví dụ, chưa được kiểm tra, nhưng một cái gì đó như:

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

Tìm phần tử biểu mẫu ẩn trong HTML biểu mẫu web có tên form_idđể lấy id biểu mẫu chính xác cho form_altertên hàm.


tôi sẽ phải làm mô-đun cho việc này?

1
Bạn có thể thực hiện một mô-đun hoặc đặt mô-đun đó trong template.php của chủ đề, thay đổi mô-đun theo tên máy của mẫu.
mariomc

Mã này cũng sẽ làm việc cho D6 chứ?
Bala

4

Một cách tiếp cận tốt hơn với mã của 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, mã này đang hoạt động rất tốt, tôi vừa sao chép và dán trong mô-đun tùy chỉnh của mình, với drupal 6, nhưng tôi đã nhận được cảnh báo lỗi này: Đối số không hợp lệ được cung cấp cho foreach () trong C: \ wamp \ www \ r4launch \ site \ all \ mô-đun \ advanced \ advanced.module trên dòng 16.
Bala

1
Tôi đã giải quyết nó bằng cách đặt bên trong điều kiện if. if (isset ($ form_state ['webform'])) {mã ở trên xuất hiện ở đây ..}
Bala

3

Trong mã của bạn, bạn thay đổi biến $valuekhông bao giờ khi liên kết lại với biến$form , nào được truyền bằng tham chiếu.

Rõ ràng, bạn thực hiện một số thay đổi nhưng không gửi lại cho Drupal.

Ngoài ra, bạn có thể làm như vậy (Tôi chưa thử nghiệm nhưng về lý thuyết thì nó sẽ hoạt động).

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

Tôi chỉ lười biếng để thêm một kiểm tra fieldsetvà thêm giữ chỗ cho trẻ em. Nhưng tôi đoán bạn có thể thay đổi nó rất dễ dàng.


3

Một cải tiến nhỏ đối với giải pháp tệp mẫu của @ Josua: Mã này cũng sẽ thêm văn bản giữ chỗ vào các biểu mẫu email.

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

Để trở thành một cải tiến thực sự, bạn nên thực hiện 2 điều: 1) kiểm tra chỉ mục được đặt 2) sử dụng cú pháp tốt hơn để kiểm tra các trường hợp khác nhau
Matteo

2

sử dụng hook_form_alter hãy thử điều này

function mymodule_survey_builder_form_alter(&$form, &$form_state, $form_id) {    
 if ($form_id == 'form_builder_field_configure') {
        $form['title']['#attributes']=array('placeholder' => t('Please enter the Qustion(English) name here.'));
}
}

1

Đối với bất kỳ ai sử dụng mô-đun Webform của Drupal cũ hoặc đã lỗi thời , cần lưu ý rằng hỗ trợ giữ chỗ đã được thêm vào 7.x-4.x branch(tháng 6 năm 2013).

Do đó, chức năng giữ chỗ HTML5 hiện là một tùy chọn gốc, tích hợp cùng với các lớp CSS tùy chỉnh cho các thành phần và một số tính năng được yêu cầu dài khác.

Dưới đây là ảnh chụp màn hình về cách chức năng mới xuất hiện:

Cài đặt thành phần biểu mẫu web Drupal hiển thị hỗ trợ giữ chỗ HTML5


0

Trong hầu hết các trường hợp, tôi đoán, người ta chỉ muốn thêm các thuộc tính giữ chỗ trên một số biểu mẫu.

Nếu bạn muốn thêm giữ chỗ cho tất cả các biểu mẫu web, bạn có thể làm như thế này:

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

Chỉ cần sử dụng mô-đun cho nó: Gợi ý Webform

Đó chính xác là những gì bạn cần. Nó dễ quản lý và không cần mã tùy chỉnh. Mô-đun này cũng cung cấp hỗ trợ cho các trình duyệt cũ không hỗ trợ thuộc tính giữ chỗ.

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.