2011-04-29 11 views
5

quería crear una etiqueta como:Jugar! ¿Cómo recuperar el valor del campo en una etiqueta de plantilla que tenga entidad y el nombre del campo pasado por separado como parámetros?

#{some_tag entity:user, field:'name'} 

y esperar que se produzca alguna salida con el nombre de usuario en ella mediante el uso de la expresión como:

${_entity._field} 

Sé que no funciona, pero es por eso que pregunto aquí. ¿Existe una manera simple de usar un nombre de campo pasado como parámetro a una etiqueta de plantilla para obtener el valor del campo?

Respuesta

2

No conozco una respuesta fácil, pero es posible. Puede crear una etiqueta rápida y usar la reflexión para obtener el campo que busca. Puede obtener más información sobre etiquetas rápidas aquí: Can someone explain how to use FastTags

Sin embargo, ¿no sería más sencillo enviar el campo específico a su etiqueta?

+0

tengo que usar ambos: el nombre del campo y el valor del campo, así que quería para comprimir la lista de parámetros. Si no hay una manera fácil de hacerlo, usaré la lista de parámetros ampliados. – Rajish

0

Para mí funciona de manera fácil. Tengo etiqueta de buscapersonas:

#{pager model:productList, totalCount:total /} 

Y en pager.tag tengo:

<div class="total">${_totalCount}</div> 
<ul> 
#{list items:_model.getStartPage(params.pageNumber).._model.getPageCount(params.pageNumber), as:'i'} 
%{selectedClass=i.toString()==(params.pageNumber==null? "1" : params.pageNumber)?"selected":""%} 
<li class="${selectedClass}"> 
    #{if selectedClass == "selected"} 
    <span>${i}</span> 
    #{/if} 
    #{else} 
    <a href="@{Product.list(params.categoryId, params.rangeStart, params.rangeEnd, params.brandId, i, params.pageSize, params.q)}">${i}</a> 
    #{/else} 
</li> 
#{/list} 

+0

Lo siento, pero habiendo leído su código varias veces, todavía no entiendo dónde está respondiendo la parte de mi pregunta. – Rajish

+0

Su pregunta es: cómo pasar el nombre de la entidad y el campo a la etiqueta de la plantilla, ¿verdad? Acabo de mostrarte un ejemplo práctico de cómo lograr esto. Tal vez solo me perdí algo. – wassertim

+0

Por lo que veo, pasas una entidad y un número. No hay lugar en su código donde obtiene el valor del campo usando su _name_ (no el valor pasado como parámetro). Mire de cerca los ejemplos dados en la pregunta. – Rajish

1

Los parámetros se almacenan en una variable llamada renderArgs. No estoy seguro de si se trata de plantillas dentro accesibles directamente, pero si esto no funciona:

renderArgs.get(_entity) 

, entonces probablemente puede acceder de forma indirecta mediante el método estático:

Scope.RenderArgs.current().get(_entity) 

Acceso a una llamada el campo de esa entidad es entonces una cuestión de reflexión.

Sin embargo, estoy de acuerdo con la sugerencia de que tiene que haber una manera más fácil. Si te encuentras reflejando así, generalmente (no siempre) significa que has sobrediseñado algo.

1

Puede simplemente pasar esos parámetros a una clase de utilidad que usa la reflexión para encontrar el valor de cadena que realmente desea que se muestre.

${play.sample.util.ReflectUtil.get(_entity, _field)} 

play.sample.util.ReflectUtil:

public static String get(String entity, String field) { 
    String displayValue = ... // look up value ... 
    return displayValue; 
} 

O un FastTag funcionarían también.

3

Cuando tuve que hacer esto, hice algo similar al módulo CRUD. Llamo la etiqueta como #{sometag 'entity.field' /}

luego en la etiqueta rápido que tengo (más o menos):

String[] parts = args.get("arg").split("\\."); 
Object entity = play.mvc.Scope.RenderArgs.current().get(parts[0]); 
String field = String.valueOf(parts[1]); 
Object value = groovy.util.Eval.me("_caller", template.template, "_caller." + args.get("arg").replace(".", "?.")); 
Cuestiones relacionadas