본문 바로가기

운영체제/리눅스

리눅스 서버로 구축하는 웹 그룹웨어 솔루션

리눅스 서버로 구축하는 웹 그룹웨어 솔루션

필자 : 김태용 (sysop@debianusers.org)



들어가며..

    현재 기업 및 단체에서는 업무의 효율성을 증대하기 위해 그룹웨어를 도입하고 있다. 그룹웨어를 사용함으로서 생기는 업무의 효율성을 지면을 통해 말하지 않아도 많은 분들이 알고 있을 것이다. 그룹웨어들의 종류는 수십 가지에 이루며 대부분 상용이고 자신(회사)의 업무에 적용하기 위해서는 많은 시간과 돈을 투자해야 한다. 하지만 지금 소개하려고 하는 그룹웨어는 뛰어난 기능과 확장성 그리고 보안성을 가지고 있으면서 GPL LICENSE를 가지고 있는 그룹웨어들 중 한 가지이다.


1. PHPGroupWare 에 대해서

    PHPGroupWare는 최상의 인트라넷/그룹웨어 툴 그리고 어플리케이션 프레임워크이다. 이 프로그램은 PHP 언어로 작성되어 있으며, 개발자 애드온 어플리케이션을 작성할 수 있도록 만들어졌다. PHP는 간단하고 크로스 풀랫폼을 지원하며 서버 쪽에서 실행되는 스크립트이다. PHPGroupWare 의 개발 목적은 회사나 학교, 개인에게 자신들의 어플리케이션을 작성 및 완벽한 보안 적용을 할 수 있도록 하는 웹 기반 그룹웨어 어플리케이션을 만드는데 있다. 이 프로그램의 개발 주안점은 로터스 노츠의 강력한 프로그램적 능력을 가진 오픈 소스 그룹웨어 어플리케이션을 작성하는데 있다.


2. PHPGroupWare 의 특징

    PHPGroupWare는 새로운 기능과 어플리케이션을 아주 간단하게 작성할 수 있도록 만들어져 있다. 이 프로그램은 PHPGroupWare Core 와 PHPGroupWare Apps 두 부분으로 나누어져 있고, API는 아주 모듈화되어 있기 때문에 객체 지향적 디자인을 가지고 있으며 개발자로 하여금 자신들이 필요로 하는 정보와 함수에 접근할 수 있도록 한다.

    우선 core와 apps 그리고 API의 특징을 살펴보겠다.


    - core의 특징

    Web Mail (IMAP & POP3 지원 / 특별히 정형화된 이메일을 특별히 관리하기 위한 X-phpGW-Type 지원) / 통합된 유즈넷 뉴스그룹 (이메일에 통합) / 다중 파일 첨부 / 주소록 후크 (vcard 형식으로 작성된 파일 추가 가능) / 문제 발생할 경우 해결할 수 있는 이벤트 지원 / 스케줄러 (개인 / 그룹 지원) / TODO (개인 / 그룹 지원) / 파일 관리자 (비공개 / 그룹 디렉토리 지원) / 서버에서 파일을 업로드, 생성, 수정 지원 / 직접 전자우편 첨부를 저장 / 그룹웨어 인터페이스 번역 관리자 (간단한 인터페이스로 다국어로 인터페이스를 변환 업그레이드 지원 (한국어 포함 12개 국어 지원))

    - apps의 특징

    문제 생성 시스템 / 채팅 / 포럼 / 헤드라인 뉴스 / FTP 클라이언트 / Napster 클라이언트 / 리소스 부팅 시스템 (미팅룸 및 프로젝트를 위한) / 인적 자원 프로그램 / 발명 프로그램 / 팩스 통합 시스템 등이 있으며 계속 개발되고 있다.

    - API의 특징

    완전한 객체지향 구조 / 섹션 관리 / 현재 Mysql과 PostgreSQL을 지원하는 데이터베이스 추상화 / 프록시 서버와 연결을 관리하는 네트워크 클래스 / SQL, LDAP, PAM, SMB 기반 인증을 지원하는 인증 추상화 / 고도로 세련된 번역 지원 / 사용자 파일을 저장하고 사용하는 어플리케이션을 지원하는 파일 관리자 / 템플릿 시스템 / 사용자와 그룹 조합에 기반한 어풀리케이션 권한 (퍼미션) / 개발자가 간단한 함수를 사용하여 스케줄러에 아이템을 추가하도록 하는 등 모든 핵심 어풀리케이션에 간단한 인터페이스 / 브라우저 디텍션과 XML 파서 등과 같은 다양한 유틸리티 등이 있다.


3. 설치

    현재 APM(Apache + PHP + MySQL)이 작동하고 있다면 설치 및 설정하는 것은 간단하다. 몇 가지의 설정을 빼고는 웹으로 설치하고 설정할 수 있다.

    (1)  시작하기 전에.

    PHP가 설치되어 있는지 확인을 하려면 웹 서버 루트 디렉토리에 test.php 파일을 하나 만들고 아래와 같은 내용을 작성한다.

    <?      phpinfo();      ?>

    그리고 웹브라우저에서 http://서버주소/test.php 라고 입력하면 PHP 옵션이 자세하게 나온다. 기본적으로 APM만을 요구하지만 더 많은 기능을 원한다면 추가적으로 NNTP 서버와 LDAP 서버를 설정해 주어야 한다.

    APM 및 NNTP, LDAP 설정에 대해서는 특별히 다루지 않을 것이며 아래 사이트를 참고 하길 바란다.
    LDAP HOWTO http://kldp.org/HOWTO/html/LDAP/LDAP-HOWTO.html
    APM HOWTO http://kldp.org/KoreanDoc/html/ApacheMySQLPHP_Guide-KLDP/
                        ApacheMySQLPHP_Guide-KLDP.html
    Apache, SSL, MySQL, PHP  http://www.devshed.com/Server_Side/PHP/SoothinglySeamless

    (2)  테스트 한 시스템

    RedHat Linux 6.1, Debian GNU/Linux
    Kernel 2.2.18, 2.4.3
    PHP 3.0.13+, PHP 4.0.x
    Apache 1.3.x
    MySQL 3.2x
    Courier-IMAP & courier-IMAP-SSL 1.3.x 또는 courier-POP & courier-POP-SSL 0.3x 그리고 Qmail, Exim, Sendmail


