====================
 Viewlet Traversing
====================

Traversing to viewlets is done via namespaces.

  >>> from zope.testbrowser.testing import Browser
  >>> browser = Browser()
  >>> browser.handleErrors = False
  >>> browser.open('http://localhost/@@test.html')

We have a test page registered that contains our viewlet. The viewlet
itself just renders a link to its location (this is just for testing).

  >>> print browser.contents
  <html>
    <body>
       <div><div><a
       href="http://localhost/test.html/++manager++IMyManager/++viewlet++MyViewlet">My
       Viewlet</a></div></div>
    </body>
  </html>

Let's follow the link to traverse the viewlet directly.

  >>> browser.getLink('My Viewlet').click()
  >>> browser.url
  'http://localhost/test.html/++manager++IMyManager/++viewlet++MyViewlet'
  >>> print browser.contents
  <div><a href="http://localhost/test.html/++manager++IMyManager/++viewlet++MyViewlet">My Viewlet</a></div>


What happens if a viewlet managers is nested into another viewlet? To test
this we will create another manager and another viewlet::

  >>> browser.open('http://localhost/@@nested.html')
  >>> print browser.contents
  <html>
    <body>
      <div><div><a href="http://localhost/nested.html/++manager++IOuterManager/++viewlet++OuterViewlet/++manager++IInnerManager/++viewlet++InnerViewlet/++manager++IMostInnerManager/++viewlet++MostInnerViewlet">Most inner viewlet</a></div></div>
    </body>
  </html>

Let's follow the link to traverse the viewlet directly.

  >>> browser.getLink('Most inner viewlet').click()
  >>> browser.url
  'http://localhost/nested.html/++manager++IOuterManager/++viewlet++OuterViewlet/++manager++IInnerManager/++viewlet++InnerViewlet/++manager++IMostInnerManager/++viewlet++MostInnerViewlet'

  >>> browser.contents
  '<div><a href="http://localhost/nested.html/++manager++IOuterManager/++viewlet++OuterViewlet/++manager++IInnerManager/++viewlet++InnerViewlet/++manager++IMostInnerManager/++viewlet++MostInnerViewlet">Most inner viewlet</a></div>'


Caveats
-------

Update of the manager is not called, because this may be too expensive
and normally the managers update just collects viewlets.
