|
1 ===================== |
|
2 pyams_viewlet package |
|
3 ===================== |
|
4 |
|
5 These doctests are based on zope.viewlet doctests. |
|
6 |
|
7 In this implementation of viewlets, we first have to define *viewlet managers*, which are special |
|
8 content providers which manage a special type of content providers called *viewlets*. Every |
|
9 viewlets manager handles the viewlets registered for it: |
|
10 |
|
11 >>> from pyramid.testing import setUp, tearDown |
|
12 >>> config = setUp() |
|
13 |
|
14 >>> from pyams_viewlet.interfaces import IViewletManager |
|
15 |
|
16 >>> class ILeftColumn(IViewletManager): |
|
17 ... """Left column viewlet manager""" |
|
18 |
|
19 We can then create a viewlet manager factory using this interface: |
|
20 |
|
21 >>> from pyams_viewlet.manager import ViewletManagerFactory |
|
22 >>> LeftColumn = ViewletManagerFactory('left-column', ILeftColumn) |
|
23 |
|
24 Having the factory, we can instantiate it: |
|
25 |
|
26 >>> from zope.interface import implementer, Interface |
|
27 >>> @implementer(Interface) |
|
28 ... class Content: |
|
29 ... """Content class""" |
|
30 >>> content = Content() |
|
31 |
|
32 >>> from pyramid.interfaces import IView, IRequest |
|
33 >>> from pyramid.testing import DummyRequest |
|
34 >>> request = DummyRequest() |
|
35 |
|
36 >>> @implementer(IView) |
|
37 ... class View: |
|
38 ... def __init__(self, context, request): |
|
39 ... self.context = context |
|
40 ... self.request = request |
|
41 >>> view = View(content, request) |
|
42 |
|
43 >>> left_column = LeftColumn(content, request, view) |
|
44 |
|
45 Actually, viewlet manager doesn't render anything: |
|
46 |
|
47 >>> left_column.update() |
|
48 >>> left_column.render() |
|
49 '' |
|
50 |
|
51 We have to create and register viewlets for the manager: |
|
52 |
|
53 >>> from pyams_viewlet.interfaces import IViewlet |
|
54 >>> from pyams_viewlet.viewlet import EmptyViewlet |
|
55 >>> class TextBox(EmptyViewlet): |
|
56 ... def render(self): |
|
57 ... return '<div class="text">Text box!</div>' |
|
58 ... def __repr__(self): |
|
59 ... return '<TextBox object at %x>' % id(self) |
|
60 |
|
61 >>> config.registry.registerAdapter(TextBox, |
|
62 ... (Interface, IRequest, IView, ILeftColumn), |
|
63 ... IViewlet, name='text-box') |
|
64 |
|
65 >>> left_column.render() |
|
66 '' |
|
67 |
|
68 Viewlet managers are memoized on rendering, so we have to reset it's state if we want to |
|
69 render it another time: |
|
70 |
|
71 >>> left_column.reset() |
|
72 >>> left_column.update() |
|
73 >>> left_column.render() |
|
74 '<div class="text">Text box!</div>' |
|
75 |
|
76 >>> tearDown() |