Reference fields and widgets
Special fields for setting up a ReferenceBrowserWidget
There are a few fields you need in your field definition, and therefore in the tagger values for the field in your UML. They are:
- widget:type = ReferenceBrowserWidget
- widget:startup_directory = /news/somefolder (doesn't need plone site id)
- widget:restrict_browsing_to_startup_directory = True|False
- relationship = "KnowsAbout" - this is an arbitrary value which defines the references in the reference catalogue. Two difference reference fields in the same content typeMUST have different values or both will display the same set of references (those from the second field)
- multiValued = True|False
REMEMBER - you must also add an imports statement to your class definition:
imports = from Products.ATReferenceBrowserWidget.ATReferenceBrowserWidget import ReferenceBrowserWidget
For some more relationships info see: http://plone.org/documentation/kb/archgenxml-getting-started/relationships
References are to objects not to brains objects
As far as I can recall from a conversation with someone in the Plone chat room ages ago,reference fields hold references to the objects themselves and NOT some kind of brains object in the portal catalog.
This means that getting the objects is a different thing than we're used to. For example, getting the URL of the referenced object(s) seems round the houses. In the end (in spiderweb page) I did it for internal links on images, by converting the image box brains into a proper object, using the accessor method to get the reference, and then absolute_url() on the object returned. This did NOT work on the reference to the object when the results of the reference field are stored in the portal catalog i.e. a brains representation of thereference field. In this case absolute_url() returns an URL like http://your.domain.com/portal_catalog/id-of-your-referenced-object
To sum up:
link = box.getInternalLink return link.absolute_url()
DOES NOT WORK (where box is the brains and getInternalLink is stored in the portal_catalog)
obj = box.getObject() link = obj.getInternalLink() return link.absolute_url()
DOES WORK
Therefore it looks as though it is pointless storing reference fields in the catalog.
Reference catalog
That's because there's a special catalog for references which you can use to get references and back references. See this link:
http://developer.plone.org/content/archetypes/references.html