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 !

Gregory Kapustin
źródło

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.

Mathankumar
źródło
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'),
  );
}
MuschPusch
źródło
1
Aby być kompletnym: musisz dołączyć moduł obsługi do plików .info [] = views_handler_custom_handler.inc
Fawwad