Visualforce en Lightning Platform

¿Cómo incluir Visualforce en Lightning Platform?

Visualforce en Lightning Platform puede ser incluida de muchas maneras, más de las que normalmente tenemos en cuenta.

Cuando una organización tiene procesos de negocio complejos que requieran una interfaz UI, no compatible con la funcionalidad existente, podemos usar Visualforce pages.

A continuación vamos a ver las diferentes maneras de incluir una Visualforce en Salesforce.

Formas de Incluir Visualforce en Lightning Platform

Una visualforce page (VFP) puede ser incorporada, en Force.com, como tabs, páginas de inicio, layouts, botones, links, componentes, menu items, acciones rápidas y páginas.

Tabs

Al crear una pestaña personalizada (custom tabs) podemos incrustar páginas de Visualforce de la siguiente manera:

Vamos a “Setup” y buscamos “Tabs“. En la sección Visualforce Tabs, podemos crear una nueva pestaña relacionada con la visualforce page.

Custom Tab Salesforce

Adicionalmente, podemos sobrescribir las pestañas del inicio (Home Tabs). No obstante, para sobrescribir estas pestañas debemos utilizar, únicamente, controladores personalizados o no usar controladores en nuestra visualforce page.

Página Layouts

Podemos incrustar páginas Visualforce en los layouts de un object. Sin embargo, esta visualforce debe usar el standard controller del objeto estándar o personalizado asociado con el layout.

Layout in visualforce page

Botones o Links

Podemos configurar botones o links para abrir Visualforce pages. Además, podemos sobrescribir botones o acciones en objetos estándar o personalizados.

Para crear un botón personalizado en un objeto estándar, vamos a la sección “Buttons, Links and Actions” en el objeto deseado, damos clic en “New Button o Link” y seleccionamos la opción Visualforce Page en Content Source. Luego, debemos agrégalo al layout del objeto en la sección Mobile & Lightning Actions.

Visualforce page button
Visualforce en Lightning Platform custom button

Para reemplazar un botón, link o acción, vayamos a esta sección en el objeto, seleccionamos el botón deseado y damos clic en Edit. A continuación, seleccionamos nuestra visualforce page en las opciones correspondientes.

Account button in Visualforce en Lightning Platform
visualforce override properties

Más Información

Para saber más sobre Salesforce puedes ir a Lightning Component Framework

Lightning Component Framework

The Lightning Component Framework

The Lightning Component Framework is a UI framework that allows building single-page web apps with dynamic and responsive user interfaces in Salesforce.

Benefits of Using Lightning Component Framework

  • Utilizes event-driven architecture. Therefore, components are capable of listening and response events.
  • Can build responsive applications.
  • Uses Javascript on the client side and Apex on the server side.
  • Utilizes a stateful client and a stateless server. It means, it calls the server only when is necessary incresing the effience of the app.
  • Can use Aura or Lightning Web Components to build components that coexist and interoperate on a page.
  • Can use in different context. For example, can be used in Custom Tabs, Lightning Experience and the Salesforce mobile app.
  • Components are reusable and reduce time development.

Event-Driven in Lightning Component Framework

  • Utilizes event-driven architecture which consists of event procedures, event consumers, and channels.
  • To handle information in real time when an event occurs.
  • Simplifies communication by decoupled event producers from event consumers.
  • A component can subscribe to an application event or a visible component event.

Built-in Apps

  • Theres a wide range of built-in components to build apps quickly.
  • Can be responsive.
  • Can be use in different devices without problems.
  • Also, can build reusable components building blocks and accelerate app development.
  • Can customize applications and components using the Salesforce Design Guidelines call Lightning System Design.

Multiple Uses Cases

  • Components can be accessed from the navigation menu in the Salesforce Mobile App.
  • In addition, Lightning components can be added to Visualforce Pages usign the <apex:includeLightning /> component.
  • We can publish components on the Appexchange and shared with others.
  • Standard and custom components can be added to Lightning Pages using the Lightning App Builder.
  • Finally, we can use Experience Builder to add componentes in a community.

Increased Performance

  • Lightning components runs on stateful and stateless architecture to use resources efficiently.
  • Increses efficiency by utilizing server, browser, devices and network intelligently.
  • Use Javascript on the client side to manage UI component metadata and data.
  • Client calls the server or only sends requests to it only when necessary.
  • Server only sends the data that is needed by the client.
  • Can use JSON format to exhange data between client and server.

