¡La versión 2.0 de Play ya está lista! Ayúdanos a traducir la documentación de la útlima versión y sigue nuestro progreso.

Manuales, tutoriales & referencias

Consulte

Contenidos

Elija la versión

Buscar

Busque con google

Libros

CRUD: Generador de interfaz de administración

El módulo CRUD (cuyas siglas provienen del inglés Create, Read, Update, Delete, que en español significan Crear, Leer, Actualizar, Eliminar) genera una interfaz completamente utilizable para administrar sus objetos JPA.

Utilizando el módulo CRUD

Veamos un simple ejemplo de cómo manejar la información de los usuarios utilizando el módulo CRUD.

Habilitando el módulo CRUD en nuestra aplicación

Para habilitar el módulo CRUD, agregue al archivo /conf/dependencies.yml la siguiente línea luego de require:

require:
    - play -> crud

Ahora ejecute el comando play dependencies para resolver la dependencia del nuevo módulo.

Importando las rutas CRUD por defecto

En el archivo conf/routes, importe las rutas del módulo agregando ésta línea:

# Import CRUD routes
*     /admin           module:crud

Esto agrega varias rutas por cada uno de tus controladores CRUD, que agregaremos a continuación.

Nota: no es obligatorio utilizar el archivo de rutas por defecto. Puede definir sus propias rutas, o también mezclar ambos enfoques.

Creando una clase User

El módulo CRUD provee una interfaz de usuario para las clases del modelo. Comenzaremos creando una interfaz de usuario para la clase User, que es una entidad JPA:

package models;
 
import play.*;
import play.db.jpa.*;
 
import javax.persistence.*;
import java.util.*;
 
@Entity
public class User extends Model {
 	
	public String name;
	public String email;
	public String address;
 	
}

Creando el controlador de Users

Ahora, crearemos un simple controlador que herede del controlador CRUD. Esto es como un ‘marcador’ que el módulo CRUD utiliza para generar rutas.

package controllers;
 
public class Users extends CRUD {
   
}

Ahora abra http://localhost:9000/admin y debería ver el área de administración para el modelo User.

Por convención, el nombre de la clase del controlador debe ser igual al nombre de la clase del modelo que queremos administrar, pero con una ‘s’ al final. Si quiere utilizar otro nombre, puede hacerlo utilizando la anotación CRUD.For.

package controllers;
 
import models.User;
 
@CRUD.For(User.class)
public class AdminUsers extends CRUD {
   
}

El formulario de User

Haciendo click en el botón Add debería ver el formulario de User.

Ahora podemos agregar algunas reglas de validación a nuestra clase User:

package models;
 
import play.*;
import play.db.jpa.*;
 
import javax.persistence.*;
import java.util.*;
 
import play.data.validation.*;
 
@Entity
public class User extends Model {
 	
   @Required
   @MinSize(8)
   public String name;
	
   @Required
   @Email
   public String email;
	
   @Required
   @MaxSize(1000)
   public String address;
 
   public String toString() {
      return email;
   }
	
}

Refresque el formulario y verá que las validaciones son aplicadas automáticamente.

Cambiando las etiquetas del formulario

Agregue estas líneas al archivo conf/messages de su aplicación:

name=Name
email=Email address
address=Postal address

y refresque el formulario:

Creando un usuario y personalizando la vista de lista

Por defecto, la vista de lista utiliza una única columna que nos muestra el resultado del método toString() del objeto.

Para personalizar esta vista, necesitamos crear la plantilla (template) /app/views/Users/list.html en nuestra aplicación.

Abra una línea de comandos, vaya al directorio de la aplicación y tipee:

play crud:ov --template Users/list

Esto copiará la plantilla por defecto list.html de CRUD a la plantilla Users/list.html de nuestra aplicación, sobreescribiéndola si estuviese presente.

Ahora podrá personalizar la plantilla editándola de la siguiente manera:

#{extends 'CRUD/layout.html' /}
 
<div id="crudList" class="${type.name}">
	
	<h2 id="crudListTitle">&{'crud.list.title', type.name}</h2>
 
	<div id="crudListSearch">
		#{crud.search /}
	</div>
 
	<div id="crudListTable">
		#{crud.table fields:['email', 'name'] /}
	</div>
	
	<div id="crudListPagination">
		#{crud.pagination /}
	</div>
	
	<p id="crudListAdd">
		<a href="@{blank()}">&{'crud.add', type.modelName}</a>
	</p>
