EsyouSystemのてくてくブログ

EsyouSystemの中の人がてくてくしたことを記すブログ

StandardControllerとCustomControllerを一緒に使ったときにハマったこと

題名の通りではあるんですけど、

昨日あったことなので、取れたてホヤホヤです。

 

StandardControllerを指定する際にvisualforceに書くと思いますが、

例えば

 

<apex:page standardController="Account" extensions="HogeController" >

 

とあった場合に

HogeController内でgetRecordをすればAccountの項目が

取得出来るのはご存知かと思いますが、

 

Accountの項目を取得するのではなく、

その一階層下の項目を取得する必要がありました。

 

その場合、私はvisualforceに

 

<apex:inputHidden value="{!accounts.hogehoge__c}"

 

と実装していました。

そうすると、目的の画面を表示し、編集ボタンを押すと

謎のエラーが!

system.security.NoAccessException: hogehogeObject__c の更新アクセスが拒否されました」

 

なんぞーーーーーーーーーーーー

なんぞおおおおおおおおおおおおおお

 

とハマりつつ、Google先生に助けて頂きながら

https://help.salesforce.com/apex/HTViewSolution?id=000002417&language=en_US

結局はこういう場合には、

visualforceでinputHiddenを書いてはいけないというのだけは理解出来ました。

(英語わからないよ・・・)

 

なので、apex:inputHiddenの実装をやめて

カスタムコントローラに、

this.hogeController.addFields(new List<String>{'accounts.hogehoge__c'});

 

と実装することで事なきを得ました。

 

普段スタンダードコントローラを使わないので、結構ビビリましたが

もう大丈夫です(´ー`)

 

以下の2点が問題発生する要因です。

・画面を参照・編集するユーザーのプロファイルがhogeObjectを参照権限のみになっている。

(今回の私のPJの場合は、Accountの画面でhogeObjectは編集する必要がなかった為、この権現で問題なかった)

・動作確認をする際に、システム管理者で行ってしまっていた。

 

これから動作確認する場合には、

使用するユーザーのプロファイルで確認するように気を付けようと思います。