More Information

For more Salesforce information: Static and Instance in Apex Salesforce

Lightning Component Framework

Lightning Component Framework

Lightning Component es un framework UI que permite crear páginas web simples, responsive y con interfaces dinámicas en Salesforce.

Beneficios de usar Lightning Component Framework

  • Utiliza una arquitectura even-driven. Por lo tanto, los componentes son capaces de escuchar y responder a eventos.
  • Pueden construir aplicaciones responsive, es decir, se adaptan a cualquier dispositivo.
  • Usa Javascript en el lado del cliente y Apex en el lado del servidor.
  • Usa un cliente stateful y un servidor stateless. Es decir, llama al servidor solo cuando es necesario, incrementando la eficiencia de la aplicación.
  • Puede usar Aura o Lightning Web Components para construir componentes que coexistan e interoperen en una misma página.
  • Se puede usar en diferente contexto. Por ejemplo, se puede utilizar en Pestañas Personalizadas, Lightning Experience y en la aplicación movil de Salesforce.
  • Además, los componentes son reusables y reducen el tiempo de desarrollo.

Event-Driven en Lightning Component Framework

  • Utiliza la arquitectura even-driven. Es decir, consta de procedimientos y consumidores de eventos, además de, canales.
  • Se utiliza para manejar información en tiempo real cuando un evento ocurre.
  • Adicionalmente, simplifica la comunicación de los productores de eventos desacoplando a los consumidores de eventos.
  • Un componente puede suscribirse a una aplicación del evento o ser visible para los eventos del componente.

Aplicaciones Integradas

  • Salesforce brinda una gran cantidad de componentes integrados para crear aplicaciones rápidamente.
  • Pueden ser responsive, por lo tanto, se pueden utilizar en diferentes dispositivos sin problema.
  • Además, se pueden construir componentes reusables, construyendo bloques que aceleren el desempeño de la aplicación.
  • Se pueden personalizar las aplicaciones utilizando Lightning System Design.

Múltiples Casos de Uso

  • Se pueden acceder a los componentes desde el menú de navegación en la Aplicación Movil de Salesforce.
  • Adicionalmente, podemos incluir Lightning Components en Visualforce Pages usando el componente <apex:includeLightning />.
  • Los componentes estándar y personalizados pueden ser agregados a Lightning Pages usando Lightning App Builder.
  • Además, Podemos publicar componentes en el AppExchange y compartirlo con otros.
  • Finalmente, podemos usar Experience Builder para agregar componentes a una comunidad.

Incrementan el Rendimiento

  • Se ejecutan en una arquitectura stateful y stateless para utilizar los recursos de manera eficiente.
  • Por otro lado, incrementan su eficiencia al utilizar el servidor, navegador, dispositivos y la red de forma inteligente.
  • Usan Javascript en el lado del cliente para administrar componentes UI, metadata y data.
  • El cliente llama al servidor o envía solicitudes solo cuando sea necesario.
  • El servidor solo envía los datos que el cliente necesite.
  • Se puede utilizar el formato JSON para intercambiar datos entre el cliente y el servidor.

Más Información

Para saber más de Salesforce puedes ir a Apex estático e instanciado en Salesforce

Static and Instance in Apex Salesforce

If you are a Salesforce developer, you need to know everything about static and instance in Apex Salesforce to code as a pro with good programming principles.

In apex classes can’t be static. Nonetheless, we can have static methods, variables and initialization code. Also we can have instance methods, member variables and initialization code, which have no modifier, and local variables.

Static Characteristics in Apex

Static methods, variables and initialization code could be:

  • Associated with a class.
  • Only in outer classes.
  • Only when a class is loaded.
  • No transmitted as part of the view state for a Visualforce page.

Instance Characteristics in Apex

Instance methods, member variables, and initialization code could be:

  • Associated with a particular object.
  • No definition modifier.
  • Created with every object instantied from the class declared.

Using Static Methods and Variables

  • Only with outer classes. That means, classes that can have inner classes.
  • Doesn’t require an instance of the class in order to run.
  • All static variables are initialized before an object of a class is created.
  • A static method is used as a utility method. For example, when we need to access to raw data without make an object declaration.
  • A static variable is static only within the scope of the Apex transaction. Can be used as a flags in Apex Triggers.
  • A static variable or method can’t be accessed through an instance of that class.
  • An inner class behaves like a static class and doesn’t require the static keyword. Those classes doesn’t need to be declared.
  • In other words, use static methods and variables when you don’t need the abstraction of an object but straight code.
  • Ask yourself “Does it make sense to call this method, even if no object has been constructed yet?” If so, it should definitely be static.
