goa/doc/devmanual_fr/chap_visualisation_donnees.txt
author Julien Jehannet <Julien Jehannet <julien.jehannet@logilab.fr>>
Tue, 02 Mar 2010 21:48:36 +0100
branchstable
changeset 4783 6dc34d4cf892
parent 0 b97547f5f1fa
permissions -rw-r--r--
[F] views: fix 2 unicode errors 1. You can now use valid unicode strings in ValidationError exception. Previously, if 'err' contains unicode, UnicodeDecodeError was raised by format_errors() >>> templstr = '<li>%s</li>\n' >>> e = ValidationError(None, {None: u'oué, une exception en unicode!'}) >>> templstr % e '<li>None (None): ou\xc3\xa9, une exception en unicode!</li>\n' >>> templstr = u'<li>%s</li>\n' >>> templstr % e u'<li>None (None): ou\xe9, une exception en unicode!</li>\n' 2. The message of an Exception can contains unicode. But it now properly managed by “informal” string representation. We can easily fix the problem by using the Exception.message attribute that still contains the original message. >>> a = AssertionError(u'séfdsdf') >>> a.message u's\xe9fdsdf' >>> str(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128) >>> a = ValueError(u'fsdfsdéfsdfs') >>> str(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128) >>> a ValueError(u'fsdfsd\xe9fsdfs',) >>> unicode(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128) >>> a.message u'fsdfsd\xe9fsdfs'

Dfinition de vues
==================

Les classes de base des vues
----------------------------

La class `View` (`cubicweb.common.view`)
`````````````````````````````````````
Un vue crit dans son flux de sortie via son attribut `w` (`UStreamIO`).

L'interface de base des vues est la suivante :

* `dispatch(**context)`, appelle ("rend") la vue en appellent `call` ou
  `cell_call` en fonction des arguments pass
* `call(**kwargs)`, appelle la vue pour un result set complet ou nul
* `cell_call(row, col, **kwargs)`, appelle la vue pour une cellule donne d'un
  result set
* `url()`, retourne l'url permettant d'obtenir cette vue avec le result set en
  cours 
* `view(__vid, rset, __fallback_vid=None, **kwargs)`, appelle la vue
  d'identificant `__vid` sur le result set donn. Il est possible de donnes un
  identificant de vue de "fallback" qui sera utilis si la vue demande n'est
  pas applicable au result set
  
* `wview(__vid, rset, __fallback_vid=None, **kwargs)`, pareil que `view` mais
  passe automatiquement le flux en argument
  
* `html_headers()`, retourne une liste d'en-tte HTML  placer par le template
  principal 

* `page_title()`, retourne le titre  utiliser dans l'en tte HTML `title`

* `creator(eid)`, retourne l'eid et le login du crateur de l'entit ayant
  l'eid pass en argument

Autres classes de base :

* `EntityView`, vue s'appliquant  aux lignes ou cellule contenant une entit
  (eg un eid)
* `StartupView`, vue de dpart n'ayant pas besoin de result set
* `AnyRsetView`, vue s'appliquant  n'importe quelle result set


Les templates ou patron
-----------------------

Les patrons (ou *template*) sont des cas particulier de vue ne dpendant a
priori pas d'un result set. La classe de base `Template` (`cubicweb.common.view`)
est une classe drive de la classe `View`.

Pour construire une page HTML, un *template principal* est utilis. Gnralement
celui possdant l'identifiant 'main' est utilis (ce n'est pas le cas lors
d'erreur dans celui-ci ou pour le formulaire de login par exemple). Ce patron
utilise d'autres patrons en plus des vues dpendants du contenu pour gnrer la
page  renvoyer.

C'est ce template qui est charg :

1. d'xcuter la requte RQL des donnes  afficher le cas chant
2. ventuellement de dterminer la vue  utiliser pour l'afficher si non
   spcifie
3. de composer la page  retourner


Le patron principal par dfaut (`cubicweb.web.views.basetemplates.TheMainTemplate`)
--------------------------------------------------------------------------------

Le template principal par dfaut construit la page selon la dcomposition
suivante :

.. image:: main_template_layout.png

Le rectancle contenant le `view.dispatch()` reprsente l'emplacement o est
insr la vue de contenu  afficher. Les autres reprsentent des sous-templates
appel pour construire la page. Les implmentations par dfaut de tout ces
templates sont dans le module `cubicweb.web.views.basetemplates`. Vous pouvez
videmment surcharger l'un des sous-templates pour modifier l'aspect visuel
d'une partie dsire de la page.

On peut galement contrler certains comportements du template principal 
l'aide des paramtres de formulaire suivante :

* `__notemplate`, si prsente (quelque soit la valeur associe), seule la vue de
  contenu est renvoye
* `__force_display`, si prsente et contient une valeur non nulle, pas de
  navigation quelque soit le nombre d'entits  afficher
* `__method`, si le result set  afficher ne contient qu'une entit et que ce
  paramtre est spcifi, celui-ci dsigne une mthode  appeler sur l'entit
  en lui donnant en argument le dictionnaire des paramtres de formulaire, avant
  de reprendre le comportement classique (s'insre entre les tapes 1. et
  2. dcrites ci-dessus)


.. include:: sect_stdlib_vues.txt


Vues xml, binaires...
---------------------
Pour les vues gnrants autre que du html  (une image gnre dynamiquement par
exemple), et qui ne peuvent donc gnralement pas tre incluse dans la page
HTML gnre par le template principal (voir ci-dessus), il faut :

* placer l'attribut `templatable` de la classe  `False`
* indiquer via l'attribut `content_type` de la classe le type MIME gnr par la
  vue 'application/octet-stream'

Pour les vues gnrants un contenu binaire (une image gnre dynamiquement par
exemple), il faut galement placer l'attribut `binary` de la classe  `True` (ce
qui implique `templatable == False` afin que l'attribut `w` de la vue soit
remplac par un flux binaire plutt que unicode.


Quelques trucs (X)HTML  respecter
----------------------------------
Certains navigateurs (dont firefox) n'aime pas les `<div>` vides (par vide
j'entend sans contenu dans la balise, il peut y avoir des attributs), faut
toujours mettre `<div></div>` mme s'il n'y a rien dedans, et non `<div/>`.