Theo chủ đề user_profile_form (mẫu chỉnh sửa người dùng)


7

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 đã tạo ra câu hỏi này vì hai lý do: Thứ nhất, vì tôi phải mất một thời gian để tìm ra phương pháp cá nhân của mình để giải quyết vấn đề này và muốn cứu người khác đau buồn. Thứ hai, để xem liệu có ai khác có cách theo chủ đề tốt hơn không chỉ user_profile_form mà còn nói chung. Tôi sẽ đăng các liên kết đến các câu hỏi hay về hình thức theo chủ đề khi tôi nhìn thấy chúng; những người khác được chào đón để làm như vậy.
isynold

Tài liệu Drupal về các hình thức nút theo chủ đề là một nơi tốt để bắt đầu hướng dẫn chung về chủ đề biểu mẫu: drupal.org/node/1092122
thiệu vào

Câu trả lời:


7

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.

  1. 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.

  2. 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ị".

  3. 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.


Có một lý do nào khiến bạn tránh các mẫu Display Suite không?
Capi Etheriel

Thật sự lâu lắm tôi không nhớ. Tôi nghĩ rằng khả năng xuất các biểu mẫu trong tệp mẫu (trong khi vẫn có sức mạnh của API biểu mẫu để tạo các biểu mẫu mạnh mẽ, an toàn trong mã phụ trợ) là một chiến thắng lớn cho tính linh hoạt và tách mã; gần hơn với mô hình MVC mà Drupal mong muốn.
chia sẻ

Thôi nào, Drupal không phải là MVC cũng không nên. Kiểm tra garfieldtech.com/blog/mvc-vs-pac (mặc dù bài đăng đó khá cũ, nhưng nó vẫn giúp làm sáng tỏ mọi thứ).
Capi Etheriel

1
Đúng như vậy, nói rằng "nên khao khát" một mô hình MVC chắc chắn chỉ là một ý kiến ​​(và nhân tiện, tôi thích bài viết này). Tôi đoán quan điểm của tôi không phải là Drupal nên tuân theo các nguyên tắc MVC nghiêm ngặt, mà là các tệp mẫu thường cung cấp cho họ ít kinh nghiệm về Drupal linh hoạt hơn so với học một lớp trừu tượng khác (DS) hoặc API Drupal. Tôi nghĩ rằng quan điểm đó là đạt được sự tín nhiệm; Tôi đang mong đợi một lớp trình bày đơn giản hơn nhiều trong D8 với sáng kiến ​​Twig. Mã như thế này về cơ bản chỉ là một hack ngớ ngẩn để đạt được điều đó.
chia sẻ


0

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.


Cảm ơn @ACD đã giúp tôi quay lại đây để xem lại mã noob cũ của mình. Tôi đã thực hiện các chỉnh sửa mà bạn đã đề xuất và thêm một vài tinh chỉnh (cụ thể là, đảm bảo rằng các mã thông báo mẫu thực sự được bao gồm). Không hoàn toàn chắc chắn làm thế nào hoặc nếu mã này đã từng làm việc; nó có thể đã hiển thị một biểu mẫu, nhưng không nên gửi.
chia sẻ

0

Các bảng hoàn toàn có thể tiếp nhận biểu mẫu chỉnh sửa Hồ sơ và với một số bản vá (hiện tại), bạn có thể lấy thông tin Profile2 dưới dạng mối quan hệ.

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.