public class P { 
   public static boolean firstRun = true; 
}
trigger T1 on Account (before delete, after delete, after undelete) { 
  if(Trigger.isBefore){
    if(Trigger.isDelete){
        if(p.firstRun){
            Trigger.old[0].addError('Before Account Delete Error');
            p.firstRun=false;
        } 
      }
  }
}

Using Instance Methods and Variables

  • Are used by instance of a class, that is, by an object.
  • Instance member variable is declared inside a class.
  • Usually use instance member variables to affect the behavior of the method.
  • In other words, use it when depends of an object and could affect their behaviour. For example, a Point, need an instance of x and y to be created.
public class Plotter {
 
    // This inner class manages the points
    class Point {
        Double x;
        Double y;
 
        Point(Double x, Double y) {
             this.x = x;
             this.y = y;
        }
        Double getXCoordinate() {
             return x;
        }
 
        Double getYCoordinate() {
             return y;
        }
    }
 
    List<Point> points = new List<Point>();
 
    public void plot(Double x, Double y) {
        points.add(new Point(x, y));
    }
    
    // The following method takes the list of points and does something with them
    public void render() {
    }
}

References

To learn more about Salesforce can see: Contenidos Web en Visualforce Pages

Apex estático e instanciado en Salesforce

Como desarrolladores de esta plataforma, necesitamos conocer sobre Apex estático e instanciado en Salesforce, así podremos programar a un nivel profesional con buenos principios del ámbito.

Las clases en Apex no pueden ser estáticas, sin embargo, podemos utilizar métodos estáticos, variables y códigos de inicialización. Por otro lado, podemos tener métodos instanciados y códigos de inicialización sin modificador ni variables locales.

Características de Apex Estático

Los métodos estáticos, variables y códigos de inicialización pueden:

  • Estar asociados con una clase.
  • Aparecen sólo en clases externas.
  • Se ejecutan sólo cuando una clase es ejecutada.
  • No pueden trasmitirse como parte del view state de una Visualforce page.

Características de Apex Instanciado

Los métodos instanciados, variables miembro y códigos de inicialización pueden:

  • Estar asociados con un objeto particular.
  • No tienen un modificador de definición.
  • Se crean con cada objeto instanciado cuando la clase se ejecuta.

Usando Métodos y Variables Estáticas

  • Solo en clases externas. Es decir, clases que pueden incluir clases internas.
  • No se requiere una instancia de la clase para ejecutarse.
  • Todas las variables estáticas son inicializadas antes de que un objeto de la clase sea creado.
  • Un método estático es usado como un método de utilidad (Utility). Por ejemplo, cuando necesitemos acceder a datos que no necesitan la declaración de un objeto.
  • Una variable estática es estática solo dentro del alcance de la transacción Apex. Así mismo, pueden ser usadas como banderas en Apex Triggers (Código de Ejemplo).
  • No podemos acceder a una variable o método estático a través de la instancia de una clase.
  • Una clase interna se comporta como una clase estática y no requiere la palabra clave static. Además, estas clases no necesitan ser declaradas.
  • En otras palabras, se usan métodos y variables estáticas cuando no se necesita la abstracción de un objeto pero si de código directo.
  • Pregúntate “¿Tiene sentido llamar a este método, incluso si ningún objeto ha sido construido todavía?” Si es así, el método debería ser estático.
public class P { 
   public static boolean firstRun = true; 
}
trigger T1 on Account (before delete, after delete, after undelete) { 
  if(Trigger.isBefore){
    if(Trigger.isDelete){
        if(p.firstRun){
            Trigger.old[0].addError('Before Account Delete Error');
            p.firstRun=false;
        } 
      }
  }
}

Usando Instancia de métodos y variables

  • Son usados por la instancia de una clase, es decir, por un objeto.
  • La instancia de una variable miembro es declarada dentro de una clase.
  • Usualmente se usa la variable de instancia (member) para afectar el comportamiento del método.
  • En otras palabras, se usa cuando depende de un objeto y puede afectar su comportamiento. Por ejemplo, un Point, necesita instanciar x y y antes de ser creada.
public class Plotter {
 
    // This inner class manages the points
    class Point {
        Double x;
        Double y;
 
