playframework crud

playframework - Personalización avanzada de formularios y controladores CRUD en Play



(1)

Lo que estoy buscando es la capacidad de generar rápidamente (¡SECAR!) Formularios para determinados modelos, pero de una manera menos controlada que utilizando formularios / modelos CRUD; por ejemplo, al poder usar etiquetas crud sin los controladores / rutas crud completas, o al personalizarlas fuertemente.

Déjame explicarte a través de un ejemplo.

Tengo un modelo A que enlaces (ManyToOne) a 2 modelos, B y C

class public A extends Model { public String name; @ManyToOne public A a; @ManyToOne public B b; }

Me gustaría poder escribir las siguientes rutas:

/A/{id}/B/ somecontroller /A/{id}/C/ some(other?)controller

o mejor:

/A/{id}/{submodel}/ somecontroller

Y en la vista html correspondiente, puede hacer algo como:

<div>object.name</div> #{form action:@save(object.b._key()), enctype:''multipart/form-data''} #{crud.form object.b /} <p class="crudButtons"> <input type="submit" name="_save" value="&{''crud.save'', type.modelName}" /> <input type="submit" name="_saveAndContinue" value="&{''crud.saveAndContinue'', type.modelName}" /> </p> #{/form}

Donde ''objeto'' no es la instancia "b" o "c", sino "a", y puedo decir #{crud.form /} qué modelo debe mapear (en este caso, ''b'')

¿Hay alguna forma de lograr algo similar?

La pregunta podría ser resuelta ya sea:

  • ¿Hay alguna etiqueta #{form MODEL} #{/form} simple ?!

o, al poder personalizar de alguna manera más el CRUD, por ejemplo.

  • ¿Hay alguna manera de modificar el módulo crud principal y anular solo los métodos deseados (sin copiarlo todo)?

Me temo que no puedo lograr este objetivo simplemente anulando un controlador CRUD modelo, tal vez estoy equivocado, pero además de leer el código CRUD (que estoy haciendo), el documento oficial es un poco limitado sobre qué métodos se pueden anular y cómo...

Relacionado: cómo crear un formulario html para un modelo en playframework

También acabo de encontrar este hilo de google mail que parece ir en la dirección custom-crud. Esperaba una solución más lista para una necesidad típica ...


¡Encontré en esta obra! El grupo de google enhebraron la respuesta que estaba buscando. ¡Todo está ya allí, aunque no documentado!

Es tan fácil como usar:

para mostrar una forma de creación de la clase Modelo.

#{crud.form class:''models.ModelName'' /}

para mostrar la forma de edición de cualquier instancia existente

#{curd.form object:anyInstance /}

Entonces puedes ir como quieras pero este es mi patrón para editar objetos existentes:

En tu plantilla

#{form @Controller.Action, method="POST" ... } <input type="hidden" name="object.id" value="${myobject.ID}" /> #{crud.form object:gun.gunEngraving} #{/crud.form} <p> <input type="submit" value="Save Changes" /> </p> #{/form}

la entrada oculta establece el campo especial "id" para que:

En su controlador. Acción

function static void Action(routeParams, MyModel object) { some validation; object.save(); render or renderTemplate or other action for redirect; }

Esto es, por supuesto, un código simplificado, pero realmente me gusta este patrón cuando rápidamente necesito insertar un formulario en una vista y no puedo / no quiero usar todo el sistema CRUD.

[Editar] Bondad CRUD personalizada más avanzada

Las etiquetas crud en realidad no necesitan el módulo crud. Tanto que terminé copiándolos en mi proyecto, pirateándolos para agregar características interesantes adicionales, como la capacidad de cambiar el nombre del objeto en el formulario del "objeto" predeterminado (decidí anular los originales, pero usted puede hacer su propio uso de una carpeta diferente a las tags/crud para el espacio de nombres)