Chủ đề một hình thức liên lạc


11

Tôi muốn tạo chủ đề cho một biểu mẫu liên hệ trong Drupal 8. Tôi muốn đặt div xung quanh các thành phần của biểu mẫu (sử dụng bootstrap).

Tôi cũng muốn đặt một số lớp trên các yếu tố nhất định (nút gửi, chính biểu mẫu).


2
Tôi đề nghị mô tả vấn đề của bạn chi tiết hơn và nói những gì bạn đã thử. Điều đó sẽ cho thấy một số sáng kiến ​​và giúp người khác cho bạn một câu trả lời tốt hơn.
Aram Boyajyan

Câu trả lời:


16

Mở tệp YOUTHEMENAME.theme của bạn và thêm mã sau đây:

function YOURTHEMENAME_form_contact_message_feedback_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  // Name
  $form['name']['#prefix'] = '<div class="row"><div class="col-md-6"><div class="form-group">';
  $form['name']['#suffix'] = '</div>';
  $form['name']['#attributes']['placeholder'][] = $form['name']['#title'].'*';
  $form['name']['#attributes']['class'][] = 'form-control';
  unset($form['name']['#title']);

  // Mail
  $form['mail']['#prefix'] = '<div class="form-group">';
  $form['mail']['#suffix'] = '</div>';
  $form['mail']['#attributes']['placeholder'][] = $form['mail']['#title'].'*';
  $form['mail']['#attributes']['class'][] = 'form-control';
  unset($form['mail']['#title']);


  // Subject
  $form['subject']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
  $form['subject']['widget'][0]['value']['#attributes']['placeholder'][] = $form['subject']['widget'][0]['#title'].'*';
  $form['subject']['widget'][0]['#title'] = '';
  unset($form['subject']['widget'][0]['value']['#title']);
  $form['subject']['widget'][0]['#prefix'] = '<div class="form-group">';
  $form['subject']['widget'][0]['#suffix'] = '</div></div>';

  // Message
  $form['message']['widget'][0]['value']['#attributes']['class'][] = 'form-control';
  $form['message']['widget'][0]['value']['#attributes']['placeholder'][] = $form['message']['widget'][0]['#title'].'*';
  $form['message']['widget'][0]['#title'] = '';
  unset($form['message']['widget'][0]['value']['#title']);
  $form['message']['widget'][0]['#prefix'] = '<div class="col-md-6"><div class="form-group">';
  $form['message']['widget'][0]['#suffix'] = '</div></div></div>';

  // Submit
  $form['actions']['#prefix'] = '<div class="clearfix">';
  $form['actions']['#suffix'] = '</div>';
  $form['actions']['submit']['#attributes']['class'][] = 'btn';
  $form['actions']['submit']['#attributes']['class'][] = 'btn-success';
  $form['actions']['submit']['#attributes']['class'][] = 'pull-right';

}

Và đây là kết quả của bạn: nhập mô tả hình ảnh ở đây

Đừng quên xóa bộ nhớ cache của bạn;)


1
Nếu chủ đề của tôi có tên 'abc' và biểu mẫu của tôi có tên 'liên hệ với chúng tôi', tôi sẽ đặt tên cho chức năng này là gì?
Daniel Dewhurst

3
{themename} _form_contact_message_ {formname} _form_alter
Johan Haest

Việc này thật là tuyệt!!!
ipwa

19

Bạn có thể chỉ cần chủ đề mọi hình thức như bạn muốn. Tôi không thích phương pháp của @rpayanm, vì nó khó bảo trì và khó đọc, với các hình thức lớn thì đây không phải là trường hợp, chỉ là một trình bao bọc đơn và cấu trúc đơn giản.

Mỗi hình thức cố gắng sử dụng chủ đề bằng với tên máy của họ. Bạn có thể tìm thấy tên mẫu này $form['#theme']chỉ bằng cách thay đổi, nó luôn luôn (hoặc trong hầu hết các lần) giống như tên máy id mẫu. Những gì bạn cần làm là đăng ký mẫu cho nó. Bạn cần thực hiện hook_theme(). Bạn có thể viết nó trong CUSTOMMODULE.module hoặc trong THEMENAME.theme. Khóa chủ đề phải giống như trong $form['#theme'], để nó tự động sử dụng nó, nếu không, bạn cần thêm khóa mới thông qua thay đổi biểu mẫu.

