Skip to main content

Crear y utilizar controladores personalizados

Objetivos de aprendizaje

Después de completar esta unidad, podrá:

  • Explicar qué es un controlador personalizado y describir sus atributos clave.
  • Crear una clase de controlador personalizado.
  • Utilizar un controlador personalizado en una página de Visualforce.
Nota

Nota

¿Su idioma de aprendizaje es español? Comience el reto en un Trailhead Playground en español y utilice las traducciones proporcionadas entre paréntesis para navegar. Copie y pegue solo los valores en inglés, ya que las validaciones del reto se basan en los datos en inglés. Si no aprueba el reto en su organización en español, le recomendamos que (1) cambie la configuración regional a Estados Unidos, (2) cambie el idioma a inglés, siga las instrucciones descritas aquí y, a continuación, (3) vuelva a hacer clic en el botón Check Challenge (Comprobar el reto).

Consulte la insignia Trailhead en su idioma para obtener más información sobre cómo aprovechar la experiencia de Trailhead en otros idiomas.

Introducción a controladores personalizados

Agregue un controlador personalizado a una página de Visualforce haciendo referencia al nombre de la clase del controlador en el atributo <apex:page>  controller.

Cuando su página utiliza un controlador personalizado, no puede utilizar un controlador estándar. Las páginas utilizan un atributo diferente para establecer el controlador personalizado.

  1. Abra Developer Console y haga clic en File (Archivo) | New (Nuevo) | Visualforce Page (Página de Visualforce) para crear una nueva página de Visualforce. Escriba ContactsListWithController para el nombre de página.
  2. En el editor, sustituya cualquier marcado con lo siguiente.
    <apex:page controller="ContactsListWithController">
        <apex:form>
            <apex:pageBlock title="Contacts List" id="contacts_list">
                <!-- Contacts List goes here -->
            </apex:pageBlock>
        </apex:form>
    </apex:page>
    Cuando intente guardar esta página, obtendrá un error, porque ContactsListWithController no existe todavía. No se preocupe, solucionaremos esto después.

Crear una clase de Apex de controlador personalizado

Un controlador personalizado es simplemente una clase de Apex, que redacta por sí mismo con Develover Console.

Existen muchas clases de utilidad y sistema para ayudarle a redactar lógicas de controlador personalizado, pero el único requisito para que se utilice una clase como un controlador personalizado es que exista.

  1. Abra Developer Console y haga clic en File (Archivo) | New (Nuevo) | Apex Class (Clase de Apex) para crear una nueva clase de Apex. Escriba ContactsListWithController para el nombre de la clase.

En el editor, sustituya cualquier código con lo siguiente.

public class ContactsListWithController {
// Controller code goes here
}

Al igual que con páginas de Visualforce, debe guardar sus cambios en Apex cuando lo cambie. No es mucho y no hace nada aún, pero hace que desaparezca el error de la página de Visualforce.

  1. Vuelva a cambiar a la página de Visualforce y guárdela de nuevo. El mensaje de error debe desaparecer y la página se guarda correctamente.
  2. Haga clic en Preview (Vista previa) para abrir una vista previa de su página, que podrá ver mientras realiza cambios. Se abrirá una nueva ventana que muestra los elementos de barra lateral y encabezado de la página estándar de Salesforce, pero aún no el contenido.

A primera vista, estos dos nuevos elementos que creó no parecen muy interesantes. Aunque sean en un 90 % código de marcadores, los dos elementos, página de Visualforce y controlador de Apex, están vinculados entre sí. En cuanto agregue algunos códigos más al controlador, su página podrá utilizarlo.

Más allá de los aspectos básicos

Es posible que haya observado que esta clase de controlador personalizado no se hereda de otra clase ni implementa una interfaz que promete ajustarse a los requisitos de un controlador de Visualforce. Ni los controladores complejos hacen esas cosas, porque no hay ninguna clase de la cual heredar o interfaz que implementar. Esto le deja la libertad de crear sus propias clases e interfaces cuando aumente su experiencia con Apex.

Agregar un método para recuperar registros

Cree un método de obtención que ejecute una consulta SOQL que devuelva los registros que desea mostrar en su página.

