Handler für benutzerdefinierte Ansichten ohne Tabelle


22

Das schien zunächst einfach, aber ich verliere meine Haare.

Ich möchte einfach einen benutzerdefinierten View-Handler hinzufügen, der keine Tabelle verwendet.

Ich habe versucht, wie von PHP vorgeschlagen, $ data ['views'] ['mycustomfield'] in hook_views_data zu tun, aber immer noch "mycustomfield colum not found".

Irgendeine Hilfe ? Vielen Dank !

Antworten:


26

Eigentlich ist es einfach. Schauen Sie sich einfach die Implementierung der Views Global-Handler an, die in views.views.inc verfügbar sind .

Unten sehen Sie ein Beispiel, wie Sie einen Feld-Handler hinzufügen können, ohne eine Tabelle zu haben.

  1. Geben Sie Ihre benutzerdefinierten Handler in hook_views_data wie folgt an:

    /**
     * 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. Erstellen Sie eine Inc-Datei für Ihren Handler und platzieren Sie Ihre Logik dort. hier wäre der Dateiname 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. Geben Sie diese neue Handler-Datei in der Info-Datei Ihres Moduls an

  4. Leeren Sie die Caches

Jetzt wird der neue Feldhandler in der Feldliste angezeigt.


1
Danke ! Genau die zwei Dinge, die ich brauchte: Überschreiben Sie die Abfrage, indem Sie sie leer angeben, und fügen Sie '#global' hinzu.
— Gregory Kapustin

Gibt es eine Möglichkeit, nach diesen Ergebnissen zu filtern? Zum Beispiel habe ich einen benutzerdefinierten Feld-Handler erstellt, um einen speziellen "Status" basierend auf der Beziehung eines Benutzers zu einer Entität zu berechnen. Ich möchte in der Lage sein, über diesen Status zu filtern. Irgendwelche Ideen?
— TigerRussell

Danke, das habe ich gebraucht! Es scheint jedoch, dass ich für einen solchen Feld-Handler keine Views-Beziehungen aktivieren kann. drupal.stackexchange.com/questions/166734/… Irgendeine Idee?
— donquixote

1

Um vollständig zu sein, müssten Sie auch hook_views_api hinzufügen

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

1
Um vollständig zu sein: Sie müssen den Handler in die .info-Datei files [] = views_handler_custom_handler.inc
— Fawwad,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.