Kinh nghiệm: Logo Trong Drupal

Thảo luận trong 'Học tập' bởi nuongitq, 18/12/2015.

  1. nuongitq

    nuongitq Thành viên đạt chuẩn

    Tham gia:
    5/8/2014
    Bài viết:
    73
    Đã được thích:
    8
    Điểm thành tích:
    8
    Logo Drupal

    Tuy nhiên, tôi đã gặp một trường hợp sử dụng thực tế nơi các tùy chọn cấu hình mặc định là không đủ. Cụ thể, nếu bạn cần phải có nhiều người dùng truy cập để chỉnh sửa một nút cụ thể của một loại nhất nhưng nếu không có họ nhất thiết phải có quyền truy cập để chỉnh sửa những người khác cùng loại. Nói cách khác, các bài viết tuyệt vời tiếp theo cần được chỉnh sửa bởi Laura và Glenn nhưng không phải bởi các đồng nghiệp của họ. Tuy nhiên, ra khỏi hộp, người sử dụng của một vai trò cụ thể có thể là thạc sĩ hoặc nội dung của riêng mình, của tất cả các nội dung của một loại nhất định. Vì vậy, đây không phải là ngay lập tức có thể khi lap trinh php.

    Đầu tiên chúng ta cần các tập tin editor_list.info cho mô-đun của chúng tôi để nhận được chúng tôi sẽ:
    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]name = Editor List
    description = Module illustrating a custom solution for having multiple editors on a node.
    core = 7.x
    dependencies[] = entityreference

    Tiếp theo, chúng ta cần tập editor_list.module chúng tôi, nơi hầu hết các logic kinh doanh của chúng tôi sẽ được đặt. Vì vậy, đi trước và tạo ra nó và chúng tôi sẽ cư nó như chúng tôi đi về.

    Cuối cùng, mặc dù không được đề cập ở đây, chúng ta có thể có một file editor_list.install nơi chúng tôi có thể thực hiện hook_install () và móc hook_update để tạo ra các lĩnh vực và / hoặc triển khai cấu hình. Trong kho, bạn sẽ thấy rằng tôi đã cung cấp một cái móc cài đặt đó đã tạo nên một trường tham chiếu thực thể gọi là field_editors và gắn nó vào loại Điều nội dung. Nếu bạn đang theo cùng nhưng không sử dụng các mã trong các kho lưu trữ, bạn nên đi trước và tạo ra các lĩnh vực thủ công thông qua giao diện người dùng. Đó là một lĩnh vực đơn giản mà tham khảo các thực người dùng và cho phép lựa chọn không giới hạn. Không có gì lớn.

    Truy cập Node

    Trở lại với tập tin .module của chúng tôi, đó là thời gian để thực hiện logic truy cập của chúng tôi. Đầu tiên mặc dù, để làm những điều như linh hoạt và tái sử dụng càng tốt, chúng ta hãy có một chức năng đơn giản mà trả về một mảng của các loại nút mà chúng tôi áp dụng logic truy cập của chúng tôi:
    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]function editor_list_node_types() {
      return array('article');
    }


    Do chúng tôi chỉ nhắm mục tiêu điều, điều này sẽ đủ. Nhưng chúng ta sẽ sử dụng chức năng này ở những nơi nhiều như vậy trong trường hợp chúng ta cần hướng đến loại khác là tốt, chúng ta chỉ có thể cập nhật mảng này.

    Tiếp theo, chúng ta hãy viết một chức năng hữu ích mà trả về tất cả các ID người dùng thiết lập trong lĩnh vực biên tập viên của một nút cho trước. Chúng tôi cũng sẽ sử dụng ở nhiều nơi:

    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]function editor_list_uids_from_list($node) {
      $users = field_get_items('node', $node, 'field_editors');
      $allowed_uids = array();
      if ($users) {
        $allowed_uids = array_map(function($user) {
          return $user['target_id'];
        }, $users);
      }
      return $allowed_uids;
    }


    Tôi tin rằng các chức năng là tự giải thích khá vì vậy tôi sẽ không đi vào chi tiết tại đây. Thay vào đó, chúng ta có thể quay về với chúng tôi hook_node_access () thực hiện đó được gọi bằng Drupal bất cứ khi nào người dùng cố gắng làm điều gì đó với một nút (xem, chỉnh sửa hoặc xóa):
    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]/**
    * Implements hook_node_access().
    */
    function editor_list_node_access($node, $op, $account) {
      $node_types = editor_list_node_types();
      if ( ! is_object($node) || ! in_array($node->type, $node_types) || $op !== 'update') {
        return NODE_ACCESS_IGNORE;
      }
      $allowed_uids = editor_list_uids_from_list($node);
      if (empty($allowed_uids)) {
        return NODE_ACCESS_IGNORE;
      }
      if (in_array($account->uid, $allowed_uids)) {
        return NODE_ACCESS_ALLOW;
      }
    }

    >> Khóa học lập trình android cơ bản nâng cao tại hà nội !

    Dòng truy cập

    Bây giờ chúng ta có một module làm việc mà những gì tôi bắt đầu đặt ra cho nó làm. Nhưng chúng ta hãy nói rằng người quản trị của bạn là những người duy nhất chịu trách nhiệm cho việc thêm người dùng vào danh sách biên tập. Nói cách khác, bạn sợ rằng nếu biên tập viên của bạn có thể chỉnh sửa các nút và loại bỏ khỏi danh sách, họ sẽ bị khóa của nút họ có nghĩa vụ phải làm việc trên.

    Để giải thích cho tình trạng này, chúng ta cần phải thực hiện một kiểm tra truy cập lĩnh vực và loại bỏ khả năng rằng các biên tập viên làm xáo trộn với lĩnh vực đó. Thực hiện hook_field_access nên làm các trick độc đáo. Và nếu bạn đang tự hỏi, hook này là tương tự như hook_node_access () nhưng chịu trách nhiệm cho các lĩnh vực cá nhân chứ không phải là toàn bộ nút (+ một vài khác biệt nhỏ khác).

    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]/**
    * Implements hook_field_access().
    */
    function editor_list_field_access($op, $field, $entity_type, $entity, $account) {
      $node_types = editor_list_node_types();
      if ($entity_type === 'node' && is_object($entity) && in_array($entity->type, $node_types)) {
        return editor_list_control_field_access($op, $field, $entity_type, $entity, $account);
      }
    }


    Và ở đây chúng tôi có nó. Có một vài thông số hơn vì hook này được gọi cho tất cả các thực thể, không chỉ là các nút. Nhưng một lần nữa, chúng tôi kiểm tra xem các nút truy cập hiện là một trong những người chúng ta được xác định trước đó (và rằng các thực thể là trong thực tế, một node) và thời gian đại biểu này đến một hàm khác để giữ cho mọi thứ ngăn nắp:

    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]function editor_list_control_field_access($op, $field, $entity_type, $entity, $account) {
      if ($op !== 'edit') {
        return;
      }
      $uids = editor_list_uids_from_list($entity);
      if (!in_array($account->uid, $uids)) {
        return;
      }
      $deny = array('field_editors');
      if (in_array($field['field_name'], $deny)) {
        return false;
      }
    }}


    Vì chúng ta chỉ quan tâm nếu người dùng đang cố gắng để cập nhật một lĩnh vực cụ thể, chúng tôi trở về không có gì nếu đây không phải là trường hợp. Hãy nhớ rằng các chuỗi op đây là chỉnh sửa và không cập nhật như trong các móc khác. Đây chỉ là một trong những đôi mà Drupal không thống nhất tất cả chúng ta đến tình yêu rất nhiều. Và cũng giống như trước đây, chúng ta bỏ qua tình huống nếu người sử dụng hiện nay không phải là một phần của danh sách biên tập.

    Làm cho ngăn nắp

    Điều cuối cùng tôi sẽ chỉ cho các bạn ở đây liên quan đến tổ chức và có lẽ một chút kinh nghiệm người dùng. Với việc thực hiện hiện tại của chúng tôi, các trường danh sách biên tập trên các nút điều là hiện tại ở đâu đó trên các hình thức (bất cứ nơi nào bạn kéo-và-thả nó khi chỉnh sửa các thiết lập trường). Tuy nhiên, nó sẽ không được tốt đẹp nếu nó đã được tự động một phần của các nhóm thông tin Authoring ở dưới cùng của trang? Một cái gì đó như thế này:
    [​IMG]
    Đầu tiên, chúng ta cần phải thực hiện hook_form_alter hoặc một trong các biến thể của nó. Tôi thích một trong những mục tiêu nhất để tránh các cuộc gọi không cần thiết với nó và một loạt các kiểm tra điều kiện:

    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]/**
    * Implements hook_form_BASE_FORM_ID_alter().
    */
    function editor_list_form_article_node_form_alter(&$form, &$form_state, $form_id) {
      $form['#after_build'][] = 'editor_list_node_form_after_build';
    }


    Chúng tôi đã đi với BASE_FORM_ID các nút bài viết ở đây vì vậy nếu chúng ta mở rộng ứng dụng của chúng tôi với các loại khác, chúng tôi sẽ làm tương tự cho những người là tốt. Bên trong, chúng ta chỉ cần xác định một chức năng #after_build để được kích hoạt khi các hình thức đã hoàn thành xây dựng. Điều này là để đảm bảo tất cả các hình thức thay đổi đã được đã được thực hiện bởi các module đóng góp. Tất cả những gì còn lại phải làm là để viết các chức năng chịu trách nhiệm về việc thay đổi sang hình thức:

    Code:
    [/SIZE][/FONT]
    [SIZE=4][FONT=Georgia]function editor_list_node_form_after_build($form, &$form_state) {
      $field = field_info_field('field_editors');
      if ( ! field_access('edit', $field, 'node', $form['#entity'])) {
        return $form;
      }
    
      if ($form['author']['#access'] === 0) {
        return $form;
      }
    
      $field_editors = $form['field_editors'];
      $field_editors['#weight'] = 0;
      $form['author']['additional_authors'] = $field_editors;
      $form['field_editors'] = array();
    
      return $form;
    }
    


    Điều này có vẻ phức tạp nhưng nó thực sự không phải là. Chúng ta bắt đầu bằng cách tải các định nghĩa lĩnh vực của trường danh sách biên tập của chúng tôi. Điều này là để chúng ta có thể chạy kiểm tra field_access vào nó và chỉ trả lại các mảng dạng không thay đổi nếu người dùng hiện tại không có quyền truy cập vào các lĩnh vực. Tiếp theo, chúng ta làm như vậy nếu người dùng hiện tại không có quyền truy cập vào các nhóm tác giả về hình thức (gọi là nhóm thông tin Authoring chúng tôi muốn đặt vực thành). Và cuối cùng, chúng ta tạo một bản sao của các định nghĩa trường, thay đổi trọng lượng của nó và đặt nó vào các nhóm, tiếp theo là unset định nghĩa ban đầu để tránh việc trùng lặp.

    Và đó là khá nhiều đó. Bây giờ các trường danh sách biên tập nên được nhét trong với phần còn lại của các thông tin liên quan đến quyền tác giả.
    Xem thêm: Khóa học photoshop cơ bản nâng cao tại hà nội !
     

    Xem thêm các chủ đề tạo bởi nuongitq
    Đang tải...


  2. babymarket

    babymarket Thành viên tập sự

    Tham gia:
    24/11/2015
    Bài viết:
    5
    Đã được thích:
    1
    Điểm thành tích:
    3
    haha, bác làm 1 tràng gì trong này có mẹ nào đọc hiểu được đâu
     
  3. Trà.chanh

    Trà.chanh Thành viên chính thức

    Tham gia:
    24/10/2015
    Bài viết:
    160
    Đã được thích:
    10
    Điểm thành tích:
    18
    Mình đang không hiểu bạn viết cái gì
     
  4. piaggiodaison

    piaggiodaison Thành viên tích cực

    Tham gia:
    13/7/2013
    Bài viết:
    580
    Đã được thích:
    98
    Điểm thành tích:
    28
    Bạn này làm lập trình với drupal. Chắc muốn quảng cáo dịch vụ lập trình web
     

Chia sẻ trang này