Obsługa widoków niestandardowych bez tabeli


22

Na początku wydawało się to łatwe, ale tracę na tym włosy.

Chcę po prostu dodać niestandardowy moduł obsługi widoku, który nie używa tabeli.

Próbowałem zrobić jako widoki zaproponowane przez php, $ data ['views'] ['mycustomfield'] w hook_views_data, ale nadal: "mycustomfield colum nie znaleziono".

Jakaś pomoc ? Dzięki !

Odpowiedzi:


26

Właściwie to jest łatwe. Wystarczy spojrzeć na implementację widoki Global handlers, która jest dostępna w views.views.inc .

Poniżej znajduje się przykład dodawania modułu obsługi pola bez tabeli,

  1. Podaj swoje niestandardowe programy obsługi w danych hook_views_data, takich jak poniżej,

    /**
     * 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. Utwórz plik inc dla swojego programu obsługi i umieść tam swoją logikę. coś jak poniżej Tutaj nazwa pliku to 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. Określ ten nowy plik modułu obsługi w pliku informacyjnym modułu

  4. Wyczyść skrzynki

Teraz nowy moduł obsługi pól będzie na liście pól.


1
Dzięki ! Dokładnie 2 rzeczy, których potrzebowałem: zastąp zapytanie, określając je jako puste i dołącz do „#global”.
Gregory Kapustin

Czy istnieje sposób na odfiltrowanie tych wyników? Na przykład utworzyłem niestandardowy moduł obsługi pola do obliczania specjalnego „statusu” na podstawie relacji użytkownika z bytem. Chciałbym móc filtrować według tego stanu. Jakieś pomysły?
tigertrussell

Dzięki, właśnie tego potrzebowałem! Wygląda jednak na to, że nie mogę włączyć relacji widoków dla takiej procedury obsługi pola. drupal.stackexchange.com/questions/166734/... Masz pomysł?
donquixote

1

Aby zakończyć: musisz również dodać hook_views_api

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

1
Aby być kompletnym: musisz dołączyć moduł obsługi do plików .info [] = views_handler_custom_handler.inc
Fawwad
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.