/**
 * Implements hook_theme().
 */
function MODULENAME_theme($existing, $type, $theme, $path) {
  return [
    'FORM_ID_THEME' => [
      'template' => 'custom-form-template-name',
      'render element' => 'form',
    ]
  ];
}

Drupal vượt qua biến $ form với dạng.

Sau đó, bạn phải tạo custom-form-template-name.html.twig(với tên mẫu của bạn từ hook_theme ()).

Mẫu tối thiểu là

{{ form }}

Bạn cũng có thể in mọi lĩnh vực từ mẫu mà bạn muốn

{{ form.field_name }}

Ở đây bạn có thể làm bất cứ điều gì bạn muốn với đánh dấu.

Bạn cũng có thể truyền dữ liệu bổ sung cho mẫu bằng cách triển khai template_preprocess_TEMPALTENAME

function template_preprocess_FORM_ID_THEME(&$variables) {
  $variables['example'] = 'This is added via preprocess';
}

Và sau đó sử dụng trong mẫu

{{ example }}
<div class="first-field">
  {{ form.first_field }}
</div>

<div class="second-field">
  {{ form.second_field }}
</div>

<div class="buttons">
  {{ form.submit }}
  {{ form.preview }}
</div>
{#
Don't forget to add printing form special info at the end.
Without this data form will not working propertly.
#}
{{ form.form_build_id }}
{{ form.form_token }}
{{ form.form_id }}

Tôi nghĩ rằng phương pháp này là fliexible, sạch sẽ và mạnh mẽ.

Ps xin lỗi vì tiếng Anh của tôi, hy vọng ai đó chỉnh sửa và sửa lỗi của tôi :)

Ví dụ về hình thức phức tạp sử dụng phương pháp này.

nhập mô tả hình ảnh ở đây


2
Lưu ý rằng đối với tôi, tôi đã thay đổi {{ form.submit }}thành{{ form.actions.submit }}
mikeDOTexe

@Niklan: Tôi đã theo dõi trên cùng mã cho mẫu gói thực thể tùy chỉnh của mình. Nếu tôi sử dụng {{ form }}, nó đang in toàn bộ biểu mẫu. Nhưng nếu tôi sử dụng trường cụ thể như thế {{ form.my_field }}, không có gì hiển thị. Bất kỳ ý tưởng làm thế nào chúng ta có thể hiển thị từng trường của hình thức gói thực thể tùy chỉnh?
kalidasan

@kalidasan cố gắng in mọi lĩnh vực mà không in {{ form }}. Tôi đề nghị sau khi in {{ form }}tất cả các thành phần của biểu mẫu sẽ được đánh dấu là '#rendered' => TRUEvà sẽ không được hiển thị sớm. Nếu bạn không sử dụng phương thức theo chủ đề này, bạn phải in từng trường riêng lẻ. Không có drupal_render_children()trong Drupal 8, trừ khi bạn tự viết nó. Dù sao, theo mặc định, điều này sẽ gây ra sự trùng lặp, vì vậy hãy thử in từng trường theo cách thủ công.
Niklan

@Niklan: Tôi chưa dùng {{ form }} & {{ form.my_field }}chung. Lần đầu tiên thử chỉ với {{ form }}, ở đây tôi có thể thấy toàn bộ biểu mẫu. Sau đó loại bỏ {{ form }}khỏi mẫu sau đó thử cho từng trường mẫu như thế này {{ form.my_field }}, etc , nhưng không nhận được bất kỳ trường hợp nào. Không có gì hiển thị.
kalidasan

1
@kalidasan bạn có thể bỏ đặt tiêu đề trong template_preprocess_FORM_ID_THEME(&$variables). Trong tiền xử lý này, bạn có thể thêm các biến mới, thay đổi các phần tử biểu mẫu hiện có. Tôi không bao giờ nhìn thấy điều này {{ form.field_name.widget }}và tôi hình thức theo chủ đề thường xuyên. Có vẻ như trường này được tùy chỉnh tạo hoặc thêm bởi mô-đun của bên thứ ba? Tôi nghĩ rằng điều này được cho phép, nhưng không cai trị cho người khác. Tôi khuyên bạn nên bắt đầu với hook tiền xử lý và chỉ cần nhìn vào $variables['form']những gì nó chứa bên trong.
Niklan
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.