Spac Download2010. 11. 23. 16:07
Spac v.10.10.1 버전 공개

  1. 템플릿구별자 코드 사용자 정의기능 추가 http://www.phpwork.kr/Blog/viewContents/13/112 참조
  2. 확장컨트롤러 ini 파일 위치 변경
  3. 내장 페이징 클래스사용시 페이지 링크 버튼 이미지를 쉽게 변경할 수 있도록 수정됐습니다. 
    http://www.phpwork.kr/Blog/viewContents/23/113/1/ 참조
  4. 이전 버전 사용자는Controller.Class.php, ViewTemplate.Class.php, Paging.Class.php 파일을 덮어 써 주시고 Crypt.ini, ViewTemplate.ini, Paging.ini 파일을 해당 클래스가 있는 디렉토리로 위치시켜줍니다.(없는경우 생성)
    또한 Controller.ini 파일의 내용중 각각 ini파일들의 경로를 수정된 위치에 맞게 수정해줍니다.
  5. 이전버전에서 업데이트 해도 사용자의 프로그램에 영향을 주지 않습니다

Posted by webdata
Spac Download2010. 8. 11. 18:19
- MySQL Dao 바인딩쿼리관련 메소드가 추가되고 내장 템플릿사용시 발생될 수 있는 몇가지 오류가 수정됐습니다.

자세한 내용은 http://www.phpwork.kr 에서 확인하실 수 있으며, 아래의 링크에서 다운로드 받으실 수 있습니다.

Posted by webdata

::: SPAC (Simple Php Action Class) PHP Framework:::



Spac 은 PHP를 이용해 웹어플리케이션을 개발시 구조적이고 체계적인 개발을 할 수 있도록 도와주는 PHP를 위한 개발 프레임웍입니다.

최근 PHP 프레임웍이 외국으로부터 많이 알려지면서 프레임웍을 이용하여 개발하는 사례가 많아지며, 프레임웍에 대해 관심을 갖는 PHP 개발자들 또한 많아지고 있는 추세인것 같습니다.

이런 분위기를 타고 저 또한 개인적으로 사용하고 있는 PHP 개발 프레임웍 Spac을 소개하고자 합니다.

Spac은 작고, 가볍고,  빠른 PHP 웹어플리케이션 개발을 위한 프레임웍입니다.


Spac 이라는 PHP프레임웍에 대해 특징을 위주로 하나하나 소개하겠습니다.


1. 개인/기업/영리/비영리기관 관계없이 무료로 웹사이트 개발에 이용하실 수 있습니다. (수정배포 불가)


2. 클래스기반의 작고, 가볍고, 빠른  PHP 웹어플리케이션 개발 프레임웍입니다.


3. URL을 분석하여 액션클래스를 매핑, 실행합니다.


4. M.V.C 패턴을 기본으로 지원합니다.


5. 웹어플리케이션을 위한 디렉토리 구성이 자유롭습니다.


6. 호출되는 URL과 이에 매핑되는 액션클래스를 사용자가 임의로 설정할 수 있습니다. (액션클래스매핑)


7. 간편한 HTML 레이아웃 구성 도구가 제공됩니다.


8. 뷰에서 PHP코드의 활용이 자유롭습니다.


9. 뷰에 전용템플릿태그를 기본적으로 지원하며, 사용자가 직접 태그규칙을 작성하여 실행할 수도 있습니다.


10. 뷰파일은 캐시되어 좀 더 빠른 엑세스를 가능하게 합니다.


11. URL 암호화 기능을 지원하며, 이 암호화 처리는 사용자 암호화클래스를 로드하여 구성할 수도 있습니다. 


12. 개발에 중요한 사항은 기본적인 플러그인으로 제공됩니다. ( Dao,  Paging 등)


13. 기타 다양한 확장을 위해 외부컨트롤러로드 도구를 제공합니다.


14. 지속적인 업데이트가 진행되며 업데이트 반영시 이미 개발된 사용자 어플리케이션에 영향을 거의 주지 않습니다.






1. Spac(Simple Php Action Class)은 클래스기반 개발 프레임웍입니다.

아래는 간단한 "Hello World" 를 출력하는 간단한  예제입니다.


(1) "HelloWorld"  클래스 작성 

model/HelloWorld.Class.php
<?php
class HelloWorld extends Controller {
    function HelloWorld () {
       $this->message = "Hello World!";
    }
    function execute() {
       $this->result_uri = 'helloworld.html';
       $this->dispatcher();
    }
}
?>

