ここでは、RayPenをVisualforceページに配置し、ユーザーによる手書きと手書き結果を表示する手順を説明します。ユースケースとして病院において手術を実施する前に患者の同意を得るシーンを想定しています。紙の契約書への署名の手続きの代わりに、Salesforce上の契約書と手書きの署名を行うサンプルです。なお、ここで説明する内容はサンプルパッケージでインストールすることもできます。
まず、手書き結果を保存するためにカスタムオブジェクトを作成します。
作成した「SurgeryAgreement」カスタムオブジェクトに、次のカスタム項目を作成します。
項目の表示ラベル | API参照名 | データ型 | 説明 |
---|---|---|---|
AgreementText | AgreementText__c | ロングテキスト(131072) | 契約の文章 |
Date | Date__c | テキストエリア(255) | 署名した日付 |
DoctorTitle | DoctorTitle__c | テキストエリア(255) | 医師名 |
PatientName | PatientName__c | テキストエリア(255) | 患者名 |
Patient Signature | Patient_Signature__c | Lookup(Signature) | 署名のルックアップ |
PDFPageUrl | PDFPageUrl__c | URL(255) | 将来の拡張のための予約 |
SignatureId | SignatureId__c | テキスト(255) | 署名のID |
SignatureTitle | SignatureTitle__c | テキストエリア(255) | 署名のタイトル |
Title | Title__c | テキストエリア(255) | タイトル |
次に、手書き結果を書き込むためのコントローラーを作成します。
public with sharing class SurgeryAgreementPageController {
public string defaultAgreementText = '私は術前、担当医師より手術に関して十分な説明をうけ了解いたしました。よって貴院における手術の実施に同意いたします。なお手術中、他の疾患が発見された場合や不測の事態が生じた場合には、それに応じた適切な処置をとられることに同意いたします。';
public string getDefaultAgreementText(){
return this.defaultAgreementText;
}
public string defaultAgreementTitle = '手術同意書';
public string getDefaultAgreementTitle(){
return this.defaultAgreementTitle;
}
public string defaultAgreementDate = Datetime.now().format('yyyy年MM月dd日');
public string getDefaultAgreementDate(){
return this.defaultAgreementDate;
}
public string defaultSignatureTitle = '署名欄';
public string getDefaultSignatureTitle(){
return defaultSignatureTitle;
}
public string defaultDoctorTitle = '院長 殿';
public string getDefaultDoctorTitle(){
return defaultDoctorTitle;
}
public Surgery_Agreement__c currentAgreement{get{
if (!Surgery_Agreement__c.sObjectType.getDescribe().isAccessible()){return null;}
PageReference currentPage = apexpages.currentPage();
Map<string, string> parameters = currentPage.getParameters();
string currentAgreementId = parameters.get('agreementId');
return this.getAgreementById(currentAgreementId);
}}
public string currentAgreementSignatureId;
public string getCurrentAgreementSignatureId(){
if (!Schema.sObjectType.Surgery_Agreement__c.fields.signatureId__c.isAccessible()){return '';}
if (this.currentAgreement != null){
return this.currentAgreement.signatureId__c;
}else{
return '';
}
}
public Surgery_Agreement__c savedAgreement;
public Surgery_Agreement__c signAgreement(string agreementId, string signatureId){
if (!Surgery_Agreement__c.sObjectType.getDescribe().isAccessible()){return null;}
if (!Surgery_Agreement__c.sObjectType.getDescribe().isUpdateable()){return null;}
Surgery_Agreement__c agreement = getAgreementById(agreementId);
if (agreement == null){
return null;
}
agreement.signatureId__c = signatureId;
agreement.Patient_Signature__c = signatureId;
update agreement;
return agreement;
}
public Surgery_Agreement__c getAgreementById(string agreementId){
if (!Surgery_Agreement__c.sObjectType.getDescribe().isAccessible()){return null;}
if (String.isEmpty(agreementId)){
return null;
}
Surgery_Agreement__c agreement = [select AgreementText__c, SignatureId__c from Surgery_Agreement__c where Id=:agreementId limit 1];
return agreement;
}
public PageReference onPatientSignatureComplete(){
if (!Surgery_Agreement__c.sObjectType.getDescribe().isCreateable()){return null;}
Surgery_Agreement__c agreement = new Surgery_Agreement__c();
agreement.Date__c = this.defaultAgreementDate;
agreement.DoctorTitle__c = this.defaultDoctorTitle;
agreement.SignatureTitle__c = this.defaultSignatureTitle;
agreement.AgreementText__c = this.defaultAgreementText;
insert agreement;
this.signAgreement(agreement.Id, patientSignatureId);
this.savedAgreement = agreement;
return null;
}
public Boolean getCurrentSignatureExists(){
return this.savedAgreement != null;
}
public string patientSignatureId{get;set;}
}
次に、Visualforceページを作成して手書きパッドを表示します。
<apex:page controller="SurgeryAgreementPageController" standardStylesheets="false">
<h1>
{!defaultAgreementTitle}
</h1>
<div>
{!defaultDoctorTitle}
</div>
<div>
{!defaultAgreementText}
</div>
<div>
{!defaultAgreementDate}
</div>
<div>
{!defaultSignatureTitle}
<div class="signature-pad-container">
<gcrp:RayPen placeholder="署名する"
styleClass="signature-button"
signatureImageStyle="max-width: 200px; max-height: 100px;"
currentSignatureId="{!patientSignatureId}"
onSignatureComplete="{!onPatientSignatureComplete}"
footNote="署名の前に契約書を必ずお読みください"
footNoteColor="#cccccc"
signatureLineColor="#cccccc"
titleText="同意書"
titleTextColor="#000000"
okButtonText="OK"
cancelButtonText="キャンセル"
signaturePadOrientation="portrait"
/>
</div>
</div>
<style>
.signature-pad-container{
max-width: 200px;
max-height: 100px;
width: 200px;
height: 100px;
border: 1px solid black;
background-color: white;
text-align: center;
}
.signature-button{
width: 200px !important;
height: 100px !important;
background-color: white !important;
border: none !important;
-webkit-appearance: none;
background-image: none !important;
box-sizing: border-box;
border-radius: unset !important;
padding: 0 !important;
margin: 0 !important;
}
.signature-image{
}
</style>
</apex:page>
次に、作成したVisualforceページをSalesforceモバイルアプリケーションから表示可能にします。
作成したタブをSalesforceのナビゲーションメニューに追加します。
Salesforce Classicの場合:
Lightning Experienceの場合:
Salesforceモバイルアプリケーションを使用して動作を確認します。