4. PHPGroupWare 설치하기

    (1)  TarBall 설치하기

    tarball 에서 설치하는 방법은 가장 쉽다.
    예를 들면
    xxx:/var/www# wget http://prdownloads.sourceforge.net/phpgroupware/phpGroupWare-0.9.9p1.tar.gz
    xxx:/var/www# tar vfxz phpGroupWare-0.9.9p1.tar.gz
    xxx:/var/www# cd phpgroupware/

    (2)  CVS에서 설치하기

    CVS에서 설치하는 것도 쉽다. 파일이 웹서버 디렉토리에 있는지 확인하고 다음처럼 한다.
    (주의 : 서버 설정에 맞추어야 한다.)

    xxx:/var/www# cd /var/www
    xxx:/var/www# cvs -d:pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsroot/phpgroupware login (Password는 엔터 키로 넘긴다.)
    xxx:/var/www# cvs -z3 -d:pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsroot/phpgroupware co phpgroupware

    만약 CVSROOT를 사용하려면:

    xxx:/var/www# export CVSROOT=‘:pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsroot/phpgroupware’
    xxx:/var/www# cvs login (Password는 엔터 키로 넘긴다.)
    xxx:/var/www# cvs co phpgroupware

    이 방법 또한 웹디렉토리에 퍼미션이 있어야 한다. 없다면 관리자에게 문의하기 바란다.
    (2)-1.  CVS로 패치 하기.

    최근 phpGroupWare 개발자들이 릴리즈된 버전들에 대해 패치를 지원하고 있다. 이것은 다음 공식 릴리즈를 기다릴 필요 없이 현재 버전에 잘못된 것들을 수정하는 정도라고 할 수 있다. 패치와 픽스를 적용하고 관리하기 위한 개발자가 따로 있다. 예를 들어 0.9.9를 사용하는 코드의 이 버전을 검사해 보려면 다음과 같이 하면 된다.:

    login to cvs anonymously as described above
    cvs -z3 -d:pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsroot/phpgroupware -r Version-0_9_9-patches phpgroupware

    (3)  파일 퍼미션 설정

    phpGroupWare가 정상적으로 작동하게 하려면 몇 가지 파일 퍼미션을 설정해줘야 하는 디렉토리가 있다.

    임시 디렉토리(반드시 필요하다) - 이건 암시적으로 /tmp 디렉토리인데 몇 가지 어풀리케이션이 정상적으로 작동하려면 반드시 필요하다. 간단하게 웹서버가 거기에 파일을 추가/삭제할 수 있는지 확인해 봐야 한다.

    파일 디렉토리(꼭 필요함) - 이건 phpGroupWare 밑에 있는 디렉토리들인데 이 디렉토리의 웹 서버 계정 소유권을 줄 수 있다.

    chown nobody:nobody
    ( 이것은 사용자 nobody 로 웹 서버를 실행했다는 말이다. 자신의 서버 환경에 맞추어야 한다.)
    chmod 700 /var/www/phpgroupware/files

    루트 디렉토리(추천 안 함) - 웹 서버 계정으로 phpgroupware 디렉토리에 쓰기 권한을 주면 설치 프로그램이 자동적으로 header.inc.php 파일을 만들어줘야 한다. 아니면 그것을 만들기 위해서 설치 프로그램을 사용해야 하고 그것을 파일에 저장하려면 수동으로 해주어야 한다.

    그렇게 하려면:
    chown :nobody /var/www/phpgroupware
    chmod 770

    이렇게 하려면 퍼미션이 필요하다. 웹 서버 디렉토리에 쓰기 권한이 없으면 시스템 관리자에게 연락한다.

    (4)  DB 만들기

    어플리케이션을 설치하기 위해서 테이블을 만들려면 빈 데이터베이스가 필요하다.

      (4)-1.  Mysql (Mysql이 설치되어서 잘 동작한다고 가정하고)

      Mandrake 또는 RedHat: /etc/rc.d/init.d/mysqld start
      Debian: /etc/init.d/mysql start
      다른 시스템: /usr/local/mysql/bin/safe_mysqld &
      빈 데이터베이스 만들기: mysqldadmin -u someuser create phpgroupware -p
      mysql에 들어가려면: mysql -u someuser -p
      mysql 프롬프트에서 다음과 같이 한다:
      “somepassword” 으로 phpgroupware@local 로 접속해서 phpgroupware.* 에 모든 권한을 줘야 한다.
      Mysql에 대한 자세한 사용자 문서를 보려면 이곳으로 : http://www.mysql.com

      (4)-2.  Postgresql (역시 설치되었고 잘 동작한다고 가정하고)

      Postgresql에서 요구되는 디비를 생성하기 위해서는 postgresql이 시작되었는지 확인해야 한다.
      Mandrake 또는 RedHat: /etc/rc.d/init.d/postgresql start
      다른 시스템: /usr/bin/postmaster -D /var/lib/pgsql/data or /usr/bin/pg_ctl -D /var/lib/pgsq/data start (설치된 디렉토리에 맞춰서)
      빈 데이터베이스 만들기: /usr/bin/createdb phpgroupware
      데이터베이스 사용자 만들기: /usr/bin/createuser phpgroupware
      Postgresql에 대한 자세한 문서는 웹으로 가면 된다: http://www.postgresql.org

    (5)  phpGroupWare 설치/설정

    웹 브라자에서 http://서버루트/phpgroupware/setup/ 이라고 입력한다. 여기에 header.inc.php 과 데이터베이스 테이블이 만들어지거나 업그레이드 된다. 설치는 phpGroupWare 데이터베이스 버전과 설치된 header.inc.php 파일을 알아내려고 할 것이다. 그리고 최근 버전으로 업그레이드 한다.
    참고: 문제 생기는 게 싫다면 setup 스크립트를 실행하기 전에 데이터베이스를 모두 백업해야 한다!

    xxx:/var/www/phpgroupware# cp header.inc.php.template header.inc.php
    header.inc.php를 자신의 서버의 환경에 맞게 수정한 다음에 웹브라우저를 통하여 확인한다.

    예) http://webserver/phpgroupware/setup/


    위와 같은 결과가 나오면 일단 출발이 순조로운 편이다. header admin login에 접속한다.


    Login을 하고나면 위와 같이 header 세팅을 하게 된다. 세팅을 하고 나서 Continue를 눌러 세팅값을 저장한다.


    기본 세팅을 저장했다면 Setup/Config Admin Login에 접속한다.


    header.inc.php 을 정확히 설정했다면 위와 같은 화면을 볼 것이다.
    Step 1. Create 를 눌러 테이블을 생성시킨다.


    위와 같은 화면이 나오면 테이블 생성이 성공적으로 이루어졌다.
    Re-Check Myinstallation 으로 생성된 데이터 베이스를 검사한다.


    데이터베이스 테이블 생성이 완료되면 Step 2. Configure New 을 누른다.


    이곳에서 PHPGruopWare 의 인증 및 각종 서버에 대한 설정을 마치고


    Step 3. Manage Languages 를 눌려 사용언어를 선택한다.


    이곳에서 결정되는 언어는 나중에 사용자가 각자 자신의 사용언어를 선택할 때 사용된다.
    외국인이 이용하거나 할 경우는 사용하고자 하는 언어를 모두 추가한다.


    지금 까지 PHPGroupWare 의 환경을 설정하였다.
    여기서 Step 2. Click Here 를 눌러 Admin 계정 및 비밀번호를 반드시 작성해야 한다.

    (5)  설치 테스트


    대략적인 설정이 끝나고 http://webserver/phpgroupware/ 로(설치된 디렉토리) 이동을 한 다음 드디어 로그인을 한다. 설정이 정상적으로 되었으면 로그인할 수 있다. 여기서 관리자 권한을 가진 새로운 사용자를 만들고 예전 것은 지워버리는 것이 아마 좋을 것이다.


    로그인을 하면 브라우저 윗 부분에 아이콘들이 나오는데 preferences아이콘을 선택해서 환경을 설정해주면 된다. (위 화면은 로그인하고 나서 Administration의 화면이다.)

    설치된 위치를 웹 브라우저에서 지정한다. 로그인해 본다. 여기서 관리자 권한을 가진 새로운 사용자를 만들고 예전 것은 지워버리는 게 좋다.

    (6)  추가 어플리케이션 설치

    phpGroupWare 을 설치하고 실행해 봤다면 아마 추가적인 어플리케이션을 받아서 설치하고 싶을 것이다.

    새 어플리케이션을 받으면 README나 INSTALL을 꼭 보도록 한다. 그리고 DB에 새로운 테이블을 생성하고 lang 테이블(일반적으로 lang.sql 이라는 파일)에 추가적인 번역 데이터들이 있을 것이다.
    그냥 phpGroupWare 설치된 곳에 어플리케이션 디렉토리를 복사만 하면 새 어플리케이션이 다 설치된 것이다. 그리고 관리자 페이지에서 어플리케이션을 가능하도록 해주면 된다.

    예를 들면 헤드라인 어플리케이션 을 설치한다면
    (어플리케이션에 대한 것은 http://www.sourceforge.net/projects/phpgwapps 에서 보도록 한다.)
    어플리케이션의 .tar.gz 를 받거나 다음 명령으로 CVS 에 소스가 있는지 확인한다.

    export CVSROOT=‘:pserver:anonymous@cvs.phpgroupware.sourceforge.net:/cvsroot/phpgwapps’
    cvs login (password 는 엔터로 넘긴다.)
    cvs co headlines

    phpGroupWare 가 설치된 디렉토리로 headlines 디렉토리를 옮고 관리자로 phpGroupWare에 들어가서 관리자 페이지로 간다. 첫번째 섹션에서 어플리케이션 링크를 선택하고 추가하려면 클릭하고 양식을 다 채우면 된다. 어플리케이션 이름은 옮긴 디렉토리 이름으로 하면 되고 이 경우에는 headlines 라고 하면 된다. 어플리케이션 제목은 네비게이션 바에 보여지는 것이고 다른 곳에 새 어플리케이션을 언급하기 위한 것인데 여기서는 Headlines 라고 쓰면 된다. Enabled 는 임시적으로 모든 사용자들이 어플리케이션을 사용 못하도록 하는 것인데 이제 이 어플리케이션을 사용할 수 있도록 박스에 체크하면 된다. 관리자 페이지로 돌아가서 특정 사용자나 사용자 그룹에 대한 어플리케이션을 가능하도록 해야 한다. 그리고 계정 수정 페이지의 중간에 보이는 Headlines 박스를 체크해주면 된다.

    계정에 Headlines 어플리케이션에 추가되었으면 관리자와 환경설정 페이지에서 Headlines 라는걸 볼 수 있을 것이다. 그리고 네비게이션 바를 보면 Headlines 어플리케이션에 대한 아이콘도 있다. 관리자 영역 링크를 통해 Headlines 사이트를 활성화했다면 네비게이션 바에서 Headlines 아이콘을 클릭해서 선택한 사이트로부터 헤드라인을 받아올 수 있다.


5. phpGroupWare 어플리케이션 개발

    이번 장은 어플리케이션들을 통합하는데 필요한 phpGroupWare의 하부구조와 API를 설명하는 것이다.

    (1)  어플리케이션 작성의 개요

    우리는 별다른 어려움 없이 phpGroupWare를 위한 어플리케이션을 만들 수 있도록 시도했다. 우리는 어플리케이션 작업을 쉽게 할 수 있기를 바라며 phpGroupWare 자체는 다루지 않겠다.

    (2)  phpGroupWare API가 제공하는 것은?

    phpGroupWare API는 세션 관리, 사용자/그룹 관리를 관리하고 PHPLIB 데이터베이스 추상 메소드를 사용한 다중 데이터베이스를 지원한다. 그리고 PHPLIB 템플릿 클래스를 사용한 템플릿과 파일 시스템 인터페이스, 네트워크 입출력 인터페이스까지 지원한다.

    이런 기본적인 함수들의 제일 위에는, 필요로 하는 사용자 환경에 대한 정보와 phpGroupWare에 제대로 적용될 수 있도록 하는 몇 가지 함수들을 phpGroupWare에서 제공한다.


6.  지침

    (1)  요구

    이 지침는 phpGroupWare 딜럭스에 포함되도록 고려된 어떤 어플리케이션을 반드시 따르도록 되어야 한다.

      반드시 PHP3와 PHP4에서 실행되어야 한다.
      SQL 문장은 MySQL과 PostgreSQL에서 호환되어야 한다.
      기본적으로 포함된 header.inc.php를 사용해야 한다.
      모든 링크에 %phpgw_link($url)을 사용해야 한다 (이것은 세션을 지원하기 위한 것이다).
      폼에 대해 “post”를 사용해야 한다.
      phpGW 그룹 권한과 phpGW 사용자 퍼미션을 존중해야 한다.
      디렉토리 구조, 템플릿 지원, 언어(다중 언어) 지원을 사용해야 한다.
      Unix와 NT 플랫폼에서 동작해야 한다.

    이 요구에 맞지 않는 어플리케이션에 대해서는 phpGroupWare 어플리케이션 프로젝트를 통하여 사용자들이 활용할 수 있고 개발자가 결정한다는 것을 뜻한다. 만약 템플릿과 언어 지원으로 어플리케이션을 변환하는데 도움이 필요하다면 도움을 주도록 하겠다.

    (2)  어플리케이션 작성/포팅

    인클루드 파일
    작성하는 각 PHP 페이지는 어떤 변수를 따라 header.inc.php를 포함시켜야 한다.
    이것은 각 PHP 페이지의 제일 위에 이것을 넣으면 된다.

      <?php
      $phpgw_info[“flags”][“currentapp”] = “appname”;
      include(“../header.inc.php”);
      ?>

    물론 어플리케이션 이름은 맞도록 고치면 된다.
    이것은 다음과 같은 것을 제공할 것이다:

    phpgwAPI - phpGroupWare API가 로드될 것이다.
                      phpGW navbar가 로드될 것이다
                      (기본적이지만 다음 지점에서 비활성화할 수 있다).
    appname/inc/functions.inc.php - 이 파일은 phpgwAPI 뒤에 그리고 어떤 HTML 코드가
                                                    생성되기 직전에 로드된다. 이 파일은 모든 어플리케이션
                                                    특정 함수를 포함할 것이다. 이 파일 안에 필요로 하는
                                                    다른 추가적인 파일도 포함할 수 있다.
    appname/inc/header.inc.php - 이 파일은 시스템 header/navbar 바로 다음에 로드되고
                                                 개발자들은 로드될 필요가 있을 때마다 사용할 수 있다.
    appname/inc/footer.inc.php - 이 파일은 시스템 footer 바로 다음에 로드되고 개발자들은
                                                필요한 다른 곳이나 접속을 종료하기 위해 사용할 수 있다.
                                                phpGW footer가 로드될 것이고 몇몇 접속이 종료될 것이다.


]7.  어플리케이션 설치

    (1)  개요

    phpGroupWare에서 어플리케이션을 추가하고 삭제하는 것은 아주 쉽다.

    (2)  자동 기능

    우리는 개발자들이 쉽게 만들 수 있도록 하려고 다음과 같은 파일을 로드한다.
    appname/inc/functions.inc.php - 이 파일은 모든 어플리케이션 특정 함수들을
                                                    포함할 수 있다.
    appname/inc/header.inc.php - 이 파일은 시스템 header/navbar 바로 다음에서
                                                 $phpgw->common->header에 의해 로드되고 개발자로
                                                 하여금 로드가 필요한 부분에 사용할 수 있도록 한다.
    appname/inc/footer.inc.php - 이 파일은 시스템 footer 바로 앞에서
                                                $phpgw->common->footer 에 의해 로드되고, 개발자로
                                                하여금 필요로 하는 다른 부분과 접속을 종료하기 위해 사용
                                                할 수 있다.

    (3)  파일, 디렉토리, 아이콘 추가

    코드에 다음 디렉토리를 생성할 필요가 있다
    (‘appname’을 어플리케이션 이름으로 바꿔라)

    `--appname
      |--inc
      |   |--functions.inc.php
      |   |--header.inc.php
      |   |--hook_preferences.inc.php
      |   |--hook_admin.inc.php
      |   `--footer.inc.php
      `--templates
      |   `--default

    (4)  어플리케이션을 phpGroupWare에 인식시키기

    어플리케이션을 인식하는 어플리케이션을 만들기 위해서는 어플리케이션 테이블에 어플리케이션 설명을 추가하라. 이것은 GUI 관리자 화면을 통하여 이루어진다. 또는 SQL 스크립트로도 할 수 있다.

    insert into applications (app_name, app_title, app_enabled) values (‘appname’, ‘The App name’, 1);

    (5)  관리자 페이지에 후킹

    사용자가 관리자 페이지로 가면 각 어플리케이션이 활성화되어 있는지 어플리케이션 제목이 알파벳 순서에 따르는지 확인하여 appname/inc/hook_admin.inc.php 가 시작된다. 이 파일이 존재하면 이것은 nclude() 이면 그 어플리케이션을 설정하기 위한 링크의 선택을 표시할 것이다.

    간단한 예제:

    <?php
      $img = “/” . $appname . “/images/navbar.gif”;
      section_start(“My Application”,$img);
      echo “<a HREF=\“” . $phpgw->link(“myAdminPage.php”) . “\”>”;
      echo lang(“Change myApp settings”) . “</a>”;
      section_end();
    ?>

    더 자세한 예제는 headlines/inc/hook_admin.inc.php 와 admin/inc/hook_admin.inc.php 를 보라
    참고적으로:

    링크는 admin/index.php 파일에 상대적이지만 어플리케이션의 기본 디렉토리는 아니다. (그러므로 link() 를 호출하는 곳에 $appname 을 사용하라)

    파일은 include() 에서 불리워지며 이름에 공백이 들어가지 않도록 조심하라. 기본 $phpgw 와 $phpgw_info 변수는 영역 안에 있으며 패스에서 어플리케이션 이름과 관련된 $appname 이다.

    각 어플리케이션의 링크를 표시하는 것은 section_start()와 sectio_end()의 두 가지 함수가 있다.

    section_start
    section_start($title,$icon_url) 은 어플리케이션에 대한 섹션을 시작한다. $title은 lang()을 통해 패스되며 $icon_url()은 admin/index.php 나 절대 주소에 페이지 상대적이어야 한다.

    section_end
    section_end()는 section_start()로 시작된 섹션을 종료한다.

    (6)  환경 페이지로 후킹하기

    환경 페이지로 후킹하는 메커니즘은 관리자 페이지에 후크하기 위해 사용된 것과 동일하지만 appname/inc/hook_admin.php 대신 appname/inc/hook_preferences.inc.php 를 찾는다. 동일한 함수와 변수가 정의되어 있다.


