Para configurar un campo relación asociado a una selección de grupos o empresas (o contactos), realizamos los siguientes pasos:
Para configurar una lista seleccionable (un select box)
- Agregar un Widget al layout : "KMKey Relation Select Widget"
- en el campo AdvancedQuery Expression (TALES) , utilizamos una expresión python que utlizará AdvancedQuery para ejecutar la consulta. Un ejemplo de filtro típico es filtrar los grupos de determinada categoría :
python:Eq('meta_type', 'KM Group')&In('categories',['customer','provider','lo que sea'])
o contactos
python:Eq('meta_type', 'KM Contact')
- Value to Show (TALES from the brain) : Aquí ponemos la expresión que se encarga de mostrar el valor :
python:brain.Title
Ya tenemos configurado nuestro seleccionable de empresas (o contactos)
En el caso de que haya muchos registros , no es conveniente, por motivos de rendimiento y de usabilidad, utilizar un seleccionable. Para ello podemos utilizar un autocomplete , con el mismo control, de la siguiente manera :
Para configurar un autocomplete:
- Realizamos exactamente los mismos pasos que antes
- Creamos , dentro de zmi/portal_skins/custom/ un python script. Lo llamaremos , por ejemplo "autocomplete_for_arquitectos"
- Establecemos el campo "Parameter list" a "value"
- El código del script deberá ser más o menos como el siguiente :
from Products.AdvancedQuery import MatchGlob, Eq, Le, Ge, In, Between, Generic
REQUEST = context.REQUEST
value = "*" + unicode(value, 'utf-8').encode('iso-8859-15') + "*"
catalog = context.portal_catalog
query = MatchGlob('Title', value) & Eq('meta_type', 'KM Group') & In('categories', 'Arquitecto')
brains = catalog.evalAdvancedQuery(query, ('Title' , ) )
result = ['< id="%s">%s< / li >' % (b.getDocid, b.Title) for b in brains]
result = ' <> ' + chr(10).join(result) + '< / ul >'
result = unicode(result, 'iso-8859-15')
REQUEST.RESPONSE.setHeader('Content-Type', 'text/xml;;charset=%s' % 'utf-8')
return result
- Finalmente, otra vez en el widget, establecemos el campo "Server method for autocompletation" con el nombre del script que hemos configurado antes (autocomplete_for_arquitecto, en el ejemplo)
Una vez hecho esto, en la pantalla de alta o edición, podemos establecer el campo utilizando la técnica del auto completado, escribiremos parte del nombre de la empresa a buscar, y la lista mostrará los elementos que coincidan, debiendo seleccionar uno de ellos
En caso de no aparecer ningún valor, revisar el script o mirar el error_log para localizar posibles errores
en el directorio de skins de KMKeyDefault, ya tenemos varios scipts por defecto que filtran grupos o contactos :
- auto_complete_for_contacts
- auto_complete_for_customers
- auto_complete_for_providers
- auto_complete_for_groups
- auto_complete_for_users_or_groups
Lo mismo que hemos hecho para grupos lo podemos hacer también para usuarios u otros objetos, simplemente cambiando las condiciones del query