Skip to main content
Bring your team and maximize your impact at Dreamforce. Register three or more to unlock $999 passes.

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.

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   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.

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.

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 bastante fácil de entender: es simplemente el nombre del campo por el que se ordenan los contactos. getContacts() también es bastante sencillo, aunque si no ha utilizado Apex antes, puede resultar difícil de interpretar al principio. 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.
    En la página ContactsListWithController, sustituya la línea de comentarios por el siguiente marcado.
  2. <!-- 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>
    When you save this page you should see a familiar looking table of contact information. A contacts list backed by a custom controller

El marcado para la página ContactsListWithController debe resultar familiar. Excepto para el atributo controller de la etiqueta , 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 .

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. In the ContactsListWithController class, below the getContacts()method, add the following two methods.
    public void sortByLastName() {
        this.sortOrder = 'LastName';
    }
    public void sortByFirstName() {
        this.sortOrder = 'FirstName';
    }
    These two methods change the value of the sortOrder private variable. sortOrder is used in the SOQL query that retrieves the contacts, and changing sortOrder will change the order of the results.
  2. In the ContactsListWithController page, replace the two <apex:column> tags for ct.FirstName and ct.LastNamewith the following markup.
    <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>
    Although the visual appearance remains the same, if you click the First Name and Last Name column headers now, they will change the sort order for the contacts list. Nice!

El nuevo marcado añade dos componentes anidados a cada uno de los componentes . por sí solo tiene un encabezado de texto sin formato, pero queremos que el encabezado sea interactivo. permite establecer el contenido del encabezado de columna con lo que se desee. 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 , 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: . 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