Thay đổi hình thức quản trị / nội dung


8

Sau khi đã thêm một thay đổi bởi một nhóm trên các nút, bây giờ tôi cần hiển thị người dùng đã sửa đổi từng nút trên node_admin_contentbiểu mẫu (at admin/content) ngay bên cạnh cột "Tác giả".

Tôi đã quản lý để dễ dàng giải quyết điều này bằng cách thay đổi node.admin.inc và chỉ thêm 2 dòng mã:

...
'changed_by' => t('Changed By'),
...

...
'changed_by' => theme('username', array('account' => user_load($node->changed_by))),
...

Tất nhiên, đây không phải là một giải pháp thích hợp vì nó làm thay đổi cốt lõi.

Vì vậy, sau đó tôi đã cố gắng thay đổi hình thức thông qua:

function hook_form_node_admin_content_alter(&$form, &$form_state, $form_id) { 
  $form['admin']['nodes']['#header']['changed_by'] = t('Changed By');
  // ... ?
}

Sử dụng dpmtôi có thể thấy rằng biểu mẫu có các nút trong các tùy chọn. Vấn đề là đây là kết quả của việc hiển thị các nút dưới dạng tùy chọn bảng. Tôi không có quyền truy cập vào các nút gốc, tôi cũng không muốn thực hiện lại truy vấn tìm nạp nút để có được thông tin "thay đổi bởi". Tôi đoán làm điều này trong hook hook sẽ không giải quyết nó trong lớp chính xác. Hoặc là nó?

Vì vậy, một cách tốt để thay đổi node_admin_contenthình thức để thêm nhiều dữ liệu tồn tại trên các nút là gì?

Câu trả lời:


18

Tin xấu là đã kiểm tra mã, lớp thay đổi biểu mẫu là nơi duy nhất thực sự làm điều này; Cách tiếp cận của bạn là khá nhiều tại chỗ.

Tin tốt là, Drupal thực hiện tất cả các loại bộ nhớ đệm tĩnh trong suốt quá trình tải trang, giúp giảm thiểu việc phải quay lại cơ sở dữ liệu. Vì vậy, trong khi thay đổi bảng nội dung có thể xuất hiện cồng kềnh, bạn không thực sự có một hiệu suất đáng chú ý.

Các mã sau (hoặc tương tự) sẽ hoạt động; xem các bình luận để biết thêm thông tin về vấn đề lưu trữ:

function MYMODULE_form_node_admin_content_alter(&$form, &$form_state, $form_id) {
  // Load the nodes. This incurrs very little overhead as 
  // "$nodes = node_load_multiple($nids);" has already been run on these
  // nids in node_admin_nodes(). The static cache will be used instead of
  // another db query being invoked
  $nodes = node_load_multiple(array_keys($form['admin']['nodes']['#options']));

  // Grab a list of all user ids that have been responsible for changing the node
  $uids = array();
  foreach ($nodes as $node) {
    $uids[] = $node->changed_by;
  }

  // Filter out duplicates (one user may have been the last to change more than one node)
  $uids = array_unique($uids);

  // Load a list of all involved users in one go. This is about as performant
  // as this is going to get, as you're going to need the user objects one
  // way or the other for the call to theme_username
  $users = user_load_multiple($uids);

  // Add another column to the table header
  $form['admin']['nodes']['#header']['changed_by'] = array('data' => t('Changed by'));

  // Loop through the rows in the table and add the changed by column
  foreach ($form['admin']['nodes']['#options'] as $nid => $row) {
    // Grab the user related to this node.
    $this_user = $users[$nodes[$nid]->changed_by];

    // Add data for the new column
    $form['admin']['nodes']['#options'][$nid]['changed_by'] = theme('username', array('account' => $this_user));
  }
}

Đoạn mã trên tạo ra một cột mới sáng bóng đẹp như thế này trên trang quản trị nội dung:

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


4
Tuyệt vời! Cảm ơn rất nhiều vì đã cung cấp tài liệu chất lượng với câu trả lời của bạn.
cherouvim