view/helloworld.html
<html>
<head></head>
<body>
{=message}
</body>
</html>


(2) 브라우저 호출 / 출력





2. URL을 이용하여 직접 클래스/메소드를 호출하는 방식을 사용합니다.

Spac에선 URL에 실제 웹서버의 디렉토리 및 파일구조를 명시하는 방식이 아닌 가상의 URL을 사용합니다.
이 가상의 URL은 Spac 내부에 구성된 사용자 클래스를 기반으로 구성됩니다.

위의 예제와 같이 URL에 클래스명 및 메소드명을 직접 명시하여 호출하면 Spac 컨트롤러가 해당 클래스의 메소드를 실행시켜 줍니다.

아래는 Spac 을 이용하여 개발시 일반적인 URL 호출 유형입니다.

 





3. Model, View, Controller 의 구조를 기본으로 하는 개발 프레임웍입니다.

다른 일반적인 프레임웍과 마찬가지로 Spac 프레임웍이 비즈니스로직과 프리젠테이션 영역을 분리하여 개발할 수 있도록 도와줍니다.

Model 에서 수행된 비즈니스로직 수행 결과를 View에 전달하여 사용자에게 출력(프리젠테이션) 하는 구조를 가지고 있으며, 이때 Model 과 View를 연결해주는 연결자 역할을 Spac 프레임웍의 Controller 가 담당하고 있습니다.



다음 그림은 Spac 프레임웍의 일반적인 프로세스 구성도 입니다. 



 


 

4. 웹어플리케이션들이 위치하는 웹디렉토리 구성이 자유롭습니다.

Spac 프레임웍을 이용하여 개발하면 웹디렉토리 및 파일구성이 자유롭습니다.

Spac 의 핵심코어 및 개발자가 작성한 중요한 어플리케이션들은 웹에서 직접 접근 불가능한 위치에 둘 수 있으며, 이를 권장합니다.

웹에서 접근 가능한 디렉토리 (일반적으로 "public_html" 혹은 "www" 등..) 에는 "index.php" 파일과 이미지 및 자바스크립트, 스타일시트 파일등만 위치하고, 중요한 웹어플리케이션 파일들은 웹디렉토리 외 다른 디렉토리에 구성할 수 있습니다.


아래는 기본적인 Spac의 디렉토리 구성입니다. (그림에서 public_html 은 웹에서 접근 가능한 웹디렉토리를 의미합니다.)



(위의 디렉토리 구성은 예제이며 사용자의 환경에 맞추어 자유롭게 구성할 수 있습니다.)






5. 클래스매핑을 이용하여 URL 에 직접 명시되는 클래스명이 노출됨으로서 발생할 수 있는 미연의 사고를 방지할 수 있습니다.

Spac에서는 URL 에 비즈니스로직을 명시 호출하여 해당 클래스가 실행되도록 하고 있는데 이때 노출될 수 있는 클래스명을 클래스매핑을 이용하여 전혀 다른 클래스가 실행 되도록 설정할 수 있습니다.

이는 URL로 "AClass" 가 호출되면 실제 "AClass" 가 아닌 "BClass"가 실행되도록 설정 할 수 있음을 의미합니다.



 

6. Spac 프레임웍에는 간편하게 페이지 레이아웃을 구성할 수 있는 도구가 제공됩니다.

기존 PHP 개발시 여러개의 조각 파일을 하나의 레이아웃 파일에 인클루드로 삽입하여 사용하던 방식을 Spac Layout 기능을 이용하면 더욱 더 간편하게 작성하실 수 있고, 유지보수 또한 간편하게 하실 수 있습니다.




▼▼▼





7. HTML을 이용하여 뷰 화면을 구성 / 출력 할 수 있으며, 자유롭게 PHP코드를 사용할 수 있습니다.

사용자가 작성한 클래스에서 도출된 결과값을 특정한 View 파일을 이용하여 출력할 수 있습니다.
이 View 파일은 HTML 코드로 작성할 수 있으며, 이 파일내에서 PHP 코드의 사용 또한 자유롭습니다.





8. 위 View 파일내에 PHP코드를 섞어 쓰는대신 템플릿전용 태그를 사용하여 좀 더 간결한 View를 작성하실 수 있습니다.

View 파일은 기본적으로 HTML코드 및 PHP코드를 사용하여 작성하지만, 여러가지 이유로 PHP코드 섞어 사용하기 불편한 경우 이를 대신하여 전용 템플릿태그를 사용할 수 있습니다.






9. View 파일은 Cache 파일로 저장하여 좀 더 빠른 엑세스를 가능하게 합니다.