8.  하부구조

    (1)  개요

    pgpGroupWare는 개발자에게 작동할 sound 디렉토리 구조를 제공하도록 할 것이다.
    디렉토리 레이아웃은 처음에 복잡한 것처럼 보이지만 조금 사용한 후에는 많은 수의 어플리케이션과 함수들이 수용하고 있다는 것을 알게 될 것이다.

    (2)  디렉토리 트리

    .--appname
    |   |--inc
    |   |   |--functions.inc.php
    |   |   |--header.inc.php
    |   |   |--hook_preferences.ini.php
    |   |   |--hook_home.inc.php
    |   |   `--footer.inc.php
    |   |--manual
    |   |--setup
    |   |   |--baseline.inc.php
    |   |   |--droptables.inc.php
    |   |   |--newtables.inc.php
    |   |   |--upgradetables.inc.php
    |   |   |--config.inc.php
    |   |   `--register.inc.php
    |   `--templates
    |   |   `--default
    |   |      `--images
    |   |        `--navbar.gif
    |   |--preferences.php
    |--docs (installation docs)
    |--files
    |   |--groups
    |   `--users
    `--phpgwapi
       |--cron (phpgroupware's optional daemons)
       |--doc (developers docs)
       |--inc
       |

      |--phpgw.inc.php
       |   |--phpgw_info.inc.php
       |   |--phpgw_common.inc.php
       |   `--etc..
       |--manual
       |--setup
       |   |--baseline.inc.php
       |   |--droptables.inc.php
       |   |--newtables.inc.php
       |   |--upgradetables.inc.php
       |   |--config.inc.php
       |   `--register.inc.php
       |--templates
       |   |--default
       |   |   `--images
       |   |   |--home.gif
       |   |   `--preferences.gif
       |   `--verilak
       |      `--images
       |       |--home.gif
       |       `--preferences.gif
       `--themes
          `--default.theme

    (3)  번역

    번역은 데이터베이스를 통해 이루어지며 다른 메커니즘을 사용하도록 설정할 수 있다.
    Transy라고 부르는 프로그램을 통해 개발자/번역가들이 번역물을 만들거나 업그레이드하도록 훌륭한 GUI를 제공할 것이다. 이것은 SQL 스크립트를 작성하고 이름을 lang.sql이라고 하면 된다는 것이다. 이것을 doc/lang.sql로 복사하고 템플릿으로 사용하면 된다.


9.  API

    (1)  소개

    phpGroupWare는 개발자들에게 일반 태스크를 관리하는 유용한 API를 제공한다.
    이것을 하기 위해서 우리는 다차원 클래스 $phpgw-> 를 만들었다.
    이것은 굉장한 코드 체계를 허용하며 개발자들이 함수가 사용된 파일을 쉽게 명시할 수 있도록 도와준다. 이 클래스의 부분인 모든 파일들은 inc/core 디렉토리에 있으며 sub-class 와 맞도록 이름되어 있다.

    예: $phpgw->send->msg() 는 inc/phpgwapi/phpgw_send.inc.php 파일에 있다.

    (2)  기본 함수

    $phpgw->link
    $phpgw->link($url)

    세션 관리에 대한 지원을 추가한다. 모든 링크는 반드시 이것을 사용하며 href의 폼 액션과 헤더 로케이션을 포함한다. 만약 같은 페이지로 돌아가는 폼 액션을 해야 한다면 어떤 파라미터도 없이 사용할 수 있다.

    이 함수는 매우 자주 사용되기 때문에 클래스의 핵심 부분에 있으며 개발자들이 키만 몇 번 두드리면 되기를 바란다. 예:

    <form name=copy method=post action=“<?php echo $phpgw->link();?>”>

    /* 만약 세션 관리가 url 파라미터를 전달하여 이루어진다면 */
    /* 결과는 다음과 같이 될 것이다. */
    /* <form name=copy method=post action=“somepage.php?sessionid=87687693276?kp3=kjh98u80”> */

    (3)  어플리케이션 함수

    $phpgw->common->phpgw_header
    $phpgw->phpgw_header()
    네비게이션 바와 appname/inc/header.php를 포함하는 HTML 페이지의 시작 부분을 출력한다.

    $phpgw->common->phpgw_footer
    $phpgw->phpgw_footer()
    appname/inc/footer.php 를 포함하는 시스템 footer 를 출력한다.

    $phpgw->common->appsession
    $phpgw->common->appsession($data)

    어플리케이션이 필요로 하는 중요한 정보 세션 정보들을 저장한다.
    $phpgw->appsesstion은 세션 테이터의 값이 파라미터를 빈 값을 남겼다는 것을 리턴하며 [즉 $phpgw->appsession(“”)] 그렇지 않으면 보내는 데이터가 저장될 것이다.
    또한 쉼표로 분리된 문자열을 저장할 수 있고 돌려받을 값을 받았을 때 배열에 넣기 위해서는 explode()를 사용하라.

    예:
      $phpgw->common->appsession(“/path/to/something”);
      echo “Dir: ” . $phpgw->common->appsession();

    (4)  파일 함수

    $phpgw->vfs->read_file
    $phpgw->vfs->read_file($file)
    $file로부터 데이터를 리턴한다.
    파일에 완전한 경로를 전달해야 한다.

    예:
    $data = $phpgw->vfs->read_file(“/some/dir/to/file.txt”);

    $phpgw->vfs->write_file
    $phpgw->vfs->write_file($file, $contents)
    $file에 데이터를 기록한다.
    파일에 완전한 경로를 전달해야 한다.

    예:
    $data = $phpgw->vfs->write_file(“/some/dir/to/file.txt”);

    $phpgw->vfs->read_userfile
    $phpgw->vfs->read_userfile($file)
    사용자 개인 디렉토리에서 $file로부터 데이터를 리턴한다.

    예:
    $data = $phpgw->vfs->read_userfile(“file.txt”);

    $phpgw->vfs->write_userfile
    $phpgw->write_userfile($file, $contents)
    사용자 개인 디렉토리에서 $file에 데이터를 기록한다.

    예:
    $data = $phpgw->vfs->write_userfile(“file.txt”);

    $phpgw->vfs->list_userfiles
    $phpgw->vfs->list_userfiles()
    사용자 개인 디렉토리에 있는 파일의 목록을 가진 배열을 리턴한다.

    예:
    $filelist = array();
    $filelist = $phpgw->vfs->list_userfiles();

    (5)  이메일/NNTP 함수

    $phpgw->send->msg
    $phpgw->msg->send($service, $to, $subject, $body, $msgtype, $cc, $bcc)
    email이나 NNTP를 통해 메시지를 전송하고 에러 코드를 리턴한다.

    예:
    $to = “someuser@domain.com”;
    $subject = “Hello buddy”;
    $body = “Give me a call\n Been wondering what your up to.”;
    $errors = $phpgw->msg->send(“email”, $to, $subject, $body);


10.  설정 변수

    (1)  소개

    phpGroupWare는 개발자들에게 가능한 사용자, 그룹, 서버, 어플리케이션 환경에 대한 정보를 제공한다.
    이렇게 하기 위해 우리는 환경에 대한 모든 정보를 가진 $phpgw_info[]라고 하는 다차원 배열을 제공한다.
    다차원 배열에 접근해서 이 값을 알아내는 것은 쉽다.

    몇 가지 예를 보자:

      <?php
      // To do a hello username
      echo “Hello” . $phpgw_info[“user”][“fullname”];
      //If username first name is John and last name is Doe, prints: ‘Hello John Doe’
      ?>
      <?php
      // To find out the location of the imap server
      echo “IMAP Server is named: ” . $phpgw_info[“server”][“imap_server”];
      //If imap is running on localhost, prints: ‘IMAP Server is named: localhost’
      ?>

    (2)  사용자 정보

    $phpgw_info[“user”][“userid”] = 사용자 아이디
    $phpgw_info[“user”][“sessionid”] = 세션 아이디
    $phpgw_info[“user”][“theme”] = 선택한 테마
    $phpgw_info[“user”][“private_dir”] = 사용자 개인 디렉토리. phpGroupWare 핵심 함수는 파일에 접근하기 위해 이것을 사용한다.
    $phpgw_info[“user”][“firstname”] = 사용자 이름
    $phpgw_info[“user”][“lastname”] = 사용자 성
    $phpgw_info[“user”][“fullname”] = 사용자 전체 이름
    $phpgw_info[“user”][“groups”] = 사용자가 속한 그룹
    $phpgw_info[“user”][“app_perms”] = 사용자가 현재 어플리케이션에 접근할 수 있다면
    $phpgw_info[“user”][“lastlogin”] = 사용자가 마지막으로 로그인한 시간
    $phpgw_info[“user”][“lastloginfrom”] = 마지막에 로그인한 곳
    $phpgw_info[“user”][“lastpasswd_change”] = 마지막으로 변경한 비밀번호
    $phpgw_info[“user”][“passwd”] = 해쉬된 비밀번호
    $phpgw_info[“user”][“status”] = 사용자가 활성화 되었다면
    $phpgw_info[“user”][“logintime”] = 현재 세션에 로그인한 시간
    $phpgw_info[“user”][“session_dla”] = 현재 세션에 무엇인가를 한 마지막 시간

    $phpgw_info[“user”][“session_ip”] = 현재 아이피 주소

    (3)  그룹 정보

    $phpgw_info[``group''][``group_names''] = 그룹 목록

    (4)  서버 정보

    $phpgw_info[“server”][“server_root”] = 메인 설치 디렉토리
    $phpgw_info[“server”][“include_root”] = inc 디렉토리의 위치
    $phpgw_info[“server”][“temp_dir”] = 임시로 저장할 수 있는 디렉토리
    $phpgw_info[“server”][“files_dir”] = 사용자와 그룹 파일이 저장되는 디렉토리
    $phpgw_info[“server”][“common_include_dir”] = 핵심/공유 포함 파일들의 위치
    $phpgw_info[“server”][“template_dir”] = 활성화된 템플릿 파일 디렉토리. 이것은 서버에
                                                                의해 기본적으로 정해지며 사용자가 바꿀수 있다.
    $phpgw_info[“server”][“dir_separator”] = 윈독엔튀 디렉토리 형식으로 호환 가능
    $phpgw_info[“server”][“encrpytkey”] = 암호화 함수에 사용된 키
    $phpgw_info[“server”][“site_title”] = 각 웹 페이지의 타이틀바에 보여질 사이트 타이틀
    $phpgw_info[“server”][“webserver_url”] = phpGroupWare 설치된 URL
    $phpgw_info[“server”][“hostname”] = phpGroupWare가 설치된 서버의 이름
    $phpgw_info[“server”][“charset”] = 기본 문자셋, 기본:iso8859-1
    $phpgw_info[“server”][“version”] = phpGroupWare 버전.

    (5)  데이터베이스 정보

    사용할 데이터베이스들이 $phpgw_info_db에 의해 이미 로드되어 있기 때문에 필요하지는 않을 것이다.

    $phpgw_info[“server”][“db_host”] = 데이터베이스의 주소. localhost로 설정된다.
    $phpgw_info[“server”][“db_name”] = 데이터베이스 이름
    $phpgw_info[“server”][“db_user”] = 사용자 이름
    $phpgw_info[“server”][“db_pass”] = 비밀번호
    $phpgw_info[“server”][“db_type”] = 데이터베이스 타입. 현재 MySQL과 PostgreSQL이
                                                          지원된다.

    (6)  메일 함수

    이것은 phpGroupWare 함수를 통해 제공되기 때문에 필요가 없을 것이다.

    $phpgw_info[“server”][“mail_server”] = IMAP 서버의 주소. 보통 localhost
    $phpgw_info[“server”][“mail_server_type”] = IMAP 또는 POP3
    $phpgw_info[“server”][“imap_server_type”] = Cyrus 또는 Uwash
    $phpgw_info[“server”][“imap_port”] = 일반적으로 143, 바꿀 수도 있다.
    $phpgw_info[“server”][“mail_suffix”] = 도메인 이름이며 이메일 어드레스를
                                                              추가할 때 사용한다.
    $phpgw_info[“server”][“mail_login_type”] = VMailMgr을 지원하기 위해 추가한다.
                                                                    일반적으로 'standard' 이다.
    $phpgw_info[“server”][“smtp_server”] = SMTP 서버의 주소. 일반적으로 localhost이다.
    $phpgw_info[“server”][“smtp_port”] = 보통 25이며 바꿔도 된다.

    (7)  NNTP 정보

    $phpgw_info[“server”][“nntp_server”] = NNTP 서버 주소
    $phpgw_info[“server”][“nntp_port”] = 보통 XX이며 바꿔도 된다.
    $phpgw_info[“server”][“nntp_sender”] = 모른다
    $phpgw_info[“server”][“nntp_organization”] = 모른다
    $phpgw_info[“server”][“nntp_admin”] = 모른다

    (8)  어플리케이션 정보

    각 어플리케이션은 가능한 다음 정보를 가지고 있다.

    $phpgw_info[“apps”][“appname”][“title”] = 어플리케이션의 제목
    $phpgw_info[“apps”][“appname”][“enabled”] = 어플리케이션 활성화. True 또는 False
    $phpgw_info[“server”][“app_include_dir”] = 현재 어플리케이션 include 파일 위치
    $phpgw_info[“server”][“app_template_dir”] = 현재 어플리케이션 tpl 파일의 위치
    $phpgw_info[“server”][“app_lang_dir”] = 현재 lang 디렉토리 위치
    $phpgw_info[“server”][“app_auth”] = 서버와 현재 사용자가 현재 어플리케이션에
                                                            접근할 수 있는가
    $phpgw_info[“server”][“app_current”] = 현재 어플리케이션의 이름


11.  언어 지원 사용하기

    (1)  개요

    phpGroupWare는 다중 언어 지원 스키마를 내장하고 있다. 이것은 페이지가 아주 쉽게 다른 언어로 변경될 수 있다는 뜻이다. 텍스트 문자열의 번역은 phpGroupWare 데이터베이스에 저장되어 있고 phpGroupWare 관리자가 변경할 수 있다.

    (2)  언어 지원 사용하는 방법

    lang() 함수는 phpGroupWare의 국제화 지원에 맞는 어플리케이션의 인터페이스이다.
    어플리케이션을 개발하는 동안 lang()을 호출하여 텍스트를 출력하면 된다. 다음과 같은 코드로:

      $x = 42;
      echo lang(“The counter is %1”,$x).“<br>”;

    이것은 “The counter is %1'”을 번역할 것이며 사용 중인 현재 어플리케이션과 언어를 기반으로 한 번역된 버전이 리턴될 것이다. $x 가 끝나는 위치가 코드 상에서 문자열로 처리하는 것이 아니라 문자열 형식으로 제어가 되어 있다는 것을 주의하라. 이것은 어플리케이션이 실제 숫자가 문자열의 끝에 있지 않다는 것으로 번역하는 것을 허용한다.

    번역이 없으면 원래 문장은 문자열 다음에 * 를 포함하여 리턴된다. 이것은 어플리케이션을 쉽게 개발하도록 하며 다시 돌아가 나중에 (*에 의해 표시된) 번역물이 빠졌다는 것을 추가한다. lang 테이블에서 특정 번역이 없으면 다음과 같이 출력된다:

    The counter is 42*<br>

    만약 현재 사용자가 이탈리아어를 사용한다면 문장은 다음과 같이 리턴될 것이다:

    il contatore e 42<br>

    lang 함수

    lang($key, $m1=“”, $m2=“”, $m3=“”, $m4=“”, $m5=“”,
              $m6=“”, $m7=“”, $m8=“”, $m9=“”, $m10=“”)

    [$key ]
    번역할 문자열이며 %n 형식의 교체 지시자를 포함할 것이다.

    [$m1 ]
    첫번째 교체 값 또는 교체 값의 배열이 될 것이다 ($m2인 경우에는 무시된다)

    [$m2 - $m10 ]
    만약 $m1이 배열이 아니라면 두번째부터 열번 째 교체 값
    데이터베이스는 $key에 맞는 lang.message_id를 가진 열을 찾을 것이다. 만약 번역이 없으면 원래 $key가 사용된다. 번역 엔진은 %N 형식의 모든 토큰을 N번째 파라미터($m1[N] 또는 $mN)으로 대체될 것이다.

    번역 데이터 추가
    번역 데이터를 수동으로 생성하는데 Transy라는 어플리케이션은 이것을 쉽게 하도록 개발되었다.

    lang 테이블
    번역 클래스는 모든 번역에 lang 테이블을 사용한다. 번역을 만드는 것은 네 가지 컬럼이 있다:

    [$message_id ]
    메시지(lang() 함수에 전달된 $key)에 일치하는 키. 이것은 영어로 작성되었다.

    [app_name ]
    번역이 적용될 어플리케이션. 또는 다중 어플리케이션에 있다면 거기에도.

    [lang ]
    번역된 어플리케이션에 대한 코드가 있다.

    [content ]
    번역된 문자열

    lang,sql
    현재 모든 어플리케이션 그리고 핵심 phpGroupWare 소스 트리는 lang.sql 파일을 가지고 있다. 이것은 번역 데이터를 추가하는 곳이다. 폼에서 한 줄만 추가한다.

    REPLACE INTO lang (message_id, app_name, lang, content)
    VALUES( ‘account has been deleted’,‘common’,‘en’,‘Account has been deleted’);

    lang 언어에 message_id 문자열을 반영하는 내용을 번역한다. 만약 문자열이 어플리케이션에 표시되면 app_name에 어플리케이션을 넣거나 일반적인 이름을 사용하라. message_id는 소문자이어야 한다.

    (3)  일반적인 리턴 코드

    phpGroupWare 소스를 보면 고수준 함수들에서 사용된 리턴 코드들에 대한 패턴을 알 수 있을 것이다. 사용된 코드는 doc/developers/CODES 파일에 부분적으로 문서화되어 있다.
    코드는 일반적인 에러를 알애내고 사용자에게 프로세스 제어를 간단하게 알려주기 위해 사용되었다. 이것은 리턴되기 전에 lang()을 통하여 문자열을 전달하면 check_code() 함수를 통해 문자열로 변환된다.

    예를 들면

    echo check_code(13);

    이라고 호출하면 다음과 같이 출력할 것이다.

    Your message has been sent

    현재 언어로 번역된다.


12.  템플릿 사용하기

    (1)  개요

    phpGroupWare는 템플릿에 기반한 구조를 사용한다. 이것은 페이지를 출력하고 tpl 파일을 저장하고 다른 언어로 변환할 수 있다는 것이며 완전히 다른 것으로 보여지게 할 수도 있다는 뜻이다.

    (2)  템플릿 사용하기

    템플릿을 사용하는 몇 가지 명령:

    템플릿 클래스는 PHPLIBs 문서를 읽어보라.
    http://phplib.netuse.de