        Point(Double x, Double y) {
             this.x = x;
             this.y = y;
        }
        Double getXCoordinate() {
             return x;
        }
 
        Double getYCoordinate() {
             return y;
        }
    }
 
    List<Point> points = new List<Point>();
 
    public void plot(Double x, Double y) {
        points.add(new Point(x, y));
    }
    
    // The following method takes the list of points and does something with them
    public void render() {
    }
}

Referencias sobre Apex Estático e Instanciado

Para aprender más sobre Salesforce puedes ir a Contenidos Web en Visualforce Pages

Contenidos Web en Visualforce Pages

Contenidos web en Visualforce Pages

Existen diferentes tipos de contenidos web en visualforce pages de Salesforce como HTML, CSS, javascript, mapas y frames. A continuación vamos a entender cuáles son y cómo se utilizan.

Tipos de Contenidos Web en Visualforce

Los tipos de contenido web que pueden ser usados en Visualforce Pages son: HTML, CSS, JAVASCRIPT, IFRAMES y MAPS.

HTML

  • Se puede utilizar el código HTML regular en Visualforce pages. Por Ejemplo: <html>, <body>, <head> y <h1>.
  • Además, podemos generar automáticamente las etiquetas HTML en Visualforce.
  • Se pueden anular las etiquetas HTML.
  • Por último, se puede incluir CSS en línea dentro de las etiquetas HTML.

CSS

  • Pueden utilizarse mediante la etiqueta <apex:stylesheet>.
  • Podemos utilizar código css llamando a la variable $Resource. Por ejemplo: <apex:stylesheet value=”{!$Resource.customStyleSheet}” />
  • Así mismo, el atributo styleClass define las clases de estilo en las etiquetas. Por ejemplo: <apex:outputPanel styleClass=”dataTable”>
  • El atributo style permite configurar los estilos directamente. Por Ejemplo: <p style=”margin: 5px;”>

Javascript

  • Javascript puede ser incluido utilizando <apex:includescript>. Por ejemplo: <apex:includescript value=”{!$Resource.JavascriptFile}” />
  • La etiqueta <script> puede ser utilizada para acceder a funciones de javascript.
  • Se pueden utilizar las variables $Resource para acceder a los archivos de javascript.
  • Debemos subir como recursos estáticos los archivos javascript a utilizar.

Mapas e Iframes

  • Para mostrar mapas se puede utilizar el componente <apex:map>
  • Además, se pueden utilizar marcadores con la etiqueta <apex:mapMarker>
  • Para mostrar páginas web externas se pueden utilizar iframes con la etiqueta <apex:iframe>. Por ejemplo: <apex:iframe src=”https:://www.wikipedia.org” />

Recursos Estáticos (Static Resources)

  • Son utilizados para almacenar archivos y ser referenciados en Visualforce pages.
  • Pueden incluir imágenes, stylesheets, javascript y librerias.

Finalmente, para saber más sobre contenidos web en visualforce de Salesforce:

Si quieres saber más sobre Salesforce puedes ir a:

Controladores de una Visualforce Page

Los Controladores de una Visualforce Page son la parte lógica que debemos conocer para crear y manejar aplicaciones de calidad.

Tipos de Controladores

Controladores Estándar

  • Los controladores estándar son utilizados para gestionar objetos personalizados y por defecto.
  • Contiene la funcionalidad y la lógica utilizada por las páginas estándar de Salesforce (standard Salesforce pages).
  • Se incluyen en la etiqueta apex:page de la siguiente manera: <apex:page standardController=”Account”>
  • Se pueden acceder a sus valores mediante force.com API como {! Account.Name }
<!-- Visualforce Page Example -->
<apex:page standardController="Account">
  Name: {! Account.Name }
</apex:page>

Controladores Personalizados

  • Pueden ser utilizados para sobrescribir funcionalidad, navegación y llamadas a web services.
  • Utiliza su constructor por defecto, sin argumentos, es decir, sin parámetros.
  • Los métodos de un controlador estándar pueden ser getters, setters y acciones.
//MyCustom Controller
public class MyCustomController {
    Account acc;
    
    public MyCustomController () {
      acc = [SELECT Id, Name FROM Account
               WHERE Id =: ApexPages.currentPage().getParameters().get('id')];    
    }
    
