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 !

Gregory Kapustin
quelle

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.

Mathankumar
quelle
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'),
  );
}
MuschPusch
quelle
1
Um vollständig zu sein: Sie müssen den Handler in die .info-Datei files [] = views_handler_custom_handler.inc
Fawwad,