모듈 개발 - 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/testBoardListView.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.jsonaction 에서 viewcontroller, 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;
		}
	}