ESNext #3: 사이드바

이번에는 사이드바의 제어에 대해 예제 코드를 작성해본다. 사이드바는 문서 전체나 일부 블록, 혹은 플러그인이 확장할 수 있도록 되어 있다. 처음에는 사이드바가 휙휙 변해서 혼동이 많았지만, 몇 번 보고 그 동작에 대해 이해하기 시작하니 나쁘지 않다.

이 사이드바는 이제 매우 중요한 의미가 있다. 클래식 에디터에서는 글 편집 이외의 여러 제어 요소들을 메타 박스로 처리했다. 이 메타 박스들은 여전히 유효하고 때때로는 여전히 현역으로 동작하지만 새로운 블록 에디터를 사용하는 경우, 메타 박스보다는 사이드바 쪽의 동작이 더 필요할 수 있을 것 같다. 특히 블록을 제작하는 경우는 여지없이 사이드바를 익혀야 할 듯.

우선 사이드바에 대한 Hello, World! 출력하는 코드를 작성해 본다. 완성된 코드는 마찬가지로 Github 레포지터리코드를 올려 두었다.

서버 사이드 코드 (PHP)

서버에서는 단순하게 js 코드를 큐잉하기 위한 코드로만 되어 있다. 늘 그렇듯 ‘init‘ 액션과 ‘enqueue_block_editor_assets‘ 액션을 사용하고 index.asset.php 파일에서 생성된 정보를 활용해 스크립트를 등록하는 구현이 있다.

사이드바에 대해

사이드바에 ‘플러그인’을 넣어 보자. 플러그을 등록하면 플러그인만의 사이드바를 가지게 되고 거기에 원하는 대로 위젯을 꾸밀 수 있게 된다.

플러그인에 등록되면 아래 그림처럼 … 메뉴를 눌렀을 때 플러그인 섹션에 표시된다.

1번 … 메뉴 클릭시 사이드바가 오픈. ‘플러그인’ 섹션에 2번 Jetpack 메뉴가 등록되어 있다.
Jetpack을 선택하면 Jetpack의 사이드바 메뉴가 출력된다. 1번의 별 아이콘을 그림처럼 누른 상태로 만들면 2번 영역에 아이콘이 고정되어 언제든지 저 아이콘을 클릭하는 것으로 메뉴를 열고 닫을 수 있다.

이것이 선택되면 우측 사이드바에는 플러그인만의 위젯이 출력된다. 또한 가장 위 우측에 보면 별 아이콘이 있는데, 선택하면 … 메뉴 좌측, 톱니바퀴 아이콘 우측으로 사이드바를 여닫을 수 있는 아이콘이 고정된다. 앞으로는 생성된 아이콘을 눌러 사이드바를 열었다 닫았다를 할 수 있다.

물론 새 사이드바를 만드는 것도 가능하지만, 기존의 ‘문서’ 사이드바에 요소를 추가하는 것도 가능하다. 이것은 차후에 진행하기로 하고 여기서는 새 플러그인을 위한 사이드바 생성만 다룬다.

클라이언트 사이드 코드 (JavaScript)

우선 플러그인을 등록한다. 등록을 위해서는 ‘registerPlugin’ 함수를 사용한다. 이것은 ‘@wordpress/plugins’ 패키지에 있다. packages.json 에 등록하고 import 한다.

registerPlugin 함수는 두 개의 인자를 가진다. 첫번째는 고유한 이름. 두번째는 설정 객체이다. 간단하게 두 개의 키 ‘icon’, ‘render’를 필요로 한다. icon은 간단히 dashicons에서 찾을 수 있는 이름으로 할 수 있다.

render는 함수로서 플러그인의 내용을 그린다. 여기에 사이드바 내용을 넣으려면 PluginSidebarMoreMenuItem, PluginSidebar 둘이 필요하다. 이 둘은 ‘@wordpress/edit-post’에서 찾을 수 있다.

PluginSidebarMoreMenuItem은 … 메뉴 클릭시 ‘플러그인’ 섹션에서 만든 사이드바가 선택될 수 있도록 하는 객체이며, PluginSidebar는 사이드바의 내용을 직접 선언한다.

즉, PluginSidebarMoreMenuItem을 사용하면 아래처럼 결과가 작성된다.

그리고 해당 메뉴를 클릭하면 좌측 사이드바에 나올 내용은 PluginSidebar를 이용해 작성한다.

registerPlugin('wes3-plugin-hello-world', {
    icon: 'welcome-view-site',
    render() {
        return (
            <>
                <PluginSidebarMoreMenuItem target="wes3-plugin-hello-world">
                    {__('Hello, World!', 'wp-esnext-study')}
                </PluginSidebarMoreMenuItem>
                <PluginSidebar name="wes3-plugin-hello-world"
                               title="Hello, World!"
                               icon="welcome-view-site">
                </PluginSidebar>
            </>
        )
    }
});

PluginSidebarMoreMenuItem의 target 속성과 PluginSidebar name 속성은 서로 같게 이어준다. title 속성은 사이드바 최상단 제목을 위한 텍스트이고, icon은 사이드바가 즐겨찾기 추가되었을 때 보여질 아이콘이다.

좀 더 레이아웃에 맞춰 내용 출력하기

나머지 사이드바에 넣을 내용들은 <PluginSidebar> 안에 넣으면 된다. 그러나 레이아웃이 잘 정돈되어 나오지 않는다. 레이아웃은 좀 맞춰서 넣어 보자. 이 때 ‘@wordpress/components’ 패키지의 Panel을 이용한다.

<PluginSidebar name="wes3-plugin-hello-world"
               title="Hello, World!"
               icon="welcome-view-site">
    <Panel header="Hello, World! Panel" >
        <PanelBody title="Hello, World! Body"
                   icon="welcome-view-site"
                   initialOpen={true}>
            <PanelRow>
                <p>Hello, World! Content.</p>
            </PanelRow>
        </PanelBody>
    </Panel>
</PluginSidebar>

결과는 아래와 같다.

댓글 남기기