Hooks and Handlers

You have to tell Views about your tables using a hook. Views offers 3 hooks:

<?php
    hook_views_tables
();
    
hook_views_arguments();
    
hook_views_default_views();
?>

In addition, Views also supports handlers for a number of tasks, making it possible to customize the behavior of fields when being used. The handlers take various kinds of data, and some of them even allow direct access to the query building object. Care must be used to ensure that manipulating that object doesn't cause the query builder to write SQL that won't parse!

Importation de vue par défault lors de l'installation du module

<?php
/**
* This view was generated by the drupal system, with code pasted from Views Export.
*
* USAGE:
* To make a view into a module:
* 1. Create or revise a view using the drupal View GUI
* 2. Export the View
* 3. Paste the contents from the Views export window between the BEGIN/END paste tags below
* 4. Rename the default view generating function.
*          Syntax: views_  +  name_of_view + _views_default_views()
*          Example: views_nanodays_reports_views_default_views()
*
* 5. Rename and save the module
*          Syntax: views_ + name_of_view + .module
*          Example: views_nanodays_reports.module
* 6. Rename and save the .info file (This file helps drupal to find your view
*          Syntax: views_ + name_of_view + .info
*          Example: views_nanodays_reports.info
* 7. Edit the contents of the .info file
*    name - shows up on Module Menu
*   
*       Example:
*         ; $Id$
        name = CUSTOM VIEWS: Reports 2008
        description = "Displays Reports "
        dependencies = views
        package = Views
        project = "views_custom"
*
*
*
* 8. Back up your drupal system
* 9. Delete the view on the system
* 10. Your .module and .info file should be in the folder views_custom
* 11. Upload your module to sites/all/modules
* 12. Enable the module (admin/build/modules); will appear under 'Views' (controlled in .info file)
* 13. Go to administer views page: admin/build/views...you should see your view there
* 14. If change your view, it overrides this new 'default' setting that you have declared.
*
* HINTS: If you do not see your view:
* 1. Make sure you have enabled it
* 2. Clear the Views cache.
* 3. Disable and then re-enable the view.
* 4. Remember that any changes you make to a view in the drupal system will not be saved to the module.
*    However, you can make more changes, re-export, paste into your .module, and reupload, clear your views cache to edit your view.
*
*/

//function views_{name of view, matches name of module, eg. all_reports}_views_default_views() {
//for views_all_reports.module, views_all_reports.info

function views_all_reports_views_default_views() {
   
/* --- BEGIN ---- PASTE from Views export ----------- */   
 

/* --- END ---- PASTE from Views export ----------- */
  return $views;
}
?>

Déclarer des vues se fait en implémentant le hook_views_api

<?php
/**
 * Implementation of hook_views_api().
 */
function signup_views_api() {
  return array(
    
'api' => 2.0,
    
'path' => drupal_get_path('module''signup') .'/views',
  );
}

?>

Déclarer les tables à Views

Les tables sont décrite à view par le hook hook_views_data() qui retourne un tableau les informations des tables et dont les clés sont les noms des tables.

Les clés devraient être les noms des tables (sans préfix) bien que l'on puisse utiliser des alias car le vrai nom des table est stocké dans les informations concernant la jointure.

<?php
$data 
= array(
  
'table1' => array(
      
'table'=> array('group'=>t('Taxonomy')),
      
'field1'=>array(),
      
'field2'=>array(),
  ),
  
'table2' => array(
    
// ...info here...
  
),
  
'table3' => array(
    
// ...info here...
  
),
);

?>

Chaque élément d'une table doit être un champs de la table excepté pour l'élément table qui contient des informations spéciales et que nous abordons à la section suivante.

l'élément Table

Chaque table doit comporter l'élément table utilisé pour définir des informations sur la table comme le groupe auquel la table appartient ainsi que les jointures dont elle à besoin ainsi que si oui ou nonn, il s'agit d'une table de base.

On peut aussi placer dans l'élément table des éléments propres aux fields ceci permettra de faire hériter ce comportement à tous les fields.

group
Le nom du group auquel l'élément sera associé. dans l'interface utilisateur, ce sera affiché comme suit le Group: title. Par exemple "Node: Node ID", "Taxonomy: Term description", etc...

Il est donc important de choisir un nom de groupe conssistant

title
Le nom du chame, il doit être court mais descriptif
help
Une description plus longue aidant a comprendre ce que le champs est ou fait. Celui-ci devrait tenir en une seule ligne ou deux pour ne pas polluer l'UI.

Table de Base

Si la table est une table de base, c'est à dire, celle-ci peut être considérer comme la table centrale d'une vue, la table primaire (node, comment, users), il est possible de déclarer celle-ci comme une table de base.

Ceci permet de la sélectionner dans l'UI lors de l'ajout d'une vue.

