2012-07-19 19 views
12

Tengo una página de Visualforce que está incrustada en la página de detalles de Oportunidades.Página de Visualforce incrustada en una página de detalles que debe redirigir a otra página

Dentro de la página hay un botón de comando que invoca un método en la extensión del controlador de respaldo.

Una vez que se completa el método de respaldo, ¿cómo puedo redirigir al usuario a otra página?

puedo devolver un PageReference del método, sino que sólo volverá a dirigir el iframe que la página incrustada Visualforce se muestra en.

Lo ideal sería que actualizar la ventana de nivel superior pero me preocupa que hay pueden ser problemas de dominio cruzado si la página de fuerza visual incrustada no está en el mismo dominio que la ventana principal.


Como una prueba básica en He intentado añadir lo siguiente a la página Visualforce incrustado:

<script> 
    window.setTimeout(testRedirect,2000); 
    function testRedirect() { 
     top.location.reload(); 
    } 
</script> 

Esto dio lugar a Chrome tala de error:

Unsafe JavaScript attempt to access frame with URL https://na2.salesforce.com/006400000000000 from frame with URL https://ab2.na2.visual.force.com/servlet/servlet.Integration?lid=066400000000000&ic=1 . Domains, protocols and ports must match.

Así que los dominios son diferentes para la página de Visualforce.

+1

Busco a utilizar esto como parte de la solución para mi [Personalizado segura CSRF botón vinculado al método Apex] (http://stackoverflow.com/questions/10809520/csrf-safe-custom-button-linked-to-apex-method/11006021#11006021) pregunta. Puede ser que necesite usar un apex: actionFunction con algunos javascript para cambiar 'window.top.location.href' al finalizar. –

+0

Hola Daniel, a menos que alguien tenga algunas tácticas súper astutas, creo que no tendrás suerte con esto: el problema es que las páginas de la fuerza visual integradas se sirven desde un dominio diferente, por lo que estás sujeto a la protección XSS del navegador . ¡Espero que alguien me demuestre que estoy equivocado y encuentre la manera de hacer que esto funcione para usted! –

Respuesta

13

Es un poco más código, pero esto funciona para mí en toda navegadores, y no estoy recibiendo ningún tipo de error entre dominios.

de extensión del mando:

public class Opp_Ext { 
    private ApexPages.StandardController stdController; 
    public String redirectUrl {public get; private set;} 
    public Boolean shouldRedirect {public get; private set;} 

    public Opp_Ext(ApexPages.StandardController stdController) { 
     this.stdController = stdController; 
     shouldRedirect = false; 
    } 

    public PageReference doStuffAndRedirect() { 
     shouldRedirect = true; 
     redirectUrl = stdController.view().getUrl(); 
     return null; 
    } 
} 

VF Página:

<apex:page standardController="Opportunity" extensions="Opp_Ext" > 
    <apex:form > 
     <apex:commandButton value="Do Stuff" action="{!doStuffAndRedirect}" rerender="redirectPanel" /> 
     <apex:outputPanel id="redirectPanel" > 
      <apex:outputText rendered="{!shouldRedirect}"> 
       <script type="text/javascript"> 
        window.top.location.href = '{!redirectUrl}'; 
       </script> 
      </apex:outputText> 
     </apex:outputPanel> 
    </apex:form> 
</apex:page> 
+0

Genial, gracias. Supongo que el punto clave es que la asignación a window.top.location.href está permitida en todos los dominios. Entonces solo se trata de renderizar el Javascript correcto después de presionar el botón.Terminé con algo similar a esto, pero el tuyo es mejor con el JavaScript que solo se envía al cliente después de presionar el botón. –

+0

He vuelto a esto y se me ocurrió una solución similar si la URL para redirigir se conoce de antemano. Consulte [PáginaReferencia de la página de Visualforce incrustada se convierte en línea] (http://salesforce.stackexchange.com/questions/11158/pagereference-from-embedded-visualforce-page-becomes) –

+0

¡increíble! gracias :) –

0

Intenta utilizando PageReference Clase

Además setRedirect será útil

muestra:

public class mySecondController { 
Account account; 

public Account getAccount() { 
    if(account == null) account = new Account(); 
    return account; 
} 

public PageReference save() { 
    // Add the account to the database. 

    insert account; 
    // Send the user to the detail page for the new account. 

    PageReference acctPage = new ApexPages.StandardController(account).view(); 
    acctPage.setRedirect(true); 
    return acctPage; 
} 

}

+2

Estaba pensando en esto originalmente, pero solo carga el diseño de la página Oportunidad dentro del mini iframe en el que está incrustada la página de VF. – JCD

+0

Establezca el destino del comandoLink/commandButton en "_top" y cargará la página en el marco superior , es decir, la ventana completa. –

0

Es necesario utilizar oncomplete = "window.top.location.href = '{!'/'+obj.id}';"

+0

Proporcione más explicaciones sobre cómo y dónde usar. Las respuestas de solo código son desaprobadas, por ejemplo, alguien que lee las respuestas rápidamente no puede determinar qué está haciendo su solución o cómo usarla. – clearlight

Cuestiones relacionadas