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 !

Gregory Kapustin
la source

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.

Mathankumar
la source
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'),
  );
}
MuschPusch
la source
1
Pour être complet: Vous devez inclure le gestionnaire dans les fichiers .info [] = views_handler_custom_handler.inc
Fawwad