모듈 개발 - Prev/engine-pmc GitHub Wiki
시작
모듈은 /modules
폴더에 모듈 이름으로 하위 폴더를 만드는 것으로 시작합니다.
모듈 이름이 test
라면 /modules/test
라는 폴더를 만드십시오.
info.json 파일 생성
폴더를 생성했으면 info.json
파일을 /modules/test
폴더안에 생성하십시오.
info.json
파일은 이곳 을 클릭하여 작성법을 익히십시오.
View 클래스 생성
info.json
에서 dispDefault
라는 액션을 하나 만들고 view
속성을 TestView
로 지정했다면 TestView.class.php
파일을 /modules/test
폴더 안에 생성하십시오.
TestView.class.php 는 아래처럼 작성합니다.
<?php
class TestView extends View {
public function dispDefault() {
//TODO: Edit here
}
}
dispDefault()
메소드 안에는 해당 액션이 실행됬을때의 액션을 정의합니다.
View
클래스에는 model
, controller
등의 속성이 정의되어있으며 $this->model
, $this->controller
등으로 속성에 접근합니다.
engine pmc 에서 test
모듈과 dispDefault
액션을 실행하고 싶다면 127.0.0.1/?module=test&action=dispDefault
같은 주소를 브라우저에서 접속하면됩니다.
Model, Controller 클래스 생성
마찬가지로 model 이나 controller 정의 시 View와 비슷한 방법으로 처리합니다.
다중 MVC파일 정의
info.json
에서 action을 여러개 정의하고 m/v/c 를 분리하여 각자 다른 m/v/c 파일을 사용한다면 아래처럼 info.json을 작성할 수 있습니다.
{
"actions":[
{
"name":"dispList",
"view":"BoardListView"
},
{
"name":"dispArticle",
"view":"BoardArticleView"
}
]
}
또한 /modules/test
에 BoardListView.class.php
, BoardArticleView.class.php
파일을 만들어야 합니다.
php코드는 다음처럼 작성합니다.
<?php
class BoardListView extends View {
public function dispList() {
//TODO: Edit here
}
//...
}
<?php
class BoardArticleView extends View {
public function dispArticle() {
//TODO: Edit here
}
//...
}
모듈 클래스파일 생성
해당 모듈 이름이 test
일 경우 /modules/test
폴더 안에 TestModule.class.php
안에 추가할 수 있습니다. Module은 module
, view
, controller
클래스들을 관리하며 TestModule.class.php
파일이 없을 시 비어있는 기본 모듈 클래스 Module
이 생성됩니다.
모듈은 m/v/c
에서 $this->module
로 접근 할 수 있으며 Module
클래스에는 model
, controller
, view
, action
, moduleInfo
등의 속성을 갖고 있습니다.
info.json
의 action
에서 view
나 controller
, model
을 정의해 주지 않을 시 비어있는 기본 클래스인 View 클래스
, Controller 클래스
, Model 클래스
가 로드됩니다.
init 함수
model
, view
, controller
, module
클래스에는 init
함수가 존재하는데 일종의 생성자
개념이라고 보면 됩니다.
init
함수는 m/v/c
클래스가 모두 불러와진후 module -> model -> controller -> view 순으로 호출됩니다.
<?php
class TestModule extends Module {
public function init() {
//TODO: Edit here
//echo 'module is initialized, action:';
//echo $this->action;
}
}
템플릿 연계
view
에서는 템플릿을 연계하여 쓸 수 있습니다. 템플릿은 일종의 레이아웃으로, 시각적 요소를 표현하는 파일입니다.
기본적으로 html 문법을 따르며, 템플릿 전용 문법이 존재합니다.
템플릿 문법은 **이 문서**을 참고하십시오
템플릿은 /modules/test/template
폴더안에 생성하며 템플릿이름.html
처럼 파일을 저장합니다.
템플릿 실행은 view
에서 $this->execTemplate('템플릿이름')
으로 템플릿을 실행 할 수 있습니다.
<?php
class IndexView extends View {
public function dispDefault() {
$this->execTemplate('welcome');
}
}
데이터베이스
데이터베이스에 사용은 ORM(Object Relational Mapping)방식을 사용하며 DBHandler class에 정의 되어 있습니다. 참고 문서
예제
폴더 안 포함물
- [폴더] template
- info.json
- TestController.class.php
- TestDimigoView.class.php
- TestModel.class.php
- TestModule.class.php
- TestView.class.php
info.json
{
"name" : "test module",
"model":"TestModel",
"actions" : [
{
"name" : "dispDefault",
"view" : "TestView",
"controller" : "TestController"
},
{
"name" : "dispTemplate",
"view" : "TestView"
},
{
"name" : "dispDimigo",
"view" : "TestDimigoView"
},
{
"name" : "procDual",
"controller" : "TestController"
},
{
"name" : "dispLoginLog",
"view" : "TestView"
}
]
}
TestController.class.php
<?php
class TestController extends Controller {
public function procDual() {
echo '########';
getContent('index', 'dispDefault');
getContent('board', 'dispEditor');
}
}
TestController.class.php
<?php
class TestController extends Controller {
public function procDual() {
echo '########';
getContent('index', 'dispDefault');
getContent('board', 'dispEditor');
}
}
TestDimigoView.class.php
<?php
class TestDimigoView extends View {
public function dispDimigo() {
var_dump2($this->model);
echo 'Dimigo!';
}
}
TestModel.class.php
<?php
class TestModel extends Model {
public function getLoginLog() {
return DBHandler::for_table('login_log')
->select('*')
->where('input_id', User::getCurrent()->input_id)
->find_many();
}
function getRandomValue() {
return (int)(rand() * 1000);
}
}
TestModule.class.php
<?php
class TestModule extends Module {
public function init() {
//echo 'module is initialized, action:';
//echo $this->action;
}
}
TestView.class.php
<?php
class TestView extends View {
public $name;
public function init() {
$this->name = User::getCurrent()->user_name;
}
public function dispDefault() {
echo $this->name . '<br>';
echo $this->model->getRandomValue();
echo '액션 "dispDefault()"이 실행됨';
}
public function dispTemplate() {
Context::set('data1', 'data1 변수의 값');
$this->execTemplate('template1');
}
public function dispLoginLog() {
$rows = $this->model->getLoginLog();
for ($i=0; $i < count($rows); $i++) {
echo $rows[$i]->ip_address . ' / ' . $rows[$i]->login_time . '<br>';
}
}
public function getName() {
return $this->name;
}
}