레이아웃 및 템플릿 전용 태그를 사용하는 경우 서버에 부담을 줄여주고 속도를 높이기 위해 해당 결과물을 캐시파일로 저장하여 다음번 호출시 해당 로직을 수행하지 않고 즉각 캐시파일을 실행합니다.

원본파일이 수정될 경우 캐시파일이 자동 업데이트 ON/OFF 기능 또한 내장되어 있습니다. 






10. 외부 플러그인 컨트롤러의 자유로운 사용

Spac 프레임웍에서 개발에 필요한 모든 기능을 제공하지 않는 대신, 유용한 외부 클래스를 플러그인으로 로드하여 사용할 수 있는 환경을 제공합니다.

개발의 주가 되는 비즈니스로직과 직접적인 관련인 없는 범용 클래스들을 Spac에서는 외부컨트롤러로 인식하여 로딩하여 사용할 수 있도록 해줍니다.

 

이상 Spac의 일반적인 소개를 마칩니다.




Posted by webdata

::: SPAC (Simple Php Action Class) PHP Framework:::


요기로 가서 보세요 : http://spac.tistory.com/65

Posted by webdata
기본예제/회원관리2009. 12. 4. 23:47
이제 리스트 화면에서 특정회원을 삭제해 보도록 하겠습니다.

특정 회원을 삭제하기 위해선 해당 회원의 키값을 전달해야 하는데 회원가입예제에서 POST 처리를 했으므로 이번에는 GET방식으로 회원 키값을 받아 처리하는 예제를 해보겠습니다.

먼저 list.html 에 각 회원목록에 버튼을 만들어 회원의 정보를 삭제할 수있도록 GET방식으로 삭제 메소드에 변수를 전달하는 코드를 만듭니다.

기존 list.html 을 아래의 내용으로 수정합니다.

* Spac/view/list.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>회원리스트</title>

<script>
function deleteUser(user_id) {
    document.location.href="/User/deleteUser/"+user_id;
}
</script>

</head>
<body>

회원수는 <?=count($this->data_list)?> 명 입니다.
<br/><br/>

<table border="1">

    <tr bgcolor="#f2f2f2">
        <td width="100">아이디</td>
        <td width="120">이름</td>
        <td width="150">등록일</td>
        <td width="60">처리</td>       
    </tr>
 
<?php
foreach($this->data_list as $Rows) {
?>

    <tr>
        <td width="100"><?=$Rows['user_id']?></td>
        <td width="120"><?=$Rows['user_name']?></td>
        <td width="150"><?=$Rows['reg_date']?></td>
        <td width="60"><a href="#" onClick="deleteUser('<?=$Rows['user_id']?>')">삭제</a></td>              
    </tr>

<?php
}
?>

</table>

<!-- 회원가입버튼을 만들어주고 클릭하면 이전에 만든 가입폼으로 이동시킵니다. -->
<input type="button" value="회원가입" onClick="document.location.href='/User/viewUserRegForm'"></input>

</body>
</html>

회원 삭제처리 메소드는 User 클래스내에 "deleteUser" 로 하겠습니다.
따라서 위의 예제에서는 각 회원리스트중 "삭제" 버튼을 클릭하면 "/User/deleteUser/아이디" 를 브라우저로 호출하도록 했습니다.
URL에서 슬래시를 기준으로 첫번째는 클래스명, 두번째는 메소드명, 세번째이상은 전달 GET 변수입니다.
따라서 위 주소의 뜻은 User 클래스의 deleteUser 메소드를 "아이디"를 인자로 호출한다는의미입니다.

이제 실행할 실제 deleteUser 메소드를 작성합니다.
 
* Spac/model/User.Class.php
<?php
require_once("../Spac/controller/Dao/Dao.Class.php"); // getControllerInstance("Dao") 사용할경우 생략가능
class User extends Controller {

    var $user_id;
    var $user_pw;
    var $user_name;
   
    var $data_list = array();   

    function User () {
        $this->Dao = new Dao;             //$this->getControllerInstance("Dao"); 로 대체 가능.
        $this->Dao->transaction = true;
        $this->Dao->connect();
    }

    function viewUserRegForm() {
        $this->result_uri    = "user_reg.html";
        $this->dispatcher();
    }

    // POST 로 전송된 값을 맴버변수로 세팅합니다.
    function setPostVars() {
        $this->user_id       = $_POST['user_id'];
        $this->user_pw      = $_POST['user_pw'];
        $this->user_name  = $_POST['user_name'];
    }

