0

私は午前中ずっとこれに取り組んできましたが、終わりがありません。Salesforce.com で OnClick Java を使用するボタンを実行しようとしていますが、エラーが発生し続けます。テキストだけを使用すると機能するため、データ内の特殊文字に問題がある可能性があると思います。しかし、数字や特殊文字が存在するたびに、「unexpected token ILLEGAL」というエラーが表示されます。私が間違っていることと、特殊文字が関係しているときに失敗から逃れる方法を理解するのを手伝ってくれる人はいますか?

{!REQUIRESCRIPT("/soap/ajax/28.0/connection.js")} 


var opptyObj = new sforce.SObject("Opportunity");
var caseObj = new sforce.SObject("Case");
var today = new Date();
var sOpptyId = "{!Case.Opportunity__c}";

if( sOpptyId != "")
{ 
alert("This case is already tied to an opportunity!");
} 
else
{ 
opptyObj.AccountId = "{!Case.AccountId}";
opptyObj.CloseDate = sforce.internal.dateTimeToString(today);
opptyObj.Description="{!Case.Description}";
opptyObj.Case__c = "{!Case.Id}";
opptyObj.Name = "{!Case.Subject}";
opptyObj.StageName = "Estimate in Progress";
opptyObj.Created_from_Case__c = "Y";
opptyObj.Type = "New Business";
opptyObj.Amount = ".01";

var opptyresult = sforce.connection.create([opptyObj]);

if (opptyresult[0].success=='false') 
{ 
alert("Opportunity creation failed: " + opptyresult[0].errors.message);
} 
else 
{ 
caseObj.Id = '{!Case.Id}';
caseObj.Opportunity__c = opptyresult[0].id;
caseObj.Status = "Estimate in Progress";

var caseResult = sforce.connection.update([caseObj]);

if(caseResult[0].success == 'false') 
{ 
alert("Case update failed: " + caseResult[0].errors.message);
} 
else 
{ 
alert("An opportunity has been created and linked to this case.");
location.reload(true);
} 
} 
}
4

1 に答える 1

0

これがある種のテンプレートであると仮定すると、これをレンダリングするものは何でも、挿入する文字列の一部の値を適切にエスケープする必要があります。

これを考えると:

opptyObj.Description="{!Case.Description}";

これで構成される説明を入力するとします。

「それはすごい」とジョンは言った。

それがテンプレートでレンダリングされると、結果は次のようになります。

opptyObj.Description=""That is awesome," said John.";

ご覧のとおり、結果は構文エラーです。

この方法で挿入されたテキストでは、引用符をエスケープする必要があります。そして、このテンプレートをレンダリングするテクノロジーが何であるかを知らなければ、具体的なことは言えませんが、 と を に置き換えたいと考え"てい\"ます。エスケープ文字は、他の特別な意味ではなく、文字列内のリテラル文字として扱われることを強制します。'\'\

これは、スクリプトに挿入されているときに実行する必要があります。これの精神の何か:

opptyObj.Description="{!Case.Description.replace(/'/, "\\'").replace(/"/, '\\"')}

正確な方法は、ここで使用されている言語またはテンプレート エンジンによって異なります。しかし、結果は次のようになります。

opptyObj.Description="\"That is awesome,\" said John.";

Ruby on Railsは、 Javascript への注入のためにデータをサニタイズするメソッドを実装しています。escape_javascript以下の置換を行います。良いベースラインのようです。

  • '\\'=>'\\\\'
  • '</'=>'<\/'
  • "\r\n"=>'\n'
  • "\n"=>'\n'
  • "\r"=>'\n'
  • '"'=>'\\"'
  • "'"=>"\\'"

アップデート:

これによると:http://www.salesforce.com/us/developer/docs/pages/Content/pages_security_tips_scontrols.htm

機能が欲しいようですJSENCODE。もしかして、こういうこと?

opptyObj.Description="{!JSENCODE(Case.Description)}";
于 2013-07-25T18:26:29.727 に答える