El objetivo principal de la mayoría de los controladores es recuperar datos para mostrar o gestionar actualizaciones en datos. En este controlador sencillo, todo lo que necesita hacer es ejecutar una consulta SOQL básica que busque registros de contacto y luego convierta en disponibles esos registros en la página de Visualforce.

  1. En la clase ContactsListWithController, sustituya la línea de comentario // Controller code goes here por el siguiente código.
    private String sortOrder = 'LastName';
    public List<Contact> getContacts() {
        List<Contact> results = Database.query(
            'SELECT Id, FirstName, LastName, Title, Email ' +
            'FROM Contact ' +
            'ORDER BY ' + sortOrder + ' ASC ' +
            'LIMIT 10'
        );
        return results;
    }
    Este código agrega una variable de miembro privada, una cadena denominada sortOrder, y un método público, getContacts(). sortOrder es mucho más fácil de comprender, es el nombre del campo por el que ordenar los contactos. getContacts() es también bastante sencillo, pero si no ha visto Apex antes, puede ser difícil de analizar a primera vista. El efecto del método es realizar una consulta SOQL para obtener una lista de registros de contacto y luego devolver esa lista de contactos al método emisor. ¿Quién será el emisor? La página de Visualforce, claro.
  2. En la página ContactsListWithController, sustituya la línea de comentarios <!-- Contacts List goes here --> por el siguiente marcado.
    <!-- Contacts List -->
    <apex:pageBlockTable value="{! contacts }" var="ct">
        <apex:column value="{! ct.FirstName }"/>
        <apex:column value="{! ct.LastName }"/>
        <apex:column value="{! ct.Title }"/>
        <apex:column value="{! ct.Email }"/>
    </apex:pageBlockTable>
    Cuando guarda esta página, debe ver una ficha de información de contacto que le resulta familiar. Una lista de contactos respaldada por un controlador personalizado

El marcado para la página ContactsListWithController debe resultar familiar. Excepto para el atributo controller de la etiqueta <apex:page>, es casi el mismo código que debe utilizar para crear la página con el controlador estándar.

La diferencia es lo que sucede cuando se evalúa la expresión {! contacts }. En esta página, Visualforce traduce esa expresión en una llamada al método getContacts() de su controlador. Ese método devuelve una lista de registros de contacto, que es exactamente lo que espera <apex:pageBlockTable>.

El método getContacts() se denomina método de obtención y es un patrón general, donde {! someExpression } en su marcado de Visualforce se conecta automáticamente con un método denominado getSomeExpression() en su controlador. Esta es la forma más sencilla de que su página obtenga el acceso a datos que necesita mostrar.

Agregar un nuevo método de acción

Cree métodos de acción en su controlador personalizado para responder a entradas de usuario en la página

Mostrar datos está bien, pero responder a acciones de usuarios es esencial en cualquier aplicación web. Con un controlador personalizado, puede crear tantas acciones personalizadas como desee admitir en una página, redactando métodos de acción para responder a la actividad de usuarios.

  1. En la clase ContactsListWithController, debajo del método getContacts(), agregue los dos métodos siguientes.
    public void sortByLastName() {
        this.sortOrder = 'LastName';
    }
    public void sortByFirstName() {
        this.sortOrder = 'FirstName';
    }
    Estos dos métodos cambian el valor de la variable privada sortOrder. sortOrder se utiliza en la consulta SOQL que recupera los contactos, y al cambiar sortOrder se cambiará el orden de los resultados.
  2. En la página ContactsListWithController, sustituya las dos etiquetas <apex:column> para ct.FirstName y ct.LastName con el siguiente marcado.
    <apex:column value="{! ct.FirstName }">
        <apex:facet name="header">
            <apex:commandLink action="{! sortByFirstName }"
                reRender="contacts_list">First Name
            </apex:commandLink>
        </apex:facet>
    </apex:column>
    <apex:column value="{! ct.LastName }">
        <apex:facet name="header">
            <apex:commandLink action="{! sortByLastName }"
                reRender="contacts_list">Last Name
            </apex:commandLink>
        </apex:facet>
    </apex:column>
    Aunque el aspecto visual permanece igual, si hace clic en los encabezados de columna Nombre y Apellidos ahora, cambiará el orden de clasificación de la lista de contactos. ¡Excelente!