Par example:

<?php
  
// Advertise this table as a possible base table
  
$data['node']['table']['base'] = array(
    
'field' => 'nid',
    
'title' => t('Node'),
    
'help' => t("Nodes are a Drupal site's primary content."),
    
'weight' => -10,
  );
?>

Les tags suivant sont disponibles:

field
The primary key field for this table. For Views to treat any table as a base table, it must have a primary field. For node this is the 'nid', for users this is the 'uid', etc. Without a single primary key field (i.e. not a composite key), Views will not be able to utilize the table as a base table. If your table does not have a primary key field, it is not too difficult to just add a serial field to it, usually.
title
LE titre de cette table dans l'UI. Celui-ci devrait être unique et décrire les objets que la table contientd'un point de vue utilisateur.
help
Un texte court décrivant les objets contenus dans la table
database
Si la table est maintenue dans une base de données différente que celle de Drupal, spécifier l'url de connection dans un format similaire à celui de la DB Drupal dans le fichier settings.php et renseignez le nom Drupal de la DB.

C'est assez exotique et ce ne sera probablement utilisé que dans des situation spécifiques notez par contre que le typde de DB doit être le meme que celu de votre DB drupal (A cause du bootstrap qui ne charge qu'un seul type de DB).

N'essayez pas non plus de faire un join sur une table qui ne serait pas dans la même DB... Ca fout le bordel et amene plein d'erreur...

<?php
      
// In settings.php for your site
      // Your drupal (site) database needs to be called 'default'
      
$db_url['default'] = 'mysqli://user:pass@host/drupal_db';
      
$db_url['budget'] = 'mysqli://user:pass@host/other_db';
?>

Then when you are describing the external database in your base table you would write something like this:

<?php
      $data
[$table]['table']['base'] = array(
        
'field' => 'Primary key',
        
'title' => t('Field name'),
        
'help' => t('Field description'),
        
'database' => 'budget',
        
'weight' => -10,
        );
?>

Lier des tables à la DB existante

Pour que Views utilise vos tables, il faut que soit celle ci ai été déclaré en tant que table de base, soit Views ai conscience de la façon de lier la table à la DB existante... Et parfois ... les deux ...

Views utilise ces informations pour créer un path avec la table de base.

Lorsque la table est ajouté à la query, Views va utiliser ce path pour ajouter toute les tables nécéssaire à la query.

Dans l'exemple ci dessus, pour associé un term à la table de base Node les tables term_data et term_node doivent être définies et ont chacunes besoin de d'un join handler

<?php
$data
['term_data']['table']['join']['node'] = array(
  
'left_table' => 'term_node',
  
'left_field' => 'tid',
  
'field' => 'tid',
);
?>

Le code ci dessus peut être intermpreter comme "Pour joindre la table node, la table term_data àd'abord besoin d'être lié à la table term_node et le join se fait sur field tid".

Lorsque l'on ajoutte cette table à la query, Views regardera d'abord term_node et embranchera sur la table term_node...

<?php
$data
['term_node']['table']['join']['node'] = array(
  
'left_field' => 'nid',
  
'field' => 'nid',
);
?>

Ci dessus, l'absence de l'élément left_table indique que la table term_node est directement lié à la table de base node en utilisant des deux coté de la jointure le field nid.

Il existe quelques options usplémentaires:

handler
Le nom du handler à utiliser. Par default c'est views_join. Mais il est possible de vréer des handlers de join custom qui peuvent utiliser, ou non , toutes les datas qui sont définit ci dessous lorsqu'elle conviennent.
table
La table de jointure. Cet élément est optionelle et ne devrait être utilisé que lorsque la table est réferencer comme un alias .
field
Le field sur lequelle se fait la jointure ... c'est un élément obligatoire.
left_table
La prochaine étape avant la destionation. Si la prochaine étape est la table de base cet élément doit être omis.
left_field
Le field de gauche sur lequelle se fait la jointure ... c'est un élément obligatoire.
type
Le type de jointure: soit LEFT (par defaut) soit INNER.
extra
Soit un string soit un arra ou chacun des éléments est lui même un array:

field
Le champs ou une formule
operator
Similaire aux filtres c'est un operateur comme >, <, =, etc. par défaut c'est l'opérateur = ou IN.
value
Doit être définit. Si c'est un array la valeur de l'opérateur sera définit à IN.
numeric
Si vrai; la valeur ne sera pas encadrer d'apostrophe, et %d sera utilisé comme container.
extra type
Définit comment tous les extras seront combiné. Soit AND soit OR.le défault est AND.

Décrires les champs des tables

