Manipulador de visualizações personalizadas sem tabela

22

Isso pareceu fácil no começo, mas estou perdendo meu cabelo com isso.

Eu simplesmente quero adicionar um manipulador de exibição personalizado que não usa tabela.

Tentei fazer as visualizações propostas pelo php, $ data ['views'] ['mycustomfield'] em hook_views_data, mas ainda assim, "mycustomfield colum não foi encontrado".

Qualquer ajuda ? Obrigado !

Gregory Kapustin
fonte

Respostas:

26

Na verdade é fácil. Basta olhar para os manipuladores de Views Global de implementação, que estão disponíveis em views.views.inc .

Abaixo está o exemplo de como você pode adicionar um manipulador de campo sem ter uma tabela,

  1. Especifique seus manipuladores personalizados em hook_views_data, como abaixo,

    /**
     * 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. Crie um arquivo inc para o seu manipulador e coloque sua lógica lá. algo como abaixo Aqui, o nome do arquivo seria 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 novo arquivo manipulador no arquivo de informações do seu módulo

  4. Limpe os caches

Agora, o novo manipulador de campo estará lá na lista de campos.

Mathankumar
fonte
1
THX ! Exatamente as duas coisas que eu precisava: substitua a consulta especificando-a vazia e junte-se a '#global'.
precisa
Existe uma maneira de filtrar esses resultados? Por exemplo, criei um manipulador de campo personalizado para calcular um "status" especial com base no relacionamento do usuário com uma entidade. Eu gostaria de poder filtrar por esse status. Alguma ideia?
tigertrussell
Obrigado, é disso que eu precisava! Mas parece que não posso ativar os relacionamentos de visualizações para um manipulador de campo como este. drupal.stackexchange.com/questions/166734/… Alguma idéia?
31715 donquixote
1

Para concluir: você também precisará adicionar hook_views_api

function my_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'my_module'),
  );
}
MuschPusch
fonte
1
Para ser completa: Você tem que incluir manipulador em .info arquivo arquivos [] = views_handler_custom_handler.inc
Fawwad