    //위에서 저장된 맴버변수 값을 DB에 Insert 합니다.
    function regUser() {

        $this->setPostVars();

        //print_r($param);
        //exit;
       
        $query = " Insert Into user_info(user_id,user_pw,user_name,reg_date) values(?,password(?),?,NOW()) ";
        $this->Dao->prepareStatement($query);
      
        $param = array($this->user_id,$this->user_pw,$this->user_name);
       
        $this->Dao->setParam($param);
      
        $this->Dao->executeStatement();
      
        //echo "회원가입에 성공했습니다.";
        $this->result_uri    = "/User/getUserList";
        $this->redirect();

    }
   
    function getUserList() {
     
        $this->data_list = array();

        $query = " Select * From user_info ";
        $this->Dao->executeQuery($query);

        while($rows = $this->Dao->getFetchArray()) {
            $this->data_list[] = $rows;
        }

        $this->result_uri    = "list.html";
        $this->dispatcher();      

    }

    function getDeleteGetVars() {
        $this->user_id = $this->args[0];
    }
   
    function deleteUser() {
       
        $this->getDeleteGetVars();
       
        $query = " Delete From user_info Where user_id = ?";
        $this->Dao->prepareStatement($query);       
        $param = array($this->user_id);       
       
        $this->Dao->setParam($param);
      
        $this->Dao->executeStatement();
        $this->Dao->closeStatement();

        $this->result_uri    = "/User/getUserList";
        $this->redirect();
       
    }
   
   
   
   
   
   

}
?>


:::[getDeleteGetVars] 설명:::
위 내용중 파란색 글자 부분이 기존 User 클래스에서 추가된 내용입니다.
"getDeleteGetVars" 메소드를 보면 GET변수를 받는 방법을 알 수 있습니다.

 도메인/클래스명/메소드명/parameter1/parameter2.....

위의 형식 중 parameter를 받는 방법은
$param1 = $this->args[0];
$param2 = $this->args[1];


위의 getDeleteGetVars 예제에선 전달 변수가 1개이므로
    function getDeleteGetVars() {
        $this->user_id = $this->args[0];
    }

이처럼 변수를 받아 맴버변수로 저장했습니다.


[deleteUser] 설명

먼저 위의 getDeleteGetVars 메소드를 호출하여 전달된 변수를 맴버변수로 받습니다.
해당 변수를 user_id  조건으로 삭제 SQL 문을 처리합니다.

처리 후엔
        $this->result_uri    = "/User/getUserList";
        $this->redirect();

이처럼 회원 리스트 화면으로 이동시킵니다.


이제 브라우저에서 삭제처리를 실행하여 제대로 삭제가 이루어 지는지 테스트합니다.


'기본예제 > 회원관리' 카테고리의 다른 글

2. 회원리스트 조회  (0) 2009.12.01
1. 회원가입 예제  (0) 2009.12.01
Posted by webdata
기본예제/회원관리2009. 12. 1. 21:32
이전 예제에서 가입된 회원들의 리스트를 조회하는 예제를 해보겠습니다.

회원에 관련된 내용은 모두 User 클래스에서 실행합니다.
이전에 작성된 User 클래스에 몇가지 메소드를 추가해 보겠습니다.

* Spac/model/User.Class.php
<?php
require_once("/home/sue/www/Spac/controller/Dao/Dao.Class.php"); // getControllerInstance("Dao") 사용할경우 생략가능
class User extends Controller {

    var $user_id;
    var $user_pw;
    var $user_name;

    var $data_list = array();

    function User () {
        $this->Dao = new Dao;             //$this->getControllerInstance("Dao"); 로 대체 가능.
        $this->Dao->transaction = true;
        $this->Dao->connect();
    }

    function viewUserRegForm() {
        $this->result_uri    = "user_reg.html";
        $this->dispatcher();
    }

    // POST 로 전송된 값을 맴버변수로 세팅합니다.
    function setPostVars() {          //예제를 위해 POST 값을 직접 맴버변수에 등록했음.
        $this->user_id       = $_POST['user_id'];
        $this->user_pw      = $_POST['user_pw'];
        $this->user_name  = $_POST['user_name'];
    }

    //위에서 저장된 맴버변수 값을 DB에 Insert 합니다.
    function regUser() {
       
        $this->setPostVars();
       
        $query = " Insert Into user_info(user_id,user_pw,user_name,reg_date) values(?,password(?),?,NOW()) ";
        $this->Dao->prepareStatement($query);
       
        $param = array($this->user_id,$this->user_pw,$this->user_name);
        $this->Dao->setParam($param);
       
        $this->Dao->executeStatement();
       
        echo "회원가입에 성공했습니다.";

        $this->Dao->closeStatement();

    }