@cherouvim Đừng lo lắng :)
Clive

Cảm ơn nó cũng hoạt động với tôi nhưng tôi muốn thay đổi các cột hiện có như tôi muốn hiển thị tên người dùng hoặc tên thật của tác giả thay vì email của tác giả trong cột tác giả.
Pranav Gandhi

3

Chỉ cần thay thế quản trị / nội dung bằng Chế độ xem, sau đó thêm bất kỳ trường nào bạn muốn. Lượt xem quản trị viên thậm chí sẽ làm điều đó cho bạn.


Đó cũng là suy nghĩ đầu tiên của tôi, nhưng Lượt xem có tự động biết về cột mới được thêm vào bảng nút không? Nó có nhận được thông tin về các thuộc tính thực thể từ hook_schema()/ hook_schema_alter()triển khai không?
Clive

Tôi giả sử bạn vừa thêm một trường CCK. Tôi thấy bây giờ bạn đã đi với hook_schema_alter (), rất tốt. Tuy nhiên, bạn có thể triển khai hook_view_data_alter () để hiển thị cột mới.
Bojan Zivanovic

Vâng, nó không cảm thấy "đúng" để làm điều đó nhưng tôi không thể đặt ngón tay của mình vào lý do. Bạn có thể nghĩ về một kịch bản trong đó việc thêm cột theo cách đó thực sự sẽ gây ra vấn đề không?
Clive

Nó không gây ra bất kỳ vấn đề nào, chỉ cung cấp cho bạn một chút công việc bổ sung (như cần hook_view_data_alter () cho Lượt xem, tương tự đối với các thuộc tính nếu bạn ở D7) trong khi "sai về ý thức hệ", đó là cách suy nghĩ rất Drupal 5 . Oh tốt, không có vấn đề lớn.
Bojan Zivanovic

Cảm ơn đó là điều tốt để biết. Cá nhân tôi luôn sử dụng các trường cho loại điều này nhưng thật thú vị khi tìm hiểu rằng nó có thể được thực hiện mà không có tác dụng phụ lớn. Câu trả lời của bạn nói lên rất nhiều về điều đó; nếu bạn thực hiện theo cách phù hợp / được đề xuất (nghĩa là với các trường), bạn sẽ tiết kiệm cho mình rất nhiều công việc sau này
Clive

0

Hơi lạc đề một chút, nhưng câu trả lời này cho thấy cách bạn có thể thực hiện việc này theo chương trình (ví dụ: bằng cách thêm nó dưới dạng cập nhật mô-đun trong tệp MY_MODULE.install.)

Bạn sẽ cần thêm một chút công việc nếu bạn muốn thêm trường mới của mình trước trường hiện tại cuối cùng. Hợp nhất nó trước khi kết thúc mảng $ view-> display ['default'] -> display_options ['Field'].

    function MY_MODULE_update_7101(){
        // update the admin/content view, need to do it manually because it's
        // set by admin_views module
        $view_name = 'admin_views_node';
        $view = views_get_view($view_name, TRUE);

        //  add the relationship
        $view->display['default']->display_options['relationships']['uid_1']['id'] = 'uid_1';
        $view->display['default']->display_options['relationships']['uid_1']['table'] = 'node_revision';
        $view->display['default']->display_options['relationships']['uid_1']['field'] = 'uid';
        $view->display['default']->display_options['relationships']['uid_1']['label'] = 'Revision User';
        // new column settings
        $new_column = array(
            'name_1' => array(
                'id' => 'name_1',
                'table' => 'users',
                'field' => 'name',
                'relationship' => 'uid_1',
                'label' => 'Updated By',
            )
        );
        // need to use this because array_splice by itself resets 'name_1' key to '0'
        // see http://php.net/manual/en/function.array-splice.php#56794
        $temp_array = array_splice( $view->display['default']->display_options['fields'] , 0, 7);
        $view->display['default']->display_options['fields'] = array_merge($temp_array , $new_column, $view->display['default']->display_options['fields']);

        views_save_view($view);
    }
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.