Controlador de vistas personalizadas sin tabla

22

Esto parecía fácil al principio, pero estoy perdiendo el pelo en esto.

Simplemente quiero agregar un controlador de vista personalizado que no use tabla.

Traté de hacer las vistas propuestas por php, $ data ['vistas'] ['mycustomfield'] en hook_views_data, pero aún así, "no se encontró la columna mycustomfield".

Alguna ayuda ? Gracias !

Gregory Kapustin
fuente

Respuestas:

26

En realidad es fácil. Basta con mirar los manejadores de Vistas globales de implementación que están disponibles en views.views.inc .

A continuación se muestra el ejemplo de cómo puede agregar un controlador de campo sin tener una tabla,

  1. Especifique sus controladores personalizados en hook_views_data como a continuación,

    /**
     * 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. Cree un archivo inc para su controlador y ponga su lógica allí. algo como a continuación Aquí el nombre del archivo sería 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. Especifique este nuevo archivo de controlador en el archivo de información de su módulo

  4. Limpia las cachés

Ahora el nuevo controlador de campo estará allí en la lista de campos.

Mathankumar
fuente
1
Gracias ! Exactamente las 2 cosas que necesitaba: anular la consulta especificándola vacía y unirme a '#global'.
Gregory Kapustin
¿Hay alguna forma de filtrar estos resultados? Por ejemplo, he creado un controlador de campo personalizado para calcular un "estado" especial basado en la relación de un usuario con una entidad. Me gustaría poder filtrar a través de ese estado. ¿Algunas ideas?
tigertrussell
Gracias, esto es lo que necesitaba! Pero parece que no puedo habilitar las relaciones de vistas para un controlador de campo como este. drupal.stackexchange.com/questions/166734/… ¿ Alguna idea?
donquixote
1

Para completar: también necesitarías agregar hook_views_api

function my_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'my_module'),
  );
}
MuschPusch
fuente
1
Para completar: debe incluir el controlador en los archivos de archivo .info [] = views_handler_custom_handler.inc
Fawwad