    function getUserList() {
      
        $this->data_list = array();

        $query = " Select * From user_info ";
        $this->Dao->executeQuery($query);

        while($rows = $this->Dao->getFetchArray()) {
            $this->data_list[] = $rows;
        }

        $this->result_uri    = "list.html";
        $this->dispatcher();       

    }
}
?>

회원리스트를 모두 배열로 가져오는 메소드  getUserList 를 추가했습니다.
회원 리스트는 "list.html" 로 출력합니다.

이제 list.html 파일을 뷰에 생성합니다.

* Spac/view/list.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>회원리스트</title>
</head>
<body>

회원수는 <?=count($this->data_list)?> 명 입니다.
<br/><br/>

<table border="1">

    <tr bgcolor="#f2f2f2">
        <td width="100">아이디</td>
        <td width="120">이름</td>
        <td width="150">등록일</td>
    </tr>
 
<?php
foreach($this->data_list as $Rows) {
?>

    <tr>
        <td width="100"><?=$Rows['user_id']?></td>
        <td width="120"><?=$Rows['user_name']?></td>
        <td width="150"><?=$Rows['reg_date']?></td>
    </tr>

<?php
}
?>

</table>

<!-- 회원가입버튼을 만들어주고 클릭하면 이전에 만든 가입폼으로 이동시킵니다. -->
<input type="button" value="회원가입" onClick="document.location.href='/User/viewUserRegForm'"></input>

</body>
</html>



이제 브라우저로 출력해 보겠습니다.
아래와 같이 호출합니다.
http://localhost/User/getUserList



회원 리스트가 잘 출력되는지, 회원가입버튼을 클릭하면 이전 예제에서 만든 가입품으로 이동하는지 확인합니다.

이제  회원 가입을 하면 가입처리된 후에 위 리스트 화면으로 이동하도록 수정해 보겠습니다.

User 클래스의 "regUser" 메소드의 마지막 부분만 수정해주면 되겠습니다.

* Spac/model/User.Class.php
<?php
require_once("/home/sue/www/Spac/controller/Dao/Dao.Class.php"); // getControllerInstance("Dao") 사용할경우 생략가능
class User extends Controller {

    var $user_id;
    var $user_pw;
    var $user_name;

    var $data_list = array();

    function User () {
        $this->Dao = new Dao;             //$this->getControllerInstance("Dao"); 로 대체 가능.
        $this->Dao->transaction = true;
        $this->Dao->connect();
    }

    function viewUserRegForm() {
        $this->result_uri    = "user_reg.html";
        $this->dispatcher();
    }

    // POST 로 전송된 값을 맴버변수로 세팅합니다.
    function setPostVars() {
        $this->user_id       = $_POST['user_id'];
        $this->user_pw      = $_POST['user_pw'];
        $this->user_name  = $_POST['user_name'];
    }

    //위에서 저장된 맴버변수 값을 DB에 Insert 합니다.
    function regUser() {
       
        $this->setPostVars();
       
        $query = " Insert Into user_info(user_id,user_pw,user_name,reg_date) values(?,password(?),?,NOW()) ";
        $this->Dao->prepareStatement($query);
       
        $param = array($this->user_id,$this->user_pw,$this->user_name);
        $this->Dao->setParam($param);
       
        $this->Dao->executeStatement();

        $this->Dao->closeStatement();
       
        //echo "회원가입에 성공했습니다.";
        $this->result_uri    = "/User/getUserList";
        $this->redirect();

    }

    function getUserList() {
      
        $this->data_list = array();

        $query = " Select * From user_info ";
        $this->Dao->executeQuery($query);

        while($rows = $this->Dao->getFetchArray()) {
            $this->data_list[] = $rows;
        }

        $this->result_uri    = "list.html";
        $this->dispatcher();       

    }
}
?>

위 소스중 echo 로 출력해주는 부분은 주석처리하고 아래 해당 페이지로 바로 이동 (redirect) 시켜줍니다.


브라우저에서 확인하여 회원가입 -> 리스트화면 -> 회원가입화면 의 형식으로 이동이 되는지 확인합니다.

'기본예제 > 회원관리' 카테고리의 다른 글

회원데이터의 삭제 :: Spac에서 변수의 전달처리  (0) 2009.12.04
1. 회원가입 예제  (0) 2009.12.01
Posted by webdata