function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
yonet77yonet77 

遷移先の画面にメッセージを埋め込む方法

初めて投稿します。

 

拡張コントローラ内の処理で、遷移先の画面に警告メッセージを埋め込むことは可能でしょうか?

※なお、遷移先の画面は、標準の画面です。

今考えているコードは以下のような感じですが・・この場合、遷移先の画面にメッセージが表示されません。

 

 

public PageReference aaaa(){

  if(xxxx){
    // 警告メッセージをセット
    ApexPages.Message msg = new ApexPages.Message(ApexPages.Severity.WARNING, 'xxxxx');
    ApexPages.addMessage(msg);

    // 遷移先画面を指定
    PageReference page = new ApexPages.StandardController(xxx).view();
    page.setRedirect(true);

    return page;
  }
}

遷移した後に、何かしらメッセージを通知できれば良いのですが・・解決方法がありましたら、ご教示お願いします。

 

どうぞよろしくお願いします。

 

tajimatajima

原因はPageReferenceに setRedirect(true); を設定しているためですね。

これを指定していると次のページへは新しいリクエストとして処理されるため、前のリクエストで設定されたメッセージが引き継がれません。

setRedirect(true)の指定をやめるか、別の方法(たとえば、リクエストパラメータでメッセージ文字列を渡し、次のページのコントローラでMessageにセットする、等)を考えるしかありません。

 

yonet77yonet77

返信、ありがとうございます!

 

ただ、setRedirect に false を指定しても、遷移先の画面にメッセージを表示できませんでした。。

 

setRedirect(false); を実行しているコントローラは、当方で作成したカスタムオブジェクトの標準コントローラを拡張した拡張コントローラで、遷移先画面は、そのカスタムオブジェクトの標準画面となるのですが、

拡張コントローラによるVisualforceページ ⇒ 標準コントローラによる標準画面 に遷移する場合、

ApexPages.Message は引き継がれないのでしょうか?

yonet77yonet77

たびたびですみません。もう少し詳細な情報を以下に記載します。

--

カスタムボタンをクリックした際に、何かしらのロジックを実行し、併せて画面遷移を行いたいため、以下(※1)のような構成にしており、このような処理の流れを想定しています。

※遷移先のVisualforceページは、実際には表示されないまま、doActionメソッド内で指定した画面に遷移する想定です。

 

1.標準画面に追加したカスタムボタンをクリックする

2.Foo.pageをコールする

3.Foo.pageをレンダリングする前に、HogeControllerのdoActionを実行する

4.doAction内で指定した別の標準画面に遷移する

※doAction内でメッセージを追加している場合には、そのメッセージを画面に表示させたい。

⇒ただ、実際には、画面にメッセージは表示されません。。。。

 

Foo.pageをレンダリングする前に、HogeControllerのdoAction内で、メッセージを作成・追加するあたりに無理があるのでしょうか・・?

何かしらアドバイスを頂けると、大変助かります。何卒よろしくお願いします。

 

 

(※1)

■(CustomObject)におけるカスタムボタンの設定

動作:現在のウィンドウにサイドバーなしで表示

内容のソース:Visualforceページ

コンテンツ:Foo

 

 

■遷移先のVisualforceページ(ページ名:Foo.page)

 

<apex:page standardController="(CustomObject)" extensions="HogeController" action="{!doAction}">
</apex:page>

 

■拡張コントローラ (HogeController)

 

public with sharing class HogeController {
  private (CustomObject) stdObj;

  public HogeController(ApexPages.StandardController stdCon){
    this.stdObj = [(SOQLクエリ)];
  }

  public PageReference doAction(){

    if(xxxx == false){
      // 警告メッセージをセット
      ApexPages.Message msg = new ApexPages.Message(ApexPages.Severity.WARNING, 'error..');
      ApexPages.addMessage(msg);

      // 遷移先画面を指定
      PageReference page = new ApexPages.StandardController(stdObj).view();
      page.setRedirect(false);

      return page;
    }

    (..何かしらの業務ロジック処理..)
    insert newObj;

    PageReference nextPage = new ApexPages.StandardController(newObj).view();
    nextPage.setRedirect(false);
    return nextPage;
  }
}

 

 

 

tajimatajima

遷移先がVisualforceページではなく、標準画面なのですね。

 

 

ApexPages.addMessage(msg);はVisualforceでしか利用できません。
標準画面でエラーメッセージを表示させたいのであれば、
sObjectに対してaddError('エラーメッセージ'); としてください。
stdObj.addError('error..');

 

ApexPages.addMessage(msg);はVisualforceでしか利用できません。

標準画面でエラーメッセージを表示させたいのであれば、sObjectに対してaddError('エラーメッセージ'); としてください。

 

 

 

stdObj.addError('error..');

 



 

yonet77yonet77

ご返信、ありがとうございます!

 

sObjectに対して、addError でエラーメッセージを追加するよう修正しても、遷移先画面でメッセージ通知はできませんでした。。

addError でエラーメッセージを追加する場合、ApexPages.StandardController(stdObj).view() と「view()」を指定しているのが問題なのか・・?と思って、「edit()」を指定しても結果は変わらずでした。

デバッグログを見る限りでは、メッセージは追加されているようですが、遷移先画面で表示されないようです。

 

addError でエラーメッセージを追加する場合も、Visualforceでしか利用できない、といった制約がありますでしょうか?

上記のような制約があるのであれば、カスタムボタンでJavascriptを実行するよう変更しようかと思います。

 

何度も質問して恐縮ですが、アドバイス等頂けると幸いです。 どうぞよろしくお願いします。

 

(以下、修正したコードです。ご参考までです。)

public with sharing class HogeController {
  private (CustomObject) stdObj;

  public HogeController(ApexPages.StandardController stdCon){
    this.stdObj = [(SOQLクエリ)];
  }

  public PageReference doAction(){

    if(xxxx == false){
      // エラーメッセージをオブジェクトに追加
      stdObj.addError('Error...');

      // 遷移先画面を指定
      PageReference page = new ApexPages.StandardController(stdObj).view();
      page.setRedirect(false);

      return page;
    }

    (..何かしらの業務ロジック処理..)
    insert newObj;

    PageReference nextPage = new ApexPages.StandardController(newObj).view();
    nextPage.setRedirect(false);
    return nextPage;
  }
}