Gestore di viste personalizzate senza tabella


22

All'inizio mi è sembrato facile ma sto perdendo i capelli.

Voglio semplicemente aggiungere un gestore di viste personalizzato che non utilizza alcuna tabella.

Ho provato a fare come proposto php views, $ data ['views'] ['mycustomfield'] in hook_views_data, ma comunque "colonna mycustomfield non trovata".

Qualsiasi aiuto ? Grazie !

Risposte:


26

In realtà è facile. Guarda l'implementazione dei gestori di Views Global che è disponibile in views.views.inc .

Di seguito è riportato l'esempio di come è possibile aggiungere un gestore di campi senza una tabella,

  1. Specifica i gestori personalizzati in hook_views_data come di seguito,

    /**
     * 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. Crea un file inc per il tuo gestore e metti la tua logica lì. qualcosa come sotto Qui il nome del file sarebbe 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. Specificare questo nuovo file gestore nel file di informazioni del modulo

  4. Cancella le cache

Ora il nuovo gestore campi sarà presente nell'elenco dei campi.


1
Grazie ! Esattamente le 2 cose di cui avevo bisogno: sovrascrivi la query specificandola vuota e unisciti a '#global'.
Gregory Kapustin,

C'è un modo per filtrare questi risultati? Ad esempio, ho creato un gestore campi personalizzato per calcolare uno "stato" speciale basato sulla relazione di un utente con un'entità. Vorrei poter filtrare tramite quello stato. Qualche idea?
tigertrussell,

Grazie, questo è quello di cui avevo bisogno! Ma sembra che non posso abilitare le relazioni di visualizzazione per un gestore di campo come questo. drupal.stackexchange.com/questions/166734/… Qualche idea?
donquixote,

1

Per essere completo: dovresti aggiungere anche hook_views_api

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

1
Per essere completo: devi includere il gestore nei file di file .info [] = views_handler_custom_handler.inc
Fawwad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.