¡Cuánto tiempo! Pues si, en Enero fue mi último post en Español y 11 meses después vuelvo a escribir una entrada en nuestra lengua materna. Y es que últimamente he estado un pelín ocupada con mi bebe de 7 meses.
Esta será la última entrada con el título Mi primera Visualforce ya que terminaremos de cubrir conocimientos básicos. Pero no significa que no seguiré escribiendo en Español. Seguid atentos porque publicaré cosas.
¡Pero vamos al lío! Todos los objetos tienen asociados un controlador estándar que le proporciona funcionalidad (Échale un vistazo a esta entrada). Además, podemos crear controladores personalizados para extender y dar más potencia a nuestra página.
Además los controladores pueden tener un único elemento como argumento, como expliqué en mi última entrada, ó a una lista de registros.
Controlador asociado a varios registros
Controlador Estándar
Como recordarás, para usar el controlador estándar, sólo tienes que usar el atributo standardController del tag apex:page
<apex:page standardController="Account"> </apex:page>
Entonces, ¿cuál es la diferencia? Como supondrás, necesitaré una variable para poder almacenar todas las cuentas, y después iterar sobre ella. Para ello, apex:page ofrece otro atributo recordsetVar cuyo valor será la lista de registros. Una vez que la tengamos, sólo tenemos que mostrar los campos que deseemos de nuestra cuenta. En el código de más abajo, usaremos el tag apex:repeat aunque podríamos haber usado también apex:datatable como en posts anteriores.
<apex:page standardController="Account" recordsetVar="records"> <apex:form > <apex:pageBlock title="Listado de Cuentas"> <apex:pageBlockSection columns="1"> <apex:repeat value="{!records}" var="acc"> <apex:outputField value="{!acc.Name}"/> </apex:repeat> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page>
Siendo este el resultado
Controlador Personalizado
¿Y cómo puedo conseguir lo mismo pero con un controlador creador por mi mismo? Sólo tienes que seguir estos pasos:
Crear un Controlador en Apex
Una clase en Apex sencilla. Pero ten en cuenta lo que explicamos en el último post sobre nomenclatura, sharings, etc. Lo único que debemos tener en cuenta es el constructor. Esta vez, en vez de utilizar ApexPages.StandardController, usaremos la clase ApexPages.StandardSetController que nos permitirá recuperar la lista de registros seleccionados (por ejemplo) con el método getRecords de forma similar que el controlador de único registro nos ofrecía el método getRecord. Pero además, en este caso, tenemos métodos para facilitar la paginación cómo getHasNext ó getHasPrevious.
public with sharing class AccountListController { public AccountListController(ApexPages.StandardSetController controller) { //TODO añadir código } }
Añadir método para recuperar la lista de cuentas
Muy sencillo. Añadimos la variable registroCuentas con sus métodos get y set. Por otro lado, añadimos un método que recuperará las listas que tenemos en base de datos por medio de una SOQL calcularCuentas. Y por último, en el constructor, rellenamos la variable privada con la información.
public with sharing class AccountListController { private List<Account> registroCuentas; public AccountListController(ApexPages.StandardSetController controller) { setRegistroCuentas(calcularCuentas()); } public List<Account> calcularCuentas() { try { return [Select Id, Name From Account]; } catch(Exception ex) { ApexPages.addMessages(ex); return null; } } public List<Account> getRegistroCuentas() { return registroCuentas; } public void setRegistroCuentas(List<Account> value) { registroCuentas = value; } }
Modificar la página para usar el Controlador
En este último paso sólo tenemos que añadir el atributo extensions cuyo valor es el nombre del controlador personalizado que hemos creado. Además, debemos usar nuestro método como valor en el atributo recordSetVar.
<apex:page standardController="Account" extensions="AccountListController" recordsetVar="registroCuentas"> <apex:form > <apex:pageBlock title="Listado de Cuentas Personalizado"> <apex:pageBlockSection columns="1"> <apex:repeat value="{!registroCuentas}" var="acc"> <apex:outputField value="{!acc.Name}"/> </apex:repeat> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page>
Como puedes ver, el look & feel de la página es igual que la página que usa el controlador estándar.
A partir de ahí, eres tu quien pone los límites en una página.
Alternativa
Por último, si nuestro caso de uso es simplemente mostrar la lista de Cuentas, pero no nos piden nada más (por ejemplo mostrar sólo unos campos), podemos usar el tag apex:enhancedList y no reinventar la rueda. Con esta línea de código, podemos mostrar todas las cuentas de nuestra organización junto con sus enlaces de editar, borrar, seleccionar, etc y sin ningún esfuerzo.
<apex:page > <apex:enhancedList type="Account" height="300" rowsPerPage="10" id="AccountList" /> </apex:page>
Esta ha sido una entrada sencilla en la que hemos aprendido
- Mostrar una lista de Cuentas por medio del controlador Standard
- Mostrar una lista de Cuentas via un controlador personalizado
- Mostrar una lista de Cuentas usando el tag apex:enhancedList
Nos vemos en el próximo post.