Gestionnaire de vues personnalisées sans table


22

Cela semblait facile au début, mais je perds mes cheveux à ce sujet.

Je veux simplement ajouter un gestionnaire de vue personnalisé qui n'utilise aucune table.

J'ai essayé de faire comme les vues proposées par php, $ data ['views'] ['mycustomfield'] dans hook_views_data, mais toujours, "mycustomfield colum not found".

De l'aide ? Merci !

Réponses:


26

En fait, c'est facile. Il suffit de regarder les gestionnaires d'implémentation de vues globales qui sont disponibles dans views.views.inc .

Voici l'exemple de la façon dont vous pouvez ajouter un gestionnaire de champs sans avoir de table,

  1. Spécifiez vos gestionnaires personnalisés dans hook_views_data comme ci-dessous,

    /**
     * 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. Créez un fichier inc pour votre gestionnaire et mettez-y votre logique. quelque chose comme ci-dessous Ici, le nom du fichier serait 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. Spécifiez ce nouveau fichier de gestionnaire dans le fichier d'informations de votre module

  4. Vider les caches

Maintenant, le nouveau gestionnaire de champs sera là dans la liste des champs.


1
THX ! Exactement les 2 choses dont j'avais besoin: remplacer la requête en la spécifiant vide et rejoindre '#global'.
Gregory Kapustin

Existe-t-il un moyen de filtrer ces résultats? Par exemple, j'ai créé un gestionnaire de champs personnalisé pour calculer un «statut» spécial en fonction de la relation d'un utilisateur avec une entité. Je voudrais pouvoir filtrer via ce statut. Des idées?
tigertrussell

Merci, c'est ce dont j'avais besoin! Mais il semble que je ne puisse pas activer les relations de vues pour un gestionnaire de champs comme celui-ci. drupal.stackexchange.com/questions/166734/… Une idée?
donquixote

1

Pour être complet: vous devez également ajouter hook_views_api

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

1
Pour être complet: Vous devez inclure le gestionnaire dans les fichiers .info [] = views_handler_custom_handler.inc
Fawwad
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.