Salesforce Visualforceの基礎の基礎

# これは何？
この記事は「[24日後に立派なSalesforceエンジニアになるWEBエンジニア Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kakakaori)」の16日目の記事です。9日後に立派なSalesforceエンジニアになるために今日はVisualforceについてみていきたいと思います。

# Visualforceとは？
>Visualforce は、Lightning プラットフォームでネイティブにホストできる高度なカスタムユーザインターフェースを、開発者が作成できるようにするフレームワークです。Visualforce フレームワークには、HTML に似たタグベースのマークアップ言語、およびクエリや保存など、基本的なデータベース操作を非常に簡単に実行できるサーバ側の「標準コントローラ」のセットが含まれています。
[Visualforce開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_intro_what_is_it.htm)

つまりVisualforceはSalesforceの画面を独自に作成するためのフレームワークで、標準で用意されてるコントローラや、Apexで作った独自のロジックを呼び出し画面を表示することができるもの。

あれ？昨日までやってきたLWCと何が違うんだっけ？？

ちょっとだけ両方を触ってみたうえで私の独断と偏見100%でお伝えすると、今から新しく作るものは基本LWCでいいと思う。特に今回のアドベントカレンダーにあるようにバックグラウンドがWEBエンジニアなら尚更。
ちなみに公式にも[どのような場合に Visualforce ではなく Lightning Web コンポーネントを使用すべきですか?](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_intro_when_use_lwc.htm)という内容について以下のように書かれている。
>新規の開発の場合は、Lightning Experience ローコードツールと Lightning Web コンポーネントを使用することを常にお勧めしています。これらには、さまざまなメリットがあり、開発も容易に行えるようになります。

あれ？私はなぜVisualforceを学ぼうとしてるんだ？？

と、なるけど、とりあえずどんなものか知っておく必要があると思うので気を取り直して進んでいく。

# Visualforceはどんな場面で使えるの？
Salesforce内ではさまざまなところから Visualforce　を呼び出せるようになっているので、ここではいくつか例に挙げながらみていこうと思う。

## 1. Lightning アプリケーションビルダーでコンポーネントとして利用する
左側のコンポーネントの中にVisualforceがあるので、それを表示したいところに持っていき、表示するVisualforce名を選択する。
![スクリーンショット 2022-12-10 21.14.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/e31e5362-182d-2020-5664-e58d1d7e8e43.png)

## 2. クイックアクションとして利用する
先に `設定 > ユーザーインターフェース > グローバルアクション > グローバルアクション`　からグローバルアククションとしてVisualforceを呼び出すように設定し保存しておく。
![スクリーンショット 2022-12-10 21.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/4f380612-ad51-e3b5-0f6a-aeae541eb50c.png)
その後、クイックアクションを設定したいオブジェクトのページレイアウトから先ほど作成したアクションを配置する。
![スクリーンショット 2022-12-10 21.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/82802a53-93f7-ef66-bd7d-446c5910570b.png)
こうすることでクイックアクションとしてVisualforceを呼び出すことができるようになる。
![スクリーンショット 2022-12-10 21.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/1ae66bfe-f686-e2b7-4116-06ae87a1ef05.png)

## 3. タブから利用する
まずはタブの設定を行う。`設定 > ユーザーインターフェース > タブ`から表示したいVisualforceの情報を登録。
![スクリーンショット 2022-12-10 21.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/840e3ac8-5319-6d45-2de6-54d2e1ff9c53.png)
するとこのようにタブに追加されて、ここからVisualforceを呼び出すことができる。
![スクリーンショット 2022-12-10 21.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/2900a2a4-0d74-896a-c3aa-38e6a32b1cc3.png)

現状よく使っているのはこの辺り。
それ以外にもいくつか呼び出せるところはあるので、また出てきたらその時に触れていこうと思う。

# Visualforceのサンプルコード
Visualforceページは `pages` を右クリックして`SFDX:Visualforceページを作成`から作っていく。開発環境構築については[こちらの記事](https://qiita.com/kakakaori830/items/67c32c1d84b4a473cb1c)で記載している。
![スクリーンショット 2022-12-10 21.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/f3bba593-39cd-48c6-0c81-df732c647ed8.png)
新規作成すると`test.page` と`test.page-meta.xml` の2ファイルが生成されるが、主に`test.page`にコードを書いていく。
```html:test.page
<apex:page standardController="Contact" >
    <apex:form >
        <apex:pageBlock title="Edit Contact">
            <apex:pageBlockSection columns="1">
                <apex:inputField value="{!Contact.FirstName}"/>
                <apex:inputField value="{!Contact.LastName}"/>
                <apex:inputField value="{!Contact.Email}"/>
                <apex:inputField value="{!Contact.Birthdate}"/>
            </apex:pageBlockSection>
            <apex:pageBlockButtons >
                <apex:commandButton action="{!save}" value="Save"/>
            </apex:pageBlockButtons>
        </apex:pageBlock>
    </apex:form>
</apex:page>
```
htmlぽいちゃぽいけど、LWCに比べるとなんともとっつきにくい感じがする。
上記をsandboxにデプロイして取引先責任者のページに配置するとこんな感じになる。
![スクリーンショット 2022-12-10 21.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200812/535e5788-d7d0-4b10-db12-4642c91a7de9.png)

この部分`<apex:page standardController="Contact" >`で標準の取引先責任者のコントローラーを呼び出している。詳細については[こちら](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_controller_std.htm)に記載されているが、標準コントローラーを使うことで新たにクラスを作らなくても、レコードの保存や編集、削除といった標準機能を使うことができる。ただし標準機能以上のことを処理させたい場合は、自分でカスタムコントローラーを作ってそれを呼び出してやる必要がある。が、この辺りの詳しい内容についてはまた別記事で紹介しようと思う。

# 最後に
今までLWCをやってきて新たにVisualforceに触れてみたけど、やっぱり個人的にはLWCで全て実装したいなと感じました。が、Visualforceじゃないとできないシーンもあるので、一応知識としては知っておいた方が実装面においては役に立ちそうです。
ということで明日はVisualforceもちょっと使う、コールシステムとの連携周りについて書いていきたいと思います。