플러그인 만들기
오승훈
@akasima
XEHub
1
예제코드
https://github.com/akasima/openseminar_1212
git clone
https://github.com/akasima/openseminar_1212
2
Get started
3
Install
Installer 를 이용한 설치
- http://xpressengine.io/docs/3.0/install#Linux
Git 을 이용한 설치
- http://xpressengine.io/docs/3.0/install#Git
4
Debuging
/.env => APP_DEBUG=true
/storage/logs/laravel.log
dd();
5
http://xpressengine.github.io/laravel-korean-docs/docs/5.0/helpers/
Config
/config/cms 디렉토리에 파일 추가 또는 수정
설치 과정에서 입력한 설정 값들은 /config/cms/*php
에 있음
/config/*php 설정 내용을 확인하고 config/cms/*php
에 동일한 형태로 작성
6
플러그인 둘러보기
7
플러그인 규칙
8
1. 디렉토리이름은 소문자, 숫자와 언더스코어(언더바)로 작
2. plugin.php, composer.json 필수
plugin.php - 필수 요소1
9
<?php
namespace Akasima;
use …;
class Plugin extends AbstractPlugin
{
/**
* 이 메소드는 활성화(activate) 된 플러그인이 부트될 때 항상 실행됩니다.
*
* @return void
*/
public function boot()
{
}
composer.json - 필수 요소2
10
{
"name": "xpressengine-plugin/my_plugin",
"description": "플러그인소개",
"keywords": [
"xpressengine",
"plugin"
],
"license": "LGPL-2.0",
"version": "1.0.0",
"type": "xpressengine-plugin",
"support": {
"email": "email@email.com"
},
"authors": [
{
"name": "input your name",
"email": "input@your.email",
"homepage": "http://mysite.com",
"role": "Developer"
}
],
"extra": {
"xpressengine": {
"title": "my_plugin_title",
"icon": "myicon.png",
"component": []
}
},
"repositories": [
{
"type": "composer",
"url": "http://packagist.xpressengine.io/"
}
],
"require": {
},
"autoload": {
"psr-4": {
"Akasima": "src/"
}
}
}
app/Console/Commands/stubs/composer.json.stub 복사
composer.json - 필수 요소2
11
"extra": {
"xpressengine": {
"title": "my_plugin_title",
"icon": "myicon.png",
"component": []
}
},
"repositories": [
{
"type": "composer",
"url": "http://packagist.xpressengine.io/"
}
],
"require": {
},
"autoload": {
"psr-4": {
"Akasima": "src/"
}
}
}
composer.json - 필수 요소2
12
"require": {
},
"autoload": {
"psr-4": {
"Akasima": "src/"
}
}
}
"extra": {
"xpressengine": {
"title": "my_plugin_title",
"icon": "myicon.png",
"component": []
}
},
"repositories": [
{
"type": "composer",
"url": "http://packagist.xpressengine.io/"
}
],
"require": {
},
"autoload": {
"psr-4": {
"Akasima": "src/"
}
}
}
생성된 플러그인 구조
13
composer.json
pluing.php
플러그인 생성 확인
14
http://your.domain/settings/plugins
플러그인 켜기
15
플러그인 동작 확인
16
public function boot()
{
$this->route();
}
protected function route()
{
// implement code
Route::fixed($this->getId(), function () {
Route::get('/', [
'as' => 'my_plugin::index',
'uses' => function (Request $request) {
echo "Hello World";
}
]);
});
}
plugin.php 수정
AbstractPlugin
17
Core Plugin 패키지에 의해 동작하기 위해 반드시 상속해야 하는 Class
AbstractPlugin
18
http://api.xpressengine.io/master/Xpressengine/Plugin/AbstractPlugin.html
AbstractPlugin
19
http://api.xpressengine.io/master/Xpressengine/Plugin/AbstractPlugin.html
컴포넌트
20
21
컴포넌트?
my_plugin
플러그인
- 설치/실행 기능
- 꾸러미 관리 목적
boot()
install()
activate()
22
컴포넌트?
my_plugin
테마 스킨
매뉴
얼
위젯
게시판 스
킨
플러그인은 여러개의 기능
요소로 이루어짐
(컴포넌트가 있을 수 있음)
23
컴포넌트 종류 및 추상 클래스
Interface XE3
ModuleAbstractModule 모듈
SkinAbstractSkin 스킨
ThemeAbstractTheme 테마
WidgetAbstractWidget 위젯
UIObjectAbstractUIObject UI Object
DynamicFieldAbstractType FieldType
DynamicFieldAbstractSkin FieldSkin
24
ComponentInterface
http://api.xpressengine.io/master/Xpressengine/Plugin/ComponentInterface.html
25
ComponentInterface
http://api.xpressengine.io/master/Xpressengine/Plugin/ComponentInterface.html
26
컴포넌트 ID
등록된 컴포넌트 리스트
dd(app('xe.register'));
27
컴퍼넌트 실행 순서
my_plugin
테마 스킨
매뉴
얼
28
컴퍼넌트 실행 순서
my_plugin
테마 스킨
매뉴
얼
컴포넌트 boot
29
컴퍼넌트 실행 순서
my_plugin
테마 스킨
매뉴
얼
플러그인 boot
컴포넌트 ID란?
module/board@board
module/my_plugin@manual
컴포넌트종류/플러그인@컴포넌트이름
컴포넌트 ID
module/board@board
module/my_plugin@manual
// my_plugin 에서 등록한 게시판 모듈용 redSkin
module/board@board/skin/my_plugin@redSkin
// my_plugin 에서 등록한 매뉴얼 모듈용 redSkin
module/my_plugin@manual@skin/my_plugin@blueSkin
컴포넌트종류/플러그인@컴포넌트이름/컴포넌트종류/플러그인@컴포넌
대상아이디/컴포넌트종류/플러그인@컴포넌트이름
플러그인 만들기
32
$ php artisan make:plugin pluginName nameSpace
description
33
Command 로 플러그인
생성
34
vendor
view
생성된 디렉토리
assets
src
composer.json
pluing.php
js, css, image
PHP source
템플릿
35
플러그인 직접 생성
$ mkdir plugin_name
$ cd plugin_name
$ touch plugin.php, composer.json
$ composer install
플러그인 관리자에서 플러그인을 켜야 동작됨!
36
Github clone
$ git clone https://github.com/repository.git
$ cd repository
$ composer install
플러그인 관리자에서 플러그인을 켜야 동작됨!
포인트 적립 플러그인
37
게시물, 댓글 등록할 때 포인트 지급 기능
데이터 베이스 테이블 생성
points, point_logs 테이블 추가
플러그인 install 메소드에 코드 추가
38
http://xpressengine.github.io/laravel-korean-docs/docs/5.0/schema/
인터셉트 추가
게시물, 댓글 등록할 때 포인트를 지급할 수 있도록 플
러그인 boot() 에 인터셉트 추가
포인트 정보를 테이블에 등록하기 위해 Model 클래스
생성
39
http://xpressengine.io/plugin/xe_aoplist
http://api.xpressengine.io/master/Xpressengine/Document/DocumentHandler.html#method_add
http://xpressengine.github.io/laravel-korean-docs/docs/5.0/eloquent/
플러그인 설정 페이지
40
설정 페이지 추가
플러그인 목록에서 플러그인을 설정할 수 있는 페이지
추가
플러그인 설정 페이지 Route 추가
컨트롤러 추가
플러그인의 getSettingsURI() 에 url 등록
41
Config 패키지 사용
설정 페이지에서 Config 패키지를 이용해 설정 관리
추가한 인터셉트에서 설정이 적용될 수 있도록 수정
42
관리자 메뉴 추가
43
포인트 로그 페이지 추가
관리자 > 컨텐츠 영역에 ‘포인트’ 메뉴 추가
포인트 로그 Route 추가 및 view 파일 작성
플러그인 boot() 에서 Register 를 이용해 관리자 메뉴
정보 추가
44
메뉴 만들기
45
메뉴 생성
DirectLink 모듈
SimplePage 모듈
ExternalPage 모듈 - 플러그인에 외부 페이지 파일 추
가하여 연결하기. 플러그인에 externalPage.php 파일
을 만들고 연결하기.
46
모듈 컴포넌트 만들기
47
모듈 추가
Module/MyModule 클래스 생성
composer.json 에 컴포넌트 정보 추가
메뉴 아이템 추가할 때 설정 항목 추가
Config 패키지를 이용해 모듈 설정 등록
MyModule 로 메뉴 추가
48
Route 등록
모듈 boot() 할 때 Route 등록하고 UserController 에 연
결되도록 설정
UserController 클래스 추가하고 View blade 파일 추가
49
http://xpressengine.github.io/laravel-korean-docs/docs/5.0/routing/
스킨 컴포넌트 만들기
50
스킨 추가
Skin/DefaultSkin 클래스 생성
composer.json 에 컴포넌트 정보 추가
UserController 에 스킨을 사용하도록 수정하고 view
정보 수정
MyModule 에서 스킨을 선택하도록 수정
51
Command 추가
52
포인 로그 삭제
Command/RemoveLog 클래스 추가
handler() 에 로그 삭제 코드 추가
서버에서 $ php artisan 으로 추가된 명령어 확인
53
http://xpressengine.github.io/laravel-korean-docs/docs/5.0/commands/
Q & A
감사합니다
54

오픈세미나 플러그인만들기(한번더)