"SugarCRM"의 두 판 사이의 차이

오픈소스 비즈니스 컨설팅
둘러보기로 가기 검색하러 가기
잔글
잔글
 
(같은 사용자의 중간 판 14개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
오픈소스로 제공되는, On-Premise/On-Demand/Appliance 방식의 CRM인 sugarCRM (Sugar Community Edition)을 소개한다.
 
오픈소스로 제공되는, On-Premise/On-Demand/Appliance 방식의 CRM인 sugarCRM (Sugar Community Edition)을 소개한다.
* 홈페이지
 
:*http://www.sugarcrm.com/
 
:*http://www.codeplex.com/sugarcrm/
 
:*http://www.sugarforge.org/content/open-source/, http://www.sugaropensource.org/, http://sourceforge.net/projects/sugarcrm/
 
* 다운로드 : http://sourceforge.net/project/showfiles.php?group_id=107819
 
* 라이센스 : AGPL v3 + 상용 라이센스
 
* 플랫폼  : Windows, Solaris, Linux, Mac OS
 
  
==Document==
+
*홈페이지
 +
 
 +
:*[http://www.sugarcrm.com/ http://www.sugarcrm.com/]
 +
:*[http://www.codeplex.com/sugarcrm/ http://www.codeplex.com/sugarcrm/]
 +
:*[http://www.sugarforge.org/content/open-source/ http://www.sugarforge.org/content/open-source/], [http://www.sugaropensource.org/ http://www.sugaropensource.org/], [http://sourceforge.net/projects/sugarcrm/ http://sourceforge.net/projects/sugarcrm/]
 +
 
 +
*다운로드 : [http://sourceforge.net/project/showfiles.php?group_id=107819 http://sourceforge.net/project/showfiles.php?group_id=107819]
 +
*라이센스 : AGPL v3 + 상용 라이센스
 +
*플랫폼  : Windows, Solaris, Linux, Mac OS
 +
 
 +
== Document ==
 +
 
 
*기술지원
 
*기술지원
:*Forum : http://forums.sugarcrm.com/
 
:*Blog : http://developers.sugarcrm.com/wordpress/
 
  
*[http://apidocs.sugarcrm.com/ API Document] : [http://www.phpdoc.org/ phpDocumentor 2]를 사용하여 추출한 API Document
+
:*Forum : [http://forums.sugarcrm.com/ http://forums.sugarcrm.com/]
:*Ultimate : [http://apidocs.sugarcrm.com/api/6.5.4/ult API], [http://apidocs.sugarcrm.com/schema/6.5.0/ult Schema]
+
:*Blog : [http://developers.sugarcrm.com/wordpress/ http://developers.sugarcrm.com/wordpress/]
:*Enterprise : [http://apidocs.sugarcrm.com/api/6.5.4/ent API], [http://apidocs.sugarcrm.com/schema/6.5.0/ent Schema]
 
:*Corporate : [http://apidocs.sugarcrm.com/api/6.5.4/corp API], [http://apidocs.sugarcrm.com/schema/6.5.0/corp Schema]
 
:*Professional : [http://apidocs.sugarcrm.com/api/6.5.4/pro API], [http://apidocs.sugarcrm.com/schema/6.5.0/pro Schema]
 
:*Community : [http://apidocs.sugarcrm.com/api/6.5.4/ce API], [http://apidocs.sugarcrm.com/schema/6.5.0/ce Schema]
 
  
*http://developers.sugarcrm.com/docs/ENT/6.4/n/Application_Guides/-docs-Application_Guides-Sugar_Enterprise_Application_Guide_6.4.0-toc.html
+
*[http://apidocs.sugarcrm.com/ API Document] : [http://www.phpdoc.org/ phpDocumentor 2]를 사용하여 추출한 API Document
 +
 
 +
:*Ultimate : [http://apidocs.sugarcrm.com/api/6.5.4/ult API], [http://apidocs.sugarcrm.com/schema/6.5.0/ult Schema]
 +
:*Enterprise : [http://apidocs.sugarcrm.com/api/6.5.4/ent API], [http://apidocs.sugarcrm.com/schema/6.5.0/ent Schema]
 +
:*Corporate : [http://apidocs.sugarcrm.com/api/6.5.4/corp API], [http://apidocs.sugarcrm.com/schema/6.5.0/corp Schema]
 +
:*Professional : [http://apidocs.sugarcrm.com/api/6.5.4/pro API], [http://apidocs.sugarcrm.com/schema/6.5.0/pro Schema]
 +
:*Community : [http://apidocs.sugarcrm.com/api/6.5.4/ce API], [http://apidocs.sugarcrm.com/schema/6.5.0/ce Schema]
 +
 
 +
*[http://developers.sugarcrm.com/docs/ENT/6.4/n/Application_Guides/-docs-Application_Guides-Sugar_Enterprise_Application_Guide_6.4.0-toc.html http://developers.sugarcrm.com/docs/ENT/6.4/n/Application_Guides/-docs-Application_Guides-Sugar_Enterprise_Application_Guide_6.4.0-toc.html]
  
 
*[http://support.sugarcrm.com/02_Documentation/01_Sugar_Editions/02_Sugar_Enterprise/Sugar_Enterprise_6.5/Sugar_Enterprise_Administration_Guide_6.5.0 Sugar Enterprise 6.5.0 Administration Guide - SugarCRM Support Site]
 
*[http://support.sugarcrm.com/02_Documentation/01_Sugar_Editions/02_Sugar_Enterprise/Sugar_Enterprise_6.5/Sugar_Enterprise_Administration_Guide_6.5.0 Sugar Enterprise 6.5.0 Administration Guide - SugarCRM Support Site]
28번째 줄: 34번째 줄:
 
*[http://status.sugarcrm.com/ On-Demand Status]
 
*[http://status.sugarcrm.com/ On-Demand Status]
  
==CentOS에 Sugar 6.5.13 설치==
+
== 관리자 가이드 ==
CentOS에서 Sugar를 설치 합니다.
 
  
*사전 준비 사항
+
=== 로그 설정 ===
:*[[MySQL]] 설치
 
:*[[Apache HTTP Server]] 설치
 
:*[[PHP]] 설치
 
  
*Sugar를 다운로드하여 원하는 위치에 놓고 압축을 풉니다.
+
*로그 파일
cd /cloudnas/install
 
wget http://sourceforge.net/projects/sugarcrm/files/1%20-%20SugarCRM%206.5.X/SugarCommunityEdition-6.5.X/SugarCE-6.5.14.zip/download
 
 
unzip SugarCE-6.5.14.zip
 
chown -R apache:apache SugarCE-Full-6.5.14
 
mv SugarCE-Full-6.5.14 /cloudnas/www/html/sugar
 
 
 
*IE에서 http://~/sugar 사이트로 접속하여 설치를 진행 합니다.
 
 
 
*"The passwords provided for the Sugar database user do not match. Please re-enter the same passwords in the password fields." 오류 발생시
 
:*"Same as Admin User"를 선택하여 설치 합니다.
 
:*설치 완료후 config.php 파일에서 db 접속 정보를 수동으로 변경 합니다.
 
 
 
==설치 가이드==
 
아래 설치 가이드는 Windows Server 2003을 기준으로 작성한 것 입니다. 설치 환경이 틀릴 경우에는 별도의 주석을 달아 주세요.
 
 
 
===설치전 사전 준비 사항===
 
*[[MySQL 5.0.51|MySQL Community Server 5.0.51]] 설치
 
:*[[MySql Tools for 5.0|MySql Tools for 5.0]] 설치
 
*[[Apache HTTP Server 2.2.8|Apache HTTP Server 2.2.8 with OpenSSL 0.9.8g]]
 
*[[PHP 5.2.5|PHP 5.2.5]] 설치
 
:*PHP에 [[PHP 5.2.5#GD Library 설치|GD Library 2.0.35]] 설치
 
:*PHP에 gettext 모듈 설치
 
:*PHP에 [[PHP 5.2.5#IMAP 설치|IMAP 확장팩]] 설치
 
:*PHP에 mbstring 모듈 설치
 
:*PHP에 mysql, mysqli 모듈 설치
 
:*PHP에 curl 모듈 설치
 
:*php.ini에서 다음과 같이 설정 한다.
 
memory_limit = 128M        : 최소 40M 이상
 
upload_max_filesize = 10M  : 최소  6M 이상
 
post_max_size = 10M        : 최소  6M 이상
 
 
 
===Sugar CRM 설치===
 
*[http://sourceforge.net/projects/sugarcrm/files/ 다운로드 사이트]에서 설치 프로그램인 "SugarCE-5.2.0j.zip"을 다운로드 한다.
 
:*Apache의 Document Root인 c:/www 아래 c:/www/sugar/ 폴더($SUGAR_HOME)에 다운로드 받은 압축 파일의 압축을 풀어 저장 한다.
 
<br>
 
 
 
*Sugar CRM은 PHP 버전이 최소 5.1.0 이상이 되어야 하며, 5.2.x를 권장 하므로 5.3.0일 경우 다음과 같이 조치를 취하여야 정상적으로 설치가 된다.
 
//--- $SUGAR_HOME/include/utils.php의 setPhpIniSettings() 함수에서 3라인을 주석 처리 한다.
 
function setPhpIniSettings() {    //--- 3562 라인
 
//  if(function_exists('gzclose') && headers_sent() == false) {
 
//      ini_set('zlib.output_compression', 1);
 
//  }
 
 
//--- $SUGAR_HOME/install/welcome.php에서 (163 라인)
 
if (version_compare(phpversion(),'5.1.0') < 0 || version_compare(phpversion(),'5.3.0') >= 0) {
 
//--- 위 문장을 아래와 같이 수정 한다.
 
if (version_compare(phpversion(),'5.1.0') < 0 || version_compare(phpversion(),'5.3.0') > 0) {
 
<br>
 
 
 
*[http://localhost/sugar/install.php http://localhost/sugar/install.php]에 접속하여 SugarCRM 설정을 시작 한다.
 
:[[그림:install_sugar_001.png|설치 시작]]
 
:*하단의 "Next" 버튼을 선택 한다.
 
<br>
 
 
 
*"I Accept"를 체크하여 라이선스를 확인한 후 "Next" 버튼을 선택 한다.
 
:[[그림:install_sugar_002.png|라이선스 확인]]
 
<br>
 
 
 
*"Custom Install"을 선택한 후 "Next" 버튼을 선택 한다.
 
:[[그림:install_sugar_003.png|Custom Install]]
 
<br>
 
 
 
*Database Type으로 "MySQL(MySQLi detected)"를 선택한 후 "Next" 버튼을 선택 한다.
 
:[[그림:install_sugar_004.png|DBMS 선택]]
 
<br>
 
 
 
*다음과 같이 DBMS 정보를 설정한 후 "Next" 버튼을 선택 한다.
 
Database Name                        : "sugardb" (SugarCRM용으로 생성한 Database 명)
 
Host Name                            : "localhost"
 
Database Administrator Username      : "root"
 
Database Admin Password              : xxxx
 
Select Box에서 “Provide existing user”를 선택 한다.
 
Sugar Database Username              : "sugar" (SugarCRM용으로 생성한 DB 사용자)
 
Sugar Database User Password          : xxxx
 
Re-enter Sugar Database User Password : xxxx
 
Populate Database with Demo Data?    : "yes" 선택 (데모용 데이터가 생성됨)
 
:[[그림:install_sugar_005.png|DBMS 설정]]
 
<br>
 
 
 
*"I Accept" 버튼을 선택하여 위 설정에 따라 DB가 생성되도록 한다.
 
:[[그림:install_sugar_006.png|DB 생성 확인]]
 
<br>
 
 
 
*SugarCRM의 접속 정보 및 관리자(admin)의 암호를 설정 한다.
 
URL of Sugar Instance              : "http://localhost/sugar"
 
System Name                        : "SugarCRM"
 
Sugar Admin User Password          : xxxx
 
Re-enter Sugar Admin User Password : xxxx
 
:[[그림:install_sugar_007.png|접속 정보]]
 
<br>
 
 
 
*다음과 같이 보안 옵션을 설정 한다.
 
Send Anonymous Usage Statistics ?        : not check
 
Automatically Check For Updates?        : not check
 
Use a Custom Session Directory for Sugar : not check
 
Use a Custom Log Directory              : not check
 
Provide Your Own Application ID          : not check (SugarCRM Clustering시 사용함)
 
:[[그림:install_sugar_008.png|보안 옵션]]
 
<br>
 
 
 
*다음과 같이 지역 설정을 한다.
 
Default Date Format                            : "2006/12/23"
 
Default Time Format                            : "11:00pm"
 
Default Language                                : "US English"
 
Default Name Format                            : "s lf"
 
Character Set most commonly used in your Locale : "UTF-8"
 
Character Set for Import/Export                : "UTF-8"
 
Export (.csv) Delimiter                        : ","
 
 
Default Currency                                : "Korean Won"
 
Significant Digits                              : "0"
 
1000s Separator                                : ","
 
Decimal Separator                              : "."
 
:[[그림:install_sugar_009.png|지역 설정]]
 
<br>
 
  
*설정값을 확인하고 "Install" 버튼을 선택하여 설정을 시작 한다.
 
:*$SUGAR_HOME/config.php 설정 파일이 생성됨
 
:*Database가 설정이 되고 데모 데이타가 등록됨
 
:*시간이 오래 걸릴 수 있으므로 끈기를 가지고 기다려야 함
 
:[[그림:install_sugar_010.png|설정 적용]]
 
<br>
 
 
*SugarCRM이 제대로 설정된 것을 확인하고 "Next" 버튼을 선택 한다.
 
:[[그림:install_sugar_011.png|설정 적용 완료]]
 
<br>
 
 
*한글 언어팩을 설치할 수 있는 화면이나 여기서는 "Next" 버튼을 선택하여 Skip 한다.
 
:*SugarCRM의 초기 설정에서 적용한 사항은 관리자 화면에서 다시 설정할 수 있다.
 
:*또는 $SUGAR_HOME/config.php 파일을 직접 수정하여 다시 설정할 수 있다.
 
:[[그림:install_sugar_012.png|언어팩 설정]]
 
<br>
 
 
*Registration (Optional) 화면에서 오픈소스의 발전을 위해 Sugar CE를 설치한 것을 SugarCRM에 알리고자 할 경우 필요한 정보를 입력한 후 "Send Registration" 버튼을 선택 한다.
 
:[[그림:install_sugar_013.png|설치 알림]]
 
<br>
 
 
*SugarCRM의 설치가 완료 되어 로그인 창이 표시된다.
 
:*설치시 등록한 관리자(admin)으로 로그인 하여 보자.
 
:[[그림:install_sugar_014.png|로그인]]
 
<br>
 
 
*첫 로그인시 TimeZone을 설정하는 화면이 표시된다.
 
:*"Asia/Seoul(GMT+9)"를 선택한 후 "Save" 버튼을 선택 한다.
 
:[[그림:install_sugar_015.png|TimeZone 설정]]
 
<br>
 
 
===한글팩 설치===
 
한글팩 설치는 한글팩(language_ko_KR.zip)이 있다는 가정하에서 설명 한다.
 
 
*한글팩 설치
 
:*관리자로 로그인 한다.
 
:*"Admin -> Module Loader" 메뉴를 선택 한다.
 
:*"찾아보기..."을 선택한 후 language_ko_KR.zip을 선택 한다.
 
:*"Upload" 버튼을 눌러 한글팩을 서버로 업로드 한다.
 
:*업로드된 한글팩 옆에 표시되는 "install" 버튼을 눌러 한글팩을 설치 한다.
 
 
*디폴트 언어 변경
 
:*$SUGAR_HOME/config.php
 
'languages' => array (
 
    'ko_KR' => 'Korean',
 
    'en_us' => 'English (US)',
 
),
 
'default_language' => 'ko_KR',
 
 
*Module Builder(모듈 생성 도구) 오류 수정
 
:*한글팩을 설치하면 Module Builder(모듈 생성 도구)가 정상 동작하지 않는다.
 
::*한글팩을 설치할 경우, json.js (json-min.js) 파일의 _prepare() 함수가 호출되면 반환되는 문자열 앞에 이상한 문자열이 붙어 JavaScript Exception이 발생 한다.
 
::*따라서 JSON을 사용하여 서버 프로그램을 호출한 후 실행되는 parse() 함수에서 사용되는 s=_prepare(s) 함수 다음에, 반환되는 문자열에 대한 복구 작업을 해 주어야 한다.
 
::*반환되는 문자열을 복구하는 함수는 s = s.substring(s.indexOf("{")); 이다.
 
::*json.js (json-min.js) 파일은 아래 sugar_grp1_yui.js 파일안에 포함 되므로 sugar_grp1_yui.js를 직접 수정 한다.
 
:*vi $SUGAR_HOME/include/javascript/sugar_grp1_yui.js
 
::*vi $SUGAR_HOME/include/javascript/yui/build/json/json-min.js 파일을 수정한 후, "관리 -> 복구 -> JS 그룹 파일 재생성" 메뉴을 선택하여 sugar_grp1_yui.js 파일을 다시 생성하여도 된다.
 
/json-min
 
?_prepare          //--- s=_prepare(s); 를 찾기 위한 명령임
 
//--- s=_prepare(s); 문자열 바로 뒤에 아래 문자열을 추가 한다.
 
s = s.substring(s.indexOf("{"));
 
 
*MS Explorer의 경우 GET 방식으로 한글을 넘겨 줄 때, 발생하는 오류 수정
 
:*해결방안: 한글을 넘겨 주는 부분을 JavaScript의 encodeURI() 함수를 사용하여 인코딩 한다.
 
:*오류 현상 1 : Studio의 레이아웃에서 필드의 속성값을 편집하는 화면이 깨어진다.
 
::*/modules/ModuleBuilder/tpls/layoutView.tpl 파일에서 editProperty 화면을 호출하는 부분을 수정 한다. (onclick 부분)
 
::*/modules/ModuleBuilder/tpls/listView.tpl 파일에서 editProperty 화면을 호출하는 부분을 수정 한다.
 
:*오류 현상 2 : Studio의 레이아웃에서 패널의 속성값을 편집하는 화면이 깨어진다.
 
::*/modules/ModuleBuilder/javascript/studio2.js 파일에서 editProperty 화면을 호출하는 부분에서 title_label과 value_label을 수정 한다.
 
:*오류 현상 3 : 하위 패널 호출 시 화면이 표시되지 않는다.
 
::*/modules/ModuleBuilder/javascript/ModuleBuilder.js 파일에서
 
handleTreeClick: function(o) {
 
    var node = o.node;
 
    //--- ModuleBuilder.getContent(node.data.action);  이 라인을 지우고 다음 라인과 같이 수정 한다.
 
    ModuleBuilder.getContent(encodeURI(node.data.action));
 
    return false;
 
},
 
 
==Ubuntu용 설치 가이드==
 
*[http://sourceforge.net/project/showfiles.php?group_id=107819 다운로드 사이트]에서 SugarCE-5.5.0beta2.zip 를 /var/www/ 에 다운로드 한다.
 
 
*SugarCRM 소스 준비
 
cd /var/www
 
unzip SugarCE-5.5.0beta2.zip
 
mv SugarCE-Full-5.5.0beta2 sugar
 
chown -R www-data:www-data sugar
 
 
*SugarCRM 설치를 위한 준비
 
apt-get install php5-curl
 
vi /etc/php5/apache2/php.ini
 
    memory_limit = 128M        : 최소 40M 이상
 
    upload_max_filesize = 20M  : 최소 20M 이상
 
    post_max_size = 30M        : 최소 20M 이상
 
/etc/init.d/apache2 restart
 
 
*[http://localhost/sugar/ http://localhost/sugar/]에 접속하여 SugarCRM을 설치 한다.
 
:*설치에 대한 상세 내역은 위에 정리된 사항을 참조 한다.
 
 
==CentOS용 설치 가이드==
 
[[CentOS]] 5.5에서 SugarCRM을 설치해 보자.
 
 
*[http://sourceforge.net/project/showfiles.php?group_id=107819 다운로드 사이트]에서 SugarCE-6.1.1.zip 를 다운로드 한다.
 
 
*SugarCRM 소스 준비
 
cd /var/www/html
 
unzip SugarCE-6.1.1.zip
 
mv SugarCE-Full-6.1.1 sugar
 
chown -R apache:apache sugar
 
 
*SugarCRM 설치를 위한 준비
 
vi /etc/php.ini
 
    memory_limit = 128M        : 최소 40M 이상
 
    upload_max_filesize = 20M  : 최소 20M 이상
 
    post_max_size = 30M        : 최소 20M 이상
 
service httpd restart
 
 
*[http://localhost/sugar/ http://localhost/sugar/]에 접속하여 SugarCRM을 설치 한다.
 
:*설치에 대한 상세 내역은 위에 정리된 사항을 참조 한다.
 
 
*Crontab 설정
 
:*service crond restart
 
:*crontab -l
 
:*crontab -e
 
*  * * * * cd /nfsdata/www/html/rockplace; php -f cron.php > /dev/null 2>&1
 
*  * * * * cd /nfsdata/www/html/manage; php -f cron.php > /dev/null 2>&1
 
 
*Sugar에서 사용하는 PHP Extension
 
:*curl, gd2, imap, mbstring
 
:*zip, zlib
 
:*Database 연동 모듈
 
 
*설치 후 첫 파일에서 오류 화면이 표시될 경우
 
mv .htaccess .htaccess_org
 
 
==관리자 가이드==
 
===로그 설정===
 
*로그 파일
 
 
:*$SUGAR_HOME/include/SugarLogger/LoggerManager.php
 
:*$SUGAR_HOME/include/SugarLogger/LoggerManager.php
 
:*$SUGAR_HOME/include/SugarLogger/SugarLogger.php
 
:*$SUGAR_HOME/include/SugarLogger/SugarLogger.php
  
 
*$SUGAR_HOME/config.php에서 로그 설정
 
*$SUGAR_HOME/config.php에서 로그 설정
:log_dir : 로그가 저장되는 폴더
+
 
:log_file : 로그 파일명, 초기값은 "sugarcrm.log"
+
:log_dir&nbsp;: 로그가 저장되는 폴더
:log_memory_usage :  
+
:log_file&nbsp;: 로그 파일명, 초기값은 "sugarcrm.log"
:logger => level : 로그 레벨 (debug, info, error, fatal, security, off)
+
:log_memory_usage&nbsp;:
 +
:logger => level&nbsp;: 로그 레벨 (debug, info, error, fatal, security, off)
 
:logger => file
 
:logger => file
::ext : 로그 파일 확장자, 초기값은 ".log"
+
::ext&nbsp;: 로그 파일 확장자, 초기값은 ".log"
::name : 로그 파일명, 초기값은 "sugarcrm"
+
::name&nbsp;: 로그 파일명, 초기값은 "sugarcrm"
::dateFormat : 날자 포맷
+
::dateFormat&nbsp;: 날자 포맷
::maxSize : 로그 파일 최대 크기
+
::maxSize&nbsp;: 로그 파일 최대 크기
::maxLogs : 로그 파일 최대 갯수
+
::maxLogs&nbsp;: 로그 파일 최대 갯수
::suffix : 로그 파일 뒤에 붙는 문자열, 초기값은 "%m_%Y"
+
::suffix&nbsp;: 로그 파일 뒤에 붙는 문자열, 초기값은 "%m_%Y"
  
 
*프로그램에서 로그 남기기
 
*프로그램에서 로그 남기기
 +
 
  $GLOBALS['log']->debug('로그 메시지');
 
  $GLOBALS['log']->debug('로그 메시지');
 
  $GLOBALS['log']->info('로그 메시지');
 
  $GLOBALS['log']->info('로그 메시지');
  
===License 표시 변경===
+
=== License 표시 변경 ===
 +
 
 
*vi include/MVC/View/SugarView.php
 
*vi include/MVC/View/SugarView.php
 +
 
:*666 라인에 있는 $copyright 를 변경 한다.
 
:*666 라인에 있는 $copyright 를 변경 한다.
  
===한글팩 제작===
+
=== 한글팩 제작 ===
 +
 
 
SugarCRM의 한글팩을 만들기 위해 en_us 언어로 부터 ko_kr 파일을 추출하여 한글 언어팩을 작성 한다.
 
SugarCRM의 한글팩을 만들기 위해 en_us 언어로 부터 ko_kr 파일을 추출하여 한글 언어팩을 작성 한다.
  
 
*한글팩 작성을 위한 폴더 생성
 
*한글팩 작성을 위한 폴더 생성
 +
 
  mkdir /tmp/sugar            #--- 다운로드 받은 SugarCE-6.1.1.zip의 압축을 여기에 푼다.
 
  mkdir /tmp/sugar            #--- 다운로드 받은 SugarCE-6.1.1.zip의 압축을 여기에 푼다.
 
  mkdir /tmp/sugar_ko_kr  
 
  mkdir /tmp/sugar_ko_kr  
  
 
*ant를 사용하여 언어로 부터 한글 파일을 복사하기 위한 build 파일을 만든다.
 
*ant를 사용하여 언어로 부터 한글 파일을 복사하기 위한 build 파일을 만든다.
 +
 
:*vi /tmp/sugar_ko_kr/build.xml
 
:*vi /tmp/sugar_ko_kr/build.xml
 +
 
  <?xml version="1.0" encoding="UTF-8"?>
 
  <?xml version="1.0" encoding="UTF-8"?>
 
  <project name="sugar" default="init" basedir=".">
 
  <project name="sugar" default="init" basedir=".">
    <property name="dirSugar" value="/tmp/sugar" />
+
    <property name="dirSugar" value="/tmp/sugar" />
    <property name="dirSugarKoKr" value="/tmp/sugar_ko_kr" />
+
    <property name="dirSugarKoKr" value="/tmp/sugar_ko_kr" />
 
   
 
   
 
     <!-- SugarCRM 소스로부터 Language Pack과 관련된 파일만 추출 한다. -->
 
     <!-- SugarCRM 소스로부터 Language Pack과 관련된 파일만 추출 한다. -->
    <target name="init">
 
        <copy todir="${dirSugarKoKr}">
 
            <fileset
 
                dir="${dirSugar}"
 
                includes="**/en_us.*.html, **/en_us.lang.php, **/*.en_us.lang.php,
 
                          **/*.en_us.php, **/en_us.*.tpl, **/*.lang-en.php,
 
                          **/en.js, **/en_dlg.js"
 
                excludes="cache/**/*"
 
            />
 
        </copy>
 
 
   
 
   
        <move todir="${dirSugarKoKr}">
+
    <target name="init">
            <fileset
+
        <copy todir="${dirSugarKoKr}">
                dir="${dirSugarKoKr}"
+
            <fileset
                includes="**/en_us.*.html, **/en_us.lang.php, **/*.en_us.lang.php,  
+
                dir="${dirSugar}"
                          **/*.en_us.php, **/en_us.*.tpl, **/*.lang-en.php,  
+
                includes="**/en_us.*.html, **/en_us.lang.php, **/*.en_us.lang.php,
                          **/en.js, **/en_dlg.js"
+
                          **/*.en_us.php, **/en_us.*.tpl, **/*.lang-en.php,
            />
+
                          **/en.js, **/en_dlg.js"
            <filtermapper>
+
                excludes="cache/**/*"
                <replacestring from="en_us" to="ko_kr" />
+
            />
                <replacestring from="en_us.lang.php" to="ko_kr.lang.php" />
+
        </copy>
                <replacestring from="en_us.php" to="ko_kr.php" />
+
                <replacestring from="lang-en.php" to="lang-ko.php" />
+
        <move todir="${dirSugarKoKr}">
                <replacestring from="en.js" to="ko.js" />
+
            <fileset
                <replacestring from="en_dlg.js" to="ko_dlg.js" />
+
                dir="${dirSugarKoKr}"
            </filtermapper>
+
                includes="**/en_us.*.html, **/en_us.lang.php, **/*.en_us.lang.php,  
        </move>
+
                          **/*.en_us.php, **/en_us.*.tpl, **/*.lang-en.php,  
    </target>
+
                          **/en.js, **/en_dlg.js"
 +
            />
 +
            <filtermapper>
 +
                <replacestring from="en_us" to="ko_kr" />
 +
                <replacestring from="en_us.lang.php" to="ko_kr.lang.php" />
 +
                <replacestring from="en_us.php" to="ko_kr.php" />
 +
                <replacestring from="lang-en.php" to="lang-ko.php" />
 +
                <replacestring from="en.js" to="ko.js" />
 +
                <replacestring from="en_dlg.js" to="ko_dlg.js" />
 +
            </filtermapper>
 +
        </move>
 +
    </target>
 
  </project>
 
  </project>
  
 
*영어 파일을 복사하여 한글 파일로 이름만 변경 한다. (위에서 만든 build.xml 파일 사용)
 
*영어 파일을 복사하여 한글 파일로 이름만 변경 한다. (위에서 만든 build.xml 파일 사용)
 +
 
  cd /tmp/sugar_ko_kr
 
  cd /tmp/sugar_ko_kr
 
  ant init
 
  ant init
  
 
*vi /tmp/sugar_ko_kr/manifest.php
 
*vi /tmp/sugar_ko_kr/manifest.php
 +
 
  <?php
 
  <?php
 
  $manifest = array(
 
  $manifest = array(
        'acceptable_sugar_versions' => array (
+
        'acceptable_sugar_versions' => array (
                'exact_matches' => array(),
+
                'exact_matches' => array(),
                'regex_matches' => array (
+
                'regex_matches' => array (
                        0 => "6\.6\.1.*"
+
                        0 => "6\.6\.1.*"
                ),
+
                ),
        ),
+
        ),
        'acceptable_sugar_flavors' => array (
+
        'acceptable_sugar_flavors' => array (
                0 => 'CE',
+
                0 => 'CE',
                1 => 'PRO',
+
                1 => 'PRO',
                2 => 'ENT',
+
                2 => 'ENT',
        ),
+
        ),
        'name'                  => 'Korean Language Pack',
+
        'name'                  => 'Korean Language Pack',
        'description'          => 'Korean Language Pack',
+
        'description'          => 'Korean Language Pack',
        'author'                => 'pnuskgh',
+
        'author'                => 'pnuskgh',
        'published_date'        => '2011/01/23',
+
        'published_date'        => '2011/01/23',
        'version'              => '0.1',
+
        'version'              => '0.1',
        'type'                  => 'langpack',
+
        'type'                  => 'langpack',
        'icon'                  => '',
+
        'icon'                  => '',''
        'is_uninstallable'      => true,
+
        'is_uninstallable'      => true,
 
  );
 
  );
 
   
 
   
 
  $installdefs = array(
 
  $installdefs = array(
        'id'=> 'langpack_ko_kr',  
+
        'id'=> 'langpack_ko_kr',  
 
   
 
   
        'copy' => array(
+
        'copy' => array(
                array('from'=> '<basepath>',
+
                array('from'=> '<basepath>',
                          'to'=> '.',
+
                          'to'=> '.',
                ),
+
                ),
        ),
+
        ),
 
  );
 
  );
 
  ?>
 
  ?>
  
 
*SugarCRM 한글팩(langpack_ko_kr.zip) 작성
 
*SugarCRM 한글팩(langpack_ko_kr.zip) 작성
 +
 
:*/tmp/sugar_ko_kr/ 폴더에 있는 파일을 열어 열심히 한글로 번역 한다.
 
:*/tmp/sugar_ko_kr/ 폴더에 있는 파일을 열어 열심히 한글로 번역 한다.
 
:*/tmp/sugar_ko_kr/ 폴더의 내용을 묶어 langpack_ko_kr.zip 파일을 작성 한다.
 
:*/tmp/sugar_ko_kr/ 폴더의 내용을 묶어 langpack_ko_kr.zip 파일을 작성 한다.
  
===한글 설치 프로그램 제작===
+
=== 한글 설치 프로그램 제작 ===
 +
 
 
*vi /install.php 파일을 다음과 같이 수정 한다.
 
*vi /install.php 파일을 다음과 같이 수정 한다.
 +
 
  $supportedLanguages = array(
 
  $supportedLanguages = array(
    'ko_KR' => 'Korea - 한국어',  //--- 이 라인을 추가 한다.
+
    'ko_KR' => 'Korea - 한국어',  //--- 이 라인을 추가 한다.
    'en_us' => 'English (US)',
+
    'en_us' => 'English (US)',
 
   
 
   
 
  $default_lang = 'ko_KR';          //--- 디폴트로 ko_KR을 지정 한다.
 
  $default_lang = 'ko_KR';          //--- 디폴트로 ko_KR을 지정 한다.
   
+
 
 +
 
 
*/install/language/ko_KR.lang.php 파일을 작성 한다.
 
*/install/language/ko_KR.lang.php 파일을 작성 한다.
 
*/install/demoData.ko_KR.php 데모 데이터 파일을 작성 한다.
 
*/install/demoData.ko_KR.php 데모 데이터 파일을 작성 한다.
  
===테마 구조===
+
=== 테마 구조 ===
 +
 
 +
=== Dashlet ===
  
===Dashlet===
 
 
*참고 문헌
 
*참고 문헌
 +
 
:*[http://www.sugarcrm.com/wiki/index.php?title=Dashlets SugarCRM - Dashlets]
 
:*[http://www.sugarcrm.com/wiki/index.php?title=Dashlets SugarCRM - Dashlets]
  
==SOAP/REST==
+
== SOAP/REST ==
 +
 
 
*[http://axis.apache.org/axis/ AXIS 1.4]
 
*[http://axis.apache.org/axis/ AXIS 1.4]
  wsdl2java.bat -o . -p com.sugar http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php?wsdl
+
 
 +
  wsdl2java.bat -o . -p com.sugar [http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php?wsdl http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php?wsdl]
  
 
*SugarsoapLocatior.java
 
*SugarsoapLocatior.java
  //    private java.lang.String sugarsoapPort_address = "http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php";
+
 
    private java.lang.String sugarsoapPort_address = Config.getString("sugar.serverurl", "http://cloud.smartprocess.co.kr/testEnt/") + "service/v4/soap.php";
+
  //    private java.lang.String sugarsoapPort_address = "[http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php]";
 +
    private java.lang.String sugarsoapPort_address = Config.getString("sugar.serverurl", "[http://cloud.smartprocess.co.kr/testEnt/ http://cloud.smartprocess.co.kr/testEnt/]") + "service/v4/soap.php";
  
 
*SugarsoapBuindingStub.java
 
*SugarsoapBuindingStub.java
  public static String SugarServerurl = Config.getString("sugar.serverurl", "http://cloud.smartprocess.co.kr/testEnt/") + "service/v4/soap.php";
+
 
 +
  public static String SugarServerurl = Config.getString("sugar.serverurl", "[http://cloud.smartprocess.co.kr/testEnt/ http://cloud.smartprocess.co.kr/testEnt/]") + "service/v4/soap.php";
 
  _call.setSOAPActionURI(SugarsoapBindingStub.SugarServerurl + "/login");
 
  _call.setSOAPActionURI(SugarsoapBindingStub.SugarServerurl + "/login");
  
 
*SugarsoapBuindingStub.java 함수
 
*SugarsoapBuindingStub.java 함수
 +
 
  public com.sugar.Entry_value login(com.sugar.User_auth user_auth, java.lang.String application_name, com.sugar.Name_value[] name_value_list)
 
  public com.sugar.Entry_value login(com.sugar.User_auth user_auth, java.lang.String application_name, com.sugar.Name_value[] name_value_list)
 
  public void logout(java.lang.String session)
 
  public void logout(java.lang.String session)
 
  public com.sugar.Get_entry_result_version2 get_entry(java.lang.String session, java.lang.String module_name, java.lang.String id,  
 
  public com.sugar.Get_entry_result_version2 get_entry(java.lang.String session, java.lang.String module_name, java.lang.String id,  
    java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array, boolean track_view)
+
    java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array, boolean track_view)
 
  public com.sugar.Get_entry_result_version2 get_entries(java.lang.String session, java.lang.String module_name, java.lang.String[] ids,  
 
  public com.sugar.Get_entry_result_version2 get_entries(java.lang.String session, java.lang.String module_name, java.lang.String[] ids,  
    java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array, boolean track_view)
+
    java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array, boolean track_view)
 
  public com.sugar.Get_entry_list_result_version2 get_entry_list(java.lang.String session, java.lang.String module_name, java.lang.String query,  
 
  public com.sugar.Get_entry_list_result_version2 get_entry_list(java.lang.String session, java.lang.String module_name, java.lang.String query,  
    java.lang.String order_by, int offset, java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array,  
+
    java.lang.String order_by, int offset, java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array,  
    int max_results, int deleted, boolean favorites)
+
    int max_results, int deleted, boolean favorites)
 
  public com.sugar.New_set_relationship_list_result set_relationship(java.lang.String session, java.lang.String module_name,  
 
  public com.sugar.New_set_relationship_list_result set_relationship(java.lang.String session, java.lang.String module_name,  
    java.lang.String module_id, java.lang.String link_field_name, java.lang.String[] related_ids, com.sugar.Name_value[] name_value_list, int delete)
+
    java.lang.String module_id, java.lang.String link_field_name, java.lang.String[] related_ids, com.sugar.Name_value[] name_value_list, int delete)
 
  public com.sugar.New_set_relationship_list_result set_relationships(java.lang.String session, java.lang.String[] module_names,  
 
  public com.sugar.New_set_relationship_list_result set_relationships(java.lang.String session, java.lang.String[] module_names,  
    java.lang.String[] module_ids, java.lang.String[] link_field_names, java.lang.String[][] related_ids, com.sugar.Name_value[][] name_value_lists, int[] delete_array)
+
    java.lang.String[] module_ids, java.lang.String[] link_field_names, java.lang.String[][] related_ids, com.sugar.Name_value[][] name_value_lists, int[] delete_array)
 
  public com.sugar.Get_entry_result_version2 get_relationships(java.lang.String session, java.lang.String module_name, java.lang.String module_id,  
 
  public com.sugar.Get_entry_result_version2 get_relationships(java.lang.String session, java.lang.String module_name, java.lang.String module_id,  
    java.lang.String link_field_name, java.lang.String related_module_query, java.lang.String[] related_fields,  
+
    java.lang.String link_field_name, java.lang.String related_module_query, java.lang.String[] related_fields,  
    com.sugar.Link_name_to_fields_array[] related_module_link_name_to_fields_array, int deleted, java.lang.String order_by)
+
    com.sugar.Link_name_to_fields_array[] related_module_link_name_to_fields_array, int deleted, java.lang.String order_by)
 
  public com.sugar.New_set_entry_result set_entry(java.lang.String session, java.lang.String module_name, com.sugar.Name_value[] name_value_list)
 
  public com.sugar.New_set_entry_result set_entry(java.lang.String session, java.lang.String module_name, com.sugar.Name_value[] name_value_list)
 
  public com.sugar.New_set_entries_result set_entries(java.lang.String session, java.lang.String module_name, com.sugar.Name_value[][] name_value_lists)
 
  public com.sugar.New_set_entries_result set_entries(java.lang.String session, java.lang.String module_name, com.sugar.Name_value[][] name_value_lists)
460번째 줄: 231번째 줄:
 
  public com.sugar.New_return_document_revision get_document_revision(java.lang.String session, java.lang.String i)
 
  public com.sugar.New_return_document_revision get_document_revision(java.lang.String session, java.lang.String i)
 
  public com.sugar.Return_search_result search_by_module(java.lang.String session, java.lang.String search_string, java.lang.String[] modules,  
 
  public com.sugar.Return_search_result search_by_module(java.lang.String session, java.lang.String search_string, java.lang.String[] modules,  
    int offset, int max_results, java.lang.String assigned_user_id, java.lang.String[] select_fields, boolean unified_search_only, boolean favorites)
+
    int offset, int max_results, java.lang.String assigned_user_id, java.lang.String[] select_fields, boolean unified_search_only, boolean favorites)
 
  public com.sugar.Module_list get_available_modules(java.lang.String session, java.lang.String filter)
 
  public com.sugar.Module_list get_available_modules(java.lang.String session, java.lang.String filter)
 
  public java.lang.String get_user_team_id(java.lang.String session)
 
  public java.lang.String get_user_team_id(java.lang.String session)
470번째 줄: 241번째 줄:
 
  public com.sugar.Upcoming_activity_entry[] get_upcoming_activities(java.lang.String session)
 
  public com.sugar.Upcoming_activity_entry[] get_upcoming_activities(java.lang.String session)
  
==SugarCRM 아키텍처==
+
== SugarCRM 아키텍처 ==
===사용 라이브러리===
+
 
 +
=== 사용 라이브러리 ===
 +
 
 
{| cellspacing="1" cellpadding="1" border="1" width="100%"
 
{| cellspacing="1" cellpadding="1" border="1" width="100%"
 
|-
 
|-
|width="30%" bgcolor="cyan" align="center" valign="middle"|라이브러리
+
| width="30%" bgcolor="cyan" align="center" valign="middle" | 라이브러리
|width="20%" bgcolor="cyan" align="center" valign="middle"|라이선스
+
| width="20%" bgcolor="cyan" align="center" valign="middle" | 라이선스
|width="50%" bgcolor="cyan" align="center" valign="middle"|상세 설명
+
| width="50%" bgcolor="cyan" align="center" valign="middle" | 상세 설명
 
|-
 
|-
|Sugar Community Edition
+
| Sugar Community Edition
|align="center"|GNU GPL 3.0
+
| align="center" | GNU GPL 3.0
|오픈소스 CRM
+
| 오픈소스 CRM
 
|-
 
|-
|[[tcpdf]]
+
| [[Tcpdf|tcpdf]]
|align="center"|GNU LGPL 2.1
+
| align="center" | GNU LGPL 2.1
|PDF 제작
+
| PDF 제작
 
|-
 
|-
|[[phpmailer]]
+
| [[Phpmailer|phpmailer]]
|align="center"|GNU LGPL 2.1
+
| align="center" | GNU LGPL 2.1
|메일 발송
+
| 메일 발송
 
|-
 
|-
|[[PHP_Compat]]
+
| [[PHP Compat|PHP_Compat]]
|align="center"|PHP License 3.0
+
| align="center" | PHP License 3.0
|
+
|  
 
|-
 
|-
|[[nusoap]]
+
| [[Nusoap|nusoap]]
|align="center"|Free
+
| align="center" | Free
|Web Services Toolkit for PHP
+
| Web Services Toolkit for PHP
 
|-
 
|-
|[[HTTP_WebDAV_Server]]
+
| [[HTTP WebDAV Server|HTTP_WebDAV_Server]]
|align="center"|PHP License 3.0
+
| align="center" | PHP License 3.0
|WebDAV 서버
+
| WebDAV 서버
 
|-
 
|-
|[[HTML_Safe]]
+
| [[HTML Safe|HTML_Safe]]
|align="center"|BSD style license
+
| align="center" | BSD style license
|
+
|  
 
|-
 
|-
|[[domit_rss]]
+
| [[Domit rss|domit_rss]]
|align="center"|Free
+
| align="center" | Free
|DOM based RSS parser for PHP
+
| DOM based RSS parser for PHP
 
|-
 
|-
|[[domit]]
+
| [[Domit|domit]]
|align="center"|Free
+
| align="center" | Free
|DOM parser for PHP
+
| DOM parser for PHP
 
|-
 
|-
|[[Crypt_Blowfish]]
+
| [[Crypt Blowfish|Crypt_Blowfish]]
|align="center"|PHP License 3.0
+
| align="center" | PHP License 3.0
|
+
|  
 
|-
 
|-
|[[TreeView]]
+
| [[TreeView|TreeView]]
|align="center"|BSD License
+
| align="center" | BSD License
|Javascript, Tree 형태의 항목을 표시
+
| Javascript, Tree 형태의 항목을 표시
 
|-
 
|-
|[[yui]] (Yahoo User Interface)
+
| [[Yui|yui]] (Yahoo User Interface)
|align="center"|BSD License
+
| align="center" | BSD License
|Javascript, UI 모듈
+
| Javascript, UI 모듈
 
|-
 
|-
|[[tiny_mce]]
+
| [[Tiny mce|tiny_mce]]
|align="center"|GNU LGPL 2.1
+
| align="center" | GNU LGPL 2.1
|Javascript,  
+
| Javascript,
 
|-
 
|-
|[[Ext JS]]
+
| [[Ext JS|Ext JS]]
|align="center"|GNU LGPL 3.0
+
| align="center" | GNU LGPL 3.0
|Javascript,  
+
| Javascript,
 
|-
 
|-
|[[jscalendar]]
+
| [[Jscalendar|jscalendar]]
|align="center"|GNU LGPL 3.0
+
| align="center" | GNU LGPL 3.0
|Javascript, 달력
+
| Javascript, 달력
 
|}
 
|}
  
===프로그램 호출 구조===
+
=== 프로그램 호출 구조 ===
*호출 URL: http://localhost/sugar/index.php?module=Accounts&action=index
+
 
 +
*호출 URL: [http://localhost/sugar/index.php?module=Accounts&action=index http://localhost/sugar/index.php?module=Accounts&amp;action=index]
 +
 
 
:*'''module''': /sugar/modules/Accounts/ 폴더에 있는 모듈이 사용됨
 
:*'''module''': /sugar/modules/Accounts/ 폴더에 있는 모듈이 사용됨
:*'''action''':
+
:*'''action'''::*/sugar/include/MVC/Controller/action_file_map.php 참조
::*/sugar/include/MVC/Controller/action_file_map.php 참조
 
 
::*/sugar/include/MVC/Controller/action_view_map.php 참조
 
::*/sugar/include/MVC/Controller/action_view_map.php 참조
 
::*아래 정리된 범례. action_명 (view_명)
 
::*아래 정리된 범례. action_명 (view_명)
 
::*index:
 
::*index:
 
::*DetailView (detail):
 
::*DetailView (detail):
::*EditView (edit):  
+
::*EditView (edit):
::*MultiEditView (multiedit):  
+
::*MultiEditView (multiedit):
::*Popup (popup):  
+
::*Popup (popup):
::*Vcard (vcard):  
+
::*Vcard (vcard):
 
::*ImportVcard (importvcard):
 
::*ImportVcard (importvcard):
::*ImportVcardSave (importvcardsave):  
+
::*ImportVcardSave (importvcardsave):
::*SugarPdf (sugarpdf):  
+
::*SugarPdf (sugarpdf):
 
::*SaveTimezone
 
::*SaveTimezone
 
::*InitialSync
 
::*InitialSync
561번째 줄: 335번째 줄:
 
::*view 명: ajax, classic, config, detail, edit, html, importvcard, importvcardsave, json, list, multedit, noaccess, popup, serialized, sidequickcreate, sugarpdf, vcard, xml
 
::*view 명: ajax, classic, config, detail, edit, html, importvcard, importvcardsave, json, list, multedit, noaccess, popup, serialized, sidequickcreate, sugarpdf, vcard, xml
 
:*'''return_module'''
 
:*'''return_module'''
:*'''return_action'''  
+
:*'''return_action'''
:*return_id:  
+
:*return_id:
:*id:  
+
:*id:
 
:*record:
 
:*record:
 
:*view:
 
:*view:
:*Delete:  
+
:*Delete:
:*entire:  
+
:*entire:
:*mass:  
+
:*mass:
:*type:  
+
:*type:
:*ie_assigned_user_id:  
+
:*ie_assigned_user_id:
:*configure:  
+
:*configure:
 
:*RTL:
 
:*RTL:
:*LTR:  
+
:*LTR:
:*query_string:  
+
:*query_string:
:*module_tab:  
+
:*module_tab:
:*parentTab:  
+
:*parentTab:
:*popup:  
+
:*popup:
:*lvso:  
+
:*lvso:
 
:*query:
 
:*query:
 
:*displayColumns:
 
:*displayColumns:
:*orderBy:  
+
:*orderBy:
:*sortOrder:  
+
:*sortOrder:
 
:*entryPoint:
 
:*entryPoint:
:*massupdate:  
+
:*massupdate:
:*usertheme:  
+
:*usertheme:
:*noThemeSave:  
+
:*noThemeSave:
:*usercolor:  
+
:*usercolor:
:*userfont:  
+
:*userfont:
:*userthemegrouptabs:  
+
:*userthemegrouptabs:
:*MSID:  
+
:*MSID:
  
 
*호출 URL에 따른 처리 프로그램
 
*호출 URL에 따른 처리 프로그램
 +
 
:*/sugar/include/MVC/Controller/SugarController.php#process();
 
:*/sugar/include/MVC/Controller/SugarController.php#process();
 
:*/sugar/include/MVC/View/SugarView.php#process();
 
:*/sugar/include/MVC/View/SugarView.php#process();
599번째 줄: 374번째 줄:
  
 
*/sugar/modules/Accounts/ 폴더 구조
 
*/sugar/modules/Accounts/ 폴더 구조
 +
 
:*views/: Default. /sugar/include/MVC/View/views/
 
:*views/: Default. /sugar/include/MVC/View/views/
 
:*tpls/: Default. /sugar/include/MVC/View/tpls/
 
:*tpls/: Default. /sugar/include/MVC/View/tpls/
606번째 줄: 382번째 줄:
 
:*language/: 언어 파일, ko_KR.lang.php
 
:*language/: 언어 파일, ko_KR.lang.php
  
===디렉토리 구조===
+
=== 디렉토리 구조 ===
 +
 
 +
=== 프로세스 구조 ===
  
===프로세스 구조===
 
 
index.php를 분석하여 SugarCRM의 프로세스 흐름을 파악한다.
 
index.php를 분석하여 SugarCRM의 프로세스 흐름을 파악한다.
  
 
*require_once('include/entryPoint.php')
 
*require_once('include/entryPoint.php')
:*require_once('config.php') : 환경 설정
+
 
:*require_once('config_override.php') : 환경 설정 개인화
+
:*require_once('config.php')&nbsp;: 환경 설정
:*require_once 'include/SugarObjects/SugarConfig.php' : SugarCRM 환경 설정
+
:*require_once('config_override.php')&nbsp;: 환경 설정 개인화
 +
:*require_once 'include/SugarObjects/SugarConfig.php'&nbsp;: SugarCRM 환경 설정
 
:*require_once('include/utils.php')
 
:*require_once('include/utils.php')
 
:*require_once('sugar_version.php');
 
:*require_once('sugar_version.php');
642번째 줄: 420번째 줄:
  
 
*require_once('include/MVC/SugarApplication.php')
 
*require_once('include/MVC/SugarApplication.php')
 +
 
:*require_once('include/MVC/Controller/ControllerFactory.php')
 
:*require_once('include/MVC/Controller/ControllerFactory.php')
::*require_once('include/MVC/Controller/SugarController.php') : 디폴터 Controller
+
::*require_once('include/MVC/Controller/SugarController.php')&nbsp;: 디폴터 Controller
 
:::*require_once('include/MVC/View/SugarView.php');
 
:::*require_once('include/MVC/View/SugarView.php');
 
:::*require_once('modules/Administration/updater_utils.php');
 
:::*require_once('modules/Administration/updater_utils.php');
650번째 줄: 429번째 줄:
 
::::*$view->process();
 
::::*$view->process();
  
::*require_once('custom/modules/'.$module.'/controller.php') : 모듈별 사용자 정의 Controller
+
::*require_once('custom/modules/'.$module.'/controller.php')&nbsp;: 모듈별 사용자 정의 Controller
::*require_once('modules/'.$module.'/controller.php') : Module별 Controller
+
::*require_once('modules/'.$module.'/controller.php')&nbsp;: Module별 Controller
::*$controller = new SugarController() : 디폴터 Controller
+
::*$controller = new SugarController()&nbsp;: 디폴터 Controller
  
 
:*require_once('include/MVC/View/ViewFactory.php')
 
:*require_once('include/MVC/View/ViewFactory.php')
 
::*require_once('include/MVC/View/SugarView.php');
 
::*require_once('include/MVC/View/SugarView.php');
::*'custom/modules/'.$module.'/views/view.'.$type.'.php : 사용자 정의 모듈별 View
+
::*'custom/modules/'.$module.'/views/view.'.$type.'.php&nbsp;: 사용자 정의 모듈별 View
::*modules/'.$module.'/views/view.'.$type.'.php' : Module별 View
+
::*modules/'.$module.'/views/view.'.$type.'.php'&nbsp;: Module별 View
::*custom/include/MVC/View/views/view.'.$type.'.php : 사용자 정의 디폴트 View
+
::*custom/include/MVC/View/views/view.'.$type.'.php&nbsp;: 사용자 정의 디폴트 View
::*include/MVC/View/views/view.'.$type.'.php : 디폴트 View
+
::*include/MVC/View/views/view.'.$type.'.php&nbsp;: 디폴트 View
  
 
:*require_once('modules/Users/authentication/AuthenticationController.php')
 
:*require_once('modules/Users/authentication/AuthenticationController.php')
 
:*$app->execute()
 
:*$app->execute()
::*Request parameter : module, action, usertheme, MSID, entryPoint, massupdate
+
::*Request parameter&nbsp;: module, action, usertheme, MSID, entryPoint, massupdate
 
::*$this->controller = ControllerFactory::getController($module);
 
::*$this->controller = ControllerFactory::getController($module);
 
::*$this->controller->checkEntryPointRequiresAuth($_REQUEST['entryPoint'])
 
::*$this->controller->checkEntryPointRequiresAuth($_REQUEST['entryPoint'])
684번째 줄: 463번째 줄:
 
:*require_once('themes/'.$GLOBALS['theme'].'/layout_utils.php');
 
:*require_once('themes/'.$GLOBALS['theme'].'/layout_utils.php');
  
===화면 구조===
+
=== 화면 구조 ===
 +
 
 
*include/MVC/View/SugarView.php
 
*include/MVC/View/SugarView.php
 +
 
:*$this->displayHeader();
 
:*$this->displayHeader();
::*Theme : header.tpl
+
::*Theme&nbsp;: header.tpl
 +
 
 
  _leftFormHiddenLastViewed.tpl
 
  _leftFormHiddenLastViewed.tpl
 
  _leftFormHiddenShortcuts.tpl
 
  _leftFormHiddenShortcuts.tpl
  &lt;div id="header"&gt;
+
  <div id="header">
    _companyLogo.tpl
+
    _companyLogo.tpl
    _colorFontPicker.tpl
+
    _colorFontPicker.tpl
    _globalLinks.tpl
+
    _globalLinks.tpl
    _welcome.tpl
+
    _welcome.tpl
    _headerSearch.tpl
+
    _headerSearch.tpl
    _headerModuleListGroupTabs.tpl
+
    _headerModuleListGroupTabs.tpl
    _headerModuleList.tpl
+
    _headerModuleList.tpl
    _headerLastViewed.tpl
+
    _headerLastViewed.tpl
    _headerShortcuts.tpl
+
    _headerShortcuts.tpl
  &lt;/div&gt;
+
  </div>
 
+
  &lt;div id="main"&gt;
+
  <div id="main">
    _leftFormHide.tpl
+
    _leftFormHide.tpl
 +
 
 
:*$this->preDisplay();
 
:*$this->preDisplay();
 
:*$this->displayErrors();
 
:*$this->displayErrors();
711번째 줄: 494번째 줄:
 
::*$subpanel->display();
 
::*$subpanel->display();
 
:*$this->displayFooter();
 
:*$this->displayFooter();
::*Theme : footer.tpl
+
::*Theme&nbsp;: footer.tpl
  
 
*Default Theme
 
*Default Theme
 +
 
:*Sugar <- default
 
:*Sugar <- default
  
===Shortcut Menu===
+
=== Shortcut Menu ===
 +
 
 
*SugarCRM의 좌측 메뉴에 보여지는 Shortcut Menu (바로가기 메뉴)를 정리 한다.
 
*SugarCRM의 좌측 메뉴에 보여지는 Shortcut Menu (바로가기 메뉴)를 정리 한다.
  
 
*/modules/모듈명/Menu.php 에 권한에 따른 바로 가기 메뉴가 정의 되어 있다.
 
*/modules/모듈명/Menu.php 에 권한에 따른 바로 가기 메뉴가 정의 되어 있다.
  
==동적 구조==
+
== 동적 구조 ==
 +
 
 
*Relate 변수
 
*Relate 변수
 +
 
  select name, type, ext2, ext3  
 
  select name, type, ext2, ext3  
  from fields_meta_data  
+
from fields_meta_data  
 
  where custom_module = 'cases'  
 
  where custom_module = 'cases'  
  and type = 'relate';
+
  and type = 'relate';
 
   
 
   
 
  select custom_module, name, type, len, required, ext1, ext2, ext3, ext4  
 
  select custom_module, name, type, len, required, ext1, ext2, ext3, ext4  
  from fields_meta_data  
+
  from fields_meta_data  
  where custom_module = 'Campaigns'
+
where custom_module = 'Campaigns'
  order by name;
+
order by name;
  
 
*relationship
 
*relationship
 +
 
  desc relationships;
 
  desc relationships;
  
==문제 해결==
+
== 문제 해결 ==
 +
 
 
*Sugar 화면이 깨어지고 Ajax 관련 오류 창이 표시됨
 
*Sugar 화면이 깨어지고 Ajax 관련 오류 창이 표시됨
 +
 
  CentOS에 설치된 PHP 라이브러리의 버전이 달라 문제가 발생 합니다.  
 
  CentOS에 설치된 PHP 라이브러리의 버전이 달라 문제가 발생 합니다.  
 
   
 
   
749번째 줄: 539번째 줄:
  
 
*Home 화면에서 Dashlet의 탭이 계속 실행중으로 표시됨
 
*Home 화면에서 Dashlet의 탭이 계속 실행중으로 표시됨
 +
 
:*cache/xml/ 폴더를 apache:apache 권한으로 생성을 합니다.
 
:*cache/xml/ 폴더를 apache:apache 권한으로 생성을 합니다.
  
==Localization==
+
== Localization ==
 +
 
 
=== 한글팩 작성 ===
 
=== 한글팩 작성 ===
  
820번째 줄: 612번째 줄:
 
:*include/SugarFields/Fields/Address/ko_KR.DetailView.tpl, ko_KR.EditView.tpl
 
:*include/SugarFields/Fields/Address/ko_KR.DetailView.tpl, ko_KR.EditView.tpl
  
===한글로 모듈(거래처) 목록 검색===
+
=== 한글로 모듈(거래처) 목록 검색 ===
 +
 
 
*AJAX 목록 화면에서 한글로 검색시 화면이 표시되지 않음
 
*AJAX 목록 화면에서 한글로 검색시 화면이 표시되지 않음
 +
 
  include/ListView/ListViewData.php 파일의 529 라인에서
 
  include/ListView/ListViewData.php 파일의 529 라인에서
 
  $queryString = htmlentities($_REQUEST[$field_name]);을 아래와 같이 변경함
 
  $queryString = htmlentities($_REQUEST[$field_name]);을 아래와 같이 변경함
 
  $queryString = htmlentities($_REQUEST[$field_name], null, "UTF-8");
 
  $queryString = htmlentities($_REQUEST[$field_name], null, "UTF-8");
  
===메일 발송시 보낸 사람 이름===
+
=== 메일 발송시 보낸 사람 이름 ===
 +
 
 
*메일 발송시 보낸 사람 이름이 깨어짐
 
*메일 발송시 보낸 사람 이름이 깨어짐
 +
 
  modules/Emails/Email.php 851 line
 
  modules/Emails/Email.php 851 line
  From : $this->from_addr_name = $this->from_addr;
+
  From&nbsp;: $this->from_addr_name = $this->from_addr;
  To   : $this->from_addr_name = "{$mail->FromName} <{$mail->From}>";
+
  To &nbsp;: $this->from_addr_name = "{$mail->FromName} <{$mail->From}>";
 +
 
 
:*근본적으로 해결을 하려면 $mail->FromName 값이 MIME으로 인코딩 되었을 경우에만 decode를 하도록 수정할 것
 
:*근본적으로 해결을 하려면 $mail->FromName 값이 MIME으로 인코딩 되었을 경우에만 decode를 하도록 수정할 것
  
==Tips==
+
== Tips ==
 +
 
 
*[http://developers.sugarcrm.com/wordpress/2012/10/15/conditional-formatting-on-cases-list-view-and-dashlets/ Conditional Formatting on Cases List view and Dashlets, 2012.10.15]
 
*[http://developers.sugarcrm.com/wordpress/2012/10/15/conditional-formatting-on-cases-list-view-and-dashlets/ Conditional Formatting on Cases List view and Dashlets, 2012.10.15]
 
*[http://developers.sugarcrm.com/wordpress/2012/10/08/customizing-the-query-used-for-a-subpanel/ Customizing the query used for a subpanel, 2012.10.08]
 
*[http://developers.sugarcrm.com/wordpress/2012/10/08/customizing-the-query-used-for-a-subpanel/ Customizing the query used for a subpanel, 2012.10.08]
 
*Leveraging ACL access levels in your code
 
*Leveraging ACL access levels in your code
 +
 
:*[http://developers.sugarcrm.com/wordpress/2012/10/03/leveraging-acl-access-levels-in-your-code-part-1-admindeveloper-access/ Leveraging ACL access levels in your code: Part 1 – Admin/Developer access]
 
:*[http://developers.sugarcrm.com/wordpress/2012/10/03/leveraging-acl-access-levels-in-your-code-part-1-admindeveloper-access/ Leveraging ACL access levels in your code: Part 1 – Admin/Developer access]
 
:*[http://developers.sugarcrm.com/wordpress/2012/10/04/leveraging-acl-access-levels-in-your-code-part-2-record-level-acls-and-some-more-module-level-acls/ Leveraging ACL access levels in your code: Part 2 – Record Level ACLs and some more Module Level ACLs]
 
:*[http://developers.sugarcrm.com/wordpress/2012/10/04/leveraging-acl-access-levels-in-your-code-part-2-record-level-acls-and-some-more-module-level-acls/ Leveraging ACL access levels in your code: Part 2 – Record Level ACLs and some more Module Level ACLs]
853번째 줄: 652번째 줄:
 
:*[http://www.opencrx.org/ openCRX]&nbsp;: Java 기반
 
:*[http://www.opencrx.org/ openCRX]&nbsp;: Java 기반
 
:*[http://www.opentaps.org/ Opentaps]&nbsp;: Java 기반, 도요타에서 사용중
 
:*[http://www.opentaps.org/ Opentaps]&nbsp;: Java 기반, 도요타에서 사용중
<br/>
+
 
[[Category:오픈소스|Category:오픈소스]][[Category:CRM|Category:CRM]][[Category:한글화|Category:한글화]][[Category:Sugar|Category:Sugar]][[Category:WebSite|Category:WebSite]]
+
 
 +
 
 +
== 지원 업체 ==
 +
 
 +
{{지원업체}}
 +
[[Category:오픈소스|Category:오픈소스]]<br/>[[Category:CRM|Category:CRM]]<br/>[[Category:한글화|Category:한글화]]<br/>[[Category:Sugar|Category:Sugar]]<br/>[[Category:WebSite|Category:WebSite]]

2018년 2월 7일 (수) 16:51 기준 최신판

오픈소스로 제공되는, On-Premise/On-Demand/Appliance 방식의 CRM인 sugarCRM (Sugar Community Edition)을 소개한다.

  • 홈페이지

Document

  • 기술지원

관리자 가이드

로그 설정

  • 로그 파일
  • $SUGAR_HOME/include/SugarLogger/LoggerManager.php
  • $SUGAR_HOME/include/SugarLogger/SugarLogger.php
  • $SUGAR_HOME/config.php에서 로그 설정
log_dir : 로그가 저장되는 폴더
log_file : 로그 파일명, 초기값은 "sugarcrm.log"
log_memory_usage :
logger => level : 로그 레벨 (debug, info, error, fatal, security, off)
logger => file
ext : 로그 파일 확장자, 초기값은 ".log"
name : 로그 파일명, 초기값은 "sugarcrm"
dateFormat : 날자 포맷
maxSize : 로그 파일 최대 크기
maxLogs : 로그 파일 최대 갯수
suffix : 로그 파일 뒤에 붙는 문자열, 초기값은 "%m_%Y"
  • 프로그램에서 로그 남기기
$GLOBALS['log']->debug('로그 메시지');
$GLOBALS['log']->info('로그 메시지');

License 표시 변경

  • vi include/MVC/View/SugarView.php
  • 666 라인에 있는 $copyright 를 변경 한다.

한글팩 제작

SugarCRM의 한글팩을 만들기 위해 en_us 언어로 부터 ko_kr 파일을 추출하여 한글 언어팩을 작성 한다.

  • 한글팩 작성을 위한 폴더 생성
mkdir /tmp/sugar            #--- 다운로드 받은 SugarCE-6.1.1.zip의 압축을 여기에 푼다.
mkdir /tmp/sugar_ko_kr 
  • ant를 사용하여 언어로 부터 한글 파일을 복사하기 위한 build 파일을 만든다.
  • vi /tmp/sugar_ko_kr/build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="sugar" default="init" basedir=".">
   <property name="dirSugar" value="/tmp/sugar" />
   <property name="dirSugarKoKr" value="/tmp/sugar_ko_kr" />


   <target name="init">
       <copy todir="${dirSugarKoKr}">
           <fileset
               dir="${dirSugar}"
               includes="**/en_us.*.html, **/en_us.lang.php, **/*.en_us.lang.php, 
                         **/*.en_us.php, **/en_us.*.tpl, **/*.lang-en.php, 
                         **/en.js, **/en_dlg.js"
               excludes="cache/**/*"
           />
       </copy>

       <move todir="${dirSugarKoKr}">
           <fileset
               dir="${dirSugarKoKr}"
               includes="**/en_us.*.html, **/en_us.lang.php, **/*.en_us.lang.php, 
                         **/*.en_us.php, **/en_us.*.tpl, **/*.lang-en.php, 
                         **/en.js, **/en_dlg.js"
           />
           <filtermapper>
               <replacestring from="en_us" to="ko_kr" />
               <replacestring from="en_us.lang.php" to="ko_kr.lang.php" />
               <replacestring from="en_us.php" to="ko_kr.php" />
               <replacestring from="lang-en.php" to="lang-ko.php" />
               <replacestring from="en.js" to="ko.js" />
               <replacestring from="en_dlg.js" to="ko_dlg.js" />
           </filtermapper>
       </move>
   </target>
</project>
  • 영어 파일을 복사하여 한글 파일로 이름만 변경 한다. (위에서 만든 build.xml 파일 사용)
cd /tmp/sugar_ko_kr
ant init
  • vi /tmp/sugar_ko_kr/manifest.php
<?php
$manifest = array(
       'acceptable_sugar_versions' => array (
               'exact_matches' => array(),
               'regex_matches' => array (
                       0 => "6\.6\.1.*"
               ),
       ),
       'acceptable_sugar_flavors' => array (
               0 => 'CE',
               1 => 'PRO',
               2 => 'ENT',
       ),
       'name'                  => 'Korean Language Pack',
       'description'           => 'Korean Language Pack',
       'author'                => 'pnuskgh',
       'published_date'        => '2011/01/23',
       'version'               => '0.1',
       'type'                  => 'langpack',
       'icon'                  => ,
       'is_uninstallable'      => true,
);

$installdefs = array(
       'id'=> 'langpack_ko_kr', 

       'copy' => array(
               array('from'=> '<basepath>',
                         'to'=> '.',
               ),
       ),
);
?>
  • SugarCRM 한글팩(langpack_ko_kr.zip) 작성
  • /tmp/sugar_ko_kr/ 폴더에 있는 파일을 열어 열심히 한글로 번역 한다.
  • /tmp/sugar_ko_kr/ 폴더의 내용을 묶어 langpack_ko_kr.zip 파일을 작성 한다.

한글 설치 프로그램 제작

  • vi /install.php 파일을 다음과 같이 수정 한다.
$supportedLanguages = array(
   'ko_KR' => 'Korea - 한국어',  //--- 이 라인을 추가 한다.
   'en_us' => 'English (US)',

$default_lang = 'ko_KR';          //--- 디폴트로 ko_KR을 지정 한다.
  
  • /install/language/ko_KR.lang.php 파일을 작성 한다.
  • /install/demoData.ko_KR.php 데모 데이터 파일을 작성 한다.

테마 구조

Dashlet

  • 참고 문헌

SOAP/REST

wsdl2java.bat -o . -p com.sugar http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php?wsdl
  • SugarsoapLocatior.java
//    private java.lang.String sugarsoapPort_address = "http://cloud.smartprocess.co.kr/testEnt/service/v4/soap.php";
   private java.lang.String sugarsoapPort_address = Config.getString("sugar.serverurl", "http://cloud.smartprocess.co.kr/testEnt/") + "service/v4/soap.php";
  • SugarsoapBuindingStub.java
public static String SugarServerurl = Config.getString("sugar.serverurl", "http://cloud.smartprocess.co.kr/testEnt/") + "service/v4/soap.php";
_call.setSOAPActionURI(SugarsoapBindingStub.SugarServerurl + "/login");
  • SugarsoapBuindingStub.java 함수
public com.sugar.Entry_value login(com.sugar.User_auth user_auth, java.lang.String application_name, com.sugar.Name_value[] name_value_list)
public void logout(java.lang.String session)
public com.sugar.Get_entry_result_version2 get_entry(java.lang.String session, java.lang.String module_name, java.lang.String id, 
   java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array, boolean track_view)
public com.sugar.Get_entry_result_version2 get_entries(java.lang.String session, java.lang.String module_name, java.lang.String[] ids, 
   java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array, boolean track_view)
public com.sugar.Get_entry_list_result_version2 get_entry_list(java.lang.String session, java.lang.String module_name, java.lang.String query, 
   java.lang.String order_by, int offset, java.lang.String[] select_fields, com.sugar.Link_name_to_fields_array[] link_name_to_fields_array, 
   int max_results, int deleted, boolean favorites)
public com.sugar.New_set_relationship_list_result set_relationship(java.lang.String session, java.lang.String module_name, 
   java.lang.String module_id, java.lang.String link_field_name, java.lang.String[] related_ids, com.sugar.Name_value[] name_value_list, int delete)
public com.sugar.New_set_relationship_list_result set_relationships(java.lang.String session, java.lang.String[] module_names, 
   java.lang.String[] module_ids, java.lang.String[] link_field_names, java.lang.String[][] related_ids, com.sugar.Name_value[][] name_value_lists, int[] delete_array)
public com.sugar.Get_entry_result_version2 get_relationships(java.lang.String session, java.lang.String module_name, java.lang.String module_id, 
   java.lang.String link_field_name, java.lang.String related_module_query, java.lang.String[] related_fields, 
   com.sugar.Link_name_to_fields_array[] related_module_link_name_to_fields_array, int deleted, java.lang.String order_by)
public com.sugar.New_set_entry_result set_entry(java.lang.String session, java.lang.String module_name, com.sugar.Name_value[] name_value_list)
public com.sugar.New_set_entries_result set_entries(java.lang.String session, java.lang.String module_name, com.sugar.Name_value[][] name_value_lists)
public com.sugar.Get_server_info_result get_server_info()
public java.lang.String get_user_id(java.lang.String session)
public com.sugar.New_module_fields get_module_fields(java.lang.String session, java.lang.String module_name, java.lang.String[] fields)
public int seamless_login(java.lang.String session)
public com.sugar.New_set_entry_result set_note_attachment(java.lang.String session, com.sugar.New_note_attachment note)
public com.sugar.New_return_note_attachment get_note_attachment(java.lang.String session, java.lang.String id)
public com.sugar.New_set_entry_result set_document_revision(java.lang.String session, com.sugar.Document_revision note)
public com.sugar.New_return_document_revision get_document_revision(java.lang.String session, java.lang.String i)
public com.sugar.Return_search_result search_by_module(java.lang.String session, java.lang.String search_string, java.lang.String[] modules, 
   int offset, int max_results, java.lang.String assigned_user_id, java.lang.String[] select_fields, boolean unified_search_only, boolean favorites)
public com.sugar.Module_list get_available_modules(java.lang.String session, java.lang.String filter)
public java.lang.String get_user_team_id(java.lang.String session)
public void set_campaign_merge(java.lang.String session, java.lang.String[] targets, java.lang.String campaign_id)
public com.sugar.Get_entries_count_result get_entries_count(java.lang.String session, java.lang.String module_name, java.lang.String query, int deleted)
public com.sugar.Get_entry_result_for_reports get_report_entries(java.lang.String session, java.lang.String[] ids, java.lang.String[] select_fields)
public java.lang.String[] get_module_fields_md5(java.lang.String session, java.lang.String[] module_names)
public com.sugar.Last_viewed_entry[] get_last_viewed(java.lang.String session, java.lang.String[] module_names)
public com.sugar.Upcoming_activity_entry[] get_upcoming_activities(java.lang.String session)

SugarCRM 아키텍처

사용 라이브러리

라이브러리 라이선스 상세 설명
Sugar Community Edition GNU GPL 3.0 오픈소스 CRM
tcpdf GNU LGPL 2.1 PDF 제작
phpmailer GNU LGPL 2.1 메일 발송
PHP_Compat PHP License 3.0
nusoap Free Web Services Toolkit for PHP
HTTP_WebDAV_Server PHP License 3.0 WebDAV 서버
HTML_Safe BSD style license
domit_rss Free DOM based RSS parser for PHP
domit Free DOM parser for PHP
Crypt_Blowfish PHP License 3.0
TreeView BSD License Javascript, Tree 형태의 항목을 표시
yui (Yahoo User Interface) BSD License Javascript, UI 모듈
tiny_mce GNU LGPL 2.1 Javascript,
Ext JS GNU LGPL 3.0 Javascript,
jscalendar GNU LGPL 3.0 Javascript, 달력

프로그램 호출 구조

  • module: /sugar/modules/Accounts/ 폴더에 있는 모듈이 사용됨
  • action::*/sugar/include/MVC/Controller/action_file_map.php 참조
  • /sugar/include/MVC/Controller/action_view_map.php 참조
  • 아래 정리된 범례. action_명 (view_명)
  • index:
  • DetailView (detail):
  • EditView (edit):
  • MultiEditView (multiedit):
  • Popup (popup):
  • Vcard (vcard):
  • ImportVcard (importvcard):
  • ImportVcardSave (importvcardsave):
  • SugarPdf (sugarpdf):
  • SaveTimezone
  • InitialSync
  • Logout
  • RetrieveEmail
  • view 명: ajax, classic, config, detail, edit, html, importvcard, importvcardsave, json, list, multedit, noaccess, popup, serialized, sidequickcreate, sugarpdf, vcard, xml
  • return_module
  • return_action
  • return_id:
  • id:
  • record:
  • view:
  • Delete:
  • entire:
  • mass:
  • type:
  • ie_assigned_user_id:
  • configure:
  • RTL:
  • LTR:
  • query_string:
  • module_tab:
  • parentTab:
  • popup:
  • lvso:
  • query:
  • displayColumns:
  • orderBy:
  • sortOrder:
  • entryPoint:
  • massupdate:
  • usertheme:
  • noThemeSave:
  • usercolor:
  • userfont:
  • userthemegrouptabs:
  • MSID:
  • 호출 URL에 따른 처리 프로그램
  • /sugar/include/MVC/Controller/SugarController.php#process();
  • /sugar/include/MVC/View/SugarView.php#process();
  • /sugar/modules/Accounts/views/view.view_명.php
  • /sugar/include/MVC/View/views/view.view_명.php
  • /sugar/modules/Accounts/ 폴더 구조
  • views/: Default. /sugar/include/MVC/View/views/
  • tpls/: Default. /sugar/include/MVC/View/tpls/
  • metadata/: 메타데이터
  • Dashlets/: 대쉬렛
  • SugarFeeds/: 피드
  • language/: 언어 파일, ko_KR.lang.php

디렉토리 구조

프로세스 구조

index.php를 분석하여 SugarCRM의 프로세스 흐름을 파악한다.

  • require_once('include/entryPoint.php')
  • require_once('config.php') : 환경 설정
  • require_once('config_override.php') : 환경 설정 개인화
  • require_once 'include/SugarObjects/SugarConfig.php' : SugarCRM 환경 설정
  • require_once('include/utils.php')
  • require_once('sugar_version.php');
  • require_once('include/database/PearDatabase.php');
  • require_once('include/database/DBManager.php');
  • require_once('include/database/DBManagerFactory.php');
  • require_once('include/dir_inc.php');
  • require_once('include/Localization/Localization.php');
  • require_once('include/javascript/jsAlerts.php');
  • require_once('include/TimeDate.php');
  • require_once('include/modules.php');
  • require_once('data/SugarBean.php');
  • require_once('include/utils/file_utils.php');
  • require_once('include/utils/mvc_utils.php');
  • require_once('include/SugarEmailAddress/SugarEmailAddress.php');
  • require_once('include/SugarLogger/LoggerManager.php');
  • require_once('modules/Trackers/BreadCrumbStack.php');
  • require_once('modules/Trackers/Tracker.php');
  • require_once('modules/Trackers/TrackerManager.php');
  • require_once('modules/ACL/ACLController.php');
  • require_once('modules/Administration/Administration.php');
  • require_once('modules/Administration/updater_utils.php');
  • require_once('modules/Users/User.php');
  • require_once('modules/Users/authentication/AuthenticationController.php');
  • require_once('include/utils/LogicHook.php');
  • require SUGAR_PATH . '/include/SugarObjects/SugarRegistry.php';
  • require_once('include/MVC/SugarApplication.php')
  • require_once('include/MVC/Controller/ControllerFactory.php')
  • require_once('include/MVC/Controller/SugarController.php') : 디폴터 Controller
  • require_once('include/MVC/View/SugarView.php');
  • require_once('modules/Administration/updater_utils.php');
  • $this->process();
  • $this->processView();
  • $view->process();
  • require_once('custom/modules/'.$module.'/controller.php') : 모듈별 사용자 정의 Controller
  • require_once('modules/'.$module.'/controller.php') : Module별 Controller
  • $controller = new SugarController() : 디폴터 Controller
  • require_once('include/MVC/View/ViewFactory.php')
  • require_once('include/MVC/View/SugarView.php');
  • 'custom/modules/'.$module.'/views/view.'.$type.'.php : 사용자 정의 모듈별 View
  • modules/'.$module.'/views/view.'.$type.'.php' : Module별 View
  • custom/include/MVC/View/views/view.'.$type.'.php : 사용자 정의 디폴트 View
  • include/MVC/View/views/view.'.$type.'.php : 디폴트 View
  • require_once('modules/Users/authentication/AuthenticationController.php')
  • $app->execute()
  • Request parameter : module, action, usertheme, MSID, entryPoint, massupdate
  • $this->controller = ControllerFactory::getController($module);
  • $this->controller->checkEntryPointRequiresAuth($_REQUEST['entryPoint'])
  • $this->loadUser();
  • $this->ACLFilter();
  • $this->preProcess();
  • $this->controller->preProcess();
  • $this->loadLanguages();
  • $this->checkDatabaseVersion();
  • $this->loadDisplaySettings();
  • $this->loadLicense();
  • $this->loadGlobals();
  • $this->setupResourceManagement($module);
  • $this->controller->execute();
  • sugar_cleanup();
  • require_once('include/resource/ResourceManager.php');
  • require_once ('modules/Sync/file_config.php');
  • require_once('modules/Sync/SyncController.php');
  • require_once('themes/'.$GLOBALS['theme'].'/layout_utils.php');

화면 구조

  • include/MVC/View/SugarView.php
  • $this->displayHeader();
  • Theme : header.tpl
_leftFormHiddenLastViewed.tpl
_leftFormHiddenShortcuts.tpl
   _leftFormHide.tpl
  • $this->preDisplay();
  • $this->displayErrors();
  • $this->display();
  • Module과 Action에 해당하는 template이 사용됨
  • $this->displaySubPanels();
  • $subpanel->display();
  • $this->displayFooter();
  • Theme : footer.tpl
  • Default Theme
  • Sugar <- default

Shortcut Menu

  • SugarCRM의 좌측 메뉴에 보여지는 Shortcut Menu (바로가기 메뉴)를 정리 한다.
  • /modules/모듈명/Menu.php 에 권한에 따른 바로 가기 메뉴가 정의 되어 있다.

동적 구조

  • Relate 변수
select name, type, ext2, ext3 
from fields_meta_data 
where custom_module = 'cases' 
 and type = 'relate';

select custom_module, name, type, len, required, ext1, ext2, ext3, ext4 
 from fields_meta_data 
where custom_module = 'Campaigns'
order by name;
  • relationship
desc relationships;

문제 해결

  • Sugar 화면이 깨어지고 Ajax 관련 오류 창이 표시됨
CentOS에 설치된 PHP 라이브러리의 버전이 달라 문제가 발생 합니다. 

- jssource/Minifier.php 파일 수정
//--- 158 line, pnuskgh
// $this->input = preg_replace('/\h/u', ' ', $this->input);
$this->input = preg_replace('/[ \t]/u', ' ', $this->input); 

- Admin -> Repair -> Repair JS Files 실행
- cache/ 폴더의 파일을 모두 삭제
  • Home 화면에서 Dashlet의 탭이 계속 실행중으로 표시됨
  • cache/xml/ 폴더를 apache:apache 권한으로 생성을 합니다.

Localization

한글팩 작성

  • Localization 범위
  • 한글 번역, 이미지 등 한글화
  • 어순 : 성 이름
  • 날짜, 시간
  • 다중 통화 (Currency)
  • 주소


  • PHP 파일 번역
  • ko_KR.lang.php
  • ~Dashlet.ko_KR.lang.php
  • demoData.ko_KR.php
  • phpmailer.lang-ko.php
  • Template 파일 번역
  • LotusLiveSignup.ko_KR.tpl
  • footer.tpl
  • JavaScript 파일 번역
  • ko.js, ko_dlg.js
  • calendar.js, calendar-min.js
  • HTML 파일 번역
  • ko_KR.notify_template.html
  • ko_KR.Portal.html
  • 이미지 파일을 gimp를 사용하여 새로 작성
  • PDF 파일에서 한글이 깨어짐
  • TCPDF에서 hysmyeongjostdmedium.php 파일을 다운로드
  • include/tcpdf/fonts/ 폴더에 복사
  • "Admin -> Repair -> Quick Repair and Rebuild" 메뉴 실행
  • 개인별 Profile에서 PDF Settings을 다음과 같이 설정
  • Font for Header and Body : MyungJo Medium (Korean)
  • Font for Footer : MyungJo Medium (Korean)
  • vi include/Sugarpdf/sugarpdf_default.php
  • helvetica를 MyungJo Medium (Korean)로 변경 합니다. (미확인 사항)
'PDF_FONT_NAME_MAIN'=>'helvetica',
'PDF_FONT_NAME_DATA'=>'helvetica',
  • TCPDF에 ttf 폰트 추가 (실패)
  • 나눔글꼴을 다운로드 합니다.
  • http://www.xml-convert.com/en/convert-tff-font-to-afm-pfa-fpdf-tcpdf 사이트에서 ttf2ufm.exe 파일을 다운로드 합니다.
  • ttf2ufm.exe ~.ttf 명령을 사용하여 ~.ufm 파일을 생성 합니다.
  • /include/tcpdf/fonts/utils/makefont.php 파일을 수정하여 nanumgothiccoding.php, nanumgothiccoding.z, nanumgothiccoding.ctg.z 파일을 생성 합니다.
  • php -q makefont.php NanumGothicCoding.ttf NanumGothicCoding.ufm
  • 생성된 파일을 /include/tcpdf/fonts/ 폴더에 복사 합니다.

주소

  • Address Localization
  • include/SugarFields/Fields/Address/ko_KR.DetailView.tpl, ko_KR.EditView.tpl

한글로 모듈(거래처) 목록 검색

  • AJAX 목록 화면에서 한글로 검색시 화면이 표시되지 않음
include/ListView/ListViewData.php 파일의 529 라인에서
$queryString = htmlentities($_REQUEST[$field_name]);을 아래와 같이 변경함
$queryString = htmlentities($_REQUEST[$field_name], null, "UTF-8");

메일 발송시 보낸 사람 이름

  • 메일 발송시 보낸 사람 이름이 깨어짐
modules/Emails/Email.php 851 line
From : $this->from_addr_name = $this->from_addr;
To   : $this->from_addr_name = "{$mail->FromName} <{$mail->From}>";
  • 근본적으로 해결을 하려면 $mail->FromName 값이 MIME으로 인코딩 되었을 경우에만 decode를 하도록 수정할 것

Tips

참고 문헌

  • 기타 오픈소스 CRM


지원 업체

SuiteCRM을 사용한 영업관리, 고객관리는 아래 담당자에게 연락하여 주시면, 빠르고 친절하게 전문적인 답변을 드리겠습니다.

영업 문의 sales@obcon.biz 010-4667-1106 영업 대표
기술 문의 tech@obcon.biz 구축/컨설팅 담당
고객 지원 support@obcon.biz 고객 지원 담당

OBCon 홈페이지 바로가기