アポイントメントとセッションレポートの2つのカスタムオブジェクトがあります。セッションレポートは、標準のマスターと詳細の関係にあるアポイントメントの子です。さらに、プロファイルStudentがあります。このプロファイルには、予定の読み取り、作成、編集、削除があり、セッションレポートの権限はありません。ユースケースは、学生はアポイントメントを作成できますが、チューターがこのアポイントメント用に作成したセッションレポートを表示できない場合です。
Appointmentオブジェクトに標準レイアウトを使用すると、Appointmentsを表示するときに期待どおりに機能します。つまり、学生は予定フィールドを見ることができ、セッションレポートの関連リストは表示されません。監視する他のすべてのユーザープロファイルは、セッションレポートの関連リストを表示できます。
ただし、標準レイアウトをVisualforceページ自体に置き換えるときに問題が発生しました。
<apex:page standardController="Appointment__c">
<apex:sectionHeader title="{!$ObjectType.Appointment__c.label}" subtitle="{!Appointment__c.Name}"/>
<apex:pageBlock title="{!$ObjectType.Appointment__c.label} Detail">
<apex:pageBlockSection showHeader="false" columns="1">
<apex:outputField value="{!Appointment__c.Tutor_Name__c}"/>
<apex:outputField value="{!Appointment__c.Student_Name__c}"/>
</apex:pageBlockSection>
</apex:pageBlock>
<apex:relatedList list="Session_Reports__r"/>
この新しいページは、少なくともセッションレポートオブジェクトの読み取り権限を持つすべてのユーザーに対して期待どおりに機能します。Studentユーザーにはこのオブジェクトに対する権限がなく、このエラーメッセージを受け取ります
'Session_Reports__r' is not a valid child relationship name for entity Appointment
異なるプロファイルを持つユーザーに対してページを適切に表示できるため、明らかにこの関係が存在します。この失敗の原因となる標準レイアウトとVFページの違いを解決できませんでした。VFページでユーザープロファイルを識別し、その情報を使用してレンダリングを切り替えることができると私に提案されました。ただし、このタイプのアプローチはSalesforceセキュリティモデルの目的を損なうため、このような手法は採用しません。
この方法でapex:relatedListを使用できるようにする必要がありますか?または、VFレンダリングエンジンが関連リストを表示できる場合とできない場合を判断できると誤って想定していましたか?