最善のオプション(アプローチ1)は、フィールドをFieldSetに分割し(Visualforceでのフィールドセットの操作を参照)、それらのFieldSetを使用して表示するフィールドを決定し、特定のFieldSetのみを表示するVisualforceページを使用して詳細ページをオーバーライドすることです。ページを表示しているユーザーは、レコードの所有者です。このアプローチでは、カスタムコントローラー/拡張機能は必要ありません。ページのさまざまなセクションを非所有者に非表示にし、ドラッグアンドドロップのFieldSetエディターを使用して各セクションのフィールドを変更できます。これは、ドラッグアンドドロップページレイアウトエディタと非常によく似ています。
カスタムコントローラー/拡張機能も必要としない別の方法(アプローチ2)は、所有者にのみ表示するフィールドを含むVisualforceページを作成し、実行中のユーザーがレコード所有者である場合にのみこれらのフィールドをレンダリングすることです。その後、このVisualforceページをページレイアウトに追加できます。このアプローチをお勧めしない理由は、このページのフィールドのスタイルを他の標準ページレイアウトと一致させるのは面倒だからです。
参考までに、Visualforceを使用せずに標準のページレイアウトのセクションを表示/非表示にする簡単な方法(JavaScriptハックなし)はありません。
アプローチ1:
<apex:page standardController="Contact">
<!-- Fields everyone should see -->
<!-- (stored in the 'FieldsEveryoneSees' fieldset) -->
<apex:repeat value="{!$ObjectType.Contact.FieldSets.FieldsEveryoneSees}" var="f">
<apex:outputField value="{!Contact[f]}" /><br/>
</apex:repeat>
<!-- Fields only the Owner should see -->
<!-- (stored in the 'OwnerOnlyFields' fieldset) -->
<apex:repeat value="{!$ObjectType.Contact.FieldSets.OwnerOnlyFields}" var="f"
rendered="{!$User.Id == Contact.OwnerId}">
<apex:outputField value="{!Contact[f]}" /><br/>
</apex:repeat>
</apex:page>
アプローチ2:
<apex:page standardController="Contact" showHeader="false" sidebar="false">
<apex:outputPanel rendered="{!Contact.OwnerId == $User.Id}">
<!-- Fields only the Owner should see -->
<apex:outputField value="{!Contact.LastModifiedDate}"/>
<!-- etc... -->
</apex:outputPanel>
</apex:page>