オポチュニティの詳細ページに埋め込まれているVisualforceページがあります。
ページ内には、バッキングコントローラー拡張機能のメソッドを呼び出すコマンドボタンがあります。
バッキング方法が完了したら、どうすればユーザーを別のページにリダイレクトできますか?
メソッドからPageReferenceを返すことはできますが、埋め込まれたVisualforceページが表示されているiframeのみがリダイレクトされます。
理想的には最上位のウィンドウを更新したいのですが、埋め込まれたVisualforceページが親ウィンドウと同じドメインにない場合、クロスドメインの問題があるのではないかと心配しています。
の基本的なテストとして、埋め込みVisualforceページに以下を追加してみました。
<script>
window.setTimeout(testRedirect,2000);
function testRedirect() {
top.location.reload();
}
</script>
これにより、Chromeエラーがログに記録されます:
安全でないJavaScriptがURLのあるフレームにアクセスしようとする https://na2.salesforce.com/0064000000000 URLのあるフレームから https://ab2.na2.visual.force.com/servlet/ servlet.Integration?lid = 066400000000000&ic = 1 。ドメイン、プロトコル、ポートが一致している必要があります。
そのため、Visualforceページではドメインが異なります。
少しコードが増えますが、これはすべてのブラウザーで機能し、クロスドメインエラーは発生しません。
コントローラ拡張:
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ページ:
<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>
PageReference クラスを使用して試してください
さらに、setRedirectが役立ちます
サンプル:
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;
}
}