(Un-) định dạng từng thành phần của biểu mẫu


7

Khi chúng tôi tuyên bố một cái gì đó như

$form['textfield'] = array(
  '#type' => 'textfield',
  '#title' => 'textfield title',
  '#maxlength' => 8,
  '#required' => true,
);

Đầu ra sẽ giống như:

<div id="edit-textfield-wrapper" class="form-item">
  <label for="edit-textfield">textfield title: <span title="This field is required." class="form-required">*</span></label>
  <input type="text" class="form-text required" value="" size="60" id="edit-textfield" name="textfield" maxlength="8">
</div>

Tuy nhiên, tôi sẵn sàng xóa container divlabelkhỏi một số lĩnh vực của mình, đại loại như thế này:

<input type="text" class="form-text required" value="" size="60" id="edit-textfield" name="textfield" maxlength="8">

Có thể không? Có ví dụ nào ở đâu không?

Câu trả lời:


4

Bạn chỉ cần thực hiện hook_theme_registry_alter () để thay đổi chức năng chủ đề được gọi khi theme('form_element')được gọi; thông thường hàm được gọi là theme_form_element () .

function theme_form_element($element, $value) {
  // This is also used in the installer, pre-database setup.
  $t = get_t();

  $output = '<div class="form-item"';
  if (!empty($element['#id'])) {
    $output .= ' id="' . $element['#id'] . '-wrapper"';
  }
  $output .= ">\n";
  $required = !empty($element['#required']) ? '<span class="form-required" title="' . $t('This field is required.') . '">*</span>' : '';

  if (!empty($element['#title'])) {
    $title = $element['#title'];
    if (!empty($element['#id'])) {
      $output .= ' <label for="' . $element['#id'] . '">' . $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
    }
    else {
      $output .= ' <label>' . $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
    }
  }

  $output .= " $value\n";

  if (!empty($element['#description'])) {
    $output .= ' <div class="description">' . $element['#description'] . "</div>\n";
  }

  $output .= "</div>\n";

  return $output;
}
function mymodule_theme_registry_alter(&$theme_registry) {
  if (isset($theme_registry['form_element']) {
    $theme_registry['form_element']['function'] = "theme_mymodule_form_element";
  }
}

Sử dụng mã của theme_form_element(), bạn có thể viết chức năng chủ đề của riêng mình và xóa các thẻ HTML mà bạn không muốn. Hãy nhớ rằng theme('form_element')được gọi cho mọi đầu ra phần tử biểu mẫu với API biểu mẫu; nếu bạn muốn thay đổi đầu ra HTML của chỉ một phần tử biểu mẫu, thì bạn cần kiểm tra giá trị #type.
themeSpherefield () là chức năng chủ đề tạo chủ đề cho trường văn bản, nhưng nó không xuất ra nhãn hoặc gói <div>, đã được xuất ra bởi theme_form_element().

Ngoài ra, điều này có thể được thực hiện trong một chủ đề ghi đè theme_form_element().
Cách tiếp cận nào bạn nên sử dụng tùy thuộc vào việc bạn cần thay đổi đầu ra trong một chủ đề cụ thể hay cho tất cả các chủ đề được bật trong trang web Drupal của bạn; trong trường hợp sau, bạn cần thực hiện các hook mà tôi đã báo cáo trong một mô-đun.


kiamlaluno, trước hết cảm ơn câu trả lời, nhưng liệu có thể sử dụng các chức năng đó với một chủ đề cốt lõi (ví dụ như vòng hoa)?
acm

@andre matos Đối với chủ đề cốt lõi Drupal, bạn cần triển khai một mô-đun tùy chỉnh thực hiện các chức năng hook mà tôi đã mô tả. Đó là cách duy nhất để thay đổi mô-đun mà không thay đổi mã của một chủ đề, cần thay đổi tất cả các lần bạn cập nhật Drupal. Cập nhật Drupal nhưng không phải chủ đề đó sẽ không phải là một ý tưởng tốt; sẽ có những thứ được thay đổi trong mô-đun và bạn sẽ không nhận được những thay đổi đó.
kiamlaluno

7 drupal có hợp lệ không? tôi nghĩ nó khác bằng cách sử dụng hook_element_info_alter
khaled_webdev

0

Theo tôi biết, không thể xóa <div>trình bao bọc, nếu bạn không sửa đổi chủ đề.


Xem xét chủ đề tôi đang sử dụng nó là một chủ đề cốt lõi, có cách nào để làm điều đó mà không rõ ràng là hack nó không?
acm
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.