Tôi đang tìm kiếm những cách dễ dàng để tạo chủ đề cho biểu mẫu hồ sơ người dùng sẽ cho phép tôi thiết lập bố cục hai cột cho biểu mẫu và loại trừ các yếu tố nhất định.
Làm thế nào tôi có thể đạt được nó?
Tôi đang tìm kiếm những cách dễ dàng để tạo chủ đề cho biểu mẫu hồ sơ người dùng sẽ cho phép tôi thiết lập bố cục hai cột cho biểu mẫu và loại trừ các yếu tố nhất định.
Làm thế nào tôi có thể đạt được nó?
Câu trả lời:
Ngoài việc sử dụng mô-đun Display Suite, hầu hết các phương thức cho các biểu mẫu theo chủ đề đều yêu cầu một chút mã được viết. Trong phương pháp sau, tôi xác định các biến từ biểu mẫu có thể xuất ra trong tệp mẫu để phù hợp với bất kỳ cấu trúc HTML nào bạn muốn. Tôi đặt tất cả mã của mình vào template.php, nhưng bạn có thể dễ dàng tạo một mô-đun tùy chỉnh để thực hiện việc này.
Thêm một triển khai hook_theme ()
function YOURTHEME_theme($existing, $type, $theme, $path){
return array(
'user_profile_form' => array(
'render element' => 'form',
'template' => 'user-profile-form',
'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates',
//add '/templates' only if you store template files in an additional folder
),
);
}
Điều này nói với hệ thống theo chủ đề Drupal rằng có một tệp mẫu đang chờ nó trong YOUTHEME / mẫu.
Tiếp theo, chúng tôi sẽ xác định một số biến để chuyển vào mẫu đó trong hàm hook_pre process_HOOK. Chúng ta có thể tìm thấy mảng có cấu trúc của biểu mẫu trong $ biến ['form'] và gán các thành phần của biểu mẫu cho các biến mà chúng ta muốn ném xung quanh tệp tpl.php của mình.
function YOURTHEME_preprocess_user_profile_form(&$variables) {
$form_inputs = array(
'account' => $variables['form']['account'],
'picture' => $variables['form']['picture'],
'actions' => $variables['form']['actions'],
);
$variables['rendered'] = _YOURTHEME_form_variables_render_all($form_inputs);
}
function _YOURTHEME_form_variables_render_all($elements) {
//Create array to return, with element name as key and element as value
$elements_array = array();
//For each element, render it and add it to the array
foreach ($elements as $key => $element) {
$elements_array[$key] = render($element);
}
//Return array
return $elements_array;
}
Ví dụ này sẽ đặt các trường thông tin tài khoản chung, trường tải lên hình ảnh của người dùng (nếu hình ảnh được bật) và các hành động gửi vào một biến có tên là "được hiển thị".
Bây giờ chúng ta đã xác định các biến này, chúng ta có thể xuất chúng trong tệp mẫu. Tạo một tệp mẫu có tên user-profile-form.tpl.php trong 'YOUTHEME / samples'. Đây là một ví dụ demo:
<div id="new-form">
<?php echo $rendered['picture']; ?>
<?php echo $rendered['account']; ?>
<?php echo $rendered['actions']; ?>
<input type="hidden" name="form_id" value="<?php print $form['#form_id']; ?>" />
<input type="hidden" name="form_build_id" value="<?php print $form['#build_id']; ?>" />
<input type="hidden" name="form_token" value="<?php print $form['form_token']['#default_value']; ?>" />
</div>
Lưu ý các trường mẫu ẩn ở cuối; chúng bao gồm các mã thông báo Drupal quan trọng giúp bảo mật các hình thức khỏi bị tấn công. Hình thức của bạn sẽ không hoạt động mà không có họ.
Khi bạn truy cập trang chỉnh sửa người dùng của mình, bây giờ bạn sẽ chỉ thấy một số trường thông tin tài khoản chung và các trường hình ảnh. Tạo các biến khác nhau trong hàm tiền xử lý để tách các thành phần của biểu mẫu và đặt chúng vào bất cứ nơi nào bạn muốn trong tệp user-profile-form.tpl.php, thêm bất kỳ đánh dấu nào bạn muốn.
Bộ hiển thị chỉ có thể được sử dụng cho màn hình, không phải để chỉnh sửa. Thật tuyệt vời, nếu nó có thể xử lý cả hai.
Một số bản sửa lỗi cho mã của isynold :
Sửa lỗi gạch dưới trong 'kết xuất phần tử
function YOURTHEME_theme($existing, $type, $theme, $path){
return array(
'user_profile_form' => array(
'render element' => 'form',
'template' => 'user-profile-form',
'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates',
//add '/templates' only if you store template files in an additional folder
),
);
}
Khắc phục chức năng tiền xử lý từ ghi đè dữ liệu (tài khoản-> hình ảnh) và thêm các yếu tố hành động (nút biểu mẫu).
function YOURTHEME_preprocess_user_profile_form(&$variables) {
$required_elements[]=$variables['form']['account'];
$required_elements[]=$variables['form']['picture'];
$required_elements[]=$variables['form']['actions'];
$variables['rendered'] = drupal_render($required_elements);
}
Nhưng tất cả các thao tác này chỉ cho sự xuất hiện của hình thức. Nhưng biểu mẫu sẽ không hoạt động chính xác vì nó yêu cầu các yếu tố khác như xác thực, gửi trình xử lý, v.v. Vì vậy, tôi nghĩ cách tốt nhất để ẩn các phần tử không được yêu cầu trong mảng $ biến ['form'] để lại tất cả siêu dữ liệu biểu mẫu cần thiết.