El nuevo marcado agrega dos componentes anidados a cada uno de los componentes <apex:column>. <apex:column> siempre tiene un encabezado de texto sin formato, pero deseamos convertir el encabezado en activable. <apex:facet> nos permite establecer los contenidos del encabezado de columna como queramos. Y lo que queremos es un vínculo que llame el método de acción correcto. El vínculo se crea utilizando el componente <apex:commandLink>, con el atributo action establecido como una expresión que hace referencia al método de acción en nuestro controlador (recuerde que los métodos de acción, a diferencia de los métodos de obtención, se denominan del mismo modo que la expresión que hace referencia a ellos).

Cuando se hace clic en el vínculo, se activa el método de acción en el controlador. El método de acción cambia el orden de clasificación de la variable privada y luego se vuelve a representar la tabla. Cuando se vuelve a representar la tabla, se vuelve a evaluar {! contacts }, que a su vez vuelve a ejecutar la consulta con el orden de clasificación que se acaba de establecer. El resultado final es que se vuelve a ordenar la tabla en el orden solicitado por el clic del usuario.

Más allá de los aspectos básicos

El texto del encabezado para las columnas nombre y apellido está codificado en este marcado. ¿Qué sucede si no todos sus usuarios utilizan el inglés? La interfaz de usuario estándar de Salesforce tiene versiones traducidas de los nombres de campo para todos los objetos estándar y puede proporcionar sus propias traducciones para objetos personalizados. ¿Cómo se accede a esto? En lugar del texto sin formato, pruebe este marcado: <apex:outputText value="{!$ObjectType.Contact.Fields.FirstName.Label }"/>. Es la forma correcta de hacer referencia a la etiqueta de un campo, incluso si su organización utiliza el mismo idioma, porque se actualizará automáticamente si se cambia el nombre del campo alguna vez.

Más información...

Los controladores personalizados y el lenguaje de Apex le permiten hacer muchas más cosas de las que piensa en sus páginas de Visualforce.

Los métodos de obtención extraen datos de su controlador en la página. Existen métodos más apropiados que le permiten enviar valores desde la copia de seguridad de la página a su controlador. Al igual que los métodos de obtención, el prefijo de los reguladores es “set”, y aparte de eso, son solo métodos que toman un argumento.

Una alternativa a los métodos de obtención y reguladores es utilizar propiedades de Apex. Las propiedades son como una combinación de una variable con métodos de obtención y reguladores con una sintaxis que los agrupa de forma más clara. Una propiedad sencilla que hace referencia a un objeto personalizada se podría declarar así.

public MyObject__c myVariable { get; set; }

Las propiedades pueden ser públicas o privadas y pueden ser de solo lectura o incluso de solo escritura, omitiendo get o set. Puede crear implementaciones para los métodos de obtención o regulación cuando desee realizar lógicas adicionales aparte de simplemente guardar o recuperar un valor.

Las propiedades son una función general de Apex, no específica de Visualforce. Apex es un lenguaje de programación completo y además de ser el socio natural para la creación de páginas complejas de Visualforce, se utiliza en muchos más contextos de desarrollo de la plataforma Lightning. Consulte los temas de Apex en otro módulo y en los recursos al final de esta página para ver más formas de aprender a utilizar Apex de forma exhaustiva.

El ciclo de vida de una respuesta y solicitud de Visualforce puede parecer complejo inicialmente. En concreto, es importante comprender que no hay un orden especifico en el que se llama a los métodos de obtención y reguladores (o propiedades, si los utiliza), de modo que no debe introducir dependencias de orden de ejecución entre ellos. Encontrará muchos más detalles disponibles en las secciones relevantes de la Guía del desarrollador de Visualforce, en concreto en el capítulo Controladores personalizados y extensiones de controlador.

Recursos

Comparta sus comentarios sobre Trailhead en la Ayuda de Salesforce.

Nos encantaría conocer su experiencia con Trailhead. Ahora puede acceder al nuevo formulario de comentarios cuando quiera desde el sitio de la Ayuda de Salesforce.

Más información Continuar para compartir comentarios