Next/Previous navigation through collection results
Project description
The collective.nextprev package extends Plone’s next/previous navigation for folders to collections (AKA topics or smart folders). If a listing view is visited for a collection which has next/previous navigation enabled, a cookie is set to remember the collection used and any relevant query terms. When a content item in the result set is visited, this cookie will be used to determine the next and previous item links.
Start with the a folder, some content, and a collection.
>>> folder <ATFolder at /plone/Members/test_user_1_> >>> folder.contentValues() [<ATTopic at /plone/Members/test_user_1_/foo-topic-title>, <ATNewsItem at /plone/Members/test_user_1_/foo-news-item-title>, <ATDocument at /plone/Members/test_user_1_/bar-page-title>, <ATNewsItem at /plone/Members/test_user_1_/baz-news-item-title>, <ATNewsItem at /plone/Members/test_user_1_/qux-baz-news-item-title>]
One item is a page and so doesn’t show up in the collection listing.
>>> folder['foo-topic-title'].queryCatalog(full_objects=True) [<ATNewsItem at /plone/Members/test_user_1_/foo-news-item-title>, <ATNewsItem at /plone/Members/test_user_1_/baz-news-item-title>, <ATNewsItem at /plone/Members/test_user_1_/qux-baz-news-item-title>, <ATNewsItem at /plone/news/blah-news-item-title>]
Next/previous navigation is enabled for the folder but not for the topic.
>>> folder.getNextPreviousEnabled() True >>> folder['foo-topic-title'].getNextPreviousEnabled() False
Open a browser at the folder.
>>> from Products.Five.testbrowser import Browser >>> browser = Browser() >>> browser.handleErrors = False >>> browser.open(folder.absolute_url())
Visit one of the news items, the next link points to the next item in the folder but not the next item in the collection.
>>> browser.getLink('Foo News Item Title').click() >>> browser.getLink('Next') <Link text='Next: Bar Page Title Right arrow[IMG]' url='http://nohost/plone/Members/test_user_1_/bar-page-title'>
Open a browser, log in as some one who can enable the next/previous navigation for the collection, and do so.
>>> from Products.PloneTestCase import ptc >>> owner_browser = Browser() >>> owner_browser.handleErrors = False >>> owner_browser.open(folder['foo-topic-title'].absolute_url()) >>> owner_browser.getLink('Log in').click() >>> owner_browser.getControl( ... 'Login Name').value = ptc.portal_owner >>> owner_browser.getControl( ... 'Password').value = ptc.default_password >>> owner_browser.getControl('Log in').click() >>> owner_browser.getLink('Edit').click() >>> owner_browser.getControl( ... 'Enable next previous navigation').selected = True >>> owner_browser.getControl('Save').click() >>> print owner_browser.contents <... ...Changes saved...
Now that next/previous navigation is enabled, visiting the collection listing will set the cookie.
>>> browser.open(folder.absolute_url()) >>> browser.headers['set-cookie'] 'nextprev.collection="/plone/Members/test_user_1_/foo-topic-title"; Path=/, nextprev.form="test="; Path=/'
Visit an item again and now the next link will be the next item in the collection.
>>> browser.getLink('Foo News Item Title').click() >>> browser.getLink('Next') <Link text='Next: Baz News Item Title Right arrow[IMG]' url='http://nohost/plone/Members/test_user_1_/baz-news-item-title'>
If the folder listing is visited again, the next/previous links reflect the folder contents instead of the collection results.
>>> browser.open(folder.absolute_url()+'/folder_listing') >>> browser.headers['set-cookie'] 'nextprev.collection="deleted"; Path=/; Expires=Wed, 31-Dec-97 23:59:59 GMT; Max-Age=0, nextprev.form="deleted"; Path=/; Expires=Wed, 31-Dec-97 23:59:59 GMT; Max-Age=0'>>> browser.getLink('Foo News Item Title').click() >>> browser.getLink('Next') <Link text='Next: Bar Page Title Right arrow[IMG]' url='http://nohost/plone/Members/test_user_1_/bar-page-title'>
Search criteria submitted in the request are also preserved in the cookies so that the next/previous links will reflect the correct result sets.
>>> browser.open(folder.absolute_url()+'?SearchableText=baz') >>> browser.getLink('Baz News Item Title').click() >>> browser.getLink('Previous') Traceback (most recent call last): LinkNotFoundError >>> browser.getLink('Next') <Link text='Next: Qux Baz News Item Title Right arrow[IMG]' url='http://nohost/plone/Members/test_user_1_/qux-baz-news-item-title'>
Items outside the current set can be safely viewed.
>>> browser.open(folder['foo-news-item-title'].absolute_url()) >>> browser.getLink('Previous') Traceback (most recent call last): LinkNotFoundError >>> browser.getLink('Next') Traceback (most recent call last): LinkNotFoundError
A topic which is contained in a folder but is not in the current set can also be safely viewed.
>>> browser.open(folder.absolute_url()) >>> browser.getLink('Previous') Traceback (most recent call last): LinkNotFoundError >>> browser.getLink('Next') Traceback (most recent call last): LinkNotFoundError
Though next/previous navigation is not available on large folders, the next/previous links will still be rendered when a collection lists items inside a large folder.
>>> browser.open(folder.absolute_url()) >>> browser.getLink('Blah News Item Title').click() >>> browser.getLink('Previous') <Link text='Left arrow[IMG] Previous: Qux Baz News Item Title' url='http://nohost/plone/Members/test_user_1_/qux-baz-news-item-title'> >>> browser.getLink('Next') Traceback (most recent call last): LinkNotFoundError
Changelog
0.2 - 2009-02-10
Fix a bug so that items contained in large folders will still have next/prev links if the cookie is set
Refactor the various views and adapters
0.1 - 2009-02-05
Initial release
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.