Trình xử lý lượt xem tùy chỉnh không có bảng


22

Điều này ban đầu có vẻ dễ dàng nhưng tôi đang rụng tóc về điều này.

Tôi chỉ đơn giản muốn thêm một trình xử lý xem tùy chỉnh không sử dụng bảng.

Tôi đã cố gắng thực hiện như chế độ xem php đề xuất, $ data ['lượt xem'] ['mycustomfield'] trong hook_view_data, nhưng vẫn không tìm thấy "mycustomfield colum".

Có ai giúp đỡ không? Cảm ơn !

Câu trả lời:


26

Thật ra nó dễ. Chỉ cần nhìn vào các trình xử lý Lượt xem Toàn cầu có sẵn trong lượt xem.view.inc .

Dưới đây là ví dụ về cách bạn có thể thêm trình xử lý trường mà không cần có bảng,

  1. Chỉ định trình xử lý tùy chỉnh của bạn trong hook_view_data như bên dưới,

    /**
     * Implements hook_views_data().
     */
     function my_module_views_data() {
       $data['custom']['table']['group'] = t('Custom');
       $data['custom']['table']['join'] = array(
         // #global is a special flag which let's a table appear all the time.
         '#global' => array(),
       );
    
       $data['custom']['custom_handler'] = array(
         'title' => t('Custom Handler'),
         'help' => t('Custom Handler.'),
         'field' => array(
           'handler' => 'views_handler_custom_handler',
         ),
       );
    
       return $data;
    }
  2. Tạo một tệp inc cho trình xử lý của bạn và đặt logic của bạn ở đó. một cái gì đó như bên dưới Ở đây tên tập tin sẽ là Views_handler_custom_handler.inc

    /**
     * A handler to provide a field that is completely custom by the administrator.
     *
     * @ingroup views_field_handlers
     */
     class views_handler_custom_handler extends views_handler_field {
       function query() {
         // do nothing -- to override the parent query.
       }
    
       function option_definition() {
         $options = parent::option_definition();
    
         // Override the alter text option to always alter the text.
         $options['alter']['contains']['alter_text'] = array('default' => TRUE);
         return $options;
       }
    
       function options_form(&$form, &$form_state) {
         parent::options_form($form, $form_state);
    
         // Remove the checkbox
         unset($form['alter']['alter_text']);
         unset($form['alter']['text']['#dependency']);
         unset($form['alter']['text']['#process']);
       }
    
       function render($values) {
         // Render your content.
         return 'Sample';
       }
    }
  3. Chỉ định tệp xử lý mới này trong tệp thông tin mô-đun của bạn

  4. Xóa bộ nhớ cache

Bây giờ trình xử lý trường mới sẽ có trong danh sách trường.


1
Cám ơn ! Chính xác là 2 điều tôi cần: ghi đè truy vấn bằng cách chỉ định nó trống và tham gia '#global'.
Gregory Kapustin

Có cách nào để lọc các kết quả này? Chẳng hạn, tôi đã tạo Trình xử lý trường tùy chỉnh để tính toán "trạng thái" đặc biệt dựa trên mối quan hệ của người dùng với thực thể. Tôi muốn có thể lọc qua trạng thái đó. Có ý kiến ​​gì không?
tigertrussell

Cảm ơn, đây là những gì tôi cần! Nhưng dường như tôi không thể kích hoạt các mối quan hệ cho một trình xử lý trường như thế này. drupal.stackexchange.com/questions/166734/ Ý tưởng nào?
donquixote

1

Để được hoàn thành: bạn cũng cần thêm hook_view_api

function my_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'my_module'),
  );
}

1
Để được hoàn thành: Bạn phải bao gồm trình xử lý trong tệp tệp .info [] = Views_handler_custom_handler.inc
Fawwad
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.