</div>

y refresque la lista.

Personalizando campos: el tag crud.custom

Puede ir un poco más lejos y personalizar también la manera en que se muestra cada campo de la entidad User en las vistas de lista y formulario.

Para personalizar un campo en particular, utilice el tag #{crud.custom}:

#{crud.table fields:['name', 'company']}
 
   #{crud.custom 'company'}
     <a href="@{Companies.show(object.company.id)}">
      	 ${object.company.name}
     </a>
   #{/crud.custom}
 
#{/crud.table}

También puede agregar columnas o inputs de formulario definiendo sus propios manejadores:

#{crud.table fields:['name', 'company', 'edit']}
 
   #{crud.custom 'company'}
      <a href="@{Companies.show(object.company.id)}">${object.company.name}</a>
   #{/crud.custom}
 
   #{crud.custom 'edit'}
      <a href="@{Users.edit(object.id)}">Edit</a>
   #{/crud.custom}
 
#{/crud.table}

Listas de Strings y de enumeración

El módulo CRUD muestra las listas como un campo de texto. En este campo de texto, la lista está representada como una lista de Strings separadas por comas. Por ejemplo:

@Entity
public class Account extends Model {
 
      @CollectionOfElements
      public Set<ContentType> contentTypes;
 
      @CollectionOfElements
      public Set<String> usernames;
 
      public Account(Set<String> usernames) {
            super();
            this.usernames = usernames;
      }
}

En pantalla, lo veremos como “myEnumId1”,“myEnumId2” para contentTypes y “string1”,“string2” para los nombres de usuario. Por definición, esto es lo primero que usted debería personalizar en su módulo CRUD.

Personalizando las vistas show y blank de manera genérica

Lo más importante en el comportamiento de las vistas de CRUD es el ObjectType de cada campo.

Entonces, si desea cambiar el comportamiento del módulo CRUD de una manera genérica, por ejemplo esconder campos con la anotación @Version, puede crear su propia clase ObjectType. Deberá declarar un método estático en su controlador o en una superclase del mismo.

protected static ObjectType createObjectType(Class<? extends Model> type) {
   return new VersionObjectType(type);
} 

Aquí tenemos un ejemplo completo:

public class CustomAdminCompany extends CRUD {
   protected static ObjectType createObjectType(Class<? extends Model> type) {
      return new VersionObjectType(type);
   }
   
   public static class VersionObjectType extends ObjectType {
      
      private final String versionColumn;
      
      public VersionObjectType(Class<? extends Model> modelClass) {
         super(modelClass);
         versionColumn = getVersionColumnName(modelClass);
      }
      private String getVersionColumnName(Class modelClass) {
         Class c = modelClass;
         try {
            while (!c.equals(Object.class)) {
               for (Field field : c.getDeclaredFields()) {
                  if (field.isAnnotationPresent(Version.class)) {
                     return field.getName();
                  }
               }
               c = c.getSuperclass();
            }
         } catch (Exception e) {
            throw new UnexpectedException("Error while determining the "
               + "object @Version for an object of type " + modelClass);
         }
         return null;
      }
 
      @Override
      public List<ObjectField> getFields() {
         List<ObjectField> result = super.getFields();
         for (ObjectField objectField : result) {
            if (objectField.name.equals(versionColumn)) {
               objectField.type = "hidden";
            }
         }
         return result;
      }
   }   
}

Pero eso no es todo; también puede personalizar findPage y otros métodos. Eche un vistazo al código fuente.

Comandos

El módulo CRUD provee el comando crud:override que puede utilizar desde la línea de comandos para sobreescribir las plantillas que trae por defecto. Esto funciona porque CRUD carga las plantillas que estén presentes en su aplicación en lugar de las propias. También puede utilizar crud:ov en lugar de crud:override.

play crud:override --template [path]

Copia la plantilla especificada en el path, por ejemplo Users/list, al directorio app/views/CRUD/ de su aplicación. También puede utilizar -t en lugar de --template.

play crud:override --layout

Sobreescribe la plantilla de la página principal, layout.html.

play crud:override --css

Sobreescribe la hoja de estilo, crud.css, copiándola al directorio public/stylesheets/.

Limitaciones

El módulo CRUD muestra las relaciones bidireccionales tan sólo en una de las dos entidades: justamente aquella que no posea el atributo mappedBy