Loading
Ampliar Salesforce con clics, no con programación
Páginas de Visualforce como acciones personalizadas específicas de objeto

Páginas de Visualforce como acciones personalizadas específicas de objeto

Una página de Visualforce agregada como acción personalizada en un objeto se invoca en el contexto de un registro de ese tipo de objeto. Se asigna un Id. de registro específico a la acción personalizada: el registro consultado por el usuario al hacer clic en la acción personalizada. Diseñe la página para trabajar en ese tipo de registro específico.

Ediciones necesarias

Disponible en: Salesforce Classic y Lightning Experience
Disponible en: Group Edition, Professional Edition, Enterprise Edition, Performance Edition, Unlimited Edition, Contact Manager Edition, Database.com Edition y Developer Edition

Las páginas de Visualforce que cree para utilizarlas como acciones específicas de objeto deben utilizar un controlador de objetos estándar. Utilice extensiones de controlador para agregar códigos personalizados, incluyendo métodos de @RemoteAction que puede llamar utilizando Comunicación remota de JavaScript.

Su código personalizado debe hacer algo más que realizar actualizaciones en el registro de origen. Por ejemplo, la acción personalizada Crear pedido rápido busca mercancías coincidentes. Entonces crea una factura y una partida, todo como parte de la creación de un pedido de una pieza. Esta lógica ocurre en el contexto del registro de cuenta de origen, la factura está relacionada con el registro de cuenta donde se ha invocado la acción de pedido rápido.

La siguiente muestra de código presenta una página designada para su uso como acción personalizada en el objeto de cuenta, de modo que utiliza el controlador de cuentas estándar. Esta acción permite que los usuarios creen casos desde páginas de detalles de cuentas y tiene una interfaz de usuario diferente de las acciones de creación estándar.

public with sharing class CreateCaseExtension {
    private final SObject parent;
    public Case theCase {get; set;}
    public String lastError {get; set;}
    
    public CreateCaseExtension2(ApexPages.StandardController controller) {
        parent = controller.getRecord();
        theCase = new Case();
        theCase.accountId = parent.id;
        lastError = '';
    }
      
    public PageReference createCase() {
        createNewCase();
        theCase = new Case();
        theCase.accountId = parent.id;
        return null;
    }
       
     private void createNewCase() {      
        try {
            insert theCase;
            
            FeedItem post = new FeedItem();
            post.ParentId = ApexPages.currentPage().getParameters().get('id');
            post.Body = 'created a case';
            post.type = 'LinkPost'; 
            post.LinkUrl = '/' + theCase.id;
            post.Title = theCase.Subject;
            insert post;
        } catch(System.Exception ex){
           lastError = ex.getMessage();
        }
    }   
}

<apex:page standardcontroller="Account" extensions="CreateCaseExtension" showHeader="false">
    <script type='text/javascript' src='/canvas/sdk/js/publisher.js'/> 
    <style>
        .requiredInput .requiredBlock, .requiredBlock {background-color: white;} 
        .custompubblock div {display: inline-block;} 
        .custompublabel {width:54px;} 
    </style>
    <script> 
        function refreshFeed() { 
            Sfdc.canvas.publisher.publish({name : 'publisher.refresh', payload : {feed:true}}); 
        }
    </script>   
    <div> 
        <apex:form > 
            <apex:actionFunction action="{!createCase}" name="createCase" rerender="out" 
            oncomplete="refreshFeed();"/> 
            <apex:outputPanel id="out" > 
                <div class="custompubblock"> 
                    <div class="custompublabel">Account:</div><apex:inputField value="{!theCase.accountId}" 
                    style="margin-left:0;"/>&nbsp;&nbsp;&nbsp;
                    <div>Contact:&nbsp;</div><apex:inputField value="{!theCase.contactId}" />
                </div>
                <apex:inputField value="{!theCase.description}" style="width:538px;height:92px;margin-top:4px;" />
                <div class="custompubblock" style="margin-top:5px;"> 
                    <div>Status:&nbsp;</div><apex:inputField value="{!theCase.status}" />&nbsp;&nbsp;&nbsp; 
                    <div>Priority:&nbsp;</div><apex:inputField value="{!theCase.priority}" />&nbsp;&nbsp;&nbsp; 
                    <div>Case Origin:&nbsp;</div><apex:inputField value="{!theCase.origin}" /> 
                </div> 
            </apex:outputPanel>
        </apex:form><br/>
        <button type="button" onclick="createCase();" 
        style="position:fixed;bottom:0px;right:0px;padding:5px 10px; 
        font-size:13px; font-weight:bold; line-height: 
        18px;background-color:#0271BF;background-image:-moz-linear-gradient(#2DADDC, #0271BF);background-repeat:repeat-x;border-color:#096EB3;" 
        id="addcasebutton">Create Case</button> 
    </div>  
</apex:page>
Nota
Nota Cuando se le redirige a una URL interna en su organización, el cuadro de diálogo se cierra una vez finalizado o se le desplaza de la página mediante programación. Si configura el redireccionamiento para que apunte a una URL externa, el comportamiento puede variar, ya que se abre una URL externa en una nueva ficha del navegador.

Requisitos para actualizar páginas host

Si desea realizar una acción personalizada global o específica del objeto para actualizar las noticias en tiempo real de la página que las aloja, la página de Visualforce que cree para utilizarla como acción debe:

  • Haga referencia al archivo JavaScript del publicador: <script type='text/javascript' src='/canvas/sdk/js/publisher.js'/>. (La creación de acciones de Visualforce personalizadas no requiere el SDK de Lienzo.)
  • Incluya esta llamada de JavaScript: Sfdc.canvas.publisher.publish({name : 'publisher.refresh', payload : {feed:true}});.
 
Cargando
Salesforce Help | Article