    public Account getAccount () {
      return acc;
    }
}
<!-- Visualforce page -->
<apex:page controller="MyCustomController">
  <apex:pageBlock>
    <apex:pageBlockSection>
      <apex:pageBlockTable value="{! account }" var="acc">
        <apex:column value="{! acc.Id }" />
        <apex:column value="{! acc.Name }"/>
      </apex:pageBlockTable>
    </apex:pageBlockSection>
  </apex:pageBlock>
</apex:page>

Métodos Getter

  • Cada valor calculado y por mostrar en una visualforce page debe tener un método getter en el controlador.
  • Los nombre de los métodos getter deben tener siempre el prefijo get en el inicio. Por ejemplo: getAccounts.
  • Con el markup {! nombre_de_expresion } se puede conectar automáticamente una visualforce page con el método getter. Por Ejemplo: {! accounts } se conecta con el método getter getAccounts.
  • Los métodos getter no tienen parámetros pero si deben retornar un objeto.
  • Deben tener por lo menos un nivel de acceso público (Public access level).
  • Un método getter es requerido para acceder a los datos de un objeto desde un controlador a una visualforce page.
  • Un método getter puede obtener datos utilizando consultas SOQL.
//Getter example code
public class MyCustomController {
  Account acc;
  
  public Account getAccount () {
    return acc;
  }
}

Métodos Setter

  • Son utilizados para enviar datos desde una visualforce page hacia el controlador.
  • Los métodos setter no son requeridos.
  • Estos métodos son ejecutados automáticamente antes de los métodos acciones.
  • Su nombre deben empezar con el prefijo set. Por ejemplo: setVariable, el valor de variable debe ser obtenido desde una visualforce page.
  • Deben tener por lo menos un nivel de acceso público.
  • El método setter tiene un parámetro y no retorna ningún valor.
//Setter example code
public class MyCustomController {
  Account acc;
  String accountName;
    
  public Account getAccount () {
    acc = [SELECT Id, Name FROM Account 
              WHERE Id =: ApexPages.currentPage().getParameters().get('id')];
    return acc;
  }

  public String getAccountName () {
    return accountName;
  }
  //Setter Method
  public void setAccountName(String value) {
    accountName = value;
  }
  
  public PageReference save () {
    acc.Name = accountName;
    update acc;
    return null;
  }
}
<!-- Setter visualforce page example -->
<apex:page controller="MyCustomController">
  <apex:form>
    <apex:outputLabel value="Enter account: " />
    <apex:inputText value="{!accountName}" />
    <apex:commandButton value="Save" action="{!Save}" /> <p/>
    <apex:outputText value="Account Name entered: {!accountName}" />
  </apex:form>
</apex:page>

Propiedades para utilizar métodos Getter y Setter

  • Podemos representar un método get y set con los sentencias get y set. Por ejemplo: public dataType propertyName {get; set;}
  • Si una propiedad tiene una única sentencia get, es de sólo lectura.
  • Si una propiedad tiene una única sentencia set, es de sólo escritura.
  • Las propiedades con sentencias get y set son consideradas de lectura y escritura.
public class MyCustomController {

  public Account acc {get; set;}

  public String accountName {get; set;}

  public String accountPhoneNumber {get;}

  public String accountFile {set;}
  
}

Extensiones de Controladores

Las extensiones de controladores son clases en Apex que pueden extender la funcionalidad de controladores estándares o personalizados.

  • Podemos llamar a una extensión de controladores utilizando la palabra clave extension en la etiqueta <apex:page> de nuestra visualforce page.
  • Se pueden utilizar múltiples extensiones de controladores en una visualforce page separándolos por comas.
  • Deben tener un constructor con un sólo argumento del tipo ApexPages.StandardController para inicializar sus valores.
public class MyControllerExtension {

  private final Account acc;

  public MyControllerExtension(ApexPages.StandardController stdController) {
    this.acc = (Account)stdController.getRecord();
  }

  public String getGreeting () {
    return 'This is a greeting message for: ' + this.acc.Name;
  }
  
}
<apex:page standardController="Account" extensions="MyControllerExtension">
  <h2>{!greeting}</h2>
  <p>
    <apex:form>
      <p><apex:inputField value="{!account.name}"/></p>
      <apex:commandButton value="Save" action="{!save}"/>
    </apex:form>
  </p>
</apex:page>
Visualforce page result

Para saber más sobre Controladores, Getters y Setters puedes ir a:

Para saber más sobre Salesforce:

Todo lo que deberías saber sobre Excepciones de Apex en Salesforce

