Saltar al contenido

¿Cuál es la diferencia entre controladores y extensiones?

Después de buscar en diversos repositorios y sitios al final hemos hallado la respuesta que te enseñaremos más adelante.

Solución:

En el contexto de Visualforce, para aprovechar las funciones integradas de Visualforce para acceder a los datos de su organización, deber utilizar un controlador. Todos los controladores son clases Apex, ya sean clases Apex estándar (ApexPages.StandardController o ApexPages.StandardSetController) o su propia clase Apex personalizada. También puede ampliar la funcionalidad de cualquiera de estos con una clase de extensión.

Tiendo a ser un poco quisquilloso con mi terminología aquí. Los controladores son controladores. Las extensiones no son controladores. Y para mí, la diferencia es que las extensiones no pueden vivir por sí mismas en una página. En otras palabras, no se me permite usar extensiones, a menos que mi página tenga un controlador en primer lugar.

Otra característica distintiva es que a una página solo se le permite un controlador. Pero puedo agregar tantas extensiones como necesite.

Así que permítanme comenzar (lo que se ha convertido en una disertación) con controladores:

Los controladores se adjuntan a su página utilizando uno de los tres formatos mutuamente excluyentes, controlador estándar, controlador estándar de lista / conjunto, controlador personalizado.

Para una página con un solo registro, accediendo a los datos estándar y al comportamiento de su objeto, usaría un controlador estándar:

 ... 

Si desea una página con muchos registros, usando la vista de lista estándar y acciones de lista, puede usar el controlador de lista estándar:

 ... 

Si desea utilizar una funcionalidad completamente personalizada y realmente no necesita la mayoría de los comportamientos de objetos estándar, el controlador personalizado es una buena opción, pero tenga en cuenta que cualquier acción estándar que desee usar deberá implementarse en su clase personalizada. Una página con un controlador personalizado usaría lo siguiente attribute:

 ... 

Pero tenga en cuenta que usted mismo puede crear una instancia de ApexPages.StandardController para usar sus características y funcionalidad. A menudo uso el patrón a continuación para crear una instancia del controlador estándar para obtener acceso a sus métodos:

public with sharing class MyApexClass 
  private ApexPages.StandardController ctrl;
  public Account acct get;set;
  public MyApexClass()
    try
      acct = [select Name from Account 
          where Id = : ApexPages.currentPage().getParameters().get('id')];
     catch (QueryException e) 
      acct = new Account();
    
      ctrl = new ApexPages.StandardController(acct);
  
  public PageReference save()
    //here I can put additional functionality or just leave it as-is.
    return ctrl.save();
  

Lo anterior crea una instancia del controlador estándar de forma privada, pero luego muestra un método de guardado público que es solo una transferencia del método de guardado del controlador. El constructor se encarga de la limpieza de crear el registro real con el que estoy trabajando.

Si quiero ampliar la funcionalidad de cualquier controlador, puedo usar una extensión. Las extensiones funcionan con controladores estándar o personalizados. El controlador estándar con extensión personalizada, para mí, es la construcción más común que uso para Visualforce que funcionará dentro de mi organización. Obtengo todo el poder del controlador estándar, pero toda la flexibilidad de Apex. La sintaxis de una extensión con una página de controlador estándar sería la siguiente:

 ... 

Luego, se requiere la clase de extensión para implementar un constructor que acepte el tipo de controlador. Entonces, por lo general, querrá obtener un identificador para la instancia del controlador estándar que está flotando y la instancia de sObject que representa. Entonces, para una página de controlador estándar:

public with sharing class MyExtClass 
  private ApexPages.StandardController ctrl;
  public Account acct get;set;
  public MyExtClass(ApexPages.StandardController controllerParam)
      ctrl = controllerParam;
      acct = (Account) ctrl.getRecord();
  
  public PageReference customsave()
    //here I override my standard save functionality before I return the save call.
    return ctrl.save();
  

Con un controlador personalizado y una extensión, probablemente pueda extrapolar lo anterior, pero solo para cerrar el ciclo.

 ... 

Nuevamente, la clase de extensión implementa un constructor que acepta el tipo de controlador, solo que ahora es mi clase personalizada. A partir de ahí, además de obtener un identificador local para su instancia de controlador personalizado, no hay un patrón, per-se, pero el identificador local le permite interactuar directamente con su controlador personalizado, de cualquier forma necesaria, por supuesto. :

public with sharing class MyExtClass 
  private MyApexClass ctrl;
  public MyExtClass(MyApexClass controllerParam)
      ctrl = controllerParam;
  

Hay trucos adicionales que son muy poderosos, como crear instancias de ApexPages.StandardSetController en su clase para aprovechar las características de paginación integradas de esa clase. Para obtener más información sobre eso, hay un gran video de Dreamforce 11 que muestra cómo puede funcionar esto: http://youtu.be/Js00YUpJAjs

Hay 3 tipos de controlador (en realidad 4, pero dos son variantes del mismo controlador estándar):

  • Estándar: la plataforma los proporciona para que pueda producir páginas de Visualforce sin escribir código. Los usaría cuando tenga un objeto único para manipular. Proporciona un método de guardado que le permite conservar los cambios. Hay una variante de esto que maneja una colección de registros: el controlador de lista estándar.
  • Controlador personalizado: está escrito en Apex y requiere que escriba código para cualquier comportamiento que necesite. Los usaría cuando su página no se ocupa de un objeto principal, por ejemplo, una plataforma de lanzamiento que puede llevarlo a varias subpáginas diferentes.
  • Controlador de extensión. Esto proporciona funcionalidad adicional a un controlador, ya sea un controlador estándar (por ejemplo, para manipular registros secundarios junto con un padre) o un controlador personalizado (esto a menudo se pasa por alto y es una forma de proporcionar una funcionalidad común en varias páginas).

Hay más información en la guía del desarrollador en: http://www.salesforce.com/us/developer/docs/pages/Content/pages_controller_std.htm

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *