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
masakomasako 

メッセージボックスの表示

いつもお世話になっております。

 

ファイルアップロード画面とアップロードしたファイルのダウンロード画面を作っています。

ファイルダウンロード部分を、ダウンロードファイル名称(リンクで作成)をクリックするとダウンロードするのですが、

ファイル名称をクリックした時に、VBでいうメッセージボックスのOK / キャンセル、 はい / いいえ のようなメッセージを

ワンクッション入れたいと考えております。

 

Salesforce側?もしくは、JavaScript側での実装になるのでしょうか。。。

ご存知の方いらっしゃいましたら、実装方法、またはアドバイスお願いいたします。

 

 

 

ikouikou

単純なのはJavaScriptのconfirmかな。

masakomasako

 

ikou様

回答ありがとうございます。

 

JavaScriptのconfirmを使ってみたのですが、メッセージボックスが表示されずにそのままダウンロードが走ってしまいました。

元のソースが、

 【Visualforce】

<apex:outputLink value="https://c.na7.content.force.com/servlet/servlet.FileDownload?file={!d.Id}" 
 onclick="window.open('https://c.na7.content.force.com/servlet/servlet.FileDownload?file={!d.Id}', '', 'width=500,height=400'); return false;">
<apex:outputField value="{!d.Name}" />
</apex:outputLink>

 【Visualforce+JavaScript】

 

<apex:outputLink value="https://c.na7.content.force.com/servlet/servlet.FileDownload?file={!d.Id}" 
onclick="selDoc()" >
<apex:outputField value="{!d.Name}" />
</apex:outputLink>

function selDoc(){
myRet = confirm("ファイルをダウンロードします。よろしいですか?");
 if ( myRet == true ){
 // ファイルダウンロード
 }
}

confirmを調べて試してみたのですが、ファイルダウンロード部分の記述がわかりません。

元のonclick部分の記述のwindow.openを記述すれば良いと思うのですが、ドキュメントオブジェクトのIdをどのようにしてJavaScript側に渡したら良いのでしょうか?

 

もし、上記の考え方自体も違うようでしたら、合わせて教えていただけないでしょうか?

よろしくお願いいたします。

ikouikou

これでどうでしょう?

 

<apex:outputLink onclick="selDoc()" >
<apex:outputField value="{!d.Name}" />
</apex:outputLink>

function selDoc(){
myRet = confirm("ファイルをダウンロードします。よろしいですか?");
 if ( myRet == true ){
   window.open('/servlet/servlet.FileDownload?file={!d.Id}');
 }
}

 余談ですがSF内へのリンクはhttpからのフルパスじゃない方がいいですよ。

Sandboxとか作成した時にurlが異なってきますんで。

masakomasako

ありがとうございます。

 

なんとかここからは、自分で解決しようと思ったのですが、わからないので申し訳ございませんが教えて下さい。

 

プログラムの方、修正してみたのですが「構文エラー」になってしまいました。

下記の記述で試したところ、構文エラーにはなりませんでした。

 

window.open('/servlet/servlet.FileDownload?');

 

他にも、↓も試してみたのですが、リンクをクリックした時に「URL No Longer Exists」のエラーが出てしまいました。

 

<apex:outputLink onclick="selDoc({!d.Id})">
 <apex:outputField value="{!d.Name}" />
</apex:outputLink>

function selDoc(doc){
myRet = confirm("ファイルをダウンロードします。よろしいですか?");
 if ( myRet == true ){
   window.open('/servlet/servlet.FileDownload?file=doc');
 }
}

  

「 file={!​d.Id}」 部分の記述の問題かと思うのですが、どのように修正したら良いのかわかりません。

 

申し訳ございませんが、よろしくお願いいたします。

 

> 余談ですがSF内へのリンクはhttpからのフルパスじゃない方がいいですよ。

 

こちらもアドバイス、ありがとうございます。

ikouikou

file={!d.Id}は実行時にfile=xxxxxxxxxxxxxxxというSalesforceのIdにならなくてはいけません。

ダウンロードするファイルが固定ならばカスタム表示ラベルにでもIdを入れておけばいいでしょう。

検索したファイルをダウンロードする、というように動的に変わるのであれば、コントローラー側でちゃんとdにDocumentをセットしてください。

 

 

Controller

public class myController{

  //ページからのアクセス用(変数名はちゃんと考えてください!)
  public Document d {get; set;}

  // Documentの取得タイミングが分からないので、コンストラクタにしてあります
  public myController(){
    // 検索条件が不明なので、適当な1件を取ってきてページからのアクセス用変数に入れる
    this.d = [SELECT Id FROM Document Limit 1];
  }

}

 

Page

<apex:page controller="myController">

  <apex:outputlink onclick="selDoc()">{!d.Name}</apex:outputlink>
  <script>
    function selDoc(){
      myRet = confirm("ファイルをダウンロードします。よろしいですか?");
     if ( myRet == true ){
       window.open("/servlet/servlet.FileDownload?file={!d.id}");
     }
    }
  </script>
</apex:page>

 

こんなんでどうでしょう。

masakomasako

 ikou様、ありがとうございます。

 

