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 = [‘%s‘ % (b.getDocid, b.Title) for b in brains]
result = ‘ ‘ + chr(10).join(result) + ‘‘
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