Salesforce B2C/B2B Commerce でデザインを変更してみる（前編）

※ これから記載する事項は、私が所属する会社とは切関係のない事柄です。

今回は Salesforce B2C/B2B Commerce でどのようにデザインを変更するか前半と後半に分けて紹介したいと思います。後編は[こちら](https://qiita.com/syunyama/items/a342e5c540c0f344980d)。


## 基本的なテーマ変更

B2C/B2B Commerce では Experience Builder 上からテーマパネルを利用してテーマをカスタマイズすることができます。（[ヘルプ](https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_overview.htm)）
テキストサイズやスペース、ロゴなど変更できる項目がたくさんあります。項目については「[How —dxp Styling Hooks Map to Theme Panel Properties](https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/brand_hooks_map.htm)」をご覧ください。

試しに背景を白から黒に変えてみました。

Before：
![スクリーンショット 2023-01-25 10.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/eaa0e942-f794-24fe-cf5c-a09e5b3da4e7.png)

After：
![スクリーンショット 2023-01-25 10.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/9f7a120a-5bfb-0d3a-0ac3-14f840f0456a.png)





## ページレイアウトの適用

ページのレイアウトを変更するた方法は下記の２種類あります。（[ヘルプ](https://developer.salesforce.com/docs/atlas.en-us.exp_cloud_lwr.meta/exp_cloud_lwr/get_started_layout.htm)）

#### ページレイアウト

自分が全く新しいページを作成した時に適応できるレイアウトです。ヘッダーやフッターはテーマレイアウトで編集し、このレイアウトではコンテンツ内の設定が可能です。

#### テーマレイアウト

商品詳細ページ、カテゴリページ、カートページといったサイト作成時に選択したテンプレートに適用できるレイアウトです。


## 使い方

#### ページレイアウト

コンテンツ内を三つの部分に分けて色付けしてみたいと思います。この各部分には様々なコンポーネントをドラッグ&ドロップで追加することができます。

![スクリーンショット 2023-01-26 15.15.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/8399bb90-64cf-d80c-d27c-2db0030a6c30.png)




##### 1 . ページレイアウトLWCコンポーネントの作成

LWCコンポーネントの作成方法については以前紹介した記事「[初めての Lightning Web コンポーネント開発で OCI を操作してみる（lwc開発方法編）](https://qiita.com/syunyama/items/8c591c9fbe89731204a0)」を参考にしてください。
今回は下記の４つのファイルで１つのコンポーネントを作成し環境にデプロイします。



```css:sampleLayout.css
.header{
    background-color: red;
}

.main{
    background-color: blue;
}

.footer{
    background-color: yellow;
}
```



```html:sampleLayout.html
<template>
    <div class='header'>
      <slot name="contentTopRegion"></slot>
    </div>
    <div class='main'>
        <slot name="contentMainRegion"></slot>
    </div>
    <div class='footer'>
      <slot name="contentBottomRegion"></slot>
    </div>
</template>
```


使用するスロットの名前は `@slot` と共に記載しておく必要があります。 

```js:sampleLayout.js
import { LightningElement } from 'lwc';
/**
 * @slot contentTopRegion
 * @slot contentMainRegion
 * @slot contentBottomRegion
 */
export default class SampleLayout extends LightningElement {}
```



```xml:sampleLayout.js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata" >
    <masterLabel>Sample Layout</masterLabel>
    <description>Sample layout</description>
    <apiVersion>56.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightningCommunity__Page_Layout</target>
    </targets>
</LightningComponentBundle>
```



##### 2. 新しいページの作成

「New Page」ボタンをクリックして、「Standard Page」を選択します。
![スクリーンショット 2023-01-26 14.42.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/179086d0-7b65-6c9e-6525-5631cc216e3e.png)



すると、自分が作成したレイアウトが表示されているはずなので、それを選択して、必要事項を入力し、ページ作成を完了します。
![スクリーンショット 2023-01-26 14.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/b0ed8c60-a93d-8b46-5746-6f10fd4e4ba2.png)




#### テーマレイアウト

上記のページレイアウトで作ったページに対してヘッダー、フッターに加えて、test という新しいセクションを付け加えて、header：１、test：１、main：２、footer：１ となるようなレイアウトを当ててみたいと思います。（見やすくするためにヘッダーなどにデフォルトで入っているコンポーネントは全て削除しています）

![スクリーンショット 2023-01-26 16.51.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/3f0ecbe5-6b91-66e0-7dec-adec4f86a164.png)




##### 1 . テーマレイアウトLWCコンポーネントの作成

今回は下記の４つのファイルで１つのコンポーネントを作成し環境にデプロイします。

```css:sampleThemeLayout.css
:host {
  display: flex;
  flex-flow: column;
  height: 100vh;
}

.l-header{
  flex-grow: 1;
}

.l-test{
  flex-grow: 1;
}

.l-main{
  flex-grow: 2;
}

.l-footer{
  flex-grow: 1;
}
```


スロット名は`header`と`footer`は元々当たっていたslotの名前なので、踏襲しています。デフォルトのテンプレートのレイアウトは[Github](https://git.soma.salesforce.com/communities/ui-commerce-components/blob/main/packages/b2c-storefront/src/views/commerceLayout.json)を参考にしてみてください。

```xml:sampleThemeLayout.js-meta.xml
<template>
    <header data-f6-region class="l-header">
        <slot name="header"></slot>
    </header>
    <section data-f6-region class="l-test" >
        <slot name="test"></slot>
    </section>
    <section data-f6-region class="l-main" >
        <slot></slot>
    </section>
    <footer data-f6-region class="l-footer" >
        <slot name="footer"></slot>
    </footer>
</template>
```



```js:sampleThemeLayout.js
import { LightningElement } from 'lwc';
/**
 * @slot header
 * @slot test
 * @slot footer
 */
export default class SampleThemeLayout extends LightningElement {}
```



```xml:sampleThemeLayout.js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>56.0</apiVersion>
    <isExposed>true</isExposed>
    <masterLabel>Sample Theme Layout</masterLabel>
    <description>Sample theme layout</description>
    <targets>
        <target>lightningCommunity__Theme_Layout</target>  
    </targets>
</LightningComponentBundle>
```




##### 2. テーマレイアウトを利用できるように設定します
![スクリーンショット 2023-01-27 19.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/e3055f94-e049-07dc-a916-22e7d4a6fc54.png)




##### 3. テーマレイアウトをページに設定します。
![スクリーンショット 2023-01-27 19.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/7f6ac24b-d5b1-085b-93fa-0abb6d2ccd55.png)