Обработчик пользовательских представлений без таблицы


22

Поначалу это казалось легким делом, но я теряю волосы на этом.

Я просто хочу добавить пользовательский обработчик представления, который не использует таблицы.

Я попытался сделать так, как предложил php, $ data ['views'] ['mycustomfield'] в hook_views_data, но все же "mycustomfield colum not found".

Любая помощь ? Благодарность !

Ответы:


26

На самом деле это легко. Просто посмотрите на реализацию обработчиков Views Global, которая доступна в views.views.inc .

Ниже приведен пример того, как вы можете добавить обработчик поля, не имея таблицы,

  1. Укажите ваши собственные обработчики в hook_views_data, как показано ниже,

    /**
     * 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. Создайте inc-файл для вашего обработчика и поместите туда свою логику. что-то вроде ниже Здесь имя файла будет 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. Укажите этот новый файл обработчика в информационном файле вашего модуля

  4. Очистить кеши

Теперь новый обработчик поля будет там в списке полей.


1
Спасибо ! Точно 2 вещи, которые мне нужны: переопределить запрос, указав его пустым, и присоединиться к «#global».
Григорий Капустин

Есть ли способ отфильтровать эти результаты? Например, я создал собственный обработчик полей для расчета специального «статуса» на основе отношения пользователя к сущности. Я хотел бы иметь возможность фильтровать через этот статус. Любые идеи?
tigertrussell

Спасибо, это то, что мне было нужно! Но кажется, что я не могу включить отношения представлений для обработчика поля, как это. drupal.stackexchange.com/questions/166734/… Есть идеи?
Donquixote

1

Для полноты: вам нужно будет добавить hook_views_api

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

1
Для завершения: Вы должны включить обработчик в файлы .info файла [] = views_handler_custom_handler.inc
Fawwad
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.