ファイルダウンロードは、動的に変わるものを作っております。

 

作成中のプログラムを変更してみたのですが、「構文エラー」になってしまいましたので、

上記のコントローラー、Pageのみで確認してみたのですが、同じ「構文エラー」になってしまい上手く行きませんでした。

 

window.open("/servlet/servlet.FileDownload?file={!​d.id}");

(動的にIdを変えるようにしたいのですが、念の為、下記でも確認してみました。)

 

の部分をxxxxxxxxxxx部分には、存在するDocument.Id を記述するとコンパイルOK.

window.open("/servlet/servlet.FileDownload?file=xxxxxxxx");

 

そのまま実行し、リンク部分( {!d.Name} ) をクリックすると、JavaScriptの「ファイルをダウンロードしてよろしいですか~?・・・」が表示され、

「いいえ」を選択 ⇒ エラー URL No Longer Exists・・・

「はい」 を選択 ⇒ 別ウィンドウで正常にダウンロード、表示できるが元の画面で 同じエラー(URL No Longer Exists・・・・)

が表示されています。

 

原因が全然わからず、申し訳ございませんがよろしくお願いいたします。

ikouikou

私が書いたサンプルは、ControllerのクエリにName項目が足りないので実行時エラーになっていました。

正しくは以下ですね。

 

Controller

public class myController{

  //ページからのアクセス用(変数名はちゃんと考えてください!)
  public Document d {get; set;}

  // Documentの取得タイミングが分からないので、コンストラクタにしてあります
  public myController(){
    // 検索条件が不明なので、適当な1件を取ってきてページからのアクセス用変数に入れる
    this.d = [SELECT Name, Id FROM Document Limit 1];
  }

}

 

Page

<apex:page controller="myController">

  <apex:outputlink onclick="selDoc()">{!d.Name}</apex:outputlink>
  <script>
    function selDoc(){
      myRet = confirm("ファイルをダウンロードします。よろしいですか?");
     if ( myRet == true ){
       window.open("/servlet/servlet.FileDownload?file={!d.id}");
     }
    }
  </script>
</apex:page>

 

これを新規のクラス、ページとして保存してもコンパイルエラーが出ますか?

エラーが出るのはPageですか?Controllerですか?なんというエラーメッセージが出てますか?

私の環境ではちゃんと保存できますが。。

masakomasako

私の前のコメントで、Name を追加して試しましたが、前コメントの状況でした・・・。

 

因みにエラーは、page側でのエラーで、エラー内容は

Save error::構文エラー

 

で、{! d.Id} 部分に存在するId をそのまま記述すると、構文エラーは消えます。

 

実行結果は、前コメントの様な動きです。

もう一度、Page、Controller を新規で作り直しましたが、変わらず構文エラーでした。

 

ikou様の環境で 正常に保存出来ると言うことは、私の環境の問題ですね・・・

(別件で、一部ソースが表示されなかった為、昨日一度プロジェクトも削除してサーバーから取り直したのですが、

こちらも解決せず・・・、この件の構文エラーも変わらず。)

ikouikou

うーん、分からない。。。

このコードだと実行時エラーになる可能性はありますが、コンパイルのエラーとは・・・

標準オブジェクトのDocumentしか使ってないし、組織依存するような書き方じゃないんだけどな。

 

とりあえず{!d.id}の意味について分かりそうなページはこちらにあるので見てみてください。

(私のサンプルのgetterは省略形で書いてます)

あとはEclipseを使ってエラーが出ているなら、設定メニューの開発画面、または開発者モードにして作成してみてどうなるかとか・・

 

それでもダメなら私にはお手上げです!

masakomasako

原因がわからないままですが、とりあえず現状わかってる事を記述しておきます。 

 

私の環境:Force.com IDE 20.0

 

試しにブラウザから直接、新規でController、Pageを保存しましたが、こちらでも恐らく同じヶ所でエラーになっています。

Error:構文エラー

同様に、下記の部分を削除すると正常に保存できます。

window.open("/servlet/servlet.FileDownload?file={!​d.id}");

 

他の環境から試したところ、コンパイルエラーは発生しませんでした。

ikou様が載せていただいたコードを保存&実行してみたところ、

 

リンククリック後、JavaScriptの「ファイルをダウンロードしてよろしいですか?・・・」 表示後、

chromeブラウザ ⇒ 正常

    「はい」  ⇒ 正常な動き

    「いいえ」 ⇒ 正常な動き

 IE

    「はい」 ⇒ 別ウィンドウで正常にタウンロード、表示できるが元の画面でエラー(URL No Longer Exists・・・)

    「いいえ」 ⇒ エラー URL No Longer Exists・・・

 

IE での実行後のエラーは、私の環境(IE8)、他の環境(こちらのバージョン未確認)でも起きました。

コンパイルエラーの原因はわかりませんが、ブラウザの方でも問題が起きておりますので、この(メッセージ表示)件について少し検討しようかと思います。

 

何か分かりましたら、こちらで報告したいと思いますのでとりあえずクローズで。

 

お忙しい中、長々とお付き合い頂きありがとうございました。

また何かありましたらよろしくお願いいたします。