¿Por qué usar excepciones?

Las excepciones son causadas por errores encontrados cuando ejecutamos código que interrumpe su flujo normal de ejecución.

Se utilizan para recuperarse de los errores, gestionarlos y asegurarnos de una apropiada ejecución del código.

Tipos de Excepciones

Excepciones Nativas: 

  • Apex ofrece un framework nativo para gestionar excepciones por default.
  • Suceden cuando se interrumpe el flujo del programa automáticamente por el sistema.
  • Pueden haber múltiples bloques “Catch”. Sin embargo, la excepción genérica debe ser la última.
  • El bloque Finally es ejecutado cuando la excepción sucede o no. Además, se utiliza regularmente para hacer limpieza de variables o código.
Default Exception

Excepciones Personalizadas:

  • Para interrumpir el flujo del programa y gestionar los errores en cualquier parte del código.
  • Para manejar excepciones de manera más detallada.
  • Para crear una excepción personalizada se debe extender a la clase “Exception”.
  • El nombre de nuestra clase personalizada debe terminar con la palabra “Exception”. Por ejemplo: “PurchaseException” o “CustomException”.

Métodos de Excepciones: 

Métodos Comunes

  • getTypeName(): Devuelve el tipo de excepción.
  • getMessage(): Para obtener el mensaje del error.
  • getCause(): Devuelve la causa de la excepción.
  • getLineNumber(): Para devolver la línea en donde ocurre la excepción.

Otros Métodos

  • getDmlFieldNames: Nombre de los campos que causan el error.
  • getDmlId: Id de los registros fallidos que causan el error.
  • getDmlMessage: El error del mensaje por un registro fallido específico.
  • getNumDml: Devuelve el número de registros fallidos.

Consideraciones sobre Excepciones

Excepciones Gestionables: 

  • addError(): Para revertir DML operaciones y retornar el error en un trigger.
  • ApexPages.message(msg): Para mostrar los errores en un visualforce page.
  • Clase “Messaging”: Para devolver errores vía e-mail. 

Excepciones no Gestionables: 

  • LimitExceptions no pueden ser manejables. 
  • Los errores de Assertion no pueden ser gestionables.

¿Alguna vez te has preguntado si realmente estás innovando?

¿Los proyectos en los que participamos son realmente innovadores? Comencemos por responder la siguiente pregunta: ¿Qué es la innovación?

Según el libro “Como trabaja Google” de Schmidt y Rosenberg: “La innovación abarca tanto la producción como la implementación de ideas novedosas y útiles”.

Con novedoso se refiere a crear una nueva funcionalidad que sea sorprendente, por lo tanto, no solamente en responder a la necesidad de un cliente o usuario.

Por otro lado, esta idea debe ser radicalmente útil, es decir, no basta con resolver pequeñas necesidades.

En otras palabras, para que algo sea innovador, según los autores mencionados, nuestra idea debe ser “Nueva, sorprendente y radicalmente útil“.

Entonces, ¿Tu proyecto es realmente innovador?¿Qué necesitas para que sea nuevo, sorprendente y muy útil? Compártelo en los comentarios.

Fuente: Cómo trabaja google – Eric Schmidt & Jonathan Rosenberg.

¿Qué es la arquitectura MVC en Salesforce?

¿Sabías que conociendo los elementos que componen la arquitectura MVC en Salesforce puedes programar mejor en esta plataforma?

MVC es un patrón de arquitectura de software que divide los datos de una aplicación en capas según su estructura (Modelo), lógica (Controlador) y forma de presentación de datos (Vista). 

Los elementos de Salesforce se pueden clasificar en las diferentes capas de la arquitectura MVC de la siguiente manera: 

Modelo: 

  • Objetos estándares y personalizados.
  • Campos de objetos.
  • Relaciones de objetos o Lookups.
  • Clases en Apex para representar datos.

Vista: 

  • Páginas estándar.
  • Visualforce Pages.
  • Componentes.
  • Layouts y Tabs.

Controlador: 

  • Controladores estándar y personalizados con Apex.
  • Herencia (Extends) 
  • Reglas y Herramientas declarativas: Validation Rules, Flows, Triggers, Process, etc.

Teniendo en cuenta los elementos que componen cada capa de la arquitectura MVC en Salesforce, podemos incrementar nuestro conocimiento para desarrollar en esta plataforma, sobre todo al empezar. ¿Cuál es tu opinión sobre este tema?