A part le champs spéciale table, chaque table peut avoir un nombre illimité de fields qui correspondent plus ou moins aux champs de la table...Bien qu'il est assez courant de définir des champs virtuel pour afficher des des données resultant d'une formule ou des liens spéciaux associé aux objets dont fait partie la table...

Dans l'élément data de la vue, chaque champ de table est décrit, par un array dans l'élément correspondant à sa table, avec une clé correspondant au nom du champs en DB

Cet array peut contenir des informations suplémentaires sur le field, comme l'élement help mais aussi certains des 5 types d'éléments suivants:

  • argument
  • field
  • filter
  • relationship
  • sort

Par example

<?php
$data
['node']['nid'] = array(
  
'title' => t('Nid'),
  
'help' => t('The node ID of the node.'), // The help that appears on the UI,
  // Information for displaying the nid
  
'field' => array(
    
'handler' => 'views_handler_field_node',
    
'click sortable' => TRUE,
  ),
  
// Information for accepting a nid as an argument
  
'argument' => array(
    
'handler' => 'views_handler_argument_node_nid',
    
'name field' => 'title'// the field to display in the summary.
    
'numeric' => TRUE,
    
'validate type' => 'nid',
  ),
  
// Information for accepting a nid as a filter
  
'filter' => array(
    
'handler' => 'views_handler_filter_numeric',
  ),
  
// Information for sorting on a nid.
  
'sort' => array(
    
'handler' => 'views_handler_sort',
  ),
);
?>

L'exemple ci dessus décrit le field 'nid' de la table node et fournit 4 des 5 handlers. Remarquons que si dans ce cas 'nid' est le nom de la DB, ceci n'est pas obligatoire, on aurait pu utiliser un alias, ce qui permet d'obtenir plusieurs handlers pour un seul field ou encore quelque chose de complétement custom qui n'est pa extrait de la DB...

Par example:

<?php
$data
['node']['edit_node'] = array(
  
'field' => array(
    
'title' => t('Edit link'),
    
'help' => t('Provide a simple link to edit the node.'),
    
'handler' => 'views_handler_field_node_link_edit',
  ),
);
?>

L'exemple ci dessus illustre la définition du handler views_handler_field_node_link_edit qui est un handler de type field mais qui n'est pas un field en soi...

Pour les fields déclarer en tant que alias voci un autre example:

<?php
$data
['users']['uid_current'] = array(
  
'real field' => 'uid',
  
'title' => t('Current'),
  
'help' => t('Filter the view to the currently logged in user.'),
  
'filter' => array(
    
'handler' => 'views_handler_filter_user_current',
  ),
);
?>

ici c'est un handler de type filtre qui est déclarer permetant de filtrer sur l' uid de l'utilisateur courant.

Les éléments suivants sont authorisés dans la définition du field

group, title, help
Comme précédement, Ces élements sont destinés à l'UI. Lorsqu'ils sont déclarés ici, ils surchargent la déclaration définie pour la table de base.
real field
Sile field est un alias, "real field" doit être utilisé ici, de sorte que ce soit transparentpour le handler et qu'il ny voit aucune différence.
field
La définition du handler de type field, ceci définira la façon dont le field est affiché dans la vue. La définition du field est un array dont le contenu .the contents of the array are completely up to the handler, other than the 'handler' definition. Si il est homis, le handler par défaut 'views_handler_field' sera utilisé.
filter
Une définition du handler pour la section "Filters" qui sera utilisé pour définir les éléments de la clause WHERE clausesde la vue. .the contents of the array are completely up to the handler, other than the 'handler' definition. Si il est homis, le handler par défaut ''views_handler_filter'' sera utilisé.
sort
Une définition du handler pour la section "Sort Criteria" qui sera utilisé pour définir les éléments de la clause ORDER BY clausesde la vue. .the contents of the array are completely up to the handler, other than the 'handler' definition. Si il est homis, le handler par défaut ''views_handler_sort'' sera utilisé.
relationship
Une définition de handler pour la section "Field", C'est une manière d'apporter une nouvelle ou alternative table de base. La définition est également un array the contents of the array are completely up to the handler, other than the 'handler' definition. Si il est homis, le handler par défaut ''views_handler_relationship'' sera utilisé. Le handler de type relation de base requiert que les éléments 'base' et 'base field' soient définis; 'base' and 'base field' représente la moitié "droite" de la jointure et qui utilisera "field" du coté droit...
argument
Une définition de handler pour la section "Field", cette méthode permet d'accepter une entré de l'utilisateur par le biais de l'url ou d'une autre entrée (cfr panels). The definition is an array; the contents of the array are completely up to the handler, other than the 'handler' definition.si la définition est absente, le handler par défaut 'views_handler_argument' sera utilisé.

Pour plus d'informations à propos des handlers (besoin/utilisations) checker la page Doxygen de l' API views.

0
Your rating: None