Initial import from local backup (Documents-Playground/pakerpale)

This commit is contained in:
jeonghwa
2026-07-03 05:27:41 +09:00
commit 5b1bfe3390
2223 changed files with 561621 additions and 0 deletions

1
application/.htaccess Normal file
View File

@@ -0,0 +1 @@
Deny from all

1
application/cache/.htaccess vendored Normal file
View File

@@ -0,0 +1 @@
Deny from all

10
application/cache/index.html vendored Normal file
View File

@@ -0,0 +1,10 @@
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View File

@@ -0,0 +1,32 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
*--------------------------------------------------------------------------
*Admin Page 에 보일 메뉴를 정의합니다.
*--------------------------------------------------------------------------
*
* Admin Page 에 새로운 메뉴 추가시 이곳에서 수정해주시면 됩니다.
*
*/
$config['admin_page_menu']['config'] =
array(
'__config' => array('환경설정', 'fa-gears'), // 1차 메뉴, 순서대로 (메뉴명, 아이콘클래스(font-awesome))
'menu' => array(
'cbconfigs' => array('기본환경설정', ''), // 2차 메뉴, 순서대로 (메뉴명, a태그에 속성 부여)
'layoutskin' => array('레이아웃/메타태그', ''),
'memberconfig' => array('회원가입설정', ''),
'emailform' => array('메일/쪽지발송양식', ''),
'rssconfig' => array('RSS 피드 / 사이트맵', ''),
'testemail' => array('메일발송테스트', ''),
'scheduler' => array('스케쥴러 관리', ''),
'cbversion' => array('버전정보', ''),
'dbupgrade' => array('DB 업그레이드', ''),
'browscapupdate' => array('Browscap 업데이트', ''),
'optimize' => array('복구/최적화', ''),
'cleanlog' => array('오래된로그삭제', ''),
'phpinfo' => array('phpinfo', 'target="_blank"'),
),
);

View File

@@ -0,0 +1,26 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
*--------------------------------------------------------------------------
*Admin Page 에 보일 메뉴를 정의합니다.
*--------------------------------------------------------------------------
*
* Admin Page 에 새로운 메뉴 추가시 이곳에서 수정해주시면 됩니다.
*
*/
$config['admin_page_menu']['page'] =
array(
'__config' => array('페이지설정', 'fa-laptop'),
'menu' => array(
'pagemenu' => array('메뉴관리', ''),
'document' => array('일반페이지', ''),
'popup' => array('팝업관리', ''),
'faqgroup' => array('FAQ관리', ''),
'faq' => array('FAQ 내용', '', 'hide'),
'banner' => array('배너관리', ''),
'bannerclick' => array('배너클릭로그', ''),
),
);

View File

@@ -0,0 +1,27 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
*--------------------------------------------------------------------------
*Admin Page 에 보일 메뉴를 정의합니다.
*--------------------------------------------------------------------------
*
* Admin Page 에 새로운 메뉴 추가시 이곳에서 수정해주시면 됩니다.
*
*/
$config['admin_page_menu']['member'] =
array(
'__config' => array('회원설정', 'fa-users'),
'menu' => array(
'members' => array('회원관리', ''),
'membergroup' => array('회원그룹관리', ''),
'points' => array('포인트관리', ''),
'memberfollow' => array('팔로우현황', ''),
'nickname' => array('닉네임변경이력', ''),
'memberlevelhistory' => array('레벨히스토리', ''),
'loginlog' => array('로그인현황', ''),
'dormant' => array('휴면계정관리', ''),
),
);

View File

@@ -0,0 +1,34 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
*--------------------------------------------------------------------------
*Admin Page 에 보일 메뉴를 정의합니다.
*--------------------------------------------------------------------------
*
* Admin Page 에 새로운 메뉴 추가시 이곳에서 수정해주시면 됩니다.
*
*/
$config['admin_page_menu']['board'] =
array(
'__config' => array('게시판설정', 'fa-pencil-square-o'),
'menu' => array(
'boards' => array('게시판관리', ''),
'boardgroup' => array('게시판그룹관리', ''),
'trash' => array('휴지통', ''),
'trash_comment' => array('휴지통', '', 'hide'),
'posthistory' => array('게시물변경로그', ''),
'naversyndilog' => array('네이버신디케이션로그', ''),
'post' => array('게시물관리', ''),
'comment' => array('댓글관리', ''),
'tag' => array('태그 관리', ''),
'fileupload' => array('파일업로드', ''),
'filedownload' => array('파일다운로드', ''),
'editorimage' => array('에디터이미지', ''),
'linkclick' => array('링크클릭', ''),
'like' => array('추천/비추', ''),
'blame' => array('신고', ''),
),
);

View File

@@ -0,0 +1,25 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
*--------------------------------------------------------------------------
*Admin Page 에 보일 메뉴를 정의합니다.
*--------------------------------------------------------------------------
*
* Admin Page 에 새로운 메뉴 추가시 이곳에서 수정해주시면 됩니다.
*
*/
$config['admin_page_menu']['stat'] =
array(
'__config' => array('통계관리', 'fa-bar-chart-o'),
'menu' => array(
'statcounter' => array('접속자통계', ''),
'boardcounter' => array('게시판별접속자', ''),
'registercounter' => array('회원가입통계', ''),
'searchkeyword' => array('인기검색어현황', ''),
'currentvisitor' => array('현재접속자', ''),
'registerlog' => array('회원가입경로', ''),
),
);

View File

@@ -0,0 +1,153 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| AUTO-LOADER
| -------------------------------------------------------------------
| This file specifies which systems should be loaded by default.
|
| In order to keep the framework as light-weight as possible only the
| absolute minimal resources are loaded by default. For example,
| the database is not connected to automatically since no assumption
| is made regarding whether you intend to use it. This file lets
| you globally define which systems you would like loaded with every
| request.
|
| -------------------------------------------------------------------
| Instructions
| -------------------------------------------------------------------
|
| These are the things you can load automatically:
|
| 1. Packages
| 2. Libraries
| 3. Drivers
| 4. Helper files
| 5. Custom config files
| 6. Language files
| 7. Models
|
*/
/*
| -------------------------------------------------------------------
| Auto-load Packages
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
|
*/
$autoload['packages'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in system/libraries/ or your
| application/libraries/ directory, with the addition of the
| 'database' library, which is somewhat of a special case.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'email', 'session');
|
| You can also supply an alternative library name to be assigned
| in the controller:
|
| $autoload['libraries'] = array('user_agent' => 'ua');
*/
/**
* CiBoard 주 : 씨아이보드 사용을 위해 아래 라이브러리를 autoload 하고 있습니다.
* 기본적으로 autoload 되고 있는 라이브러리는 지우시면 안됩니다
* 그러나 필요한 경우 새로운 라이브러리를 추가히시는 건 괜찮습니다
*/
$autoload['libraries'] = array('session', 'managelayout', 'member', 'cbconfig', 'board', 'user_agent', 'events');
/*
| -------------------------------------------------------------------
| Auto-load Drivers
| -------------------------------------------------------------------
| These classes are located in system/libraries/ or in your
| application/libraries/ directory, but are also placed inside their
| own subdirectory and they extend the CI_Driver_Library class. They
| offer multiple interchangeable driver options.
|
| Prototype:
|
| $autoload['drivers'] = array('cache');
|
| You can also supply an alternative property name to be assigned in
| the controller:
|
| $autoload['drivers'] = array('cache' => 'cch');
|
*/
$autoload['drivers'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['helper'] = array('url', 'file');
*/
/**
* CiBoard 주 : 씨아이보드 사용을 위해 아래 헬퍼를 autoload 하고 있습니다.
* 기본적으로 autoload 되고 있는 헬퍼는 지우시면 안됩니다
* 그러나 필요한 경우 새로운 헬퍼를 추가히시는 건 괜찮습니다
*/
$autoload['helper'] = array('url', 'basic', 'thumbnail', 'cookie');
/*
| -------------------------------------------------------------------
| Auto-load Config files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['config'] = array('config1', 'config2');
|
| NOTE: This item is intended for use ONLY if you have created custom
| config files. Otherwise, leave it blank.
|
*/
/**
* CiBoard 주 : 씨아이보드 사용을 위해 아래 config 파일을 autoload 하고 있습니다.
* 기본적으로 autoload 되고 있는 config 파일은 지우시면 안됩니다
* 그러나 필요한 경우 새로운 config 파일을 추가히시는 건 괜찮습니다
*/
$autoload['config'] = array('cb_config', 'cb_version');
/*
| -------------------------------------------------------------------
| Auto-load Language files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['language'] = array('lang1', 'lang2');
|
| NOTE: Do not include the "_lang" part of your file. For example
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
*/
$autoload['language'] = array();
/*
| -------------------------------------------------------------------
| Auto-load Models
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['model'] = array('first_model', 'second_model');
|
| You can also supply an alternative model name to be assigned
| in the controller:
|
| $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array();

View File

@@ -0,0 +1,80 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* CiBoard 주 : true 일 경우 관리자페이지의 기본환경설정 > 접근기능 기능을 사용합니다.
* 만약 사용을 원치 않는 경우는 false 로 변경해주시면 됩니다.
*/
$config['use_lock_ip'] = false;
/**
* 게시판에서 첨부파일 등을 통해 올리는 이미지의 경로를 결정합니다.
* 기본적으로 uploads 로 되어있고, 만약 이 값을 변경하기 원하시면 배포된 파일의 uploads 디렉토리도 똑같은 이름으로 변경해주셔야 합니다.
* 또한 assets/js/captcha.js 에서 uploads 로 된 값을 원하시는 값으로 변경해주시면 됩니다.
* 사이트를 운영 중에 이 값을 변경하시면 사이트에 이미 올라간 이미지의 경로가 깨집니다. 디비에 저장된 경로를 모두 변경해주셔야 합니다.
* 따라서 사이트를 운영 중에는 이 값을 변경하지 않으시길 권장드립니다.
*/
$config['uploads_dir'] = 'uploads';
/**
* install 되었는지를 매번 체크하고 install 되어있지 않으면 install page 로 이동합니다.
* 사이트 install 한 후에는 값을 false 로 변경해주세요.
* 설치를 진행하기 위해서는 현재 접속하고 계신 remote_addr 를 입력하셔야 합니다.
* 설치가 끝난 후에는 다시 빈 값으로 변경해주시고, 바로 위에 chk_installed 의 값을 false 로 변경해주시면 매번 install 되었는지를 체크하지 않으므로 속도 향상에 도움이 됩니다.
*/
$config['chk_installed'] = false;
$config['install_ip'] = ''; // 여기에 all 이라고 적으면, 모든 IP 에서 접근 가능합니다, 간혹 localhost 에 설치할 때에 ip 체크를 제대로 하지 못한 경우를 대비합니다.
/**
* profiler 를 활성화할지 결정합니다.
* 사이트를 개발시에는 profiler 를 활성화하여놓고 개발하시면 각페이지에서 profiler 를 확인할 수 있습니다.
* profiler 활성화 선언은 application/core/CB_Controller.php 의 __construct() 함수에 있습니다,
*/
$config['enable_profiler'] = false;
/**
* 스케쥴러 기능을 활성화할지 결정합니다.
* 스케쥴러 기능은 cron 과 그 역할이 비슷하며, 일정한 시간 간격으로 웹요청이 들어올 때마다 실행하는 것입니다.
* 스케쥴러 등록은 관리자페이지 > 환경설정 > 스케쥴러 등록 메뉴에서 설정하실 수 있습니다.
* $config['enable_scheduler'] 의 값을 false 로 지정하시면 관리자페이지에서 등록된 스케쥴러가 있더라도 실행되지 않습니다.
* 등록한 스케쥴러가 하나도 없는 경우에는 값을 false 로 지정해놓으시면 속도향상에 도움이 됩니다.
*/
$config['enable_scheduler'] = false;
/**
* 정해진 초가 지날 때마다 한번씩 수행해야할 스케쥴러가 있는지 확인합니다.
* 스케쥴러가 하루에 한번 정도 수행해야할 것이라면, 1시간에 1번정도로 초를 길게 잡아주시면 부하를 줄일 수 있습니다.
* 이 변수는 application/hooks/Scheduler.php 에서 사용되고 있습니다.
*/
$config['check_scheduler_second'] = 300; // 초
/**
* user agent parser 를 선택합니다
* phpuseragent , browscap 둘 중에 선택, browscap 를 선택시 메모리 부족 현상이 발생할 수 있습니다. 그리고
* browscap 을 사용시에는 관리자페이지 > 환경설정 > Browscap 업데이트 페이지에서 캐시 업데이트를 해주셔야 합니다.
*/
$config['user_agent_parser'] = 'phpuseragent'; // phpuseragent , browscap 둘 중에 선택
/**
* CiBoard 주 : smpt email 을 사용하시는 경우 세팅해주세요
*/
$config['email_protocal'] = 'mail'; // mail/sendmail/smtp
$config['email_smtp_host'] = '';
$config['email_smtp_user'] = '';
$config['email_smtp_pass'] = '';
$config['email_smtp_port'] = '25';
$config['email_smtp_crypto'] = 'ssl'; // SMTP Encryption. Can be null, tls or ssl.
/**
* CiBoard 주 : 캐시 기능 사용시, 우선순위를 결정합니다
*/
$config['cache_method'] = array('adapter' => 'file', 'backup' => 'file');

View File

@@ -0,0 +1,13 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* CiBoard 주 : 현재 설치되어 있는 씨아이보드 버전입니다.
*/
define('CB_PACKAGE', 'lite');
define('CB_VERSION', '3.0.3');
$config['cb_version'] = array();

View File

@@ -0,0 +1,666 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* CiBoard 주 : URL 주소에 쓰이는 URI 부분의 첫번째 요소를 정의합니다.
* 예를 들어 갤러리 게시판을 세팅할 경우
* http://www.도메인.com/board/gallery 와 같이 될 때에 board 라는 부분을 다른 이름으로 변경할 수 있습니다.
*/
$config['uri_segment_admin'] ='admin'; //관리자 페이지 주소
$config['uri_segment_board'] ='board'; //게시판 목록 부분 주소
$config['uri_segment_write'] ='write'; //게시글 쓰기 주소
$config['uri_segment_reply'] ='reply'; //게시물 답변하기 주소
$config['uri_segment_modify'] ='modify'; //게시글 수정하기 주소
$config['uri_segment_rss'] ='rss'; // RSS 주소
$config['uri_segment_group'] ='group'; //게시판 그룹 메인 주소
$config['uri_segment_document'] ='document'; //일반 페이지 주소
$config['uri_segment_faq'] ='faq'; //FAQ 페이지 주소
//게시글 주소 ( http://www.ciboard.co.kr/post/123 과 같은 형식의 post 부분)
$config['uri_segment_post'] ='post';
//게시글 주소형식
// A : http://www.ciboard.co.kr/post/123 과 같이 uri_segment_post 와 post_id 가 순서대로 주소에 붙는 형식
// B : http://www.ciboard.co.kr/boardkey/post/123 과 같이 boardkey, uri_segment_post , post_id 가 순서대로 주소에 붙는 형식
// C : http://www.ciboard.co.kr/post/boardkey/123 과 같이 uri_segment_post , boardkey, post_id 가 순서대로 주소에 붙는 형식
$config['uri_segment_post_type'] ='A';
/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
| http://example.com/
|
| WARNING: You MUST set this value!
|
| If it is not set, then CodeIgniter will try guess the protocol and path
| your installation, but due to security concerns the hostname will be set
| to $_SERVER['SERVER_ADDR'] if available, or localhost otherwise.
| The auto-detection mechanism exists only for convenience during
| development and MUST NOT be used in production!
|
| If you need to allow multiple domains, remember that this file is still
| a PHP script and you can easily do that on your own.
|
*/
/**
* CiBoard 주 : 아래의 값을 꼭 입력하여주세요.
* 루트에 설치하는 경우 올바른 예 ) http://www.test.com/
* 루트에 설치하는 경우 잘못된 예 ) http://www.test.com/index.php
* 서브에 설치하는 경우 올바른 예 ) http://www.test.com/subdir/
* 서브에 설치하는 경우 잘못된 예 ) http://www.test.com/subdir/index.php
*/
$config['base_url'] = strtolower(substr($_SERVER['SERVER_PROTOCOL'], 0, strpos($_SERVER['SERVER_PROTOCOL'], '/'))). '://'. $_SERVER['HTTP_HOST']. '/';
if (empty($config['base_url'])) exit("&dollar;config&lsqb;&apos;base_url&apos;&rsqb; need to be set up in application/config/config.php"); // base_url 의 값을 입력하신 후에는 여기 if 문 자체를 주석처리해도 좋습니다
/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
/**
* CiBoard 주 : 아래의 값은 입력하실 필요가 없습니다.
* index.php 라고 입력하지 말아주세요. 그냥 입력하지 않으시면 됩니다
*/
$config['index_page'] = '';
/*
|--------------------------------------------------------------------------
| URI PROTOCOL
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string. The default setting of 'REQUEST_URI' works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'REQUEST_URI' Uses $_SERVER['REQUEST_URI']
| 'QUERY_STRING' Uses $_SERVER['QUERY_STRING']
| 'PATH_INFO' Uses $_SERVER['PATH_INFO']
|
| WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
*/
/**
* CiBoard 주 : 아래의 값은 변경하실 필요가 없습니다.
*/
$config['uri_protocol'] = 'REQUEST_URI';
/*
|--------------------------------------------------------------------------
| URL suffix
|--------------------------------------------------------------------------
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
| For more information please see the user guide:
|
| https://codeigniter.com/user_guide/general/urls.html
*/
/**
* CiBoard 주 : 아래의 값은 입력하실 필요가 없습니다.
*/
$config['url_suffix'] = '';
/*
|--------------------------------------------------------------------------
| Default Language
|--------------------------------------------------------------------------
|
| This determines which set of language files should be used. Make sure
| there is an available translation if you intend to use something other
| than english.
|
*/
/**
* CiBoard 주 : 아래의 값은 변경하실 필요가 없습니다.
*/
$config['language'] = 'korean';
/*
|--------------------------------------------------------------------------
| Default Character Set
|--------------------------------------------------------------------------
|
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
| See http://php.net/htmlspecialchars for a list of supported charsets.
|
*/
/**
* CiBoard 주 : 아래의 값은 변경하실 필요가 없습니다.
*/
$config['charset'] = 'UTF-8';
/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the 'hooks' feature you must enable it by
| setting this variable to TRUE (boolean). See the user guide for details.
|
*/
/**
* CiBoard 주 : 씨아이보드는 기본적으로 후크 기능을 사용하므로, 아래의 값을 변경하시면 안됩니다.
*/
$config['enable_hooks'] = TRUE;
/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries. For more information please see the user guide:
|
| https://codeigniter.com/user_guide/general/core_classes.html
| https://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
/**
* CiBoard 주 : 씨아이보드는 기본적으로 CB_ prefix 로 클래스를 생성하여 배포합니다..
* 아래의 값을 변경하기 원하시는 경우, 씨아이보드에서 배포되는 클래스명의 prefix 를 모두 알맞게 변경해주세요
*/
$config['subclass_prefix'] = 'CB_';
/*
|--------------------------------------------------------------------------
| Composer auto-loading
|--------------------------------------------------------------------------
|
| Enabling this setting will tell CodeIgniter to look for a Composer
| package auto-loader script in application/vendor/autoload.php.
|
| $config['composer_autoload'] = TRUE;
|
| Or if you have your vendor/ directory located somewhere else, you
| can opt to set a specific path as well:
|
| $config['composer_autoload'] = '/path/to/vendor/autoload.php';
|
| For more information about Composer, please visit http://getcomposer.org/
|
| Note: This will NOT disable or override the CodeIgniter-specific
| autoloading (application/config/autoload.php)
*/
/**
* CiBoard 주 : 씨아이보드는 composer 기능을 현재는 사용하고 있지 않습니다.
* 즉 아래의 값을 변경하실 필요가 없습니다
*/
$config['composer_autoload'] = FALSE;
/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify which characters are permitted within your URLs.
| When someone tries to submit a URL with disallowed characters they will
| get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| The configured value is actually a regular expression character group
| and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
/*
|--------------------------------------------------------------------------
| Enable Query Strings
|--------------------------------------------------------------------------
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
| example.com/who/what/where/
|
| You can optionally enable standard query string based URLs:
| example.com?who=me&what=something&where=here
|
| Options are: TRUE or FALSE (boolean)
|
| The other items let you set the query string 'words' that will
| invoke your controllers and its functions:
| example.com/index.php?c=controller&m=function
|
| Please note that some of the helpers won't work as expected when
| this feature is enabled, since CodeIgniter is designed primarily to
| use segment based URLs.
|
*/
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd';
/*
|--------------------------------------------------------------------------
| Allow $_GET array
|--------------------------------------------------------------------------
|
| By default CodeIgniter enables access to the $_GET array. If for some
| reason you would like to disable it, set 'allow_get_array' to FALSE.
|
| WARNING: This feature is DEPRECATED and currently available only
| for backwards compatibility purposes!
|
*/
$config['allow_get_array'] = TRUE;
/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
| 0 = Disables logging, Error logging TURNED OFF
| 1 = Error Messages (including PHP errors)
| 2 = Debug Messages
| 3 = Informational Messages
| 4 = All Messages
|
| You can also pass an array with threshold levels to show individual error types
|
| array(2) = Debug Messages, without Error Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
/**
* CiBoard 주 : 로그를 어느 정도 수준에서 남길지 결정합니다.
* 0 부터 4 사이에 원하시는 값으로 변경하시면 됩니다
*/
$config['log_threshold'] = 0;
/*
|--------------------------------------------------------------------------
| Error Logging Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/logs/ directory. Use a full server path with trailing slash.
|
*/
/**
* CiBoard 주 : 로그 경로는 기본적으로 application/logs 로 설정되어있습니다.
* log 가 쌓이는 디렉토리 경로를 변경하기 원하시는 경우에만 입력해주세요
* 입력하지 않으시면 application/logs 에 쌓이는 것을 확인하실 수 있습니다
*/
$config['log_path'] = '';
/*
|--------------------------------------------------------------------------
| Log File Extension
|--------------------------------------------------------------------------
|
| The default filename extension for log files. The default 'php' allows for
| protecting the log files via basic scripting, when they are to be stored
| under a publicly accessible directory.
|
| Note: Leaving it blank will default to 'php'.
|
*/
/**
* CiBoard 주 : 로그 파일 확장자는 기본적으로 php 입니다.
* 다른 확장자로 변경하기 원하시는 경우에만 입력해주세요
*/
$config['log_file_extension'] = '';
/*
|--------------------------------------------------------------------------
| Log File Permissions
|--------------------------------------------------------------------------
|
| The file system permissions to be applied on newly created log files.
|
| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal
| integer notation (i.e. 0700, 0644, etc.)
*/
/**
* CiBoard 주 : 아래의 값을 특별히 변경하실 필요가 없습니다
*/
$config['log_file_permissions'] = 0644;
/*
|--------------------------------------------------------------------------
| Date Format for Logs
|--------------------------------------------------------------------------
|
| Each item that is logged has an associated date. You can use PHP date
| codes to set your own date formatting
|
*/
/**
* CiBoard 주 : 로그파일명 포맷입니다. 원하시는 경우 필요한 포맷으로 변경하셔도 좋습니다
*/
$config['log_date_format'] = 'Y-m-d H:i:s';
/*
|--------------------------------------------------------------------------
| Error Views Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/views/errors/ directory. Use a full server path with trailing slash.
|
*/
$config['error_views_path'] = '';
/*
|--------------------------------------------------------------------------
| Cache Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| application/cache/ directory. Use a full server path with trailing slash.
|
*/
/**
* CiBoard 주 : 캐시 경로는 기본적으로 application/cache 로 설정되어있습니다.
* 캐시가 쌓이는 디렉토리 경로를 변경하기 원하시는 경우에만 입력해주세요
* 입력하지 않으시면 application/cache 에 쌓이는 것을 확인하실 수 있습니다
*/
$config['cache_path'] = '';
/*
|--------------------------------------------------------------------------
| Cache Include Query String
|--------------------------------------------------------------------------
|
| Whether to take the URL query string into consideration when generating
| output cache files. Valid options are:
|
| FALSE = Disabled
| TRUE = Enabled, take all query parameters into account.
| Please be aware that this may result in numerous cache
| files generated for the same page over and over again.
| array('q') = Enabled, but only take into account the specified list
| of query parameters.
|
*/
/**
* CiBoard 주 : 아래의 값을 변경하실 필요가 없습니다
*/
$config['cache_query_string'] = FALSE;
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class, you must set an encryption key.
| See the user guide for more info.
|
| https://codeigniter.com/user_guide/libraries/encryption.html
|
*/
/**
* CiBoard 주 : 아래의 값을 입력해주세요
* 입력하신 값은 외부에 공개되지 않도록 주의해주세요
*/
$config['encryption_key'] = 'crossmap2018';
/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'sess_driver'
|
| The storage driver to use: files, database, redis, memcached
|
| 'sess_cookie_name'
|
| The session cookie name, must contain only [0-9a-z_-] characters
|
| 'sess_expiration'
|
| The number of SECONDS you want the session to last.
| Setting to 0 (zero) means expire when the browser is closed.
|
| 'sess_save_path'
|
| The location to save sessions to, driver dependent.
|
| For the 'files' driver, it's a path to a writable directory.
| WARNING: Only absolute paths are supported!
|
| For the 'database' driver, it's a table name.
| Please read up the manual for the format with other session drivers.
|
| IMPORTANT: You are REQUIRED to set a valid save path!
|
| 'sess_match_ip'
|
| Whether to match the user's IP address when reading the session data.
|
| WARNING: If you're using the database driver, don't forget to update
| your session table's PRIMARY KEY when changing this setting.
|
| 'sess_time_to_update'
|
| How many seconds between CI regenerating the session ID.
|
| 'sess_regenerate_destroy'
|
| Whether to destroy session data associated with the old session ID
| when auto-regenerating the session ID. When set to FALSE, the data
| will be later deleted by the garbage collector.
|
| Other session cookie settings are shared with the rest of the application,
| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
|
*/
/**
* CiBoard 주 : 원하시는 경우 세션 환경값을 변경하여 주세요
*/
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
//$config['sess_save_path'] = APPPATH.'cache/session/';
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path' = Typically will be a forward slash
| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists.
| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript)
|
| Note: These settings (with the exception of 'cookie_prefix' and
| 'cookie_httponly') will also affect sessions.
|
*/
/**
* CiBoard 주 : 쿠키 정보를 알맞게 입력해주세요
* 특별한 경우가 아니면, 기본적으로 cookie_domain 값만 변경하시면 됩니다.
*/
$config['cookie_prefix'] = '';
$config['cookie_domain'] = ''; // .ciboard.co.kr 와 같이 맨 앞에 . 을 찍고 도메인 명을 적습니다
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
/*
|--------------------------------------------------------------------------
| Standardize newlines
|--------------------------------------------------------------------------
|
| Determines whether to standardize newline characters in input data,
| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value.
|
| WARNING: This feature is DEPRECATED and currently available only
| for backwards compatibility purposes!
|
*/
/**
* CiBoard 주 : 아래의 값을 변경하지 말아주세요.
*/
$config['standardize_newlines'] = FALSE;
/*
|--------------------------------------------------------------------------
| Global XSS Filtering
|--------------------------------------------------------------------------
|
| Determines whether the XSS filter is always active when GET, POST or
| COOKIE data is encountered
|
| WARNING: This feature is DEPRECATED and currently available only
| for backwards compatibility purposes!
|
*/
/**
* CiBoard 주 : 아래의 값을 변경하지 말아주세요.
*/
$config['global_xss_filtering'] = FALSE;
/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
*/
/**
* CiBoard 주 : csrf protection 을 사용하지 않고 싶은 경우 FALSE 로 변경하시면 됩니다.
* 그러나 보안상의 위험이 따르므로 TRUE 로 설정해 놓으시길 강력히!! 추천합니다
*/
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name'; // 값을 변경하지 말아주세요
$config['csrf_cookie_name'] = 'csrf_cookie_name'; // 값을 변경하지 말아주세요
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = FALSE;
$config['csrf_exclude_uris'] = array();
$config['csrf_exclude_uris'][] = 'editorfileupload/smarteditor/.*';
$config['csrf_exclude_uris'][] = 'editorfileupload/ckeditor';
/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads. When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| Only used if zlib.output_compression is turned off in your php.ini.
| Please do not use it together with httpd-level output compression.
|
| VERY IMPORTANT: If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts. For
| compression to work, nothing can be sent before the output buffer is called
| by the output class. Do not 'echo' any values with compression enabled.
|
*/
$config['compress_output'] = FALSE;
/*
|--------------------------------------------------------------------------
| Master Time Reference
|--------------------------------------------------------------------------
|
| Options are 'local' or any PHP supported timezone. This preference tells
| the system whether to use your server's local time as the master 'now'
| reference, or convert it to the configured one timezone. See the 'date
| helper' page of the user guide for information regarding date handling.
|
*/
$config['time_reference'] = 'local';
/*
|--------------------------------------------------------------------------
| Rewrite PHP Short Tags
|--------------------------------------------------------------------------
|
| If your PHP installation does not have short tag support enabled CI
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
| in your view files. Options are TRUE or FALSE (boolean)
|
| Note: You need to have eval() enabled for this to work.
|
*/
$config['rewrite_short_tags'] = FALSE;
/*
|--------------------------------------------------------------------------
| Reverse Proxy IPs
|--------------------------------------------------------------------------
|
| If your server is behind a reverse proxy, you must whitelist the proxy
| IP addresses from which CodeIgniter should trust headers such as
| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
| the visitor's IP address.
|
| You can use both an array or a comma-separated list of proxy addresses,
| as well as specifying whole subnets. Here are a few examples:
|
| Comma-separated: '10.0.1.200,192.168.5.0/24'
| Array: array('10.0.1.200', '192.168.5.0/24')
*/
$config['proxy_ips'] = '';
/**
* CiBoard 주 : 아래의 값을 변경하지 말아주세요.
* 버전 체크용으로 사용됩니다
*/
$config['ciboard_website'] = 'http://www.ciboard.co.kr/';
$config['ciboard_check_latest_version'] = 'http://api.ciboard.co.kr/version/check/';

View File

@@ -0,0 +1,114 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Display Debug backtrace
|--------------------------------------------------------------------------
|
| If set to TRUE, a backtrace will be displayed along with php errors. If
| error_reporting is disabled, the backtrace will not display, regardless
| of this setting
|
*/
defined('SHOW_DEBUG_BACKTRACE') OR define('SHOW_DEBUG_BACKTRACE', TRUE);
/*
|--------------------------------------------------------------------------
| File and Directory Modes
|--------------------------------------------------------------------------
|
| These prefs are used when checking and setting modes when working
| with the file system. The defaults are fine on servers with proper
| security, but you may wish (or even need) to change the values in
| certain environments (Apache running a separate process for each
| user, PHP under CGI with Apache suEXEC, etc.). Octal values should
| always be used to set the mode correctly.
|
*/
defined('FILE_READ_MODE') OR define('FILE_READ_MODE', 0644);
defined('FILE_WRITE_MODE') OR define('FILE_WRITE_MODE', 0666);
defined('DIR_READ_MODE') OR define('DIR_READ_MODE', 0755);
defined('DIR_WRITE_MODE') OR define('DIR_WRITE_MODE', 0755);
/*
|--------------------------------------------------------------------------
| File Stream Modes
|--------------------------------------------------------------------------
|
| These modes are used when working with fopen()/popen()
|
*/
defined('FOPEN_READ') OR define('FOPEN_READ', 'rb');
defined('FOPEN_READ_WRITE') OR define('FOPEN_READ_WRITE', 'r+b');
defined('FOPEN_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_WRITE_CREATE_DESTRUCTIVE', 'wb'); // truncates existing file data, use with care
defined('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE') OR define('FOPEN_READ_WRITE_CREATE_DESTRUCTIVE', 'w+b'); // truncates existing file data, use with care
defined('FOPEN_WRITE_CREATE') OR define('FOPEN_WRITE_CREATE', 'ab');
defined('FOPEN_READ_WRITE_CREATE') OR define('FOPEN_READ_WRITE_CREATE', 'a+b');
defined('FOPEN_WRITE_CREATE_STRICT') OR define('FOPEN_WRITE_CREATE_STRICT', 'xb');
defined('FOPEN_READ_WRITE_CREATE_STRICT') OR define('FOPEN_READ_WRITE_CREATE_STRICT', 'x+b');
/*
|--------------------------------------------------------------------------
| Exit Status Codes
|--------------------------------------------------------------------------
|
| Used to indicate the conditions under which the script is exit()ing.
| While there is no universal standard for error codes, there are some
| broad conventions. Three such conventions are mentioned below, for
| those who wish to make use of them. The CodeIgniter defaults were
| chosen for the least overlap with these conventions, while still
| leaving room for others to be defined in future versions and user
| applications.
|
| The three main conventions used for determining exit status codes
| are as follows:
|
| Standard C/C++ Library (stdlibc):
| http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
| (This link also contains other GNU-specific conventions)
| BSD sysexits.h:
| http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits
| Bash scripting:
| http://tldp.org/LDP/abs/html/exitcodes.html
|
*/
defined('EXIT_SUCCESS') OR define('EXIT_SUCCESS', 0); // no errors
defined('EXIT_ERROR') OR define('EXIT_ERROR', 1); // generic error
defined('EXIT_CONFIG') OR define('EXIT_CONFIG', 3); // configuration error
defined('EXIT_UNKNOWN_FILE') OR define('EXIT_UNKNOWN_FILE', 4); // file not found
defined('EXIT_UNKNOWN_CLASS') OR define('EXIT_UNKNOWN_CLASS', 5); // unknown class
defined('EXIT_UNKNOWN_METHOD') OR define('EXIT_UNKNOWN_METHOD', 6); // unknown class member
defined('EXIT_USER_INPUT') OR define('EXIT_USER_INPUT', 7); // invalid user input
defined('EXIT_DATABASE') OR define('EXIT_DATABASE', 8); // database error
defined('EXIT__AUTO_MIN') OR define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
defined('EXIT__AUTO_MAX') OR define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code
defined('PASSWORD_BCRYPT') OR define('PASSWORD_BCRYPT', 1);
/*
* CiBoard 주 : 이하는 씨아이보드 정의 상수입니다
*/
/*
* CiBoard 주 : 관리자 페이지 스킨 경로입니다.
* CIBoard 배포판은 basic 스킨을 사용합니다.
* 어드민 스킨을 제작하여 다른 폴더명으로 배포하실 수 있습니다.
*/
defined('ADMIN_SKIN') OR define('ADMIN_SKIN', 'basic');
/*
* CiBoard 주 : 현재 지역 timezone 설정입니다.
* 대한민국이 아닌 해외에서 사용하시는 경우, 아래의 값을 변경하셔서 사용하시면 됩니다
*/
if (PHP_VERSION >= '5.1.0') {
date_default_timezone_set('Asia/Seoul');
}
/*
* CiBoard 주 : 현재 시간 정의 상수입니다. 값을 변경하지 말아주세요
*/
defined('TIMESTAMP') OR define('TIMESTAMP', time());

View File

@@ -0,0 +1,104 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
| ['dsn'] The full DSN string describe a connection to the database.
| ['hostname'] The hostname of your database server.
| ['username'] The username used to connect to the database
| ['password'] The password used to connect to the database
| ['database'] The name of the database you want to connect to
| ['dbdriver'] The database driver. e.g.: mysqli.
| Currently supported:
| cubrid, ibase, mssql, mysql, mysqli, oci8,
| odbc, pdo, postgre, sqlite, sqlite3, sqlsrv
| ['dbprefix'] You can add an optional prefix, which will be added
| to the table name when using the Query Builder class
| ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
| ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
| ['cache_on'] TRUE/FALSE - Enables/disables query caching
| ['cachedir'] The path to the folder where cache files should be stored
| ['char_set'] The character set used in communicating with the database
| ['dbcollat'] The character collation used in communicating with the database
| NOTE: For MySQL and MySQLi databases, this setting is only used
| as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
| (and in table creation queries made with DB Forge).
| There is an incompatibility in PHP with mysql_real_escape_string() which
| can make your site vulnerable to SQL injection if you are using a
| multi-byte character set and are running versions lower than these.
| Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
| ['swap_pre'] A default table prefix that should be swapped with the dbprefix
| ['encrypt'] Whether or not to use an encrypted connection.
|
| 'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE
| 'mysqli' and 'pdo/mysql' drivers accept an array with the following options:
|
| 'ssl_key' - Path to the private key file
| 'ssl_cert' - Path to the public key certificate file
| 'ssl_ca' - Path to the certificate authority file
| 'ssl_capath' - Path to a directory containing trusted CA certificates in PEM format
| 'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')
| 'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not ('mysqli' only)
|
| ['compress'] Whether or not to use client compression (MySQL only)
| ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
| - good for ensuring strict SQL while developing
| ['ssl_options'] Used to set various SSL options that can be used when making SSL connections.
| ['failover'] array - A array with 0 or more data for connections if the main should fail.
| ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries.
| NOTE: Disabling this will also effectively disable both
| $this->db->last_query() and profiling of DB queries.
| When you run a query, with this setting set to TRUE (default),
| CodeIgniter will store the SQL statement for debugging purposes.
| However, this may cause high memory usage, especially if you run
| a lot of SQL queries ... disable this to avoid that problem.
|
| The $active_group variable lets you choose which connection group to
| make active. By default there is only one group (the 'default' group).
|
| The $query_builder variables lets you determine whether or not to load
| the query builder class.
*/
$active_group = 'default';
$query_builder = TRUE;
/*
* CiBoard 주 : 데이터베이스 정보를 입력하는 곳입니다.
* dbprefix 는 cb_ 기본세팅되어있습니다. 원하시는 경우 다른 이름으로 변경하셔도 됩니다.
* 단 이미 설치를 완료하신 상태에서 dbprefix 를 변경하시면,
* 테이블을 찾을수 없으므로 재설치해주셔야 합니다
* 'dsn' => 'mysql:host=localhost;dbname=yourdatabasenamehere',
* 위 부분에서 yourdatabasenamehere 이 부분을 실제 디비명으로 변경해주세요
*/
$db['default'] = array(
//'dsn' => 'mysql:host=localhost;dbname=yourdatabasenamehere',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'crossmap_legacy',
'dbdriver' => 'mysqli',
'dbprefix' => 'cx_',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8mb4',
'dbcollat' => 'utf8mb4_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);

View File

@@ -0,0 +1,24 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$_doctypes = array(
'xhtml11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'xhtml1-strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'xhtml1-trans' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
'xhtml1-frame' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
'xhtml-basic11' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
'html5' => '<!DOCTYPE html>',
'html4-strict' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
'html4-trans' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
'html4-frame' => '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
'mathml1' => '<!DOCTYPE math SYSTEM "http://www.w3.org/Math/DTD/mathml1/mathml.dtd">',
'mathml2' => '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">',
'svg10' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">',
'svg11' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">',
'svg11-basic' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">',
'svg11-tiny' => '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">',
'xhtml-math-svg-xh' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-math-svg-sh' => '<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">',
'xhtml-rdfa-1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
'xhtml-rdfa-2' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-2.dtd">'
);

View File

@@ -0,0 +1,103 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| Foreign Characters
| -------------------------------------------------------------------
| This file contains an array of foreign characters for transliteration
| conversion used by the Text helper
|
*/
$foreign_characters = array(
'/ä|æ|ǽ/' => 'ae',
'/ö|œ/' => 'oe',
'/ü/' => 'ue',
'/Ä/' => 'Ae',
'/Ü/' => 'Ue',
'/Ö/' => 'Oe',
'/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A',
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a',
'/Б/' => 'B',
'/б/' => 'b',
'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
'/ç|ć|ĉ|ċ|č/' => 'c',
'/Д/' => 'D',
'/д/' => 'd',
'/Ð|Ď|Đ|Δ/' => 'Dj',
'/ð|ď|đ|δ/' => 'dj',
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E',
'/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e',
'/Ф/' => 'F',
'/ф/' => 'f',
'/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G',
'/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g',
'/Ĥ|Ħ/' => 'H',
'/ĥ|ħ/' => 'h',
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I',
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i',
'/Ĵ/' => 'J',
'/ĵ/' => 'j',
'/Ķ|Κ|К/' => 'K',
'/ķ|κ|к/' => 'k',
'/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L',
'/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l',
'/М/' => 'M',
'/м/' => 'm',
'/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N',
'/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n',
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O',
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o',
'/П/' => 'P',
'/п/' => 'p',
'/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R',
'/ŕ|ŗ|ř|ρ|р/' => 'r',
'/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S',
'/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's',
'/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T',
'/ț|ţ|ť|ŧ|т/' => 't',
'/Þ|þ/' => 'th',
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U',
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u',
'/Ƴ|Ɏ|Ỵ|Ẏ|Ӳ|Ӯ|Ў|Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y',
'/ẙ|ʏ|ƴ|ɏ|ỵ|ẏ|ӳ|ӯ|ў|ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y',
'/В/' => 'V',
'/в/' => 'v',
'/Ŵ/' => 'W',
'/ŵ/' => 'w',
'/Ź|Ż|Ž|Ζ|З/' => 'Z',
'/ź|ż|ž|ζ|з/' => 'z',
'/Æ|Ǽ/' => 'AE',
'/ß/' => 'ss',
'/IJ/' => 'IJ',
'/ij/' => 'ij',
'/Œ/' => 'OE',
'/ƒ/' => 'f',
'/ξ/' => 'ks',
'/π/' => 'p',
'/β/' => 'v',
'/μ/' => 'm',
'/ψ/' => 'ps',
'/Ё/' => 'Yo',
'/ё/' => 'yo',
'/Є/' => 'Ye',
'/є/' => 'ye',
'/Ї/' => 'Yi',
'/Ж/' => 'Zh',
'/ж/' => 'zh',
'/Х/' => 'Kh',
'/х/' => 'kh',
'/Ц/' => 'Ts',
'/ц/' => 'ts',
'/Ч/' => 'Ch',
'/ч/' => 'ch',
'/Ш/' => 'Sh',
'/ш/' => 'sh',
'/Щ/' => 'Shch',
'/щ/' => 'shch',
'/Ъ|ъ|Ь|ь/' => '',
'/Ю/' => 'Yu',
'/ю/' => 'yu',
'/Я/' => 'Ya',
'/я/' => 'ya'
);

View File

@@ -0,0 +1,41 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Hooks
| -------------------------------------------------------------------------
| This file lets you define "hooks" to extend CI without hacking the core
| files. Please see the user guide for info:
|
| https://codeigniter.com/user_guide/general/hooks.html
|
*/
$hook['post_controller_constructor'][] = array(
'class' => '_Common',
'function' => 'init',
'filename' => 'Common.php',
'filepath' => 'hooks'
);
$hook['post_controller'][] = array(
'class' => '_Stat',
'function' => 'init',
'filename' => 'Stat.php',
'filepath' => 'hooks'
);
$hook['post_system'][] = array(
'class' => '_Scheduler',
'function' => 'init',
'filename' => 'Scheduler.php',
'filepath' => 'hooks'
);
$hook['post_system'][] = array(
'class' => '_Member_dormant',
'function' => 'init',
'filename' => 'Member_dormant.php',
'filepath' => 'hooks'
);

View File

@@ -0,0 +1,10 @@
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View File

@@ -0,0 +1,19 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Memcached settings
| -------------------------------------------------------------------------
| Your Memcached servers can be specified below.
|
| See: https://codeigniter.com/user_guide/libraries/caching.html#memcached
|
*/
$config = array(
'default' => array(
'hostname' => '127.0.0.1',
'port' => '11211',
'weight' => '1',
),
);

View File

@@ -0,0 +1,84 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
|--------------------------------------------------------------------------
| Enable/Disable Migrations
|--------------------------------------------------------------------------
|
| Migrations are disabled by default for security reasons.
| You should enable migrations whenever you intend to do a schema migration
| and disable it back when you're done.
|
*/
$config['migration_enabled'] = TRUE;
/*
|--------------------------------------------------------------------------
| Migration Type
|--------------------------------------------------------------------------
|
| Migration file names may be based on a sequential identifier or on
| a timestamp. Options are:
|
| 'sequential' = Sequential migration naming (001_add_blog.php)
| 'timestamp' = Timestamp migration naming (20121031104401_add_blog.php)
| Use timestamp format YYYYMMDDHHIISS.
|
| Note: If this configuration value is missing the Migration library
| defaults to 'sequential' for backward compatibility with CI2.
|
*/
$config['migration_type'] = 'timestamp';
/*
|--------------------------------------------------------------------------
| Migrations table
|--------------------------------------------------------------------------
|
| This is the name of the table that will store the current migrations state.
| When migrations runs it will store in a database table which migration
| level the system is at. It then compares the migration level in this
| table to the $config['migration_version'] if they are not the same it
| will migrate up. This must be set.
|
*/
$config['migration_table'] = 'migrations';
/*
|--------------------------------------------------------------------------
| Auto Migrate To Latest
|--------------------------------------------------------------------------
|
| If this is set to TRUE when you load the migrations class and have
| $config['migration_enabled'] set to TRUE the system will auto migrate
| to your latest migration (whatever $config['migration_version'] is
| set to). This way you do not have to call migrations anywhere else
| in your code to have the latest migration.
|
*/
$config['migration_auto_latest'] = FALSE;
/*
|--------------------------------------------------------------------------
| Migrations version
|--------------------------------------------------------------------------
|
| This is used to set migration version that the file system should be on.
| If you run $this->migration->current() this is the version that schema will
| be upgraded / downgraded to.
|
*/
$config['migration_version'] = 0;
/*
|--------------------------------------------------------------------------
| Migrations Path
|--------------------------------------------------------------------------
|
| Path to your migrations folder.
| Typically, it will be within your application path.
| Also, writing permission is required within the migrations path.
|
*/
$config['migration_path'] = APPPATH.'migrations/';

View File

@@ -0,0 +1,184 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| MIME TYPES
| -------------------------------------------------------------------
| This file contains an array of mime types. It is used by the
| Upload class to help identify allowed file types.
|
*/
return array(
'hqx' => array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),
'cpt' => 'application/mac-compactpro',
'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'),
'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'),
'dms' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => array('application/octet-stream', 'application/x-msdownload'),
'class' => 'application/octet-stream',
'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'),
'so' => 'application/octet-stream',
'sea' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'oda' => 'application/oda',
'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'),
'ai' => array('application/pdf', 'application/postscript'),
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'mif' => 'application/vnd.mif',
'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'),
'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'),
'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'),
'wbxml' => 'application/wbxml',
'wmlc' => 'application/wmlc',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'dvi' => 'application/x-dvi',
'gtar' => 'application/x-gtar',
'gz' => 'application/x-gzip',
'gzip' => 'application/x-gzip',
'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'),
'php4' => 'application/x-httpd-php',
'php3' => 'application/x-httpd-php',
'phtml' => 'application/x-httpd-php',
'phps' => 'application/x-httpd-php-source',
'js' => array('application/x-javascript', 'text/plain'),
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'tar' => 'application/x-tar',
'tgz' => array('application/x-tar', 'application/x-gzip-compressed'),
'z' => 'application/x-compress',
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'),
'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'),
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'mpga' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
'aif' => array('audio/x-aiff', 'audio/aiff'),
'aiff' => array('audio/x-aiff', 'audio/aiff'),
'aifc' => 'audio/x-aiff',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'rv' => 'video/vnd.rn-realvideo',
'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'),
'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'),
'gif' => 'image/gif',
'jpeg' => array('image/jpeg', 'image/pjpeg'),
'jpg' => array('image/jpeg', 'image/pjpeg'),
'jpe' => array('image/jpeg', 'image/pjpeg'),
'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
'png' => array('image/png', 'image/x-png'),
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'css' => array('text/css', 'text/plain'),
'html' => array('text/html', 'text/plain'),
'htm' => array('text/html', 'text/plain'),
'shtml' => array('text/html', 'text/plain'),
'txt' => 'text/plain',
'text' => 'text/plain',
'log' => array('text/plain', 'text/x-log'),
'rtx' => 'text/richtext',
'rtf' => 'text/rtf',
'xml' => array('application/xml', 'text/xml', 'text/plain'),
'xsl' => array('application/xml', 'text/xsl', 'text/xml'),
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'),
'movie' => 'video/x-sgi-movie',
'doc' => array('application/msword', 'application/vnd.ms-office'),
'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'),
'dot' => array('application/msword', 'application/vnd.ms-office'),
'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'),
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'),
'word' => array('application/msword', 'application/octet-stream'),
'xl' => 'application/excel',
'eml' => 'message/rfc822',
'json' => array('application/json', 'text/json'),
'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),
'p10' => array('application/x-pkcs10', 'application/pkcs10'),
'p12' => 'application/x-pkcs12',
'p7a' => 'application/x-pkcs7-signature',
'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
'p7r' => 'application/x-pkcs7-certreqresp',
'p7s' => 'application/pkcs7-signature',
'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'),
'crl' => array('application/pkix-crl', 'application/pkcs-crl'),
'der' => 'application/x-x509-ca-cert',
'kdb' => 'application/octet-stream',
'pgp' => 'application/pgp',
'gpg' => 'application/gpg-keys',
'sst' => 'application/octet-stream',
'csr' => 'application/octet-stream',
'rsa' => 'application/x-pkcs7',
'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'),
'3g2' => 'video/3gpp2',
'3gp' => array('video/3gp', 'video/3gpp'),
'mp4' => 'video/mp4',
'm4a' => 'audio/x-m4a',
'f4v' => array('video/mp4', 'video/x-f4v'),
'flv' => 'video/x-flv',
'webm' => 'video/webm',
'aac' => 'audio/x-acc',
'm4u' => 'application/vnd.mpegurl',
'm3u' => 'text/plain',
'xspf' => 'application/xspf+xml',
'vlc' => 'application/videolan',
'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'),
'au' => 'audio/x-au',
'ac3' => 'audio/ac3',
'flac' => 'audio/x-flac',
'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'),
'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'),
'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'),
'ics' => 'text/calendar',
'ical' => 'text/calendar',
'zsh' => 'text/x-scriptzsh',
'7z' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
'7zip' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'),
'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'),
'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'),
'svg' => array('image/svg+xml', 'application/xml', 'text/xml'),
'vcf' => 'text/x-vcard',
'srt' => array('text/srt', 'text/plain'),
'vtt' => array('text/vtt', 'text/plain'),
'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'),
'odc' => 'application/vnd.oasis.opendocument.chart',
'otc' => 'application/vnd.oasis.opendocument.chart-template',
'odf' => 'application/vnd.oasis.opendocument.formula',
'otf' => 'application/vnd.oasis.opendocument.formula-template',
'odg' => 'application/vnd.oasis.opendocument.graphics',
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
'odi' => 'application/vnd.oasis.opendocument.image',
'oti' => 'application/vnd.oasis.opendocument.image-template',
'odp' => 'application/vnd.oasis.opendocument.presentation',
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
'odt' => 'application/vnd.oasis.opendocument.text',
'odm' => 'application/vnd.oasis.opendocument.text-master',
'ott' => 'application/vnd.oasis.opendocument.text-template',
'oth' => 'application/vnd.oasis.opendocument.text-web'
);

View File

@@ -0,0 +1,14 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| Profiler Sections
| -------------------------------------------------------------------------
| This file lets you determine whether or not various sections of Profiler
| data are displayed when the Profiler is enabled.
| Please see the user guide for info:
|
| https://codeigniter.com/user_guide/general/profiling.html
|
*/

View File

@@ -0,0 +1,84 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
| This file lets you re-map URI requests to specific controller functions.
|
| Typically there is a one-to-one relationship between a URL string
| and its corresponding controller class/method. The segments in a
| URL normally follow this pattern:
|
| example.com/class/method/id/
|
| In some instances, however, you may want to remap this relationship
| so that a different class/function is called than the one
| corresponding to the URL.
|
| Please see the user guide for complete details:
|
| https://codeigniter.com/user_guide/general/routing.html
|
| -------------------------------------------------------------------------
| RESERVED ROUTES
| -------------------------------------------------------------------------
|
| There are three reserved routes:
|
| $route['default_controller'] = 'welcome';
|
| This route indicates which controller class should be loaded if the
| URI contains no data. In the above example, the "welcome" class
| would be loaded.
|
| $route['404_override'] = 'errors/page_missing';
|
| This route will tell the Router which controller/method to use if those
| provided in the URL cannot be matched to a valid route.
|
| $route['translate_uri_dashes'] = FALSE;
|
| This is not exactly a route, but allows you to automatically route
| controller and method names that contain dashes. '-' isn't a valid
| class or method name character, so it requires translation.
| When you set this option to TRUE, it will replace ALL dashes in the
| controller and method URI segments.
|
| Examples: my-controller/index -> my_controller/index
| my-controller/my-method -> my_controller/my_method
*/
$route['default_controller'] = 'main';
$route['404_override'] = '';
$route[config_item('uri_segment_admin') . '/preview/adminshow/(.+)'] = "$1";
if (config_item('uri_segment_admin') !== 'admin') {
$route['admin'] = '_show404notfounderrorpage';
$route[config_item('uri_segment_admin')] = 'admin';
$route['admin/(.+)'] = '_show404notfounderrorpage';
$route[config_item('uri_segment_admin') . '/(.+)'] = "admin/$1";
}
$route[config_item('uri_segment_board') . '/([a-zA-Z0-9_-]+)'] = "board_post/lists/$1";
if (strtoupper(config_item('uri_segment_post_type')) === 'B') {
$route['([a-zA-Z0-9_-]+)/' . config_item('uri_segment_post') . '/([0-9]+)'] = "board_post/post/$2";
} else if (strtoupper(config_item('uri_segment_post_type')) === 'C') {
$route[config_item('uri_segment_post') . '/([a-zA-Z0-9_-]+)/([0-9]+)'] = "board_post/post/$2";
} else {
$route[config_item('uri_segment_post') . '/([0-9]+)'] = "board_post/post/$1";
}
$route[config_item('uri_segment_write') . '/([a-zA-Z0-9_-]+)'] = "board_write/write/$1";
$route[config_item('uri_segment_reply') . '/([0-9]+)'] = "board_write/reply/$1";
$route[config_item('uri_segment_modify') . '/([0-9]+)'] = "board_write/modify/$1";
$route[config_item('uri_segment_rss') . '/([a-zA-Z0-9_-]+)'] = "rss/index/$1";
$route[config_item('uri_segment_group') . '/([a-zA-Z0-9_-]+)'] = "group/index/$1";
$route[config_item('uri_segment_document') . '/([a-zA-Z0-9_-]+)'] = "document/index/$1";
$route[config_item('uri_segment_faq') . '/([a-zA-Z0-9_-]+)'] = "faq/index/$1";
$route['profile/([a-zA-Z0-9_-]+)'] = "profile/index/$1";
$route['print/([0-9]+)'] = "board_post/post/$1/print";
$route['sitemap\.xml'] = "sitemap";
$route['sitemap_([0-9_-]+)\.xml'] = "sitemap/board/$1";

View File

@@ -0,0 +1,64 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| SMILEYS
| -------------------------------------------------------------------
| This file contains an array of smileys for use with the emoticon helper.
| Individual images can be used to replace multiple smileys. For example:
| :-) and :) use the same image replacement.
|
| Please see user guide for more info:
| https://codeigniter.com/user_guide/helpers/smiley_helper.html
|
*/
$smileys = array(
// smiley image name width height alt
':-)' => array('grin.gif', '19', '19', 'grin'),
':lol:' => array('lol.gif', '19', '19', 'LOL'),
':cheese:' => array('cheese.gif', '19', '19', 'cheese'),
':)' => array('smile.gif', '19', '19', 'smile'),
';-)' => array('wink.gif', '19', '19', 'wink'),
';)' => array('wink.gif', '19', '19', 'wink'),
':smirk:' => array('smirk.gif', '19', '19', 'smirk'),
':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'),
':-S' => array('confused.gif', '19', '19', 'confused'),
':wow:' => array('surprise.gif', '19', '19', 'surprised'),
':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'),
':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'),
'%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'),
';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'),
':P' => array('raspberry.gif', '19', '19', 'raspberry'),
':blank:' => array('blank.gif', '19', '19', 'blank stare'),
':long:' => array('longface.gif', '19', '19', 'long face'),
':ohh:' => array('ohh.gif', '19', '19', 'ohh'),
':grrr:' => array('grrr.gif', '19', '19', 'grrr'),
':gulp:' => array('gulp.gif', '19', '19', 'gulp'),
'8-/' => array('ohoh.gif', '19', '19', 'oh oh'),
':down:' => array('downer.gif', '19', '19', 'downer'),
':red:' => array('embarrassed.gif', '19', '19', 'red face'),
':sick:' => array('sick.gif', '19', '19', 'sick'),
':shut:' => array('shuteye.gif', '19', '19', 'shut eye'),
':-/' => array('hmm.gif', '19', '19', 'hmmm'),
'>:(' => array('mad.gif', '19', '19', 'mad'),
':mad:' => array('mad.gif', '19', '19', 'mad'),
'>:-(' => array('angry.gif', '19', '19', 'angry'),
':angry:' => array('angry.gif', '19', '19', 'angry'),
':zip:' => array('zip.gif', '19', '19', 'zipper'),
':kiss:' => array('kiss.gif', '19', '19', 'kiss'),
':ahhh:' => array('shock.gif', '19', '19', 'shock'),
':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'),
':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'),
':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'),
':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'),
':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'),
':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'),
':vampire:' => array('vampire.gif', '19', '19', 'vampire'),
':snake:' => array('snake.gif', '19', '19', 'snake'),
':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'),
':question:' => array('question.gif', '19', '19', 'question')
);

View File

@@ -0,0 +1,214 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| USER AGENT TYPES
| -------------------------------------------------------------------
| This file contains four arrays of user agent data. It is used by the
| User Agent Class to help identify browser, platform, robot, and
| mobile device data. The array keys are used to identify the device
| and the array values are used to set the actual name of the item.
*/
$platforms = array(
'windows nt 10.0' => 'Windows 10',
'windows nt 6.3' => 'Windows 8.1',
'windows nt 6.2' => 'Windows 8',
'windows nt 6.1' => 'Windows 7',
'windows nt 6.0' => 'Windows Vista',
'windows nt 5.2' => 'Windows 2003',
'windows nt 5.1' => 'Windows XP',
'windows nt 5.0' => 'Windows 2000',
'windows nt 4.0' => 'Windows NT 4.0',
'winnt4.0' => 'Windows NT 4.0',
'winnt 4.0' => 'Windows NT',
'winnt' => 'Windows NT',
'windows 98' => 'Windows 98',
'win98' => 'Windows 98',
'windows 95' => 'Windows 95',
'win95' => 'Windows 95',
'windows phone' => 'Windows Phone',
'windows' => 'Unknown Windows OS',
'android' => 'Android',
'blackberry' => 'BlackBerry',
'iphone' => 'iOS',
'ipad' => 'iOS',
'ipod' => 'iOS',
'os x' => 'Mac OS X',
'ppc mac' => 'Power PC Mac',
'freebsd' => 'FreeBSD',
'ppc' => 'Macintosh',
'linux' => 'Linux',
'debian' => 'Debian',
'sunos' => 'Sun Solaris',
'beos' => 'BeOS',
'apachebench' => 'ApacheBench',
'aix' => 'AIX',
'irix' => 'Irix',
'osf' => 'DEC OSF',
'hp-ux' => 'HP-UX',
'netbsd' => 'NetBSD',
'bsdi' => 'BSDi',
'openbsd' => 'OpenBSD',
'gnu' => 'GNU/Linux',
'unix' => 'Unknown Unix OS',
'symbian' => 'Symbian OS'
);
// The order of this array should NOT be changed. Many browsers return
// multiple browser types so we want to identify the sub-type first.
$browsers = array(
'OPR' => 'Opera',
'Flock' => 'Flock',
'Edge' => 'Edge',
'Chrome' => 'Chrome',
// Opera 10+ always reports Opera/9.80 and appends Version/<real version> to the user agent string
'Opera.*?Version' => 'Opera',
'Opera' => 'Opera',
'MSIE' => 'Internet Explorer',
'Internet Explorer' => 'Internet Explorer',
'Trident.* rv' => 'Internet Explorer',
'Shiira' => 'Shiira',
'Firefox' => 'Firefox',
'Chimera' => 'Chimera',
'Phoenix' => 'Phoenix',
'Firebird' => 'Firebird',
'Camino' => 'Camino',
'Netscape' => 'Netscape',
'OmniWeb' => 'OmniWeb',
'Safari' => 'Safari',
'Mozilla' => 'Mozilla',
'Konqueror' => 'Konqueror',
'icab' => 'iCab',
'Lynx' => 'Lynx',
'Links' => 'Links',
'hotjava' => 'HotJava',
'amaya' => 'Amaya',
'IBrowse' => 'IBrowse',
'Maxthon' => 'Maxthon',
'Ubuntu' => 'Ubuntu Web Browser'
);
$mobiles = array(
// legacy array, old values commented out
'mobileexplorer' => 'Mobile Explorer',
// 'openwave' => 'Open Wave',
// 'opera mini' => 'Opera Mini',
// 'operamini' => 'Opera Mini',
// 'elaine' => 'Palm',
'palmsource' => 'Palm',
// 'digital paths' => 'Palm',
// 'avantgo' => 'Avantgo',
// 'xiino' => 'Xiino',
'palmscape' => 'Palmscape',
// 'nokia' => 'Nokia',
// 'ericsson' => 'Ericsson',
// 'blackberry' => 'BlackBerry',
// 'motorola' => 'Motorola'
// Phones and Manufacturers
'motorola' => 'Motorola',
'nokia' => 'Nokia',
'palm' => 'Palm',
'iphone' => 'Apple iPhone',
'ipad' => 'iPad',
'ipod' => 'Apple iPod Touch',
'sony' => 'Sony Ericsson',
'ericsson' => 'Sony Ericsson',
'blackberry' => 'BlackBerry',
'cocoon' => 'O2 Cocoon',
'blazer' => 'Treo',
'lg' => 'LG',
'amoi' => 'Amoi',
'xda' => 'XDA',
'mda' => 'MDA',
'vario' => 'Vario',
'htc' => 'HTC',
'samsung' => 'Samsung',
'sharp' => 'Sharp',
'sie-' => 'Siemens',
'alcatel' => 'Alcatel',
'benq' => 'BenQ',
'ipaq' => 'HP iPaq',
'mot-' => 'Motorola',
'playstation portable' => 'PlayStation Portable',
'playstation 3' => 'PlayStation 3',
'playstation vita' => 'PlayStation Vita',
'hiptop' => 'Danger Hiptop',
'nec-' => 'NEC',
'panasonic' => 'Panasonic',
'philips' => 'Philips',
'sagem' => 'Sagem',
'sanyo' => 'Sanyo',
'spv' => 'SPV',
'zte' => 'ZTE',
'sendo' => 'Sendo',
'nintendo dsi' => 'Nintendo DSi',
'nintendo ds' => 'Nintendo DS',
'nintendo 3ds' => 'Nintendo 3DS',
'wii' => 'Nintendo Wii',
'open web' => 'Open Web',
'openweb' => 'OpenWeb',
// Operating Systems
'android' => 'Android',
'symbian' => 'Symbian',
'SymbianOS' => 'SymbianOS',
'elaine' => 'Palm',
'series60' => 'Symbian S60',
'windows ce' => 'Windows CE',
// Browsers
'obigo' => 'Obigo',
'netfront' => 'Netfront Browser',
'openwave' => 'Openwave Browser',
'mobilexplorer' => 'Mobile Explorer',
'operamini' => 'Opera Mini',
'opera mini' => 'Opera Mini',
'opera mobi' => 'Opera Mobile',
'fennec' => 'Firefox Mobile',
// Other
'digital paths' => 'Digital Paths',
'avantgo' => 'AvantGo',
'xiino' => 'Xiino',
'novarra' => 'Novarra Transcoder',
'vodafone' => 'Vodafone',
'docomo' => 'NTT DoCoMo',
'o2' => 'O2',
// Fallback
'mobile' => 'Generic Mobile',
'wireless' => 'Generic Mobile',
'j2me' => 'Generic Mobile',
'midp' => 'Generic Mobile',
'cldc' => 'Generic Mobile',
'up.link' => 'Generic Mobile',
'up.browser' => 'Generic Mobile',
'smartphone' => 'Generic Mobile',
'cellphone' => 'Generic Mobile'
);
// There are hundreds of bots but these are the most common.
$robots = array(
'googlebot' => 'Googlebot',
'msnbot' => 'MSNBot',
'baiduspider' => 'Baiduspider',
'bingbot' => 'Bing',
'slurp' => 'Inktomi Slurp',
'yahoo' => 'Yahoo',
'ask jeeves' => 'Ask Jeeves',
'fastcrawler' => 'FastCrawler',
'infoseek' => 'InfoSeek Robot 1.0',
'lycos' => 'Lycos',
'yandex' => 'YandexBot',
'mediapartners-google' => 'MediaPartners Google',
'CRAZYWEBCRAWLER' => 'Crazy Webcrawler',
'adsbot-google' => 'AdsBot Google',
'feedfetcher-google' => 'Feedfetcher Google',
'curious george' => 'Curious George',
'ia_archiver' => 'Alexa Crawler',
'MJ12bot' => 'Majestic-12',
'Uptimebot' => 'Uptimebot'
);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,102 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Captcha class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 비회원이 접근시 보여주는 captcha 에 관한 controller 입니다.
*/
class Captcha extends CB_Controller
{
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->helper(array('captcha', 'string'));
}
/**
* 캡차 세션 생성후 보여주는 함수입니다.
*/
function show($width = '', $height = '')
{
$this->output->set_content_type('application/json');
if ( ! $width) {
$width = 150;
}
if ( ! $height) {
$height = 40;
}
$img_path = config_item('uploads_dir') . '/captcha/';
if ( ! is_dir($img_path)) {
@mkdir($img_path, 0755);
@chmod($img_path, 0755);
$file = $img_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$data = array(
'img_path' => $img_path,
'img_url' => site_url(config_item('uploads_dir') . '/captcha') . '/',
'img_width' => $width,
'img_height' => $height,
'font_size' => 15,
'font_path' => FCPATH . 'assets/fonts/BreeSerif-Regular.ttf',
'pool' => '23456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ',
'word_length' => '8',
'img_id' => 'captcha',
);
$cap = create_captcha($data);
$save = array(
'captcha_time' => $cap['time'],
'ip_address' => $this->input->ip_address(),
'word' => $cap['word'],
);
$this->session->set_userdata('captcha', $save);
exit(json_encode($cap));
}
/**
* 구글 캡차 생성후 보여주는 함수입니다.
*/
function recaptcha()
{
$html = '<div id="google-recaptcha">';
$html .= '<script src="https://www.google.com/recaptcha/api.js"></script>';
if ( (int) $this->cbconfig->item('use_recaptcha') === 2 ){
$html .= '<div id="recaptcha" class="g-recaptcha" data-sitekey="' . $this->cbconfig->item('recaptcha_sitekey') . '" data-callback="recaptcha_validate" data-badge="inline" data-size="invisible"></div>';
$html .= '<script>jQuery("#recaptcha").hide().parent("div").hide();</script>';
} else {
$html .= '<div class="g-recaptcha" data-sitekey="' . $this->cbconfig->item('recaptcha_sitekey') . '"></div>';
}
$html .= '</div>';
echo $html;
}
}

View File

@@ -0,0 +1,541 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Comment_list class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 게시물 열람 페이지에 보이는 댓글 목록에 관한 controller 입니다.
*/
class Comment_list extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Post', 'Comment', 'Comment_meta');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring', 'accesslevel'));
}
/**
* 댓글 목록을 ajax 로 가져옵니다
*/
public function lists($post_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_comment_list_lists';
$this->load->event($eventname);
$post_id = (int) $post_id;
if (empty($post_id) OR $post_id < 1) {
show_404();
}
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$post = $this->Post_model->get_one($post_id);
if ( ! element('post_id', $post)) {
show_404();
}
$board = $this->board->item_all(element('brd_id', $post));
$mem_id = (int) $this->member->item('mem_id');
$alertmessage = $this->member->is_member()
? '회원님은 이 댓글 목록을 볼 수 있는 권한이 없습니다'
: '비회원은 이 댓글 접근할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오';
$check = array(
'group_id' => element('bgr_id', $board),
'board_id' => element('brd_id', $board),
);
$this->accesslevel->check(
element('access_view', $board),
element('access_view_level', $board),
element('access_view_group', $board),
$alertmessage,
$check
);
$is_admin = $this->member->is_admin(
array(
'board_id' => element('brd_id', $board),
'group_id' => element('bgr_id', $board)
)
);
$check = array(
'group_id' => element('bgr_id', $board),
'board_id' => element('brd_id', $board),
);
$can_comment_write = $this->accesslevel->is_accessable(
element('access_comment', $board),
element('access_comment_level', $board),
element('access_comment_group', $board),
$check
);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$findex = strtolower(element('comment_order', $board)) === 'desc'
? 'cmt_num, cmt_reply' : 'cmt_num desc, cmt_reply';
if ($this->cbconfig->get_device_view_type() === 'mobile') {
$per_page = element('mobile_comment_count', $board)
? (int) element('mobile_comment_count', $board) : 0;
} else {
$per_page = element('comment_count', $board) ? (int) element('comment_count', $board) : 0;
}
$page = (int) $this->input->get('page');
if ($page === 0) $page = 1;
if (empty($page)) {
if (strtolower(element('comment_order', $board)) === 'desc') {
$page = 1;
} else {
$page = $per_page ? ceil(element('post_comment_count', $post) / $per_page) : 1;
if ($page === 0) {
$page = 1;
}
}
}
if ($page < 1) {
show_404();
}
$offset = ($page - 1) * $per_page;
$this->Comment_model->allow_search_field = array('cmt_id', 'post_id', 'cmt_content', 'cmt_userid', 'cmt_nickname'); // 검색이 가능한 필드
$this->Comment_model->search_field_equal = array('cmt_id', 'cmt_userid', 'cmt_nickname'); // 검색중 like 가 아닌 = 검색을 하는 필드
$image_width = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('post_mobile_image_width', $board)
: element('post_image_width', $board);
$use_sideview = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('use_mobile_sideview', $board)
: element('use_sideview', $board);
$use_sideview_icon = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('use_mobile_sideview_icon', $board)
: element('use_sideview_icon', $board);
$comment_date_style = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('mobile_comment_date_style', $board)
: element('comment_date_style', $board);
$comment_date_style_manual = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('mobile_comment_date_style_manual', $board)
: element('comment_date_style_manual', $board);
$comment_best = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('mobile_comment_best', $board)
: element('comment_best', $board);
$board['use_comment_profile'] = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('use_mobile_comment_profile', $board)
: element('use_comment_profile', $board);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['step1'] = Events::trigger('step1', $eventname);
/**
* 상단에 베스트 부분에 필요한 정보를 가져옵니다.
*/
$bestresult = '';
if ($comment_best) {
$bestresult = $this->Comment_model
->get_best_list($post_id, $comment_best, element('comment_best_like_num', $board));
if ($bestresult) {
foreach ($bestresult as $key => $val) {
$bestresult[$key]['meta'] = $meta = $this->Comment_meta_model->get_all_meta(element('cmt_id', $val));
$bestresult[$key]['content'] = '';
$is_blind = (element('comment_blame_blind_count', $board) > 0 && element('cmt_blame', $val) >= element('comment_blame_blind_count', $board)) ? true : false;
if ($is_blind === true) {
$bestresult[$key]['content'] .= '<div class="alert alert-danger">신고가 접수된 게시글입니다. 본인과 관리자만 확인이 가능합니다</div>';
}
if (element('cmt_secret', $val)) {
$bestresult[$key]['content'] .= '<span class="label label-warning">비밀글입니다</span>';
}
if (($is_blind === false && ! element('cmt_secret', $val)) OR $is_admin !== false OR (element('mem_id', $val) && (int) element('mem_id', $val) === $mem_id)) {
$bestresult[$key]['content'] .= display_html_content(
element('cmt_content', $val),
element('cmt_html', $val),
$image_width,
$autolink = true,
$popup = true
);
if (element('comment_syntax_highlighter', $board)) {
$bestresult[$key]['content'] = preg_replace_callback(
"/(\[code\]|\[code=(.*)\])(.*)\[\/code\]/iUs",
"content_syntaxhighlighter",
$bestresult[$key]['content']
); // SyntaxHighlighter
}
}
if (element('cmt_del', $val)) {
$bestresult[$key]['content'] = '<div class="alert alert-danger">이 게시물은 '
. html_escape(element('delete_mem_nickname', $meta)) . '님에 의해 '
. html_escape(element('delete_datetime', $meta)) . ' 에 삭제 되었습니다</div>';
}
if (element('mem_id', $val) >= 0) {
$bestresult[$key]['display_name'] = display_username(
element('cmt_userid', $val),
element('cmt_nickname', $val),
($use_sideview_icon ? element('mem_icon', $val) : ''),
($use_sideview ? 'Y' : 'N')
);
} else {
$bestresult[$key]['display_name'] = '익명사용자';
}
$bestresult[$key]['display_datetime'] = display_datetime(
element('cmt_datetime', $val),
$comment_date_style,
$comment_date_style_manual
);
$bestresult[$key]['is_mobile'] = (element('cmt_device', $val) === 'mobile') ? true : false;
$bestresult[$key]['display_ip'] = '';
$show_comment_ip = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('show_mobile_comment_ip', $board)
: element('show_comment_ip', $board);
if ($this->member->is_admin() === 'super' OR $show_comment_ip === '2') {
$bestresult[$key]['display_ip'] = display_ipaddress(element('cmt_ip', $val), '1111');
} elseif ($show_comment_ip === '1') {
$bestresult[$key]['display_ip'] = display_ipaddress(element('cmt_ip', $val), $this->cbconfig->item('ip_display_style'));
}
$bestresult[$key]['member_photo_url']
= member_photo_url(element('mem_photo', $val), 64, 64)
? member_photo_url(element('mem_photo', $val), 64, 64)
: site_url('assets/images/member_default.gif');
}
}
}
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$where = array(
'post_id' => $post_id,
'cmt_del <>' => 2,
);
$result = $this->Comment_model
->get_comment_list($per_page, $offset, $where, '', $findex, $sfield = '', $skeyword = '');
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['meta'] = $meta
= $this->Comment_meta_model->get_all_meta(element('cmt_id', $val));
$result['list'][$key]['content'] = '';
$is_blind = (element('comment_blame_blind_count', $board) > 0 && element('cmt_blame', $val) >= element('comment_blame_blind_count', $board)) ? true : false;
if ($is_blind === true) {
$result['list'][$key]['content'] .= '<div class="alert alert-danger">신고가 접수된 게시글입니다. 본인과 관리자만 확인이 가능합니다</div>';
}
if (element('cmt_secret', $val)) {
$result['list'][$key]['content'] .= '<span class="label label-warning">비밀글입니다</span>';
}
if (($is_blind === false && ! element('cmt_secret', $val)) OR $is_admin !== false OR (element('mem_id', $val) && abs(element('mem_id', $val)) === $mem_id)
OR (element('mem_id', $post) && abs(element('mem_id', $post)) === $mem_id)) {
$result['list'][$key]['content'] .= display_html_content(
element('cmt_content', $val),
element('cmt_html', $val),
$image_width,
$autolink = true,
$popup = true
);
if (element('comment_syntax_highlighter', $board)) {
$result['list'][$key]['content'] = preg_replace_callback(
"/(\[code\]|\[code=(.*)\])(.*)\[\/code\]/iUs",
"content_syntaxhighlighter",
$result['list'][$key]['content']
); // SyntaxHighlighter
}
}
if (element('cmt_del', $val)) {
$result['list'][$key]['content'] = '<div class="alert alert-danger">이 게시물은 '
. html_escape(element('delete_mem_nickname', $meta)) . '님에 의해 '
. html_escape(element('delete_datetime', $meta)) . ' 에 삭제 되었습니다</div>';
}
if (element('mem_id', $val) >= 0) {
$result['list'][$key]['display_name'] = display_username(
element('cmt_userid', $val),
element('cmt_nickname', $val),
($use_sideview_icon ? element('mem_icon', $val) : ''),
($use_sideview ? 'Y' : 'N')
);
} else {
$result['list'][$key]['display_name'] = '익명사용자';
}
$result['list'][$key]['display_datetime'] = display_datetime(
element('cmt_datetime', $val),
$comment_date_style,
$comment_date_style_manual
);
$result['list'][$key]['is_mobile'] = (element('cmt_device', $val) === 'mobile') ? true : false;
$result['list'][$key]['display_ip'] = '';
$result['list'][$key]['lucky'] = '';
if (element('comment-lucky', $meta)) {
$result['list'][$key]['lucky'] = element('comment_lucky_name', $board). '에 당첨되어 <span class="luckypoint">' . number_format(element('comment-lucky', $meta)) . '</span> 포인트 지급되었습니다.';
}
if ($this->member->is_admin() === 'super'
OR element('show_comment_ip', $board) === '2') {
$result['list'][$key]['display_ip'] = display_ipaddress(element('cmt_ip', $val), '1111');
} elseif (element('show_comment_ip', $board) === '1') {
$result['list'][$key]['display_ip'] = display_ipaddress(element('cmt_ip', $val), $this->cbconfig->item('ip_display_style'));
}
$result['list'][$key]['member_photo_url']
= member_photo_url(element('mem_photo', $val), 64, 64)
? member_photo_url(element('mem_photo', $val), 64, 64)
: site_url('assets/images/member_default.gif');
$result['list'][$key]['cmt_depth'] = strlen($result['list'][$key]['cmt_reply']) * 30;
$result['list'][$key]['can_update'] = false;
$result['list'][$key]['can_delete'] = false;
$result['list'][$key]['can_reply'] = false;
if ( ! element('post_del', $post) && ! element('cmt_del', $val)) {
if ( ! element('mem_id', $val)) {
$result['list'][$key]['can_delete'] = true;
}
if ($is_admin !== false
OR (element('mem_id', $val) && $mem_id === abs(element('mem_id', $val)))) {
$result['list'][$key]['can_update'] = true;
$result['list'][$key]['can_delete'] = true;
}
if ($key > 0 && $is_admin === false) {
if (element('cmt_reply', $val)) {
$prev_reply = substr(
element('cmt_reply', $val),
0,
strlen(element('cmt_reply', $val)) - 1
);
if ($prev_reply === $result['list'][$key-1]['cmt_reply']) {
$result['list'][$key-1]['can_update'] = false;
$result['list'][$key-1]['can_delete'] = false;
}
}
}
if (element('block_delete', $board) && $is_admin === false) {
$result['list'][$key]['can_delete'] = false;
}
if (strlen(element('cmt_reply', $val)) < 5 && $can_comment_write === true) {
$result['list'][$key]['can_reply'] = true;
}
}
}
}
$view['view']['data'] = $result;
$view['view']['best_list'] = $bestresult;
$view['view']['board'] = $board;
$view['view']['post'] = $post;
$view['view']['is_admin'] = $is_admin;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->Post_model->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = site_url('comment_list/lists/' . $post_id) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
if ( ! $this->input->get('page')) {
$_GET['page'] = (string) $page;
}
$config['_attributes'] = 'onClick="comment_page(\'' . $post_id . '\', $(this).attr(\'data-ci-pagination-page\'));return false;"';
if ($this->cbconfig->get_device_view_type() === 'mobile') {
$config['num_links'] = element('mobile_comment_page_count', $board)
? element('mobile_comment_page_count', $board) : 3;
} else {
$config['num_links'] = element('comment_page_count', $board)
? element('comment_page_count', $board) : 5;
}
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$skindir = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('board_mobile_skin', $board)
: element('board_skin', $board);
if (empty($skindir)) {
$skindir = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('mobile_skin_board')
: $this->cbconfig->item('skin_board');
}
if (empty($skindir)) {
$skindir = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('mobile_skin_default')
: $this->cbconfig->item('skin_default');
}
if (empty($skindir)) {
$skindir = 'basic';
}
$skin = 'board/' . $skindir . '/comment_list';
$this->data = $view;
$this->view = $skin;
}
/**
* 비회원이 작성한 댓글 삭제시 패스워드를 물을 때 필요합니다.
*/
public function password($post_id = 0, $cmt_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_comment_list_password';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$cmt_id = (int) $cmt_id;
if (empty($cmt_id) OR $cmt_id < 1) {
show_404();
}
$post_id = (int) $post_id;
if (empty($post_id) OR $post_id < 1) {
show_404();
}
$comment = $this->Comment_model->get_one($cmt_id);
if ( ! element('cmt_id', $comment)) {
show_404();
}
if ((int) element('post_id', $comment) !== $post_id) {
show_404();
}
$post = $this->Post_model->get_one($post_id);
if ( ! element('post_id', $post)) {
show_404();
}
$board = $this->board->item_all(element('brd_id', $post));
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'modify_password',
'label' => '패스워드',
'rules' => 'trim|required',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$modify_password = $this->input->post('modify_password');
$return = $this->board->delete_comment_check($cmt_id, $modify_password);
$result = json_decode($return, true);
if (element('error', $result)) {
$view['view']['message'] = element('error', $result);
}
if (element('password', $result)) {
$view['view']['message'] = element('password', $result);
}
if (element('success', $result)) {
redirect(post_url(element('brd_key', $board), $post_id));
return;
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$view['view']['info'] = '댓글 삭제를 위한 패스워드 입력페이지입니다.<br />패스워드를 입력하시면 댓글 삭제가 가능합니다';
$page_title = element('board_name', $board) . ' 댓글수정';
$layout_dir = element('board_layout', $board) ? element('board_layout', $board) : $this->cbconfig->item('layout_board');
$mobile_layout_dir = element('board_mobile_layout', $board) ? element('board_mobile_layout', $board) : $this->cbconfig->item('mobile_layout_board');
$use_sidebar = element('board_sidebar', $board) ? element('board_sidebar', $board) : $this->cbconfig->item('sidebar_board');
$use_mobile_sidebar = element('board_mobile_sidebar', $board) ? element('board_mobile_sidebar', $board) : $this->cbconfig->item('mobile_sidebar_board');
$skin_dir = element('board_skin', $board) ? element('board_skin', $board) : $this->cbconfig->item('skin_board');
$mobile_skin_dir = element('board_mobile_skin', $board) ? element('board_mobile_skin', $board) : $this->cbconfig->item('mobile_skin_board');
$layoutconfig = array(
'path' => 'board',
'layout' => 'layout',
'skin' => 'password',
'layout_dir' => $layout_dir,
'mobile_layout_dir' => $mobile_layout_dir,
'use_sidebar' => $use_sidebar,
'use_mobile_sidebar' => $use_mobile_sidebar,
'skin_dir' => $skin_dir,
'mobile_skin_dir' => $mobile_skin_dir,
'page_title' => $page_title,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
return true;
}
}

View File

@@ -0,0 +1,894 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Comment_write class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 댓글 작성시 업데이트 할 때 작동하는 controller 입니다.
*/
class Comment_write extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Post', 'Comment');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring', 'accesslevel', 'email', 'notelib', 'point'));
}
/**
* 댓글 작성시 업데이트하는 함수입니다
*/
public function update()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_comment_write_update';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$post_id = (int) $this->input->post('post_id');
if (empty($post_id) OR $post_id < 1) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$post = $this->Post_model->get_one($post_id);
if ( ! element('post_id', $post)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$board = $this->board->item_all(element('brd_id', $post));
$mem_id = (int) $this->member->item('mem_id');
$mode = ($this->input->post('mode') === 'cu') ? 'cu' : 'c';
if ($mode === 'cu') {
$cmt_id = (int) $this->input->post('cmt_id');
if (empty($cmt_id) OR $cmt_id < 1) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$comment = $this->Comment_model->get_one($cmt_id);
if ( ! element('cmt_id', $comment)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
if (element('cmt_del', $comment)) {
$result = array('error' => '삭제된 글은 수정하실 수 없습니다');
exit(json_encode($result));
}
}
if (element('notice_comment_block', $board) && element('post_notice', $post)) {
$result = array('error' => '공지사항 글에는 댓글을 입력하실 수 없습니다.');
exit(json_encode($result));
}
$check = array(
'group_id' => element('bgr_id', $board),
'board_id' => element('brd_id', $board),
);
$is_accessable = $this->accesslevel->is_accessable(
element('access_comment', $board),
element('access_comment_level', $board),
element('access_comment_group', $board),
$check
);
if ($is_accessable === false) {
$alertmessage = $this->member->is_member()
? '회원님은 댓글을 작성할 수 있는 권한이 없습니다'
: '비회원은 댓글을 작성할 수 있는 권한이 없습니다.<br>회원이시라면 로그인 후 이용해 보십시오';
$result = array('error' => $alertmessage);
exit(json_encode($result));
}
$is_admin = $this->member->is_admin(
array(
'board_id' => element('brd_id', $board),
'group_id' => element('bgr_id', $board),
)
);
$origin = '';
$reply = '';
if ($this->input->post('cmt_id') && $mode === 'c') {
$parent_id = (int) $this->input->post('cmt_id');
if (empty($parent_id) OR $parent_id < 1) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$origin = $this->Comment_model->get_one($parent_id);
if ( ! element('cmt_id', $origin)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
if (element('cmt_del', $origin)) {
$result = array('error' => '삭제된 글에는 답변을 입력하실 수 없습니다');
exit(json_encode($result));
}
if (strlen(element('cmt_reply', $origin)) >= 5) {
$result = array('error' => '더 이상 답변하실 수 없습니다.\\n답변은 5단계 까지만 가능합니다');
exit(json_encode($result));
}
$reply_len = strlen(element('cmt_reply', $origin)) + 1;
$begin_reply_char = 'A';
$end_reply_char = 'Z';
$reply_number = +1;
$this->db->select('MAX(SUBSTRING(cmt_reply, ' . $reply_len . ', 1)) as reply', false);
$this->db->where('cmt_num', element('cmt_num', $origin));
$this->db->where('SUBSTRING(cmt_reply, ' . $reply_len . ', 1) <>', '');
if (element('cmt_id', $origin)) {
$this->db->like('cmt_reply', element('cmt_reply', $origin), 'after');
}
$result = $this->db->get('comment');
$row = $result->row_array();
if ( ! element('reply', $row)) {
$reply_char = $begin_reply_char;
} elseif (element('reply', $row) === $end_reply_char) { // A~Z은 26 입니다.
$result = array('error' => '더 이상 답변하실 수 없습니다.\\n답변은 26개 까지만 가능합니다');
exit(json_encode($result));
} else {
$reply_char = chr(ord(element('reply', $row)) + $reply_number);
}
$reply = element('cmt_reply', $origin) . $reply_char;
}
if ($mode === 'cu') {
if (element('protect_comment_day', $board) > 0 && $is_admin === false) {
if (ctimestamp() - strtotime(element('cmt_datetime', $comment)) >= element('protect_comment_day', $board) * 86400) {
$result = array('error' => '이 게시판은 ' . element('protect_comment_day', $board) . '일 이상된 댓글의 수정을 금지합니다');
exit(json_encode($result));
}
}
if ( ! $mem_id) {
$result = array('error' => '비회원은 수정 권한이 없습니다');
exit(json_encode($result));
}
if ( ! element('mem_id', $comment) && $is_admin === false) {
$result = array('error' => '비회원이 작성하신 글은 수정할 수 없습니다');
exit(json_encode($result));
}
if (element('mem_id', $comment)
&& abs(element('mem_id', $comment)) !== $mem_id
&& $is_admin === false) {
$result = array('error' => '다른 회원님의 댓글은 수정할 수 없습니다');
exit(json_encode($result));
}
}
if ($mode === 'c'
&& $this->session->userdata('lastest_post_time')
&& $this->cbconfig->item('new_post_second')) {
if ($this->session->userdata('lastest_post_time') >= ( ctimestamp() - $this->cbconfig->item('new_post_second')) && $is_admin === false) {
$result = array('error' => '너무 빠른 시간내에 게시물을 연속해서 올릴 수 없습니다.<br />'
. ($this->cbconfig->item('new_post_second') - (ctimestamp() - $this->session->userdata('lastest_post_time'))) . '초 후 글쓰기가 가능합니다');
exit(json_encode($result));
}
}
if (element('comment_possible_day', $board) > 0 && $is_admin === false
&& $mode === 'c' && ! $this->input->post('cmt_id')) {
if (ctimestamp() - strtotime(element('post_datetime', $post)) >= element('comment_possible_day', $board) * 86400) {
$result = array('error' => '이 게시판은 ' . element('comment_possible_day', $board) . '일 이상된 게시글에 댓글 입력을 금지합니다');
exit(json_encode($result));
}
}
$is_comment_name = ($this->member->is_member() === false) ? true : false;
$can_comment_secret = (element('use_comment_secret', $board) === '1' && $this->member->is_member()) ? true : false;
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'cmt_content',
'label' => '내용',
'rules' => 'trim|required',
),
);
if ($is_comment_name) {
$password_length = $this->cbconfig->item('password_length');
$config[] = array(
'field' => 'cmt_nickname',
'label' => '닉네임',
'rules' => 'trim|required|min_length[2]|max_length[20]|callback__mem_nickname_check',
);
$config[] = array(
'field' => 'cmt_password',
'label' => '패스워드',
'rules' => 'trim|required|min_length[' . $password_length . ']|callback__mem_password_check',
);
}
if ($this->member->is_member() === false) {
if ($this->cbconfig->item('use_recaptcha')) {
$config[] = array(
'field' => 'g-recaptcha-response',
'label' => '자동등록방지문자',
'rules' => 'trim|required|callback__check_recaptcha',
);
} else {
$config[] = array(
'field' => 'captcha_key',
'label' => '자동등록방지문자',
'rules' => 'trim|required|callback__check_captcha',
);
}
}
$this->form_validation->set_rules($config);
$form_validation = $this->form_validation->run();
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($form_validation === false) {
// 이벤트가 존재하면 실행합니다
Events::trigger('formrunfalse', $eventname);
$result = array('error' => validation_errors('<div class="alert alert-warning" role="alert">', '</div>'));
exit(json_encode($result));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
Events::trigger('formruntrue', $eventname);
$content_type = 0;
$cmt_content
= ($this->input->post('cmt_content') === '<p></p>' OR $this->input->post('cmt_content') === '<p>&nbsp;</p>')
? '' : $this->input->post('cmt_content');
if ($mode === 'c') {
if ($origin) {
$cmt_num = element('cmt_num', $origin);
$cmt_reply = $reply;
} else {
$cmt_num = $this->Comment_model->next_comment_num();
$cmt_reply = '';
}
$updatedata = array(
'cmt_num' => $cmt_num,
'cmt_reply' => $cmt_reply,
'cmt_content' => $cmt_content,
'cmt_html' => $content_type,
'cmt_datetime' => cdate('Y-m-d H:i:s'),
'cmt_updated_datetime' => cdate('Y-m-d H:i:s'),
'cmt_ip' => $this->input->ip_address(),
'post_id' => element('post_id', $post),
'brd_id' => element('brd_id', $post),
);
if ($mem_id) {
if (element('use_anonymous', $board)) {
$updatedata['mem_id'] = (-1) * $mem_id;
$updatedata['cmt_userid'] = '';
$updatedata['cmt_username'] = '익명사용자';
$updatedata['cmt_nickname'] = '익명사용자';
$updatedata['cmt_email'] = '';
$updatedata['cmt_homepage'] = '';
} else {
$updatedata['mem_id'] = $mem_id;
$updatedata['cmt_userid'] = $this->member->item('mem_userid');
$updatedata['cmt_username'] = $this->member->item('mem_username');
$updatedata['cmt_nickname'] = $this->member->item('mem_nickname');
$updatedata['cmt_email'] = $this->member->item('mem_email');
$updatedata['cmt_homepage'] = $this->member->item('mem_homepage');
}
}
if ($is_comment_name) {
if ( ! function_exists('password_hash')) {
$this->load->helper('password');
}
$updatedata['cmt_nickname'] = $this->input->post('cmt_nickname', null, '');
$updatedata['cmt_password'] = password_hash($this->input->post('cmt_password', null, ''), PASSWORD_BCRYPT);
}
if ($can_comment_secret) {
$updatedata['cmt_secret'] = $this->input->post('cmt_secret') ? 1 : 0;
}
if ($this->member->is_member() && element('use_comment_secret', $board) === '2') {
$updatedata['cmt_secret'] = 1;
}
$updatedata['cmt_device'] = ($this->cbconfig->get_device_type() === 'mobile')
? 'mobile' : 'desktop';
$cmt_id = $this->Comment_model->insert($updatedata);
$this->Post_model->comment_updated($post_id, cdate('Y-m-d H:i:s'));
if ($this->cbconfig->item('use_notification')
&& $this->cbconfig->item('notification_comment')) {
$this->load->library('notificationlib');
$not_message = $updatedata['cmt_nickname'] . '님께서 [' . element('post_title', $post) . '] 에 댓글을 남기셨습니다';
$not_url = post_url(element('brd_key', $board), $post_id) . '#comment_' . $cmt_id;
$this->notificationlib->set_noti(
abs(element('mem_id', $post)),
$mem_id,
'comment',
$cmt_id,
$not_message,
$not_url
);
}
if ($origin
&& $cmt_reply
&& $this->cbconfig->item('use_notification')
&& $this->cbconfig->item('notification_comment_comment')
&& abs(element('mem_id', $post)) !== abs(element('mem_id', $origin))) {
$this->load->library('notificationlib');
$not_message = $updatedata['cmt_nickname'] . '님께서 [' . element('post_title', $post) . '] 글의 회원님의 댓글에 답변댓글을 남기셨습니다';
$not_url = post_url(element('brd_key', $board), $post_id) . '#comment_' . $cmt_id;
$this->notificationlib->set_noti(
abs(element('mem_id', $origin)),
$mem_id,
'comment_comment',
$cmt_id,
$not_message,
$not_url
);
}
if (element('use_point', $board)) {
$point = $this->point->insert_point(
$mem_id,
element('point_comment', $board),
element('board_name', $board) . ' ' . $cmt_id . ' 댓글 작성',
'comment',
$cmt_id,
'댓글 작성'
);
}
if (element('use_comment_lucky', $board)) {
$rand = rand(1,100);
if (element('comment_lucky_percent', $board) >= $rand) {
$luckypoint = rand(element('comment_lucky_point_min', $board), element('comment_lucky_point_max', $board));
$luckytitle = element('board_name', $board) . ' ' . $cmt_id . ' ' . element('comment_lucky_name', $board) . ' 당첨';
$point = $this->point->insert_point(
$mem_id,
$luckypoint,
$luckytitle,
'lucky-comment',
$cmt_id,
'럭키포인트'
);
$metadata = array(
'comment-lucky' => $luckypoint,
);
$this->load->model('Comment_meta_model');
$this->Comment_meta_model->save($cmt_id, $metadata);
}
}
$emailsendlistadmin = array();
$notesendlistadmin = array();
$smssendlistadmin = array();
$emailsendlistpostwriter = array();
$notesendlistpostwriter = array();
$smssendlistpostwriter = array();
$emailsendlistcmtwriter = array();
$notesendlistcmtwriter = array();
$smssendlistcmtwriter = array();
$post_writer = array();
if (element('send_email_comment_super_admin', $board)
OR element('send_note_comment_super_admin', $board)
OR element('send_sms_comment_super_admin', $board)) {
$mselect = 'mem_id, mem_email, mem_nickname, mem_phone';
$superadminlist = $this->Member_model->get_superadmin_list($mselect);
}
if (element('send_email_comment_group_admin', $board)
OR element('send_note_comment_group_admin', $board)
OR element('send_sms_comment_group_admin', $board)) {
$this->load->model('Board_group_admin_model');
$groupadminlist = $this->Board_group_admin_model
->get_board_group_admin_member(element('bgr_id', $board));
}
if (element('send_email_comment_board_admin', $board)
OR element('send_note_comment_board_admin', $board)
OR element('send_sms_comment_board_admin', $board)) {
$this->load->model('Board_admin_model');
$boardadminlist = $this->Board_admin_model
->get_board_admin_member(element('brd_id', $board));
}
if (element('send_email_comment_super_admin', $board) && $superadminlist) {
foreach ($superadminlist as $key => $value) {
$emailsendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_email_comment_group_admin', $board) && $groupadminlist) {
foreach ($groupadminlist as $key => $value) {
$emailsendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_email_comment_board_admin', $board) && $boardadminlist) {
foreach ($boardadminlist as $key => $value) {
$emailsendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_email_comment_post_writer', $board)
OR element('send_note_comment_post_writer', $board)
OR element('send_sms_comment_post_writer', $board)
OR element('post_receive_email', $post)) {
$post_writer = $this->Member_model->get_one(element('mem_id', $post));
}
if ((element('mem_email', $post_writer) && element('post_receive_email', $post))
OR (element('send_email_comment_post_writer', $board) && element('mem_receive_email', $post_writer))) {
$emailsendlistpostwriter['mem_email'] = $post['post_email'];
}
if (element('send_email_comment_comment_writer', $board)) {
$emailsendlistcmtwriter['mem_email'] = $this->member->item('mem_email');
}
if (element('send_note_comment_super_admin', $board) && $superadminlist) {
foreach ($superadminlist as $key => $value) {
$notesendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_note_comment_group_admin', $board) && $groupadminlist) {
foreach ($groupadminlist as $key => $value) {
$notesendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_note_comment_board_admin', $board) && $boardadminlist) {
foreach ($boardadminlist as $key => $value) {
$notesendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_note_comment_post_writer', $board)
&& element('mem_use_note', $post_writer)) {
$notesendlistpostwriter['mem_id'] = element('mem_id', $post_writer);
}
if (element('send_note_comment_comment_writer', $board)
&& $this->member->item('mem_use_note')) {
$notesendlistcmtwriter['mem_id'] = $mem_id;
}
if (element('send_sms_comment_super_admin', $board) && $superadminlist) {
foreach ($superadminlist as $key => $value) {
$smssendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_sms_comment_group_admin', $board) && $groupadminlist) {
foreach ($groupadminlist as $key => $value) {
$smssendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_sms_comment_board_admin', $board) && $boardadminlist) {
foreach ($boardadminlist as $key => $value) {
$smssendlistadmin[$value['mem_id']] = $value;
}
}
if (element('send_sms_comment_post_writer', $board)
&& element('mem_phone', $post_writer)
&& element('mem_receive_sms', $post_writer)) {
$smssendlistpostwriter['mem_id'] = element('mem_id', $post_writer);
$smssendlistpostwriter['mem_nickname'] = element('mem_nickname', $post_writer);
$smssendlistpostwriter['mem_phone'] = element('mem_phone', $post_writer);
}
if (element('send_sms_comment_comment_writer', $board)
&& $this->member->item('mem_phone')
&& $this->member->item('mem_receive_sms')) {
$smssendlistcmtwriter['mem_id'] = $mem_id;
$smssendlistcmtwriter['mem_nickname'] = $this->member->item('mem_nickname');
$smssendlistcmtwriter['mem_phone'] = $this->member->item('mem_phone');
}
$searchconfig = array(
'{홈페이지명}',
'{회사명}',
'{홈페이지주소}',
'{댓글내용}',
'{댓글작성자닉네임}',
'{댓글작성자아이디}',
'{댓글작성시간}',
'{댓글주소}',
'{게시글제목}',
'{게시글내용}',
'{게시글작성자닉네임}',
'{게시글작성자아이디}',
'{게시글작성시간}',
'{게시글주소}',
'{게시판명}',
'{게시판주소}',
);
$autolink = element('use_auto_url', $board) ? true : false;
$popup = element('content_target_blank', $board) ? true : false;
$replaceconfig = array(
$this->cbconfig->item('site_title'),
$this->cbconfig->item('company_name'),
site_url(),
display_html_content($cmt_content, 0),
$updatedata['cmt_nickname'],
$this->member->item('mem_userid'),
cdate('Y-m-d H:i:s'),
post_url(element('brd_key', $board), element('post_id', $post)) . '#comment_' . $cmt_id,
element('post_title', $post),
display_html_content(element('post_content', $post), element('post_html', $post), element('post_image_width', $board), $autolink, $popup),
element('post_nickname', $post),
element('post_userid', $post),
element('post_datetime', $post),
post_url(element('brd_key', $board), element('post_id', $post)),
element('brd_name', $board),
board_url(element('brd_key', $board)),
);
$replaceconfig_escape = array(
html_escape($this->cbconfig->item('site_title')),
html_escape($this->cbconfig->item('company_name')),
site_url(),
display_html_content($cmt_content, 0),
html_escape($updatedata['cmt_nickname']),
$this->member->item('mem_userid'),
cdate('Y-m-d H:i:s'),
post_url(element('brd_key', $board), element('post_id', $post)) . '#comment_' . $cmt_id,
html_escape(element('post_title', $post)),
display_html_content(element('post_content', $post), element('post_html', $post), element('post_image_width', $board), $autolink, $popup),
html_escape(element('post_nickname', $post)),
element('post_userid', $post),
element('post_datetime', $post),
post_url(element('brd_key', $board), element('post_id', $post)),
html_escape(element('brd_name', $board)),
board_url(element('brd_key', $board)),
);
if ($emailsendlistadmin) {
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_email_comment_admin_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_email_comment_admin_content')
);
foreach ($emailsendlistadmin as $akey => $aval) {
$this->email->clear(true);
$this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name'));
$this->email->to(element('mem_email', $aval));
$this->email->subject($title);
$this->email->message($content);
$this->email->send();
}
}
if ($emailsendlistpostwriter) {
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_email_comment_post_writer_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_email_comment_post_writer_content')
);
$this->email->clear(true);
$this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name'));
$this->email->to(element('mem_email', $emailsendlistpostwriter));
$this->email->subject($title);
$this->email->message($content);
$this->email->send();
}
if ($emailsendlistcmtwriter) {
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_email_comment_comment_writer_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_email_comment_comment_writer_content')
);
$this->email->clear(true);
$this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name'));
$this->email->to(element('mem_email', $emailsendlistcmtwriter));
$this->email->subject($title);
$this->email->message($content);
$this->email->send();
}
if ($notesendlistadmin) {
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_note_comment_admin_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_note_comment_admin_content')
);
foreach ($notesendlistadmin as $akey => $aval) {
$note_result = $this->notelib->send_note(
$sender = 0,
$receiver = element('mem_id', $aval),
$title,
$content,
1
);
}
}
if ($notesendlistpostwriter && element('mem_id', $notesendlistpostwriter)) {
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_note_comment_post_writer_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_note_comment_post_writer_content')
);
$note_result = $this->notelib->send_note(
$sender = 0,
$receiver = element('mem_id', $notesendlistpostwriter),
$title,
$content,
1
);
}
if ($notesendlistcmtwriter && element('mem_id', $notesendlistcmtwriter)) {
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_note_comment_comment_writer_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_note_comment_comment_writer_content')
);
$note_result = $this->notelib->send_note(
$sender = 0,
$receiver = element('mem_id', $notesendlistcmtwriter),
$title,
$content,
1
);
}
if ($smssendlistadmin) {
if (file_exists(APPPATH . 'libraries/Smslib.php')) {
$this->load->library(array('smslib'));
$content = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_sms_comment_admin_content')
);
$sender = array(
'phone' => $this->cbconfig->item('sms_admin_phone'),
);
$receiver = array();
foreach ($smssendlistadmin as $akey => $aval) {
$receiver[] = array(
'mem_id' => element('mem_id', $aval),
'name' => element('mem_nickname', $aval),
'phone' => element('mem_phone', $aval),
);
}
$smsresult = $this->smslib->send($receiver, $sender, $content, $date = '', '댓글 작성 알림');
}
}
if ($smssendlistpostwriter) {
if (file_exists(APPPATH . 'libraries/Smslib.php')) {
$this->load->library(array('smslib'));
$content = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_sms_comment_post_writer_content')
);
$sender = array(
'phone' => $this->cbconfig->item('sms_admin_phone'),
);
$receiver = array();
$receiver[] = $smssendlistpostwriter;
$smsresult = $this->smslib->send($receiver, $sender, $content, $date = '', '댓글 작성 알림');
}
}
if ($smssendlistcmtwriter) {
if (file_exists(APPPATH . 'libraries/Smslib.php')) {
$this->load->library(array('smslib'));
$content = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_sms_comment_comment_writer_content')
);
$sender = array(
'phone' => $this->cbconfig->item('sms_admin_phone'),
);
$receiver = array();
$receiver[] = $smssendlistcmtwriter;
$smsresult = $this->smslib->send($receiver, $sender, $content, $date = '', '댓글 작성 알림');
}
}
$this->session->set_userdata(
'lastest_post_time',
ctimestamp()
);
// 이벤트가 존재하면 실행합니다
Events::trigger('after_insert', $eventname);
$result = array('success' => '댓글이 등록되었습니다');
exit(json_encode($result));
} else {
$updatedata = array(
'cmt_content' => $cmt_content,
'cmt_html' => $content_type,
'cmt_updated_datetime' => cdate('Y-m-d H:i:s'),
'cmt_ip' => $this->input->ip_address(),
);
if ($can_comment_secret) {
$updatedata['cmt_secret'] = $this->input->post('cmt_secret') ? 1 : 0;
}
if ($this->member->is_member() && element('use_comment_secret', $board) === '2') {
$updatedata['cmt_secret'] = 1;
}
$updatedata['cmt_device'] = ($this->cbconfig->get_device_type() === 'mobile')
? 'mobile' : 'desktop';
$this->Comment_model->update($cmt_id, $updatedata);
// 이벤트가 존재하면 실행합니다
Events::trigger('after_update', $eventname);
$result = array('success' => '댓글이 수정되었습니다');
exit(json_encode($result));
}
}
}
/**
* 댓글입력시 비회원이 입력한 경우 닉네임을 체크합니다
*/
public function _mem_nickname_check($str)
{
$this->load->helper('chkstring');
if (chkstring($str, _HANGUL_ + _ALPHABETIC_ + _NUMERIC_) === false) {
$this->form_validation->set_message(
'_mem_nickname_check',
'닉네임은 공백없이 한글, 영문, 숫자만 입력 가능합니다'
);
return false;
}
if (preg_match("/[\,]?{$str}/i", $this->cbconfig->item('denied_nickname_list'))) {
$this->form_validation->set_message(
'_mem_nickname_check',
$str . ' 은(는) 예약어로 사용하실 수 없는 닉네임입니다'
);
return false;
}
return true;
}
/**
* 새로 입력한 패스워드가 규약에 맞는지 체크합니다.
*/
public function _mem_password_check($str)
{
$uppercase = $this->cbconfig->item('password_uppercase_length');
$number = $this->cbconfig->item('password_numbers_length');
$specialchar = $this->cbconfig->item('password_specialchars_length');
$this->load->helper('chkstring');
$str_uc = count_uppercase($str);
$str_num = count_numbers($str);
$str_spc = count_specialchars($str);
if ($str_uc < $uppercase OR $str_num < $number OR $str_spc < $specialchar) {
$description = '비밀번호는 ';
if ($str_uc < $uppercase) {
$description .= ' ' . $uppercase . '개 이상의 대문자';
}
if ($str_num < $number) {
$description .= ' ' . $number . '개 이상의 숫자';
}
if ($str_spc < $specialchar) {
$description .= ' ' . $specialchar . '개 이상의 특수문자';
}
$description .= '를 포함해야 합니다';
$this->form_validation->set_message(
'_mem_password_check',
$description
);
return false;
}
return true;
}
/**
* 댓글입력시 비회원이 입력한 경우 captcha를 체크합니다
*/
public function _check_captcha($str)
{
$captcha = $this->session->userdata('captcha');
if ( ! is_array($captcha) OR ! element('word', $captcha)
OR strtolower(element('word', $captcha)) !== strtolower($str)) {
$this->session->unset_userdata('captcha');
$this->form_validation->set_message(
'_check_captcha',
'자동등록방지코드가 잘못되었습니다'
);
return false;
}
return true;
}
/**
* 회원가입시 recaptcha 체크하는 함수입니다
*/
public function _check_recaptcha($str)
{
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
'secret' => $this->cbconfig->item('recaptcha_secret'),
'response' => $str,
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, sizeof($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
$obj = json_decode($result);
if ((string) $obj->success !== '1') {
$this->form_validation->set_message(
'_check_recaptcha',
'자동등록방지코드가 잘못되었습니다'
);
return false;
}
return true;
}
}

View File

@@ -0,0 +1,166 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Currentvisitor class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 현재 접속자를 보여주는 controller 입니다.
*/
class Currentvisitor extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Currentvisitor');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 현재접속자 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_currentvisitor_index';
$this->load->event($eventname);
if ( ! $this->cbconfig->item('open_currentvisitor') && $this->member->is_admin() === false) {
alert('이 웹사이트는 현재접속자 기능을 사용하지 않습니다');
}
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$per_page = 100;
$offset = ($page - 1) * $per_page;
$minute = (int) $this->cbconfig->item('currentvisitor_minute');
if ($minute < 1) {
$minute = 10;
}
$curdatetime = cdate('Y-m-d H:i:s', ctimestamp() - $minute * 60);
$cachename = 'delete_old_currentvisitor_cache';
$cachetime = 60;
if ( ! $result = $this->cache->get($cachename)) {
$deletewhere = array(
'cur_datetime < ' => $curdatetime,
);
$this->Currentvisitor_model->delete_where($deletewhere);
$this->cache->save($cachename, cdate('Y-m-d H:i:s'), $cachetime);
}
$result = $this->Currentvisitor_model
->get_current_list($curdatetime, $per_page, $offset);
$list_num = ($page - 1) * $per_page + 1;
$visitor = array();
if (element('list', $result)) {
foreach (element('list', $result) as $key => $value) {
$data = $value;
if (element('mem_userid', $value)) {
$data['name_or_ip'] = display_username(
element('mem_userid', $value),
element('mem_nickname', $value),
element('mem_icon', $value)
);
} else {
$ip_display_style = ($this->member->is_admin() === 'super')
? '1111' : $this->cbconfig->item('ip_display_style');
$data['name_or_ip'] = display_ipaddress(element('cur_ip', $value), $ip_display_style);
}
$data['num'] = $list_num++;
$visitor[] = $data;
}
}
$view['view']['list'] = $visitor;
$view['view']['total_rows'] = $result['total_rows'];
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = site_url('currentvisitor') . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
$view['view']['canonical'] = site_url('currentvisitor');
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_currentvisitor');
$meta_description = $this->cbconfig->item('site_meta_description_currentvisitor');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_currentvisitor');
$meta_author = $this->cbconfig->item('site_meta_author_currentvisitor');
$page_name = $this->cbconfig->item('site_page_name_currentvisitor');
$searchconfig = array(
'{현재접속자수}',
);
$replaceconfig = array(
$result['total_rows'],
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layoutconfig = array(
'path' => 'currentvisitor',
'layout' => 'layout',
'skin' => 'currentvisitor',
'layout_dir' => $this->cbconfig->item('layout_currentvisitor'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_currentvisitor'),
'use_sidebar' => $this->cbconfig->item('sidebar_currentvisitor'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_currentvisitor'),
'skin_dir' => $this->cbconfig->item('skin_currentvisitor'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_currentvisitor'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,164 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Document class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 일반 문서 페이지를 보여주는 controller 입니다.
*/
class Document extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Document');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 일반문서를 보여주는 함수입니다
*/
public function index($doc_key = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_document_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
if (empty($doc_key)) {
show_404();
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$docinfo = $this->cache->get('document-key-id-info');
$doc_id = ($docinfo && element($doc_key, $docinfo)) ? element($doc_key, $docinfo) : '';
if ($doc_id) {
$data = $this->Document_model->get_one($doc_id);
} else {
$where = array(
'doc_key' => $doc_key,
);
$data = $this->Document_model->get_one('', '', $where);
}
if ( ! element('doc_id', $data)) {
show_404();
}
if ( ! $this->session->userdata('doc_id_' . element('doc_id', $data))) {
$this->Document_model->update_hit(element('doc_id', $data));
$this->session->set_userdata(
'doc_id_' . element('doc_id', $data),
'1'
);
}
$data['content'] = ($this->cbconfig->get_device_view_type() === 'mobile')
? (element('doc_mobile_content', $data) ? element('doc_mobile_content', $data)
: element('doc_content', $data)) : element('doc_content', $data);
$thumb_width = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('document_mobile_thumb_width')
: $this->cbconfig->item('document_thumb_width');
$autolink = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('use_document_mobile_auto_url')
: $this->cbconfig->item('use_document_auto_url');
$popup = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('document_mobile_content_target_blank')
: $this->cbconfig->item('document_content_target_blank');
$data['content'] = display_html_content(
element('content', $data),
element('doc_content_html_type', $data),
$thumb_width,
$autolink,
$popup,
$writer_is_admin = true
);
$view['view']['data'] = $data;
$view['view']['doc_key'] = $doc_key;
$view['view']['canonical'] = document_url($doc_key);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_document');
$meta_description = $this->cbconfig->item('site_meta_description_document');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_document');
$meta_author = $this->cbconfig->item('site_meta_author_document');
$page_name = $this->cbconfig->item('site_page_name_document');
$searchconfig = array(
'{문서제목}',
'{문서아이디}',
);
$replaceconfig = array(
element('doc_title', $data),
$doc_key,
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layout_dir = element('doc_layout', $data) ? element('doc_layout', $data) : $this->cbconfig->item('layout_document');
$mobile_layout_dir = element('doc_mobile_layout', $data) ? element('doc_mobile_layout', $data) : $this->cbconfig->item('mobile_layout_document');
$use_sidebar = element('doc_sidebar', $data) ? element('doc_sidebar', $data) : $this->cbconfig->item('sidebar_document');
$use_mobile_sidebar = element('doc_mobile_sidebar', $data) ? element('doc_mobile_sidebar', $data) : $this->cbconfig->item('mobile_sidebar_document');
$skin_dir = element('doc_skin', $data) ? element('doc_skin', $data) : $this->cbconfig->item('skin_document');
$mobile_skin_dir = element('doc_mobile_skin', $data) ? element('doc_mobile_skin', $data) : $this->cbconfig->item('mobile_skin_document');
$layoutconfig = array(
'path' => 'document',
'layout' => 'layout',
'skin' => 'document',
'layout_dir' => $layout_dir,
'mobile_layout_dir' => $mobile_layout_dir,
'use_sidebar' => $use_sidebar,
'use_mobile_sidebar' => $use_mobile_sidebar,
'skin_dir' => $skin_dir,
'mobile_skin_dir' => $mobile_skin_dir,
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,252 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Editorfileupload class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 에디터를 통해 파일을 업로드하는 controller 입니다.
*/
class Editorfileupload extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Editor_image');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('array', 'dhtml_editor');
function __construct()
{
parent::__construct();
$this->load->library('upload');
}
/**
* 스마트 에디터를 통해 이미지를 업로드하는 컨트롤러입니다.
*/
public function smarteditor($ed_nonce='')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_editorfileupload_smarteditor';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$this->_init();
$mem_id = (int) $this->member->item('mem_id');
$upload_path = config_item('uploads_dir') . '/editor/' . cdate('Y') . '/' . cdate('m') . '/';
if( ! ft_nonce_is_valid( urldecode($ed_nonce) , 'smarteditor' ) ){
exit(json_encode(array('files'=>array('0'=>array('error'=>'토큰오류')))));
}
if (isset($_FILES)
&& isset($_FILES['files'])
&& isset($_FILES['files']['name'])
&& isset($_FILES['files']['name'][0])) {
$uploadconfig = array(
'upload_path' => $upload_path,
'allowed_types' => 'jpg|jpeg|png|gif',
'max_size' => 10 * 1024,
'encrypt_name' => true,
);
$this->upload->initialize($uploadconfig);
$upload = isset($_FILES['files']) ? $_FILES['files'] : null;
if( is_array( $upload['tmp_name'] ) ){
$_FILES['userfile']['name'] = $upload['name'][0];
$_FILES['userfile']['type'] = $upload['type'][0];
$_FILES['userfile']['tmp_name'] = $upload['tmp_name'][0];
$_FILES['userfile']['error'] = $upload['error'][0];
$_FILES['userfile']['size'] = $upload['size'][0];
} else {
if($upload['type'] == "application/octet-stream"){
$imageMime = getimagesize($upload['tmp_name']); // get temporary file REAL info
$upload['type'] = $imageMime['mime']; //set in our array the correct mime
}
$_FILES['userfile']['name'] = $upload['name'];
$_FILES['userfile']['type'] = $upload['type'];
$_FILES['userfile']['tmp_name'] = $upload['tmp_name'];
$_FILES['userfile']['error'] = $upload['error'];
$_FILES['userfile']['size'] = $upload['size'];
}
if ($this->upload->do_upload()) {
// 이벤트가 존재하면 실행합니다
Events::trigger('doupload', $eventname);
$filedata = $this->upload->data();
$fileupdate = array(
'mem_id' => $mem_id,
'eim_originname' => element('orig_name', $filedata),
'eim_filename' => cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata),
'eim_filesize' => intval(element('file_size', $filedata) * 1024),
'eim_width' => element('image_width', $filedata) ? element('image_width', $filedata) : 0,
'eim_height' => element('image_height', $filedata) ? element('image_height', $filedata) : 0,
'eim_type' => str_replace('.', '', element('file_ext', $filedata)),
'eim_datetime' => cdate('Y-m-d H:i:s'),
'eim_ip' => $this->input->ip_address(),
);
$image_id = $this->Editor_image_model->insert($fileupdate);
$image_url = site_url(config_item('uploads_dir') . '/editor/' . cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata));
$info = new stdClass();
$info->oriname = element('orig_name', $filedata);
$info->name = element('file_name', $filedata);
$info->size = intval(element('file_size', $filedata) * 1024);
$info->type = 'image/' . str_replace('.', '', element('file_ext', $filedata));
$info->url = $image_url;
$info->width = element('image_width', $filedata)
? element('image_width', $filedata) : 0;
$info->height = element('image_height', $filedata)
? element('image_height', $filedata) : 0;
$return['files'][0] = $info;
// 이벤트가 존재하면 실행합니다
Events::trigger('doupload_after', $eventname);
exit(json_encode($return));
} else {
exit($this->upload->display_errors());
}
} elseif ($this->input->get('file') && $mem_id) {
// 이벤트가 존재하면 실행합니다
Events::trigger('delete_before', $eventname);
$where = array(
'mem_id' => $mem_id,
'eim_filename' => cdate('Y') . '/' . cdate('m') . '/' . $this->input->get('file'),
'eim_ip' => $this->input->ip_address(),
);
$image = $this->Editor_image_model->get_one('', '', $where);
if (element('eim_filename', $image)) {
// 이벤트가 존재하면 실행합니다
Events::trigger('delete_after', $eventname);
unlink($upload_path . $this->input->get('file'));
$this->Editor_image_model->delete_where($where);
}
}
}
/**
* CK 에디터를 통해 이미지를 업로드하는 컨트롤러입니다.
*/
public function ckeditor()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_editorfileupload_ckeditor';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$this->_init();
$mem_id = (int) $this->member->item('mem_id');
$upload_path = config_item('uploads_dir') . '/editor/' . cdate('Y') . '/' . cdate('m') . '/';
$uploadconfig = array(
'upload_path' => $upload_path,
'allowed_types' => 'jpg|jpeg|png|gif',
'max_size' => 10 * 1024,
'encrypt_name' => true,
);
if (isset($_FILES)
&& isset($_FILES['upload'])
&& isset($_FILES['upload']['name'])) {
$this->upload->initialize($uploadconfig);
$_FILES['userfile']['name'] = $_FILES['upload']['name'];
$_FILES['userfile']['type'] = $_FILES['upload']['type'];
$_FILES['userfile']['tmp_name'] = $_FILES['upload']['tmp_name'];
$_FILES['userfile']['error'] = $_FILES['upload']['error'];
$_FILES['userfile']['size'] = $_FILES['upload']['size'];
if ($this->upload->do_upload()) {
// 이벤트가 존재하면 실행합니다
Events::trigger('doupload', $eventname);
$filedata = $this->upload->data();
$fileupdate = array(
'mem_id' => $mem_id,
'eim_originname' => element('orig_name', $filedata),
'eim_filename' => cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata),
'eim_filesize' => intval(element('file_size', $filedata) * 1024),
'eim_width' => element('image_width', $filedata) ? element('image_width', $filedata) : 0,
'eim_height' => element('image_height', $filedata) ? element('image_height', $filedata) : 0,
'eim_type' => str_replace('.', '', element('file_ext', $filedata)),
'eim_datetime' => cdate('Y-m-d H:i:s'),
'eim_ip' => $this->input->ip_address(),
);
$this->Editor_image_model->insert($fileupdate);
$image_url = site_url(config_item('uploads_dir') . '/editor/' . cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata));
// 이벤트가 존재하면 실행합니다
Events::trigger('doupload_after', $eventname);
echo "<script>window.parent.CKEDITOR.tools.callFunction("
. $this->input->get('CKEditorFuncNum', null, '') . ", '"
. $image_url . "', '업로드완료');</script>";
} else {
echo $this->upload->display_errors();
}
}
}
public function _init()
{
$upload_path = config_item('uploads_dir') . '/editor/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$upload_path .= cdate('Y') . '/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$upload_path .= cdate('m') . '/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
}
}

View File

@@ -0,0 +1,208 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Faq class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* FAQ 페이지를 보여주는 controller 입니다.
*/
class Faq extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Faq', 'Faq_group');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'url');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* FAQ 페이지입니다
*/
public function index($fgr_key = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_faq_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if (empty($fgr_key)) {
show_404();
}
$where = array(
'fgr_key' => $fgr_key,
);
$faqgroup = $this->Faq_group_model->get_one('', '', $where);
if ( ! element('fgr_id', $faqgroup)) {
show_404();
}
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = 'faq_order';
$forder = 'asc';
$sfield = array('faq_title', 'faq_content', 'faq_mobile_content');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = $this->cbconfig->item('list_count') ? (int) $this->cbconfig->item('list_count') : 20;
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->Faq_model->allow_search_field = array('faq_title', 'faq_content', 'faq_mobile_content'); // 검색이 가능한 필드
$this->Faq_model->search_field_equal = array(); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->Faq_model->allow_order_field = array('faq_order'); // 정렬이 가능한 필드
$where = array(
'fgr_id' => element('fgr_id', $faqgroup),
);
$result = $this->Faq_model
->get_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$content = ($this->cbconfig->get_device_view_type() === 'mobile')
? (element('faq_mobile_content', $val) ? element('faq_mobile_content', $val)
: element('faq_content', $val)) : element('faq_content', $val);
$thumb_width = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('faq_mobile_thumb_width')
: $this->cbconfig->item('faq_thumb_width');
$autolink = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('use_faq_mobile_auto_url')
: $this->cbconfig->item('use_faq_auto_url');
$popup = ($this->cbconfig->get_device_view_type() === 'mobile')
? $this->cbconfig->item('faq_mobile_content_target_blank')
: $this->cbconfig->item('faq_content_target_blank');
$result['list'][$key]['title'] = display_html_content(
element('faq_title', $val),
element('faq_content_html_type', $val),
$thumb_width,
$autolink,
$popup,
$writer_is_admin = true
);
$result['list'][$key]['content'] = display_html_content(
$content,
element('faq_content_html_type', $val),
$thumb_width,
$autolink,
$popup,
$writer_is_admin = true
);
}
}
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
$view['view']['data'] = $result;
$view['view']['faqgroup'] = $faqgroup;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = faq_url($fgr_key) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
$view['view']['canonical'] = faq_url($fgr_key);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_faq');
$meta_description = $this->cbconfig->item('site_meta_description_faq');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_faq');
$meta_author = $this->cbconfig->item('site_meta_author_faq');
$page_name = $this->cbconfig->item('site_page_name_faq');
$searchconfig = array(
'{FAQ제목}',
'{FAQ아이디}',
);
$replaceconfig = array(
element('fgr_title', $faqgroup),
$fgr_key,
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layout_dir = element('fgr_layout', $faqgroup) ?
element('fgr_layout', $faqgroup) : $this->cbconfig->item('layout_faq');
$mobile_layout_dir = element('fgr_mobile_layout', $faqgroup)
? element('fgr_mobile_layout', $faqgroup)
: $this->cbconfig->item('mobile_layout_faq');
$use_sidebar = element('fgr_sidebar', $faqgroup)
? element('fgr_sidebar', $faqgroup)
: $this->cbconfig->item('sidebar_faq');
$use_mobile_sidebar = element('fgr_mobile_sidebar', $faqgroup)
? element('fgr_mobile_sidebar', $faqgroup)
: $this->cbconfig->item('mobile_sidebar_faq');
$skin_dir = element('fgr_skin', $faqgroup)
? element('fgr_skin', $faqgroup) : $this->cbconfig->item('skin_faq');
$mobile_skin_dir = element('fgr_mobile_skin', $faqgroup)
? element('fgr_mobile_skin', $faqgroup) : $this->cbconfig->item('mobile_skin_faq');
$layoutconfig = array(
'path' => 'faq',
'layout' => 'layout',
'skin' => 'faq',
'layout_dir' => $layout_dir,
'mobile_layout_dir' => $mobile_layout_dir,
'use_sidebar' => $use_sidebar,
'use_mobile_sidebar' => $use_mobile_sidebar,
'skin_dir' => $skin_dir,
'mobile_skin_dir' => $mobile_skin_dir,
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,700 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Findaccount class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 회원정보 찾기에 관련도니 controller 입니다.
*/
class Findaccount extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array( 'Member_auth_email');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'string');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring', 'email'));
}
/**
* 아이디/패스워드찾기 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_findaccount_index';
$this->load->event($eventname);
if ($this->member->is_member() !== false
&& ! (
$this->member->is_admin() === 'super' && $this->uri->segment(1) === config_item('uri_segment_admin')
)) {
redirect();
}
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->library(array('form_validation'));
if ( ! function_exists('password_hash')) {
$this->load->helper('password');
}
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array();
if ($this->input->post('findtype') === 'findidpw') {
$config[] = array(
'field' => 'idpw_email',
'label' => '이메일',
'rules' => 'trim|required|valid_email|callback__existemail',
);
} elseif ($this->input->post('findtype') === 'verifyemail') {
$config[] = array(
'field' => 'verify_email',
'label' => '이메일',
'rules' => 'trim|required|valid_email|callback__verifyemail',
);
} elseif ($this->input->post('findtype') === 'changeemail') {
$config[] = array(
'field' => 'change_userid',
'label' => '아이디',
'rules' => 'trim|required|alphanumunder|min_length[3]|max_length[20]',
);
$config[] = array(
'field' => 'change_password',
'label' => '패스워드',
'rules' => 'trim|required|callback__check_id_pw[' . $this->input->post('change_userid') . ']',
);
$config[] = array(
'field' => 'change_email',
'label' => '이메일',
'rules' => 'trim|required|valid_email|callback__change_email',
);
}
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('findtype') === 'findidpw') {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['findidpw_before'] = Events::trigger('findidpw_before', $eventname);
$mb = $this->Member_model->get_by_email($this->input->post('idpw_email'));
if ( ! $mb) {
$this->load->model('Member_dormant_model');
$mb = $this->Member_dormant_model->get_by_email($this->input->post('idpw_email'));
}
$mem_id = (int) element('mem_id', $mb);
$mae_type = 3;
$vericode = array('$', '/', '.');
$verificationcode = str_replace(
$vericode,
'',
password_hash($mem_id . '-' . $this->input->post('idpw_email') . '-' . random_string('alnum', 10), PASSWORD_BCRYPT)
);
$beforeauthdata = array(
'mem_id' => $mem_id,
'mae_type' => $mae_type,
);
$this->Member_auth_email_model->delete_where($beforeauthdata);
$authdata = array(
'mem_id' => $mem_id,
'mae_key' => $verificationcode,
'mae_type' => $mae_type,
'mae_generate_datetime' => cdate('Y-m-d H:i:s'),
);
$this->Member_auth_email_model->insert($authdata);
$verify_url = site_url('verify/resetpassword?user=' . element('mem_userid', $mb) . '&code=' . $verificationcode);
$searchconfig = array(
'{홈페이지명}',
'{회사명}',
'{홈페이지주소}',
'{회원아이디}',
'{회원닉네임}',
'{회원실명}',
'{회원이메일}',
'{메일수신여부}',
'{쪽지수신여부}',
'{문자수신여부}',
'{회원아이피}',
'{패스워드변경주소}',
);
$receive_email = element('mem_receive_email', $mb) ? '동의' : '거부';
$receive_note = element('mem_use_note', $mb) ? '동의' : '거부';
$receive_sms = element('mem_receive_sms', $mb) ? '동의' : '거부';
$replaceconfig = array(
$this->cbconfig->item('site_title'),
$this->cbconfig->item('company_name'),
site_url(),
element('mem_userid', $mb),
element('mem_nickname', $mb),
element('mem_username', $mb),
element('mem_email', $mb),
$receive_email,
$receive_note,
$receive_sms,
$this->input->ip_address(),
$verify_url,
);
$replaceconfig_escape = array(
html_escape($this->cbconfig->item('site_title')),
html_escape($this->cbconfig->item('company_name')),
site_url(),
element('mem_userid', $mb),
html_escape(element('mem_nickname', $mb)),
html_escape(element('mem_username', $mb)),
html_escape(element('mem_email', $mb)),
$receive_email,
$receive_note,
$receive_sms,
$this->input->ip_address(),
$verify_url,
);
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_email_findaccount_user_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_email_findaccount_user_content')
);
$this->email->clear(true);
$this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name'));
$this->email->to($this->input->post('idpw_email'));
$this->email->subject($title);
$this->email->message($content);
$this->email->send();
$view['view']['message'] = $this->input->post('idpw_email') . '로 인증메일이 발송되었습니다. <br />발송된 인증메일을 확인하신 후에 회원님의 정보 확인이 가능합니다';
// 이벤트가 존재하면 실행합니다
$view['view']['event']['findidpw_after'] = Events::trigger('findidpw_after', $eventname);
} elseif ($this->input->post('findtype') === 'verifyemail') {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['verifyemail_before'] = Events::trigger('verifyemail_before', $eventname);
$mb = $this->Member_model->get_by_email($this->input->post('verify_email'));
if ( ! $mb) {
$this->load->model('Member_dormant_model');
$mb = $this->Member_dormant_model->get_by_email($this->input->post('verify_email'));
}
$mem_id = (int) element('mem_id', $mb);
$mae_type = 2;
$vericode = array('$', '/', '.');
$verificationcode = str_replace(
$vericode,
'',
password_hash($mem_id . '-' . $this->input->post('verify_email') . '-' . random_string('alnum', 10), PASSWORD_BCRYPT)
);
$beforeauthdata = array(
'mem_id' => $mem_id,
'mae_type' => $mae_type,
);
$this->Member_auth_email_model->delete_where($beforeauthdata);
$authdata = array(
'mem_id' => $mem_id,
'mae_key' => $verificationcode,
'mae_type' => $mae_type,
'mae_generate_datetime' => cdate('Y-m-d H:i:s'),
);
$this->Member_auth_email_model->insert($authdata);
$verify_url = site_url('verify/confirmemail?user=' . element('mem_userid', $mb) . '&code=' . $verificationcode);
$searchconfig = array(
'{홈페이지명}',
'{회사명}',
'{홈페이지주소}',
'{회원아이디}',
'{회원닉네임}',
'{회원실명}',
'{회원이메일}',
'{메일수신여부}',
'{쪽지수신여부}',
'{문자수신여부}',
'{회원아이피}',
'{메일인증주소}',
);
$receive_email = element('mem_receive_email', $mb) ? '동의' : '거부';
$receive_note = element('mem_use_note', $mb) ? '동의' : '거부';
$receive_sms = element('mem_receive_sms', $mb) ? '동의' : '거부';
$replaceconfig = array(
$this->cbconfig->item('site_title'),
$this->cbconfig->item('company_name'),
site_url(),
element('mem_userid', $mb),
element('mem_nickname', $mb),
element('mem_username', $mb),
element('mem_email', $mb),
$receive_email,
$receive_note,
$receive_sms,
$this->input->ip_address(),
$verify_url,
);
$replaceconfig_escape = array(
html_escape($this->cbconfig->item('site_title')),
html_escape($this->cbconfig->item('company_name')),
site_url(),
element('mem_userid', $mb),
html_escape(element('mem_nickname', $mb)),
html_escape(element('mem_username', $mb)),
html_escape(element('mem_email', $mb)),
$receive_email,
$receive_note,
$receive_sms,
$this->input->ip_address(),
$verify_url,
);
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_email_resendverify_user_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_email_resendverify_user_content')
);
$this->email->clear(true);
$this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name'));
$this->email->to($this->input->post('verify_email'));
$this->email->subject($title);
$this->email->message($content);
$this->email->send();
$view['view']['message'] = $this->input->post('verify_email') . '로 인증메일이 발송되었습니다. <br />발송된 인증메일을 확인하신 후에 사이트 이용이 가능합니다';
// 이벤트가 존재하면 실행합니다
$view['view']['event']['verifyemail_after'] = Events::trigger('verifyemail_after', $eventname);
} elseif ($this->input->post('findtype') === 'changeemail') {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['changeemail_before'] = Events::trigger('changeemail_before', $eventname);
$mb = $this->Member_model->get_by_userid($this->input->post('change_userid'));
if ( ! $mb) {
$this->load->model('Member_dormant_model');
$mb = $this->Member_dormant_model->get_by_userid($this->input->post('change_userid'));
}
$mem_id = (int) element('mem_id', $mb);
$mae_type = 2;
$vericode = array('$', '/', '.');
$verificationcode = str_replace(
$vericode,
'',
password_hash($mem_id . '-' . $this->input->post('change_email') . '-' . random_string('alnum', 10), PASSWORD_BCRYPT)
);
$beforeauthdata = array(
'mem_id' => $mem_id,
'mae_type' => $mae_type,
);
$this->Member_auth_email_model->delete_where($beforeauthdata);
$authdata = array(
'mem_id' => $mem_id,
'mae_key' => $verificationcode,
'mae_type' => $mae_type,
'mae_generate_datetime' => cdate('Y-m-d H:i:s'),
);
$this->Member_auth_email_model->insert($authdata);
$searchconfig = array(
'{홈페이지명}',
'{회사명}',
'{홈페이지주소}',
'{회원아이디}',
'{회원닉네임}',
'{회원실명}',
'{회원이메일}',
'{메일수신여부}',
'{쪽지수신여부}',
'{문자수신여부}',
'{회원아이피}',
'{패스워드변경주소}',
);
$receive_email = element('mem_receive_email', $mb) ? '동의' : '거부';
$receive_note = element('mem_use_note', $mb) ? '동의' : '거부';
$receive_sms = element('mem_receive_sms', $mb) ? '동의' : '거부';
$replaceconfig = array(
$this->cbconfig->item('site_title'),
$this->cbconfig->item('company_name'),
site_url(),
element('mem_userid', $mb),
element('mem_nickname', $mb),
element('mem_username', $mb),
element('mem_email', $mb),
$receive_email,
$receive_note,
$receive_sms,
$this->input->ip_address(),
$verify_url,
);
$replaceconfig_escape = array(
html_escape($this->cbconfig->item('site_title')),
html_escape($this->cbconfig->item('company_name')),
site_url(),
element('mem_userid', $mb),
html_escape(element('mem_nickname', $mb)),
html_escape(element('mem_username', $mb)),
html_escape(element('mem_email', $mb)),
$receive_email,
$receive_note,
$receive_sms,
$this->input->ip_address(),
$verify_url,
);
$title = str_replace(
$searchconfig,
$replaceconfig,
$this->cbconfig->item('send_email_findaccount_user_title')
);
$content = str_replace(
$searchconfig,
$replaceconfig_escape,
$this->cbconfig->item('send_email_findaccount_user_content')
);
$this->email->clear(true);
$this->email->from($this->cbconfig->item('webmaster_email'), $this->cbconfig->item('webmaster_name'));
$this->email->to($this->input->post('change_email'));
$this->email->subject($title);
$this->email->message($content);
$this->email->send();
$view['view']['message'] = $this->input->post('change_email') . '로 인증메일이 발송되었습니다. <br />발송된 인증메일을 확인하신 후에 사이트 이용이 가능합니다';
// 이벤트가 존재하면 실행합니다
$view['view']['event']['changeemail_after'] = Events::trigger('changeemail_after', $eventname);
}
}
$view['view']['canonical'] = site_url('findaccount');
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_findaccount');
$meta_description = $this->cbconfig->item('site_meta_description_findaccount');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_findaccount');
$meta_author = $this->cbconfig->item('site_meta_author_findaccount');
$page_name = $this->cbconfig->item('site_page_name_findaccount');
$layoutconfig = array(
'path' => 'findaccount',
'layout' => 'layout',
'skin' => 'findaccount',
'layout_dir' => $this->cbconfig->item('layout_findaccount'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_findaccount'),
'use_sidebar' => $this->cbconfig->item('sidebar_findaccount'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_findaccount'),
'skin_dir' => $this->cbconfig->item('skin_findaccount'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_findaccount'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 존재하는 이메일인지 체크합니다
*/
public function _existemail($str)
{
$userinfo = $this->Member_model
->get_by_email($str, 'mem_id, mem_email, mem_denied, mem_email_cert');
if ( ! $userinfo) {
$this->load->model('Member_dormant_model');
$userinfo = $this->Member_dormant_model
->get_by_email($str, 'mem_id, mem_email, mem_denied, mem_email_cert');
}
if ( ! element('mem_id', $userinfo)) {
$this->form_validation->set_message(
'_existemail',
'존재하지 않는 이메일주소입니다'
);
return false;
}
if (element('mem_denied', $userinfo)) {
$this->form_validation->set_message(
'_existemail',
'회원님의 계정은 접근이 금지되어 있습니다'
);
return false;
} elseif ($this->cbconfig->item('use_register_email_auth') && ! element('mem_email_cert', $userinfo)) {
$this->form_validation->set_message(
'_existemail',
'회원님은 아직 이메일 인증을 받지 않으셨습니다<br> 아래 인증메일 재발송 란에서 이메일을 받아 인증해주시기 바랍니다'
);
return false;
}
return true;
}
/**
* 이메일이 실제 디비에 존재하는지 체크합니다
*/
public function _verifyemail($str)
{
if ( ! $this->cbconfig->item('use_register_email_auth')) {
$this->form_validation->set_message(
'_verifyemail',
'이 웹사이트는 이메일 인증 기능을 사용하고 있지 않습니다'
);
return false;
}
$userinfo = $this->Member_model
->get_by_email($str, 'mem_id, mem_email, mem_denied, mem_email_cert');
if ( ! $userinfo) {
$this->load->model('Member_dormant_model');
$userinfo = $this->Member_dormant_model
->get_by_email($str, 'mem_id, mem_email, mem_denied, mem_email_cert');
}
if ( ! element('mem_id', $userinfo)) {
$this->form_validation->set_message(
'_verifyemail',
'존재하지 않는 이메일주소입니다'
);
return false;
}
if (element('mem_denied', $userinfo)) {
$this->form_validation->set_message(
'_verifyemail',
'회원님의 계정은 접근이 금지되어 있습니다'
);
return false;
}
if (element('mem_email_cert', $userinfo)) {
$this->form_validation->set_message(
'_verifyemail',
'회원님의 계정은 이미 인증이 완료되어 있습니다'
);
return false;
}
return true;
}
/**
* 이메일 변경시 기존에 다른 회원에 의해 사용되고 있는 이메일인지 체크합니다
*/
public function _change_email($str)
{
if ( ! $this->cbconfig->item('use_register_email_auth')) {
$this->form_validation->set_message(
'_change_email',
'이 웹사이트는 이메일 인증 기능을 사용하고 있지 않습니다'
);
return false;
}
$userinfo = $this->Member_model
->get_by_email($str, 'mem_id, mem_email, mem_denied, mem_email_cert');
if ( ! $userinfo) {
$this->load->model('Member_dormant_model');
$userinfo = $this->Member_dormant_model
->get_by_email($str, 'mem_id, mem_email, mem_denied, mem_email_cert');
}
if (element('mem_id', $userinfo)) {
$this->form_validation->set_message(
'_change_email',
'이 이메일은 이미 다른 회원에 의해 사용되어지고 있는 이메일입니다'
);
return false;
}
if (element('mem_denied', $userinfo)) {
$this->form_validation->set_message(
'_change_email',
'회원님의 계정은 접근이 금지되어 있습니다'
);
return false;
}
if (element('mem_email_cert', $userinfo)) {
$this->form_validation->set_message(
'_change_email',
'회원님의 계정은 이미 인증이 완료되어 있습니다'
);
return false;
}
return true;
}
/**
* 아이디와 패스워드가 일치하는지 체크합니다
*/
public function _check_id_pw($password, $userid)
{
if ( ! $this->cbconfig->item('use_register_email_auth')) {
$this->form_validation->set_message(
'_check_id_pw',
'이 웹사이트는 이메일 인증 기능을 사용하고 있지 않습니다'
);
return false;
}
if ( ! function_exists('password_hash')) {
$this->load->helper('password');
}
$max_login_try_count = (int) $this->cbconfig->item('max_login_try_count');
$max_login_try_limit_second = (int) $this->cbconfig->item('max_login_try_limit_second');
$loginfailnum = 0;
$loginfailmessage = '';
if ($max_login_try_count && $max_login_try_limit_second) {
$select = 'mll_id, mll_success, mem_id, mll_ip, mll_datetime';
$where = array(
'mll_ip' => $this->input->ip_address(),
'mll_datetime > ' => strtotime(ctimestamp() - 86400 * 30),
);
$findex = 'mll_id';
$forder = 'DESC';
$this->load->model('Member_login_log_model');
$logindata = $this->Member_login_log_model
->get('', $select, $where, '', '', $findex, $forder);
if ($logindata && is_array($logindata)) {
foreach ($logindata as $key => $val) {
if (element('mll_success', $val) === '0') {
$loginfailnum++;
}
if (element('mll_success', $val) === '1') {
break;
}
}
}
if ($loginfailnum > 0 && $loginfailnum % $max_login_try_count === 0) {
$lastlogintrydatetime = $logindata[0]['mll_datetime'];
$next_login = strtotime($lastlogintrydatetime)
+ $max_login_try_limit_second
- ctimestamp();
if ($next_login > 0) {
$this->form_validation->set_message(
'_check_id_pw',
'회원님은 패스워드를 연속으로 ' . $loginfailnum . '회 잘못 입력하셨기 때문에 '
. $next_login . '초 후에 다시 시도가 가능합니다'
);
return false;
}
}
$loginfailmessage = '<br />회원님은 ' . ($loginfailnum + 1)
. '회 연속으로 패스워드를 잘못입력하셨습니다. ';
}
$userselect = 'mem_id, mem_password, mem_denied';
$userinfo = $this->Member_model->get_by_userid($userid, $userselect);
if ( ! $userinfo) {
$this->load->model('Member_dormant_model');
$userinfo = $this->Member_dormant_model->get_by_userid($userid, $userselect);
}
$hash = password_hash($password, PASSWORD_BCRYPT);
if ( ! element('mem_id', $userinfo) OR ! element('mem_password', $userinfo)) {
$this->form_validation->set_message(
'_check_id_pw',
'회원 아이디와 패스워드가 서로 맞지 않습니다' . $loginfailmessage
);
$this->member->update_login_log(0, $userid, 0, '회원아이디가 존재하지 않습니다');
return false;
} elseif ( ! password_verify($password, element('mem_password', $userinfo))) {
$this->form_validation->set_message(
'_check_id_pw',
'회원 아이디와 패스워드가 서로 맞지 않습니다' . $loginfailmessage
);
$this->member->update_login_log(element('mem_id', $userinfo), $userid, 0, '패스워드가 올바르지 않습니다');
return false;
} elseif (element('mem_denied', $userinfo)) {
if (element('mem_denied', $userinfo)) {
$this->form_validation->set_message(
'_check_id_pw',
'회원님의 계정은 접근이 금지되어 있습니다'
);
$this->member->update_login_log(element('mem_id', $userinfo), $userid, 0, '차단된 회원아이디입니다');
return false;
}
}
return true;
}
}

View File

@@ -0,0 +1,183 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Formmail class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 다른 회원에게 폼메일 전송시 작동하는 controller 입니다.
*/
class Formmail extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'dhtml_editor');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 폼메일 작성 페이지입니다
*/
public function write($userid = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_formmail_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
if ($this->cbconfig->get_device_view_type() !== 'mobile'
&& ! $this->cbconfig->item('use_sideview_email')) {
alert_close('이메일 기능을 사용하지 않는 사이트입니다');
return false;
} elseif ($this->cbconfig->get_device_view_type() === 'mobile'
&& ! $this->cbconfig->item('use_mobile_sideview_email')) {
alert_close('모바일 버전에서는 이메일 기능을 사용하지 않는 사이트입니다');
return false;
} elseif ( ! $this->member->item('mem_receive_email')
&& $this->member->is_admin() !== 'super') {
alert_close('회원님은 메일수신에 체크하지 않으셨습니다. 회원정보 수정 페이지에 가셔서, 메일 수신에 체크하신 후에 사용이 가능합니다');
return false;
}
if (empty($userid)) {
alert_close('상대방이 지정되지 않았습니다');
return false;
}
$view['view']['userid'] = $userid;
$memberselect = 'mem_id, mem_denied, mem_receive_email, mem_nickname, mem_email';
$view['view']['member'] = $member
= $this->Member_model->get_by_userid($userid, $memberselect);
if ( ! element('mem_id', $member)) {
alert_close('존재하지 않는 회원 아이디입니다');
return false;
}
if (element('mem_denied', $member)) {
alert_close('탈퇴 또는 차단된 회원입니다');
return false;
}
if ( ! element('mem_receive_email', $member) && $this->member->is_admin() !== 'super') {
alert_close(html_escape(element('mem_nickname', $member)) . ' 님은 메일 수신을 원하지 않으십니다');
return false;
}
$view['view']['use_dhtml'] = false;
if ($this->cbconfig->item('use_formmail_dhtml')) {
$view['view']['use_dhtml'] = true;
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'title',
'label' => '제목',
'rules' => 'trim|required',
),
array(
'field' => 'content',
'label' => '내용',
'rules' => 'trim|required',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_formmail');
$meta_description = $this->cbconfig->item('site_meta_description_formmail');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_formmail');
$meta_author = $this->cbconfig->item('site_meta_author_formmail');
$page_name = $this->cbconfig->item('site_page_name_formmail');
$layoutconfig = array(
'path' => 'formmail',
'layout' => 'layout_popup',
'skin' => 'formmail',
'layout_dir' => $this->cbconfig->item('layout_formmail'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_formmail'),
'skin_dir' => $this->cbconfig->item('skin_formmail'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_formmail'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
// 메일 발송
$this->load->library('email');
$this->email->from($this->member->item('mem_email'), $this->member->item('mem_nickname'));
$this->email->to(element('mem_email', $member));
$this->email->subject($this->input->post('title'));
$content_type = $this->cbconfig->item('use_formmail_dhtml') ? 1 : 0;
$this->email->message(display_html_content(
$this->input->post('content'),
$content_type,
800
));
$this->email->send();
alert_close(element('mem_nickname', $member) . ' 님에게 메일을 발송하였습니다. ');
}
}
}

View File

@@ -0,0 +1,103 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Gotourl class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 다른 페이지로 이동시 중간에 거쳐가는 controller 입니다.
* admin 페이지에서 외부 페이이지로 이동시 이 페이지를 거쳐가면 referer 가 이 주소로 남기 때문에 admin 주소를 referer 에서 감출 수 있습니다
*/
class Gotourl extends CB_Controller
{
function __construct()
{
parent::__construct();
}
/**
* url 이동 관련 함수입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_gotourl_index';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$url = $this->input->get('url');
if (empty($url)) {
$url = '/';
}
redirect($url, 'refresh');
}
/**
* banner url 이동 관련 함수입니다
*/
public function banner($ban_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_gotourl_banner';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$ban_id = (int) $ban_id;
if (empty($ban_id) OR $ban_id < 1) {
show_404();
}
$this->load->model(array('Banner_model'));
$banner = $this->Banner_model->get_one($ban_id);
if ( ! element('ban_id', $banner)) {
show_404();
}
if ( ! element('ban_activated', $banner)) {
show_404();
}
if ( ! element('ban_url', $banner)) {
show_404();
}
if ( ! $this->session->userdata('banner_click_' . $ban_id )) {
$this->session->set_userdata(
'banner_click_' . $ban_id,
'1'
);
$mem_id = (int) $this->member->item('mem_id');
$insertdata = array(
'ban_id' => element('ban_id', $banner),
'mem_id' => $mem_id,
'bcl_datetime' => cdate('Y-m-d H:i:s'),
'bcl_ip' => $this->input->ip_address(),
'bcl_referer' => $this->agent->referrer(),
'bcl_url' => element('ban_url', $banner),
'bcl_useragent' => $this->agent->agent_string(),
);
$this->load->model(array('Banner_click_log_model'));
$this->Banner_click_log_model->insert($insertdata);
$this->Banner_model->update_plus($ban_id, 'ban_hit', 1);
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
redirect(prep_url(element('ban_url', $banner)));
}
}

View File

@@ -0,0 +1,146 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Group class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 게시판 그룹 메인을 담당하는 controller 입니다.
*/
class Group extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Board');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring', 'board_group'));
}
/**
* 게시판 그룹 페이지입니다
*/
public function index($bgr_key = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_group_index';
$this->load->event($eventname);
if (empty($bgr_key)) {
show_404();
}
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$group_id = $this->board_group->item_key('bgr_id', $bgr_key);
if (empty($group_id)) {
show_404();
}
$group = $this->board_group->item_all($group_id);
$select = 'brd_id';
$where = array(
'bgr_id' => element('bgr_id', $group),
'brd_search' => 1,
);
$board_id = $this->Board_model->get_board_list($where);
$board_list = array();
if ($board_id && is_array($board_id)) {
foreach ($board_id as $key => $val) {
$board_list[] = $this->board->item_all(element('brd_id', $val));
}
}
$group['headercontent'] = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('mobile_header_content', $group)
: element('header_content', $group);
$group['footercontent'] = ($this->cbconfig->get_device_view_type() === 'mobile')
? element('mobile_footer_content', $group)
: element('footer_content', $group);
$view['view']['group'] = $group;
$view['view']['board_list'] = $board_list;
$view['view']['canonical'] = group_url($bgr_key);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_group');
$meta_description = $this->cbconfig->item('site_meta_description_group');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_group');
$meta_author = $this->cbconfig->item('site_meta_author_group');
$page_name = $this->cbconfig->item('site_page_name_group');
$searchconfig = array(
'{그룹명}',
'{그룹아이디}',
);
$replaceconfig = array(
element('bgr_name', $group),
$bgr_key,
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layout_dir = element('group_layout', $group) ? element('group_layout', $group) : $this->cbconfig->item('layout_group');
$mobile_layout_dir = element('group_mobile_layout', $group) ? element('group_mobile_layout', $group) : $this->cbconfig->item('mobile_layout_group');
$use_sidebar = element('group_sidebar', $group) ? element('group_sidebar', $group) : $this->cbconfig->item('sidebar_group');
$use_mobile_sidebar = element('group_mobile_sidebar', $group) ? element('group_mobile_sidebar', $group) : $this->cbconfig->item('mobile_sidebar_group');
$skin_dir = element('group_skin', $group) ? element('group_skin', $group) : $this->cbconfig->item('skin_group');
$mobile_skin_dir = element('group_mobile_skin', $group) ? element('group_mobile_skin', $group) : $this->cbconfig->item('mobile_skin_group');
$layoutconfig = array(
'path' => 'group',
'layout' => 'layout',
'skin' => 'group',
'layout_dir' => $layout_dir,
'mobile_layout_dir' => $mobile_layout_dir,
'use_sidebar' => $use_sidebar,
'use_mobile_sidebar' => $use_mobile_sidebar,
'skin_dir' => $skin_dir,
'mobile_skin_dir' => $mobile_skin_dir,
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,396 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Login class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 로그인 페이지와 관련된 controller 입니다.
*/
class Login extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'string');
function __construct()
{
parent::__construct();
}
/**
* 로그인 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_login_index';
$this->load->event($eventname);
if ($this->member->is_member() !== false && ! ($this->member->is_admin() === 'super' && $this->uri->segment(1) === config_item('uri_segment_admin'))) {
redirect();
}
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->library(array('form_validation'));
if ( ! function_exists('password_hash')) {
$this->load->helper('password');
}
$use_login_account = $this->cbconfig->item('use_login_account');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
if ($use_login_account === 'both') {
$config[] = array(
'field' => 'mem_userid',
'label' => '아이디 또는 이메일',
'rules' => 'trim|required',
);
$view['view']['userid_label_text'] = '아이디 또는 이메일';
} elseif ($use_login_account === 'email') {
$config[] = array(
'field' => 'mem_userid',
'label' => '이메일',
'rules' => 'trim|required|valid_email',
);
$view['view']['userid_label_text'] = '이메일';
} else {
$config[] = array(
'field' => 'mem_userid',
'label' => '아이디',
'rules' => 'trim|required|alphanumunder|min_length[3]|max_length[20]',
);
$view['view']['userid_label_text'] = '아이디';
}
$config[] = array(
'field' => 'mem_password',
'label' => '패스워드',
'rules' => 'trim|required|min_length[4]|callback__check_id_pw[' . $this->input->post('mem_userid') . ']',
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
if ($this->input->post('returnurl')) {
if (validation_errors('<div class="alert alert-warning" role="alert">', '</div>')) {
$this->session->set_flashdata(
'loginvalidationmessage',
validation_errors('<div class="alert alert-warning" role="alert">', '</div>')
);
}
$this->session->set_flashdata(
'loginuserid',
$this->input->post('mem_userid')
);
redirect(urldecode($this->input->post('returnurl')));
}
$view['view']['canonical'] = site_url('login');
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_login');
$meta_description = $this->cbconfig->item('site_meta_description_login');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_login');
$meta_author = $this->cbconfig->item('site_meta_author_login');
$page_name = $this->cbconfig->item('site_page_name_login');
$layoutconfig = array(
'path' => 'login',
'layout' => 'layout',
'skin' => 'login',
'layout_dir' => $this->cbconfig->item('layout_login'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_login'),
'use_sidebar' => $this->cbconfig->item('sidebar_login'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_login'),
'skin_dir' => $this->cbconfig->item('skin_login'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_login'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($use_login_account === 'both') {
$userinfo = $this->Member_model->get_by_both($this->input->post('mem_userid'), 'mem_id, mem_userid');
} elseif ($use_login_account === 'email') {
$userinfo = $this->Member_model->get_by_email($this->input->post('mem_userid'), 'mem_id, mem_userid');
} else {
$userinfo = $this->Member_model->get_by_userid($this->input->post('mem_userid'), 'mem_id, mem_userid');
}
$this->member->update_login_log(element('mem_id', $userinfo), $this->input->post('mem_userid'), 1, '로그인 성공');
$this->session->set_userdata(
'mem_id',
element('mem_id', $userinfo)
);
if ($this->input->post('autologin')) {
$vericode = array('$', '/', '.');
$hash = str_replace(
$vericode,
'',
password_hash(random_string('alnum', 10) . element('mem_id', $userinfo) . ctimestamp() . element('mem_userid', $userinfo), PASSWORD_BCRYPT)
);
$insertautologin = array(
'mem_id' => element('mem_id', $userinfo),
'aul_key' => $hash,
'aul_ip' => $this->input->ip_address(),
'aul_datetime' => cdate('Y-m-d H:i:s'),
);
$this->load->model(array('Autologin_model'));
$this->Autologin_model->insert($insertautologin);
$cookie_name = 'autologin';
$cookie_value = $hash;
$cookie_expire = 2592000; // 30일간 저장
set_cookie($cookie_name, $cookie_value, $cookie_expire);
}
$change_password_date = $this->cbconfig->item('change_password_date');
$site_title = $this->cbconfig->item('site_title');
if ($change_password_date) {
$meta_change_pw_datetime = $this->member->item('meta_change_pw_datetime');
if ( ctimestamp() - strtotime($meta_change_pw_datetime) > $change_password_date * 86400) {
$this->session->set_userdata(
'membermodify',
'1'
);
$this->session->set_flashdata(
'message',
html_escape($site_title) . ' 은(는) 회원님의 비밀번호를 주기적으로 변경하도록 권장합니다.
<br /> 오래된 비밀번호를 사용중인 회원님께서는 안전한 서비스 이용을 위해 비밀번호 변경을 권장합니다'
);
redirect('membermodify/password_modify');
}
}
$url_after_login = $this->cbconfig->item('url_after_login');
if ($url_after_login) {
$url_after_login = site_url($url_after_login);
}
if (empty($url_after_login)) {
$url_after_login = $this->input->get_post('url') ? urldecode($this->input->get_post('url')) : site_url();
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
redirect($url_after_login);
}
}
/**
* 로그인시 아이디와 패스워드가 일치하는지 체크합니다
*/
public function _check_id_pw($password, $userid)
{
if ( ! function_exists('password_hash')) {
$this->load->helper('password');
}
$max_login_try_count = (int) $this->cbconfig->item('max_login_try_count');
$max_login_try_limit_second = (int) $this->cbconfig->item('max_login_try_limit_second');
$loginfailnum = 0;
$loginfailmessage = '';
if ($max_login_try_count && $max_login_try_limit_second) {
$select = 'mll_id, mll_success, mem_id, mll_ip, mll_datetime';
$where = array(
'mll_ip' => $this->input->ip_address(),
'mll_datetime > ' => strtotime(ctimestamp() - 86400 * 30),
);
$this->load->model('Member_login_log_model');
$logindata = $this->Member_login_log_model
->get('', $select, $where, '', '', 'mll_id', 'DESC');
if ($logindata && is_array($logindata)) {
foreach ($logindata as $key => $val) {
if ((int) $val['mll_success'] === 0) {
$loginfailnum++;
} elseif ((int) $val['mll_success'] === 1) {
break;
}
}
}
if ($loginfailnum > 0 && $loginfailnum % $max_login_try_count === 0) {
$lastlogintrydatetime = $logindata[0]['mll_datetime'];
$next_login = strtotime($lastlogintrydatetime)
+ $max_login_try_limit_second
- ctimestamp();
if ($next_login > 0) {
$this->form_validation->set_message(
'_check_id_pw',
'회원님은 패스워드를 연속으로 ' . $loginfailnum . '회 잘못 입력하셨기 때문에 '
. $next_login . '초 후에 다시 로그인 시도가 가능합니다'
);
return false;
}
}
$loginfailmessage = '<br />회원님은 ' . ($loginfailnum + 1)
. '회 연속으로 패스워드를 잘못입력하셨습니다. ';
}
$use_login_account = $this->cbconfig->item('use_login_account');
$this->load->model(array('Member_dormant_model'));
$userselect = 'mem_id, mem_password, mem_denied, mem_email_cert, mem_is_admin';
$is_dormant_member = false;
if ($use_login_account === 'both') {
$userinfo = $this->Member_model->get_by_both($userid, $userselect);
if ( ! $userinfo) {
$userinfo = $this->Member_dormant_model->get_by_both($userid, $userselect);
if ($userinfo) {
$is_dormant_member = true;
}
}
} elseif ($use_login_account === 'email') {
$userinfo = $this->Member_model->get_by_email($userid, $userselect);
if ( ! $userinfo) {
$userinfo = $this->Member_dormant_model->get_by_email($userid, $userselect);
if ($userinfo) {
$is_dormant_member = true;
}
}
} else {
$userinfo = $this->Member_model->get_by_userid($userid, $userselect);
if ( ! $userinfo) {
$userinfo = $this->Member_dormant_model->get_by_userid($userid, $userselect);
if ($userinfo) {
$is_dormant_member = true;
}
}
}
$hash = password_hash($password, PASSWORD_BCRYPT);
if ( ! element('mem_id', $userinfo) OR ! element('mem_password', $userinfo)) {
$this->form_validation->set_message(
'_check_id_pw',
'회원 아이디와 패스워드가 서로 맞지 않습니다' . $loginfailmessage
);
$this->member->update_login_log(0, $userid, 0, '회원 아이디가 존재하지 않습니다');
return false;
} elseif ( ! password_verify($password, element('mem_password', $userinfo))) {
$this->form_validation->set_message(
'_check_id_pw',
'회원 아이디와 패스워드가 서로 맞지 않습니다' . $loginfailmessage
);
$this->member->update_login_log(element('mem_id', $userinfo), $userid, 0, '패스워드가 올바르지 않습니다');
return false;
} elseif (element('mem_denied', $userinfo)) {
$this->form_validation->set_message(
'_check_id_pw',
'회원님의 아이디는 접근이 금지된 아이디입니다'
);
$this->member->update_login_log(element('mem_id', $userinfo), $userid, 0, '접근이 금지된 아이디입니다');
return false;
} elseif ($this->cbconfig->item('use_register_email_auth') && ! element('mem_email_cert', $userinfo)) {
$this->form_validation->set_message(
'_check_id_pw',
'회원님은 아직 이메일 인증을 받지 않으셨습니다'
);
$this->member->update_login_log(element('mem_id', $userinfo), $userid, 0, '이메일 인증을 받지 않은 회원아이디입니다');
return false;
} elseif (element('mem_is_admin', $userinfo) && $this->input->post('autologin')) {
$this->form_validation->set_message(
'_check_id_pw',
'최고관리자는 자동로그인 기능을 사용할 수 없습니다'
);
return false;
}
if ($is_dormant_member === true) {
$this->member->recover_from_dormant(element('mem_id', $userinfo));
}
return true;
}
/**
* 로그아웃합니다
*/
public function logout()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_logout_index';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
if ($this->member->is_member() === false) {
redirect();
}
$where = array(
'mem_id' => $this->member->item('mem_id'),
);
$this->load->model(array('Autologin_model'));
$this->Autologin_model->delete_where($where);
delete_cookie('autologin');
$this->session->sess_destroy();
$url_after_logout = $this->cbconfig->item('url_after_logout');
if ($url_after_logout) {
$url_after_logout = site_url($url_after_logout);
}
if (empty($url_after_logout)) {
$url_after_logout = $this->input->get_post('url') ? $this->input->get_post('url') : site_url();
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
redirect($url_after_logout, 'refresh');
}
}

View File

@@ -0,0 +1,100 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Main class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 메인 페이지를 담당하는 controller 입니다.
*/
class Main extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Board');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 전체 메인 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_main_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$where = array(
'brd_search' => 1,
);
$board_id = $this->Board_model->get_board_list($where);
$board_list = array();
if ($board_id && is_array($board_id)) {
foreach ($board_id as $key => $val) {
$board_list[] = $this->board->item_all(element('brd_id', $val));
}
}
$view['view']['board_list'] = $board_list;
$view['view']['canonical'] = site_url();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_main');
$meta_description = $this->cbconfig->item('site_meta_description_main');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_main');
$meta_author = $this->cbconfig->item('site_meta_author_main');
$page_name = $this->cbconfig->item('site_page_name_main');
$layoutconfig = array(
'path' => 'main',
'layout' => 'layout',
'skin' => 'main',
'layout_dir' => $this->cbconfig->item('layout_main'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_main'),
'use_sidebar' => $this->cbconfig->item('sidebar_main'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_main'),
'skin_dir' => $this->cbconfig->item('skin_main'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_main'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,762 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Note class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 쪽지 목록, 쪽지 읽기, 쪽지 발송과 관련된 controller 입니다.
*/
class Note extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Note');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'dhtml_editor');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring', 'notelib'));
if ($this->member->item('mem_id') && $this->member->item('meta_note_received_datetime')) {
$this->load->model('Member_meta_model');
$metadata = array(
'meta_note_received_datetime' => '',
'meta_note_received_from_id' => '',
'meta_note_received_from_nickname' => '',
);
$this->Member_meta_model->save($this->member->item('mem_id'), $metadata);
}
}
/**
* 쪽지 목록 페이지입니다
*/
public function lists($type = 'recv')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_note_lists';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
$mem_id = (int) $this->member->item('mem_id');
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if ( ! $this->cbconfig->item('use_note')) {
alert_close('쪽지 기능을 사용하지 않는 사이트입니다');
return false;
} elseif ( ! $this->member->item('mem_use_note') && $this->member->is_admin() !== 'super') {
alert_close('회원님은 쪽지 기능을 사용하지 않는 중이십니다');
return false;
}
if ($type !== 'send') {
$type = 'recv';
}
$nte_type = ($type === 'send') ? 2 : 1;
$mem_column = ($type === 'send') ? 'recv_mem_id' : 'send_mem_id';
$my_column = ($type === 'send') ? 'send_mem_id' : 'recv_mem_id';
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->Note_model->primary_key;
$forder = 'desc';
if ($this->cbconfig->get_device_view_type() === 'mobile') {
$per_page = $this->cbconfig->item('note_mobile_list_page')
? (int) $this->cbconfig->item('note_mobile_list_page') : 10;
} else {
$per_page = $this->cbconfig->item('note_list_page')
? (int) $this->cbconfig->item('note_list_page') : 10;
}
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$where = array(
$my_column => $mem_id,
'nte_type' => $nte_type,
);
if ($type === 'send') {
$result = $this->Note_model
->get_send_list($per_page, $offset, $where, '', $findex, $forder);
} else {
$result = $this->Note_model
->get_recv_list($per_page, $offset, $where, '', $findex, $forder);
}
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
if ($val[$mem_column]) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
} else {
$result['list'][$key]['display_name'] = '알림';
}
$result['list'][$key]['delete_url'] = site_url('note/delete/' . element('nte_type', $val) . '/' . element('nte_id', $val));
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
$view['view']['type'] = $type;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = site_url('note/lists/' . $type) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
$view['view']['canonical'] = site_url('note/lists/' . $type);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_note_list');
$meta_description = $this->cbconfig->item('site_meta_description_note_list');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_note_list');
$meta_author = $this->cbconfig->item('site_meta_author_note_list');
$page_name = $this->cbconfig->item('site_page_name_note_list');
$layoutconfig = array(
'path' => 'note',
'layout' => 'layout_popup',
'skin' => 'lists',
'layout_dir' => $this->cbconfig->item('layout_note'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_note'),
'skin_dir' => $this->cbconfig->item('skin_note'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_note'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 쪽지 상세보기 페이지입니다
*/
public function view($type = 'recv', $note_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_note_view';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
$mem_id = (int) $this->member->item('mem_id');
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if ( ! $this->cbconfig->item('use_note')) {
alert_close('쪽지 기능을 사용하지 않는 사이트입니다');
return false;
} elseif ( ! $this->member->item('mem_use_note') && $this->member->is_admin() !== 'super') {
alert_close('회원님은 쪽지 기능을 사용하지 않는 중이십니다');
return false;
}
if ($type !== 'send') {
$type = 'recv';
}
$nte_type = ($type === 'send') ? 2 : 1;
$columnname = ($type === 'send') ? 'send_mem_id' : 'recv_mem_id';
$mem_column = ($type === 'send') ? 'recv_mem_id' : 'send_mem_id';
$note_id = (int) $note_id;
if (empty($note_id) OR $note_id < 1) {
show_404();
}
$where = array(
'nte_id' => $note_id,
$columnname => $mem_id,
'nte_type' => $nte_type,
);
$result = $this->Note_model->get_note($where);
if ( ! element('nte_id', $result)) {
show_404();
}
if ($result[$mem_column]) {
$result['userid'] = element('mem_userid', $result);
$result['display_name'] = display_username(
element('mem_userid', $result),
element('mem_nickname', $result),
element('mem_icon', $result)
);
} else {
$result['display_name'] = '알림';
}
if (element('nte_type', $result) === '1'
&& (empty($result['nte_read_datetime']) OR $result['nte_read_datetime'] <= '0000-00-00 00:00:00')) {
$updatedata = array(
'nte_read_datetime' => cdate('Y-m-d H:i:s'),
);
$this->Note_model->update(element('nte_id', $result), $updatedata);
if ($result[$mem_column] > 0) {
$updatedata = array(
'nte_read_datetime' => cdate('Y-m-d H:i:s'),
);
$where = array(
'related_note_id' => element('nte_id', $result),
);
$this->Note_model->update('', $updatedata, $where);
}
$where = array(
'recv_mem_id' => $mem_id,
'nte_type' => 1,
);
$this->db->where($where);
$this->db->group_start();
$this->db->where(array('nte_read_datetime <=' => '0000-00-00 00:00:00'));
$this->db->or_where(array('nte_read_datetime' => null));
$this->db->group_end();
$cnt = $this->db->count_all_results('note');
$updatedata = array(
'meta_unread_note_num' => $cnt,
);
$this->load->model('Member_meta_model');
$this->Member_meta_model->save($mem_id, $updatedata);
}
$result['content'] = display_html_content(
element('nte_content', $result),
element('nte_content_html_type', $result),
$thumb_width = 500,
$autolink = true,
$popup = true
);
if ($result['nte_filename']) {
$result['download_link'] = site_url('note/download/' . $type . '/' . $note_id);
}
$view['view']['data'] = $result;
$view['view']['type'] = $type;
$view['view']['canonical'] = site_url('note/view/' . $type . '/' . $note_id);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_note_view');
$meta_description = $this->cbconfig->item('site_meta_description_note_view');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_note_view');
$meta_author = $this->cbconfig->item('site_meta_author_note_view');
$page_name = $this->cbconfig->item('site_page_name_note_view');
$searchconfig = array(
'{쪽지제목}',
);
$replaceconfig = array(
element('nte_title', $result),
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layoutconfig = array(
'path' => 'note',
'layout' => 'layout_popup',
'skin' => 'view',
'layout_dir' => $this->cbconfig->item('layout_note'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_note'),
'skin_dir' => $this->cbconfig->item('skin_note'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_note'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 쪽지 글쓰기 페이지입니다
*/
public function write($userid = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_note_write';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
if ( ! $this->cbconfig->item('use_note')) {
alert_close('쪽지 기능을 사용하지 않는 사이트입니다');
return false;
} elseif ( ! $this->member->item('mem_use_note') && $this->member->is_admin() !== 'super') {
alert_close('회원님은 쪽지 기능을 사용하지 않는 중이십니다');
return false;
}
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$view['view']['userid'] = $userid;
$view['view']['use_dhtml'] = false;
if ($this->cbconfig->get_device_view_type() !== 'mobile'
&& $this->cbconfig->item('use_note_dhtml')) {
$view['view']['use_dhtml'] = true;
}
if ($this->cbconfig->get_device_view_type() === 'mobile'
&& $this->cbconfig->item('use_note_mobile_dhtml')) {
$view['view']['use_dhtml'] = true;
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'userid',
'label' => '회원아이디',
'rules' => 'trim|required|callback__check_userid',
),
array(
'field' => 'title',
'label' => '제목',
'rules' => 'trim|required',
),
array(
'field' => 'content',
'label' => '내용',
'rules' => 'trim|required',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$file_error = '';
$uploadfiledata = array();
if ($this->cbconfig->item('use_note_file')) {
$this->load->library('upload');
if (isset($_FILES)
&& isset($_FILES['note_file'])
&& isset($_FILES['note_file']['name'])
&& $_FILES['note_file']['name']) {
$upload_path = config_item('uploads_dir') . '/note/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$upload_path .= cdate('Y') . '/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$upload_path .= cdate('m') . '/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$uploadconfig = array();
$uploadconfig['upload_path'] = $upload_path;
$uploadconfig['allowed_types'] = '*';
$uploadconfig['encrypt_name'] = true;
$this->upload->initialize($uploadconfig);
$_FILES['userfile']['name'] = $_FILES['note_file']['name'];
$_FILES['userfile']['type'] = $_FILES['note_file']['type'];
$_FILES['userfile']['tmp_name'] = $_FILES['note_file']['tmp_name'];
$_FILES['userfile']['error'] = $_FILES['note_file']['error'];
$_FILES['userfile']['size'] = $_FILES['note_file']['size'];
if ($this->upload->do_upload()) {
$filedata = $this->upload->data();
$uploadfiledata['nte_filename'] = cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $filedata);
$uploadfiledata['nte_originname'] = element('orig_name', $filedata);
} else {
$file_error = $this->upload->display_errors();
}
}
}
if ($file_error) {
$view['view']['message'] = $file_error;
} else {
$recv_list = explode(',', $this->input->post('userid'));
$mem_list = array();
$error_list = array();
$view['view']['message'] = '';
$content_type = $view['view']['use_dhtml'] ? 1 : 0;
if ($recv_list && is_array($recv_list)) {
foreach ($recv_list as $key => $value) {
$value = trim($value);
if ($value) {
$mem = $this->Member_model->get_by_userid($value, 'mem_id');
if (element('mem_id', $mem)) {
$send_result = $this->notelib->send_note(
$this->member->item('mem_id'),
element('mem_id', $mem),
$this->input->post('title'),
$this->input->post('content'),
$content_type,
element('nte_originname', $uploadfiledata, ''),
element('nte_filename', $uploadfiledata, '')
);
$jsonresult = json_decode($send_result, true);
if (isset($jsonresult['error']) && $jsonresult['error']) {
$view['view']['message'] .= $jsonresult['error'] . '<br />';
}
} else {
$view['view']['message'] .= $value . '는 존재하지 않는 회원입니다<br />';
}
}
}
}
}
if (empty($view['view']['message'])) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['after'] = Events::trigger('after', $eventname);
$this->session->set_flashdata(
'message',
'쪽지가 발송되었습니다'
);
redirect('note/lists/send');
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_note_write');
$meta_description = $this->cbconfig->item('site_meta_description_note_write');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_note_write');
$meta_author = $this->cbconfig->item('site_meta_author_note_write');
$page_name = $this->cbconfig->item('site_page_name_note_write');
$layoutconfig = array(
'path' => 'note',
'layout' => 'layout_popup',
'skin' => 'write',
'layout_dir' => $this->cbconfig->item('layout_note'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_note'),
'skin_dir' => $this->cbconfig->item('skin_note'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_note'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 쪽지 다운로드 기능입니다
*/
public function download($type = 'recv', $note_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_note_download';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
if ( ! $this->cbconfig->item('use_note')) {
alert_close('쪽지 기능을 사용하지 않는 사이트입니다');
return false;
} elseif ( ! $this->member->item('mem_use_note') && $this->member->is_admin() !== 'super') {
alert_close('회원님은 쪽지 기능을 사용하지 않는 중이십니다');
return false;
}
if ($type !== 'send') {
$type = 'recv';
}
$nte_type = ($type === 'send') ? 2 : 1;
$columnname = ($type === 'send') ? 'send_mem_id' : 'recv_mem_id';
$mem_column = ($type === 'send') ? 'recv_mem_id' : 'send_mem_id';
$note_id = (int) $note_id;
if (empty($note_id) OR $note_id < 1) {
show_404();
}
$where = array(
'nte_id' => $note_id,
$columnname => $this->member->item('mem_id'),
'nte_type' => $nte_type,
);
$result = $this->Note_model->get_note($where);
if ( ! element('nte_id', $result) OR ! element('nte_filename', $result) OR ! element('nte_originname', $result)) {
show_404();
}
$this->load->helper('download');
// Read the file's contents
$data = file_get_contents(config_item('uploads_dir') . '/note/' . element('nte_filename', $result));
$name = element('nte_originname', $result);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
force_download($name, $data);
}
/**
* 쪽지 발송시 실제 존재하는 회원인지, 수신가능한 회원인지 체크하는 함수입니다
*/
public function _check_userid($str)
{
$recv_list = explode(',', $str);
$mem_list = array();
$error_list = array();
if ($recv_list && is_array($recv_list)) {
foreach ($recv_list as $key => $value) {
$value = trim($value);
if ($value) {
$select = 'mem_id, mem_denied, mem_use_note, mem_userid, mem_nickname';
$mem = $this->Member_model->get_by_userid($value, $select);
if (element('mem_id', $mem)
&& element('mem_denied', $mem) === '0'
&& element('mem_use_note', $mem) === '1') {
$mem_list['mem_id'] = element('mem_id', $mem);
$mem_list['mem_userid'] = element('mem_userid', $mem);
$mem_list['mem_nickname'] = element('mem_nickname', $mem);
} else {
$error_list[] = $value;
}
}
}
}
$error_msg = implode(',', $error_list);
if ($error_msg && $this->member->is_admin() !== 'super') {
$this->form_validation->set_message(
'_check_userid',
$error_msg . ' 는 쪽지를 받을 수 없는 회원아이디입니다. <br />쪽지를 발송하지 않았습니다'
);
return false;
}
if ($this->member->is_admin() !== 'super') {
if (count(element('mem_id', $mem_list))) {
$point = $this->cbconfig->item('point_note') * count(element('mem_id', $mem_list));
if ($point) {
if ($this->member->item('mem_point') - $point < 0) {
$this->form_validation->set_message(
'_check_userid',
'보유하신 포인트(' . number_format($this->member->item('mem_point')) . '점)가 모자라서 쪽지를 보낼 수 없습니다'
);
return false;
}
}
}
}
return true;
}
/**
* 쪽지를 삭제하는 함수입니다
*/
public function delete($note_type = 'recv', $note_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_note_delete';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
$mem_id = (int) $this->member->item('mem_id');
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
if ( ! $this->cbconfig->item('use_note')) {
alert_close('쪽지 기능을 사용하지 않는 사이트입니다');
return false;
} elseif ( ! $this->member->item('mem_use_note') && $this->member->is_admin() !== 'super') {
alert_close('회원님은 쪽지 기능을 사용하지 않는 중이십니다');
return false;
}
$note_id = (int) $note_id;
if (empty($note_id) OR $note_id < 1) {
show_404();
}
$note = $this->Note_model->get_one($note_id);
if ( ! element('nte_id', $note)) {
show_404();
}
if (element('nte_type', $note) === '1') {
if ($note_type !== element('nte_type', $note)) {
show_404();
}
if ((int) element('recv_mem_id', $note) !== $mem_id) {
show_404();
}
$note_list = 'recv';
} elseif (element('nte_type', $note) === '2') {
if ($note_type !== element('nte_type', $note)) {
show_404();
}
if ((int) element('send_mem_id', $note) !== $mem_id) {
show_404();
}
$note_list = 'send';
}
$this->Note_model->delete($note_id);
$where = array(
'recv_mem_id' => $mem_id,
'nte_type' => 1,
);
$this->db->where($where);
$this->db->group_start();
$this->db->where(array('nte_read_datetime <=' => '0000-00-00 00:00:00'));
$this->db->or_where(array('nte_read_datetime' => null));
$this->db->group_end();
$cnt = $this->db->count_all_results('note');
$updatedata = array(
'meta_unread_note_num' => $cnt,
);
$this->load->model('Member_meta_model');
$this->Member_meta_model->save($mem_id, $updatedata);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
redirect('note/lists/' . $note_list . '?' . $param->output());
}
}

View File

@@ -0,0 +1,483 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Notification class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 알림페이지와 관련된 controller 입니다.
*/
class Notification extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Notification');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
if ( ! $this->cbconfig->item('use_notification')) {
alert('이 웹사이트는 알림기능을 사용하지 않습니다.');
}
}
/**
* 알림 페이지 입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_index';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
$mem_id = (int) $this->member->item('mem_id');
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
// 2개월 이상된 알림은 하루에 한번씩 체크해서 삭제합니다.
$cachename = 'delete_old_notifications_cache';
$cachetime = 86400;
if ( ! $result = $this->cache->get($cachename)) {
$sdate = cdate('Y-m-d H:i:s', ctimestamp() - 24* 60 * 60 * 60);
$where = array(
'not_datetime <=' => $sdate,
);
$this->Notification_model->delete_where($where);
$this->cache->save($cachename, cdate('Y-m-d H:i:s'), $cachetime);
}
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$per_page = $this->cbconfig->item('list_count') ? (int) $this->cbconfig->item('list_count') : 20;
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$read = $this->input->get('read', null, '');
$result = $this->Notification_model
->get_notification_list($per_page, $offset, $mem_id, $read);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['num'] = $list_num--;
$result['list'][$key]['delete_url'] = site_url('notification/delete/' . element('not_id', $val) . '?' . $param->output());
$result['list'][$key]['read_url'] = site_url('notification/read/' . element('not_id', $val) . '?' . $param->output());
$result['list'][$key]['onClick'] = '';
if (element('not_type', $val) === 'note') {
$result['list'][$key]['read_url'] = 'javascript:;';
$result['list'][$key]['onClick'] = 'note_list(' . element('not_content_id', $val) . ');';
}
}
}
$view['view']['data'] = $result;
$view['view']['list_delete_url'] = site_url('notification/listdelete?' . $param->output());
$view['view']['list_update_url'] = site_url('notification/listupdate?' . $param->output());
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = site_url('notification') . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
$view['view']['canonical'] = site_url('notification');
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_notification');
$meta_description = $this->cbconfig->item('site_meta_description_notification');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_notification');
$meta_author = $this->cbconfig->item('site_meta_author_notification');
$page_name = $this->cbconfig->item('site_page_name_notification');
$layoutconfig = array(
'path' => 'notification',
'layout' => 'layout',
'skin' => 'notification',
'layout_dir' => $this->cbconfig->item('layout_notification'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_notification'),
'use_sidebar' => $this->cbconfig->item('sidebar_notification'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_notification'),
'skin_dir' => $this->cbconfig->item('skin_notification'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_notification'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 알림 읽기 입니다
*/
public function read($not_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_read';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
$mem_id = (int) $this->member->item('mem_id');
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$not_id = (int) $not_id;
if (empty($not_id) OR $not_id < 1) {
show_404();
}
$notification = $this->Notification_model->get_one($not_id);
if ( ! element('not_id', $notification)) {
show_404();
}
if ((int) element('mem_id', $notification) !== $mem_id) {
show_404();
}
$this->Notification_model->mark_read($not_id, $mem_id);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
$redirecturl = element('not_url', $notification);
redirect($redirecturl);
}
/**
* 알림 읽기 입니다
*/
public function readajax($not_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_readajax';
$this->load->event($eventname);
$this->output->set_content_type('application/json');
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 로그인이 필요한 페이지입니다
*/
if ($this->member->is_member() === false) {
$result = array('error' => '로그인 후 접속 가능한 페이지입니다.');
exit(json_encode($result));
}
$mem_id = (int) $this->member->item('mem_id');
$not_id = (int) $not_id;
if (empty($not_id) OR $not_id < 1) {
$result = array('error' => '잘못된 접근입니다.');
exit(json_encode($result));
}
$notification = $this->Notification_model->get_one($not_id);
if ( ! element('not_id', $notification)) {
$result = array('error' => '잘못된 접근입니다.');
exit(json_encode($result));
}
if ((int) element('mem_id', $notification) !== $mem_id) {
$result = array('error' => '잘못된 접근입니다.');
exit(json_encode($result));
}
$this->Notification_model->mark_read($not_id, $mem_id);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
$result = array('success' => '읽음으로 처리하였습니다');
exit(json_encode($result));
}
/**
* 알림 전체 읽기 입니다
*/
public function readallajax()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_readallajax';
$this->load->event($eventname);
$this->output->set_content_type('application/json');
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 로그인이 필요한 페이지입니다
*/
if ($this->member->is_member() === false) {
$result = array('error' => '로그인 후 접속 가능한 페이지입니다.');
exit(json_encode($result));
}
$this->Notification_model->mark_allread($this->member->item('mem_id'));
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
$result = array('success' => '읽음으로 처리하였습니다');
exit(json_encode($result));
}
/**
* 알림 AJAX 리스트 입니다
*/
public function ajax_list()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_ajax_list';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$result = $this->Notification_model
->get_notification_list(5, 0, $this->member->item('mem_id'), 'N');
$html = '<div class="notifications-list"><strong id="notification_count">'
. $result['total_rows']
. '</strong>개의 읽지 않은 알림이 있습니다.<span><a href="javascript:;" class="pull-right point noti-all-read">모두 읽음으로 표시</a></span></div>';
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['delete_url'] = site_url('notification/delete/' . element('not_id', $val) . '?' . $param->output());
$jsevent = '';
$read_url = site_url('notification/read/' . element('not_id', $val) . '?' . $param->output());
if (element('not_type', $val) === 'note') {
$read_url = 'javascript:;';
$jsevent = 'onClick="note_list(' . element('not_content_id', $val) . ');"';
}
$html .= '<div class="notifications-list">
<a href="' . $read_url . '" ' . $jsevent . ' class="notification_read '
. element('not_type', $val) . '" data-not-id="' . element('not_id', $val) . '">'
. html_escape(element('not_message', $val))
. ' <span class="pull-right">'
. display_datetime(element('not_datetime', $val), 'sns')
. '</span></a></div> ';
}
}
$html .= '<div class="notifications-list">
<a class="external point" href="' . site_url('notification') . '">
알림 페이지로 이동</a></div>';
echo $html;
exit();
}
/**
* 알림삭제 입니다
*/
public function delete($not_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_delete';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
$mem_id = (int) $this->member->item('mem_id');
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$not_id = (int) $not_id;
if (empty($not_id) OR $not_id < 1) {
show_404();
}
$notification = $this->Notification_model->get_one($not_id);
if ( ! element('not_id', $notification)) {
show_404();
}
if ((int) element('mem_id', $notification) !== $mem_id) {
show_404();
}
$this->Notification_model->delete($not_id);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
redirect('notification?' . $param->output());
}
/**
* 알림 선택삭제입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_listdelete';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$where = array(
'not_id' => $val,
'mem_id' => $this->member->item('mem_id'),
);
$this->Notification_model->delete_where($where);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
redirect('notification?' . $param->output());
}
/**
* 알림 선택 읽음으로 표시 입니다
*/
public function listupdate()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_notification_listupdate';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 업데이트를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->Notification_model->mark_read($val, $this->member->item('mem_id'));
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
redirect('notification?' . $param->output());
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,445 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Profile class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 회원님의 프로필 보기 페이지에 필요한 controller 입니다.
*/
class Profile extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Follow', 'Member_meta', 'Member_extra_vars');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 프로필보기 페이지입니다
*/
public function index($userid = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_profile_index';
$this->load->event($eventname);
/**
* 로그인이 필요한 페이지입니다
*/
required_user_login();
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if (empty($userid)) {
show_404();
}
if ( ! $this->member->item('mem_open_profile') && $this->member->is_admin() !== 'super' && $this->member->item('mem_userid') !== $userid) {
alert_close('회원님이 프로필 공개를 하지 않으셨으므로, 상대방의 프로필을 볼 수 없습니다. 먼저 회원님의 프로필을 공개해주세요');
return false;
}
$view['view']['member'] = $member = $this->Member_model->get_by_userid($userid);
$member_meta = $this->Member_meta_model->get_all_meta(element('mem_id', $member));
if (is_array($member_meta)) {
$view['view']['member'] = $member = array_merge($view['view']['member'], $member_meta);
}
if ( ! element('mem_id', $member)) {
alert_close('존재하지 않는 회원아이디입니다');
return false;
}
if (element('mem_denied', $member)) {
alert_close('탈퇴 또는 차단된 회원아이디입니다');
return false;
}
$member_extra_vars = $this->Member_extra_vars_model->get_all_meta(element('mem_id', $member));
if (is_array($member_extra_vars)) {
$view['view']['member'] = $member = array_merge($view['view']['member'], $member_extra_vars);
}
if ( ! element('mem_open_profile', $member)
&& $this->member->is_admin() !== 'super'
&& $this->member->item('mem_userid') !== $userid) {
alert_close(html_escape(element('mem_nickname', $member)) . ' 님이 프로필을 공개하지 않으셨습니다');
return false;
}
$registerform = $this->cbconfig->item('registerform');
$form = json_decode($registerform, true);
$display = array();
if ($form && is_array($form)) {
foreach ($form as $key => $value) {
if (element('use', $value) && element('open', $value)) {
if (element('field_name', $value) === 'mem_address') {
$value['value']
= element('mem_zipcode', $member) . ' ' .
element('mem_address1', $member) . ' ' .
element('mem_address2', $member) . ' ' .
element('mem_address3', $member);
} else {
$value['value'] = element(element('field_name', $value), $member);
if (element('field_type', $value) === 'checkbox') {
$tmp_value = json_decode($value['value']);
$tmp = '';
if ($tmp_value) {
foreach ($tmp_value as $val) {
if ($tmp) {
$tmp .= ', ';
}
$tmp .= $val;
}
}
$value['value'] = $tmp;
}
}
$display[] = $value;
}
}
}
$view['data'] = $display;
$view['view']['canonical'] = site_url('profile/' . $userid);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_profile');
$meta_description = $this->cbconfig->item('site_meta_description_profile');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_profile');
$meta_author = $this->cbconfig->item('site_meta_author_profile');
$page_name = $this->cbconfig->item('site_page_name_profile');
$searchconfig = array(
'{프로필회원명}',
'{프로필회원아이디}',
);
$replaceconfig = array(
element('mem_nickname', $member),
element('mem_userid', $member),
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layoutconfig = array(
'path' => 'profile',
'layout' => 'layout_popup',
'skin' => 'profile',
'layout_dir' => $this->cbconfig->item('layout_profile'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_profile'),
'skin_dir' => $this->cbconfig->item('skin_profile'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_profile'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 회원닉네임 클릭시 나타나는 사이드뷰 보기 관련 함수입니다
*/
public function sideview($userid = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_profile_sideview';
$this->load->event($eventname);
if (empty($userid)) {
return false;
}
$result = array();
$this->output->set_content_type('application/json');
// 이벤트가 존재하면 실행합니다
$result['event']['before'] = Events::trigger('before', $eventname);
if ($this->member->is_member() === false) {
$result = array('error' => '로그인후 이용해주세요');
exit(json_encode($result));
}
if (empty($userid)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$mem_id = (int) $this->member->item('mem_id');
$select = 'mem_id, mem_nickname, mem_homepage, mem_receive_email, mem_use_note, mem_open_profile, mem_denied';
$member = $this->Member_model->get_by_userid($userid, $select);
if ( ! element('mem_id', $member)) {
$result = array('error' => '존재하지 않는 회원 아이디입니다');
exit(json_encode($result));
}
if (element('mem_denied', $member)) {
$result = array('error' => '탈퇴 또는 차단된 회원 아이디입니다');
exit(json_encode($result));
}
$countwhere = array(
'mem_id' => $mem_id,
'target_mem_id' => element('mem_id', $member),
);
$followcount = $this->Follow_model->count_by($countwhere);
$result = array();
$result['success'] = html_escape(element('mem_nickname', $member)) . ' 님의 사이드뷰';
$result['name'] = html_escape(element('mem_nickname', $member));
if ( ! $this->cbconfig->item('use_note')) {
$result['note'] = '10'; // 쪽지 기능을 사용하지 않는 사이트
} elseif ( ! $this->member->item('mem_use_note') && $this->member->is_admin() !== 'super') {
$result['note'] = '3'; // 내가 쪽지 기능을 사용하지 않고 있음
} elseif ($member['mem_use_note']) {
$result['note'] = '1'; // 쪽지 기능 사용
} else {
$result['note'] = '2'; // 상대방이 쪽지 기능을 사용하지 않고 있음
}
if ($this->cbconfig->get_device_view_type() !== 'mobile'
&& ! $this->cbconfig->item('use_sideview_email')) {
$result['email'] = '10'; // 이메일 기능을 사용하지 않는 사이트
} elseif ($this->cbconfig->get_device_view_type() === 'mobile'
&& ! $this->cbconfig->item('use_mobile_sideview_email')) {
$result['email'] = '10'; // 이메일 기능을 사용하지 않는 사이트
} elseif ( ! $this->member->item('mem_receive_email')
&& $this->member->is_admin() !== 'super') {
$result['email'] = '3'; // 내가 이메일수신 기능을 사용하지 않고 있음
} elseif ($member['mem_receive_email']
OR $this->member->is_admin() === 'super') {
$result['email'] = '1'; // 이메일수신 기능 사용
} else {
$result['email'] = '2'; // 상대방이 이메일수신 기능을 사용하지 않고 있음
}
if ( ! $this->member->item('mem_open_profile')
&& $this->member->is_admin() !== 'super') {
$result['profile'] = '3'; // 내가 프로필공개 기능을 사용하지 않고 있음
} elseif ($member['mem_open_profile']
OR $this->member->is_admin() === 'super') {
$result['profile'] = '1'; // 프로필공개 기능 사용
} else {
$result['profile'] = '2'; // 상대방이 프로필공개 기능을 사용하지 않고 있음
}
$result['following'] = $followcount;
$result['homepage'] = html_escape(element('mem_homepage', $member));
$result['memid'] = $this->member->is_admin() === 'super' ? element('mem_id', $member) : '';
// 이벤트가 존재하면 실행합니다
$result['event']['after'] = Events::trigger('after', $eventname);
exit(json_encode($result));
}
/**
* 친구추가 관련 함수입니다
*/
public function add_follow($userid = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_profile_add_follow';
$this->load->event($eventname);
if (empty($userid)) {
return false;
}
$result = array();
$this->output->set_content_type('application/json');
// 이벤트가 존재하면 실행합니다
$resutl['event']['after'] = Events::trigger('before', $eventname);
if ($this->member->is_member() === false) {
$result = array('error' => '로그인후 이용해주세요');
exit(json_encode($result));
}
if (empty($userid)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$mem_id = (int) $this->member->item('mem_id');
$select = 'mem_id, mem_nickname, mem_homepage, mem_receive_email, mem_use_note, mem_open_profile, mem_denied';
$target = $this->Member_model->get_by_userid($userid, $select);
if ( ! element('mem_id', $target)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
if (element('mem_denied', $target)) {
$result = array('error' => '탈퇴 또는 차단된 회원입니다');
exit(json_encode($result));
}
if ((int) element('mem_id', $target) === $mem_id) {
$result = array('error' => '자기자신을 친구로 등록할 수 없습니다');
exit(json_encode($result));
}
$countwhere = array(
'mem_id' => $mem_id,
'target_mem_id' => element('mem_id', $target),
);
$followcount = $this->Follow_model->count_by($countwhere);
if ($followcount > 0) {
$result = array('error' => '이미 친구로 등록된 회원입니다');
exit(json_encode($result));
}
$insertdata = array(
'mem_id' => $mem_id,
'target_mem_id' => element('mem_id', $target),
'fol_datetime' => cdate('Y-m-d H:i:s'),
);
$this->Follow_model->insert($insertdata);
$countwhere = array(
'target_mem_id' => element('mem_id', $target),
);
$target_count = $this->Follow_model->count_by($countwhere);
$countwhere = array(
'mem_id' => $mem_id,
);
$my_count = $this->Follow_model->count_by($countwhere);
$updatedata = array(
'mem_followed' => $target_count,
);
$this->Member_model->update(element('mem_id', $target), $updatedata);
$updatedata = array(
'mem_following' => $my_count,
);
$this->Member_model->update($this->member->item('mem_id'), $updatedata);
$result['success'] = html_escape(element('mem_nickname', $target)) . ' 님을 Following 하셨습니다';
$result['my_count'] = $my_count;
$result['target_count'] = $target_count;
// 이벤트가 존재하면 실행합니다
$resutl['event']['after'] = Events::trigger('after', $eventname);
exit(json_encode($result));
}
/**
* 친구해제 관련 함수입니다
*/
public function delete_follow($userid = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_profile_delete_follow';
$this->load->event($eventname);
if (empty($userid)) {
return false;
}
$result = array();
$this->output->set_content_type('application/json');
// 이벤트가 존재하면 실행합니다
$resutl['event']['before'] = Events::trigger('before', $eventname);
if ($this->member->is_member() === false) {
$result = array('error' => '로그인후 이용해주세요');
exit(json_encode($result));
}
if (empty($userid)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$mem_id = (int) $this->member->item('mem_id');
$select = 'mem_id, mem_nickname, mem_homepage, mem_receive_email,
mem_use_note, mem_open_profile, mem_denied';
$target = $this->Member_model->get_by_userid($userid, $select);
if ( ! element('mem_id', $target)) {
$result = array('error' => '잘못된 접근입니다');
exit(json_encode($result));
}
$countwhere = array(
'mem_id' => $mem_id,
'target_mem_id' => element('mem_id', $target),
);
$followcount = $this->Follow_model->count_by($countwhere);
if ($followcount === 0) {
$result = array('error' => '아직 친구로 등록되지 않은 회원입니다');
exit(json_encode($result));
}
$deletewhere = array(
'mem_id' => $mem_id,
'target_mem_id' => element('mem_id', $target),
);
$this->Follow_model->delete_where($deletewhere);
$countwhere = array(
'target_mem_id' => element('mem_id', $target),
);
$target_count = $this->Follow_model->count_by($countwhere);
$countwhere = array(
'mem_id' => $mem_id,
);
$my_count = $this->Follow_model->count_by($countwhere);
$updatedata = array(
'mem_followed' => $target_count,
);
$this->Member_model->update(element('mem_id', $target), $updatedata);
$updatedata = array(
'mem_following' => $my_count,
);
$this->Member_model->update($mem_id, $updatedata);
$result['success'] = html_escape(element('mem_nickname', $target)) . ' 님이 Follow 해제되었습니다';
$result['my_count'] = $my_count;
$result['target_count'] = $target_count;
// 이벤트가 존재하면 실행합니다
$resutl['event']['after'] = Events::trigger('after', $eventname);
exit(json_encode($result));
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,190 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Rss class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* RSS 보기 때 필요한 controller 입니다.
*/
class Rss extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Board_meta', 'Post', 'Board_category');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* RSS 페이지 함수입니다
*/
public function index($brd_key = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_rss_index';
$this->load->event($eventname);
$rsstype = $brd_key ? 'board' : 'all';
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if ($rsstype === 'board') {
$board_id = $this->board->item_key('brd_id', $brd_key);
if (empty($board_id)) {
show_404();
}
$board = $this->board->item_all($board_id);
if (element('access_view', $board) > 0 OR element('access_list', $board) > 0) {
alert('비회원이 볼 수 없는 게시판은 RSS 접근이 금지되어 있습니다');
return false;
}
if ( ! element('use_rss_feed', $board)) {
alert('이 게시판은 RSS 보기가 금지되어 있습니다');
return false;
}
} else {
if ( ! $this->cbconfig->item('use_total_rss_feed')) {
alert('통합게시판의 사용이 금지되어 있습니다');
return false;
}
}
header('content-type: text/xml');
header('cache-control: no-cache, must-revalidate');
header('pragma: no-cache');
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
if ($rsstype === 'board') {
$limit = element('rss_feed_post_count', $board) ? element('rss_feed_post_count', $board) : 50;
} else {
$limit = $this->cbconfig->item('total_rss_feed_count') ? $this->cbconfig->item('total_rss_feed_count') : 50;
}
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$boardarray = array();
if ($rsstype === 'board') {
$where = array(
'brd_id' => element('brd_id', $board),
'post_secret' => 0,
'post_del' => 0,
);
} else {
$whereboard = array(
'bmt_key' => 'use_rss_total_feed',
'bmt_value' => '1',
);
$boardlist = $this->Board_meta_model->get('', '', $whereboard);
if ($boardlist && is_array($boardlist)) {
foreach ($boardlist as $key => $value) {
$boardarray[] = element('brd_id', $value);
}
}
$where = array(
'post_secret' => 0,
'post_del' => 0,
);
}
$result = $this->Post_model->get_rss_list($where, $boardarray, $limit);
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['title'] = element('post_title', $val);
$result['list'][$key]['pubdate'] = cdate('c', strtotime(element('post_datetime', $val)));
$result['list'][$key]['author'] = element('post_nickname', $val);
$result['list'][$key]['content'] = '';
$result['list'][$key]['category'] = '';
if ($rsstype === 'board') {
if (element('rss_feed_content', $board) === '1') {
$result['list'][$key]['content'] = strip_tags(element('post_content', $val));
} elseif (element('rss_feed_content', $board) === '2') {
$result['list'][$key]['content'] = display_html_content(
element('post_content', $val),
element('post_html', $val),
700
);
}
} else {
if ($this->cbconfig->item('total_rss_feed_content') === '1') {
$result['list'][$key]['content'] = strip_tags(element('post_content', $val));
} elseif ($this->cbconfig->item('total_rss_feed_content') === '2') {
$result['list'][$key]['content'] = display_html_content(
element('post_content', $val),
element('post_html', $val),
700
);
}
$board = $this->board->item_all(element('brd_id', $val));
}
if (element('use_category', $board) && element('post_category', $val)) {
$category = $this->Board_category_model
->get_category_info(element('brd_id', $val), element('post_category', $val));
$result['list'][$key]['category'] = element('bca_value', $category);
}
$result['list'][$key]['link'] = post_url(element('brd_key', $board), element('post_id', $val));
}
}
$view['view']['data'] = $result;
if ($rsstype === 'board') {
$view['view']['title'] = element('brd_name', $board);
$view['view']['url'] = board_url(element('brd_key', $board));
$view['view']['copyright'] = element('rss_feed_copyright', $board)
? element('rss_feed_copyright', $board)
: $this->cbconfig->item('total_rss_feed_copyright');
$view['view']['description'] = element('rss_feed_description', $board)
? element('rss_feed_description', $board)
: $this->cbconfig->item('total_rss_feed_description');
} else {
$view['view']['title'] = $this->cbconfig->item('total_rss_feed_title')
? $this->cbconfig->item('total_rss_feed_title')
: $this->cbconfig->item('site_title');
$view['view']['url'] = site_url();
$view['view']['copyright'] = $this->cbconfig->item('total_rss_feed_copyright');
$view['view']['description'] = $this->cbconfig->item('total_rss_feed_description');
}
$view['view']['board'] = isset($board) ? $board : '';
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->Post_model->primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$this->data = $view;
$skin = $this->cbconfig->item('skin_helptool') ? $this->cbconfig->item('skin_helptool') : $this->cbconfig->item('skin_default');
$this->view = 'helptool/' . $skin . '/rss';
}
}

View File

@@ -0,0 +1,276 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Search class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 게시물 전체 검색시 필요한 controller 입니다.
*/
class Search extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Board', 'Board_group', 'Post', 'Post_file', 'Search_keyword');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 검색 페이지 함수입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_search_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = 'post_num, post_reply';
$sfield = $sfield2 = $this->input->get('sfield', null, '');
$sop = $this->input->get('sop', null, '');
if ($sfield === 'post_both') {
$sfield = array('post_title', 'post_content');
}
$mem_id = (int) $this->member->item('mem_id');
$skeyword = $this->input->get('skeyword', null, '');
if (empty($skeyword)) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_nokeyword_layout'] = Events::trigger('before_nokeyword_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_search');
$meta_description = $this->cbconfig->item('site_meta_description_search');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_search');
$meta_author = $this->cbconfig->item('site_meta_author_search');
$page_name = $this->cbconfig->item('site_page_name_search');
$layoutconfig = array(
'path' => 'search',
'layout' => 'layout',
'skin' => 'search',
'layout_dir' => $this->cbconfig->item('layout_search'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_search'),
'use_sidebar' => $this->cbconfig->item('sidebar_search'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_search'),
'skin_dir' => $this->cbconfig->item('skin_search'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_search'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
return false;
}
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->Post_model->allow_search_field = array('post_title', 'post_content', 'post_userid', 'post_nickname'); // 검색이 가능한 필드
$this->Post_model->search_field_equal = array('post_userid'); // 검색중 like 가 아닌 = 검색을 하는 필드
$per_page = 15;
$offset = ($page - 1) * $per_page;
$group_id = (int) $this->input->get('group_id') ? (int) $this->input->get('group_id') : '';
$board_id = (int) $this->input->get('board_id') ? (int) $this->input->get('board_id') : '';
$where = array();
$boardwhere = array(
'brd_search' => 1,
);
if ($group_id) {
$where['board.bgr_id'] = $group_id;
$boardwhere['board.bgr_id'] = $group_id;
}
$boardlisttmp = $this->Board_model->get_board_list($boardwhere);
$boardlist = array();
if (is_array($boardlisttmp)) {
foreach ($boardlisttmp as $key => $value) {
$boardlist[$value['brd_id']] = $value;
}
}
$grouplisttmp = $this->Board_group_model
->get('', '', '', '', 0, 'bgr_order', 'ASC');
if (is_array($grouplisttmp)) {
foreach ($grouplisttmp as $key => $value) {
$grouplist[$value['bgr_id']] = $value;
}
}
$where['post.post_secret'] = 0;
$where['post.post_del'] = 0;
$like = '';
$result = $this->Post_model
->get_search_list($per_page, $offset, $where, $like, $board_id, $findex, $sfield, $skeyword, $sop);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$images = '';
if (element('post_image', $val)) {
$imagewhere = array(
'post_id' => element('post_id', $val),
'pfi_is_image' => 1,
);
$images = $this->Post_file_model
->get_one('', '', $imagewhere, '', '', 'pfi_id', 'ASC');
}
$result['list'][$key]['images'] = $images;
$result['list'][$key]['post_url'] = post_url(element('brd_key', $val), element('post_id', $val));
$result['list'][$key]['display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val),
element('mem_icon', $val),
'Y'
);
$result['list'][$key]['display_datetime'] = display_datetime(element('post_datetime', $val), 'user', 'Y-m-d H:i');
$result['list'][$key]['content'] = cut_str(strip_tags(element('post_content', $val)),200);
$result['list'][$key]['is_mobile'] = (element('post_device', $val) === 'mobile') ? true : false;
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $boardlist;
$view['view']['grouplist'] = $grouplist;
if ( ! $this->session->userdata('skeyword_' . urlencode($skeyword))) {
$sfieldarray = array('post_title', 'post_content', 'post_both');
if (in_array($sfield2, $sfieldarray)) {
$searchinsert = array(
'sek_keyword' => $skeyword,
'sek_datetime' => cdate('Y-m-d H:i:s'),
'sek_ip' => $this->input->ip_address(),
'mem_id' => $mem_id,
);
$this->Search_keyword_model->insert($searchinsert);
$this->session->set_userdata(
'skeyword_' . urlencode($skeyword),
1
);
}
}
$highlight_keyword = '';
if ($skeyword) {
$key_explode = explode(' ', $skeyword);
if ($key_explode) {
foreach ($key_explode as $seval) {
if ($highlight_keyword) {
$highlight_keyword .= ',';
}
$highlight_keyword .= '\'' . html_escape($seval) . '\'';
}
}
}
$view['view']['highlight_keyword'] = $highlight_keyword;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->Post_model->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = site_url('search/') . '?' . $param->replace('page');
$view['view']['tab_url'] = site_url('search/') . '?' . $param->replace('page, board_id');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
if ($this->cbconfig->get_device_view_type() === 'mobile') {
$config['num_links'] = 3;
} else {
$config['num_links'] = 5;
}
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_search');
$meta_description = $this->cbconfig->item('site_meta_description_search');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_search');
$meta_author = $this->cbconfig->item('site_meta_author_search');
$page_name = $this->cbconfig->item('site_page_name_search');
$searchconfig = array(
'{검색어}',
);
$replaceconfig = array(
$skeyword,
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layoutconfig = array(
'path' => 'search',
'layout' => 'layout',
'skin' => 'search',
'layout_dir' => $this->cbconfig->item('layout_search'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_search'),
'use_sidebar' => $this->cbconfig->item('sidebar_search'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_search'),
'skin_dir' => $this->cbconfig->item('skin_search'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_search'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,156 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Sitemap class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* Sitemap 과 관련된 controller 입니다.
*/
class Sitemap extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Board_meta', 'Post');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 사이트맵 페이지 함수입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_sitemap_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if ( ! $this->cbconfig->item('use_sitemap')) {
alert('사이트맵 기능을 사용하고 있지 않습니다');
return false;
}
$whereboard = array(
'bmt_key' => 'use_sitemap',
'bmt_value' => '1',
);
$sitemap = array();
$boardlist = $this->Board_meta_model->get('', '', $whereboard);
if ($boardlist && is_array($boardlist)) {
foreach ($boardlist as $key => $value) {
$sitemap[] = array(
'loc' => site_url('sitemap_' . element('brd_id', $value) . '.xml'),
'brd_id' => element('brd_id', $value)
);
}
}
$view['view']['sitemap'] = $sitemap;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
header('content-type: text/xml');
header('cache-control: no-cache, must-revalidate');
header('pragma: no-cache');
$this->data = $view;
$skin = $this->cbconfig->item('skin_helptool') ? $this->cbconfig->item('skin_helptool') : $this->cbconfig->item('skin_default');
$this->view = 'helptool/' . $skin . '/sitemap';
}
/**
* 사이트맵 페이지 함수입니다
*/
public function board($brd_id = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_sitemap_detail';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if ( ! $this->cbconfig->item('use_sitemap')) {
alert('사이트맵 기능을 사용하고 있지 않습니다');
return false;
}
if ( ! isset($brd_id)) {
alert('잘못된 접근입니다');
return false;
}
$board_id = $this->board->item_id('brd_id', $brd_id);
if ( ! $board_id) {
alert('존재하지 않는 게시판입니다');
return false;
}
$board = $this->board->item_all($board_id);
if ( ! element('use_sitemap', $board)) {
alert('이 게시판은 sitemap 기능을 사용하지 않습니다');
return false;
}
$where = array(
'brd_id' => $brd_id,
'post_secret' => 0,
'post_del' => 0,
);
$limit = $this->cbconfig->item('sitemap_count') ? $this->cbconfig->item('sitemap_count') : 100;
$result = $this->Post_model->get_rss_list($where, '', $limit);
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['link'] = post_url(element('brd_key', $board), element('post_id', $val));
}
}
$view['view']['data'] = $result;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
header('content-type: text/xml');
header('cache-control: no-cache, must-revalidate');
header('pragma: no-cache');
/**
* 레이아웃을 정의합니다
*/
$this->data = $view;
$skin = $this->cbconfig->item('skin_helptool') ? $this->cbconfig->item('skin_helptool') : $this->cbconfig->item('skin_default');
$this->view = 'helptool/' . $skin . '/sitemap_board.php';
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,164 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Tags class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 게시물 태그 목록을 열람시 필요한 controller 입니다.
*/
class Tags extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Post_file', 'Post_tag');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 태그 페이지 함수입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_tags_index';
$this->load->event($eventname);
$tag = $this->input->get('tag', null, '');
if (empty($tag)) {
show_404();
}
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$per_page = 15;
$offset = ($page - 1) * $per_page;
$result = $this->Post_tag_model->get_tag_list($per_page, $offset, $tag);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$images = '';
if (element('post_image', $val)) {
$imagewhere = array(
'post_id' => element('post_id', $val),
'pfi_is_image' => 1,
);
$images = $this->Post_file_model
->get_one('', '', $imagewhere, '', '', 'pfi_id', 'ASC');
}
$result['list'][$key]['images'] = $images;
$result['list'][$key]['post_url'] = post_url(element('brd_key', $val), element('post_id', $val));
$dbmember = $this->Member_model->get_by_memid(element('mem_id', $val), 'mem_icon');
$result['list'][$key]['display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val),
element('mem_icon', $dbmember),
'Y'
);
$result['list'][$key]['display_datetime'] = display_datetime(
element('post_datetime', $val),
'user',
'Y-m-d H:i'
);
$result['list'][$key]['content'] = cut_str(strip_tags(element('post_content', $val)),200);
$result['list'][$key]['is_mobile'] = (element('post_device', $val) === 'mobile') ? true : false;
}
}
$view['view']['data'] = $result;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = site_url('tags/') . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
if ($this->cbconfig->get_device_view_type() === 'mobile') {
$config['num_links'] = 3;
} else {
$config['num_links'] = 5;
}
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = $this->cbconfig->item('site_meta_title_tag');
$meta_description = $this->cbconfig->item('site_meta_description_tag');
$meta_keywords = $this->cbconfig->item('site_meta_keywords_tag');
$meta_author = $this->cbconfig->item('site_meta_author_tag');
$page_name = $this->cbconfig->item('site_page_name_tag');
$searchconfig = array(
'{태그명}',
);
$replaceconfig = array(
$tag,
);
$page_title = str_replace($searchconfig, $replaceconfig, $page_title);
$meta_description = str_replace($searchconfig, $replaceconfig, $meta_description);
$meta_keywords = str_replace($searchconfig, $replaceconfig, $meta_keywords);
$meta_author = str_replace($searchconfig, $replaceconfig, $meta_author);
$page_name = str_replace($searchconfig, $replaceconfig, $page_name);
$layoutconfig = array(
'path' => 'tag',
'layout' => 'layout',
'skin' => 'tag',
'layout_dir' => $this->cbconfig->item('layout_tag'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_tag'),
'use_sidebar' => $this->cbconfig->item('sidebar_tag'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_tag'),
'skin_dir' => $this->cbconfig->item('skin_tag'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_tag'),
'page_title' => $page_title,
'meta_description' => $meta_description,
'meta_keywords' => $meta_keywords,
'meta_author' => $meta_author,
'page_name' => $page_name,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,356 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Verify class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 이메일 인증 시 필요한 controller 입니다.
*/
class Verify extends CB_Controller
{
/**
* 모델을 로딩합니다
*/
protected $models = array('Member_auth_email');
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
if ( ! function_exists('password_hash')) {
$this->load->helper('password');
}
}
/**
* 이메일 인증 함수입니다.
*/
public function confirmemail()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_verify_confirmemail';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if ( ! $this->input->get('code')) {
show_404();
}
if ( ! $this->input->get('user')) {
show_404();
}
if ($this->member->is_member()) {
redirect();
}
if ( ! $this->cbconfig->item('use_register_email_auth')) {
alert('이 웹사이트는 이메일 인증 기능을 사용하고 있지 않습니다');
}
$where = array(
'mae_key' => $this->input->get('code'),
);
$result = $this->Member_auth_email_model->get_one('', '', $where);
if ( ! element('mae_id', $result)) {
$view['view']['message'] = '잘못된 접근입니다';
} elseif ( ! (element('mae_type', $result) === '1' OR element('mae_type', $result) === '2')) {
$view['view']['message'] = '잘못된 접근입니다';
} elseif ( ! empty($result['mae_use_datetime']) && element('mae_use_datetime', $result) !== '0000-00-00 00:00:00') {
$view['view']['message'] = '회원님은 이미 인증을 받으셨습니다';
} elseif (strtotime(element('mae_generate_datetime', $result)) < ctimestamp()- 86400) {
$view['view']['message'] = '24 시간 이내에 인증을 받으셔야 합니다';
} elseif (element('mae_expired', $result)) {
$view['view']['message'] = '잘못된 접근입니다';
} else {
$select = 'mem_id, mem_userid, mem_denied, mem_email_cert';
$dbmember = $this->Member_model->get_by_memid(element('mem_id', $result), $select);
if ( ! element('mem_id', $dbmember)) {
$view['view']['message'] = '잘못된 접근입니다';
} elseif (element('mem_userid', $dbmember) !== $this->input->get('user')) {
$view['view']['message'] = '잘못된 접근입니다';
} elseif (element('mem_denied', $dbmember)) {
$view['view']['message'] = '접근이 금지된 아이디입니다';
} elseif (element('mem_email_cert', $dbmember)) {
$view['view']['message'] = '회원님은 이미 인증을 받으셨습니다';
} else {
$updatedata = array(
'mem_email_cert' => 1,
);
$this->Member_model->update(element('mem_id', $result), $updatedata);
$metadata = array(
'meta_email_cert_datetime' => cdate('Y-m-d H:i:s'),
);
$this->load->model('Member_meta_model');
$this->Member_meta_model->save(element('mem_id', $result), $metadata);
$updateemail = array(
'mae_use_datetime' => cdate('Y-m-d H:i:s'),
'mae_expired' => 1
);
$view['view']['message'] = '이메일 인증이 완료되었습니다.<br />감사합니다';
$this->Member_auth_email_model->update(element('mae_id', $result), $updateemail);
$this->member->update_login_log(element('mem_id', $dbmember), element('mem_userid', $dbmember), 1, '이메일 인증 후 로그인 성공');
$this->session->set_userdata('mem_id', element('mem_id', $dbmember));
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = '이메일 인증';
$layoutconfig = array(
'path' => 'findaccount',
'layout' => 'layout',
'skin' => 'verifyemail',
'layout_dir' => $this->cbconfig->item('layout_findaccount'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_findaccount'),
'use_sidebar' => $this->cbconfig->item('sidebar_findaccount'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_findaccount'),
'skin_dir' => $this->cbconfig->item('skin_findaccount'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_findaccount'),
'page_title' => $page_title,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 패스워드 리셋위한 함수입니다.
*/
public function resetpassword()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_verify_resetpassword';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
if ( ! $this->input->get('code')) {
show_404();
}
if ( ! $this->input->get('user')) {
show_404();
}
if ($this->member->is_member()) {
redirect();
}
$this->load->library(array('form_validation'));
$password_length = $this->cbconfig->item('password_length');
$view['view']['password_length'] = $password_length;
$where = array(
'mae_key' => $this->input->get('code'),
);
$result = $this->Member_auth_email_model->get_one('', '', $where);
$view['view']['error_message'] = '';
$view['view']['successs_message'] = '';
if ( ! element('mae_id', $result)) {
$view['view']['error_message'] = '잘못된 접근입니다';
} elseif ( ! empty($result['mae_use_datetime']) && element('mae_use_datetime', $result) !== '0000-00-00 00:00:00') {
$view['view']['error_message'] = '회원님은 이미 패스워드 변경을 하셨습니다';
} elseif (strtotime(element('mae_generate_datetime', $result)) < ctimestamp()- 86400) {
$view['view']['message'] = '24 시간 이내에 인증을 받으셔야 합니다';
} elseif (element('mae_type', $result) !== '3') {
$view['view']['error_message'] = '잘못된 접근입니다';
} else {
$is_dormant_member = false;
$select = 'mem_id, mem_userid, mem_denied, mem_email_cert';
$dbmember = $this->Member_model->get_by_memid(element('mem_id', $result), $select);
if ( ! $dbmember) {
$this->load->model('Member_dormant_model');
$dbmember = $this->Member_dormant_model->get_by_memid(element('mem_id', $result), $select);
if ($dbmember) {
$is_dormant_member = true;
}
}
if ( ! element('mem_id', $dbmember)) {
$view['view']['error_message'] = '잘못된 접근입니다';
} elseif (element('mem_userid', $dbmember) !== $this->input->get('user')) {
$view['view']['error_message'] = '잘못된 접근입니다';
} elseif (element('mem_denied', $dbmember)) {
$view['view']['error_message'] = '회원님의 계정은 접근이 금지되어 있습니다';
} elseif ($this->cbconfig->item('use_register_email_auth') && ! element('mem_email_cert', $dbmember)) {
$view['view']['error_message'] = '회원님은 회원가입 후, 또는 이메일 정보 변경후 아직 이메일 인증을 받지 않으셨습니다';
}
$view['view']['mem_userid'] = element('mem_userid', $dbmember);
}
$config = array(
array(
'field' => 'new_password',
'label' => '패스워드',
'rules' => 'trim|required|min_length[' . $password_length . ']|callback__mem_password_check',
),
array(
'field' => 'new_password_re',
'label' => '패스워드',
'rules' => 'trim|required|min_length[' . $password_length . ']',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if (empty($view['view']['error_message'])) {
if ($is_dormant_member) {
$this->member->recover_from_dormant(element('mem_id', $result));
}
$hash = password_hash($this->input->post('new_password'), PASSWORD_BCRYPT);
$updatedata = array(
'mem_password' => $hash,
);
$this->Member_model->update(element('mem_id', $result), $updatedata);
$metadata = array(
'meta_change_pw_datetime' => cdate('Y-m-d H:i:s'),
);
$this->load->model('Member_meta_model');
$this->Member_meta_model->save(element('mem_id', $result), $metadata);
$updateemail = array(
'mae_use_datetime' => cdate('Y-m-d H:i:s'),
'mae_expired' => 1
);
$this->Member_auth_email_model->update(element('mae_id', $result), $updateemail);
$view['view']['success_message'] = '회원님의 패스워드가 변경되었습니다.<br />감사합니다';
$this->member->update_login_log(element('mem_id', $result), element('mem_userid', $result), 1, '패스워드 변경 후 로그인 성공');
$this->session->set_userdata('mem_id', element('mem_id', $result));
}
}
$password_description = '비밀번호는 ' . $password_length . '자리 이상이어야 ';
if ($this->cbconfig->item('password_uppercase_length') OR $this->cbconfig->item('password_numbers_length') OR $this->cbconfig->item('password_specialchars_length')) {
$password_description .= '하며 ';
if ($this->cbconfig->item('password_uppercase_length')) {
$password_description .= ', ' . $this->cbconfig->item('password_uppercase_length') . '개의 대문자';
}
if ($this->cbconfig->item('password_numbers_length')) {
$password_description .= ', ' . $this->cbconfig->item('password_numbers_length') . '개의 숫자';
}
if ($this->cbconfig->item('password_specialchars_length')) {
$password_description .= ', ' . $this->cbconfig->item('password_specialchars_length') . '개의 특수문자';
}
$password_description .= '를 포함해야 ';
}
$password_description .= '합니다';
$view['view']['info'] = $password_description;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 레이아웃을 정의합니다
*/
$page_title = '패스워드 변경';
$layoutconfig = array(
'path' => 'findaccount',
'layout' => 'layout',
'skin' => 'findaccount_change_pw',
'layout_dir' => $this->cbconfig->item('layout_findaccount'),
'mobile_layout_dir' => $this->cbconfig->item('mobile_layout_findaccount'),
'use_sidebar' => $this->cbconfig->item('sidebar_findaccount'),
'use_mobile_sidebar' => $this->cbconfig->item('mobile_sidebar_findaccount'),
'skin_dir' => $this->cbconfig->item('skin_findaccount'),
'mobile_skin_dir' => $this->cbconfig->item('mobile_skin_findaccount'),
'page_title' => $page_title,
);
$view['layout'] = $this->managelayout->front($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 새로 입력한 패스워드가 규약에 맞는지 체크합니다.
*/
public function _mem_password_check($str)
{
$uppercase = $this->cbconfig->item('password_uppercase_length');
$number = $this->cbconfig->item('password_numbers_length');
$specialchar = $this->cbconfig->item('password_specialchars_length');
$this->load->helper('chkstring');
$str_uc = count_uppercase($str);
$str_num = count_numbers($str);
$str_spc = count_specialchars($str);
if ($str_uc < $uppercase OR $str_num < $number OR $str_spc < $specialchar) {
$description = '비밀번호는 ';
if ($str_uc < $uppercase) {
$description .= ' ' . $uppercase . '개 이상의 대문자';
}
if ($str_num < $number) {
$description .= ' ' . $number . '개 이상의 숫자';
}
if ($str_spc < $specialchar) {
$description .= ' ' . $specialchar . '개 이상의 특수문자';
}
$description .= '를 포함해야 합니다';
$this->form_validation->set_message(
'_mem_password_check',
$description
);
return false;
}
return true;
}
}

View File

@@ -0,0 +1,121 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Main class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자 메인 controller 입니다.
*/
class Main extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = '';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post', 'Comment', 'Point');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 관리자 메인 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_main_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$view['view']['latest_member'] = $this->Member_model->get_admin_list(7, '', '', '', 'mem_id', 'desc', '', '');
if (isset($view['view']['latest_member']['list']) && is_array($view['view']['latest_member']['list'])) {
foreach ($view['view']['latest_member']['list'] as $key => $val) {
$view['view']['latest_member']['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val)
);
}
}
$view['view']['latest_point'] = $this->Point_model->get_admin_list(7, '', '', '', 'poi_id', 'desc', '', '');
if (isset($view['view']['latest_point']['list']) && is_array($view['view']['latest_point']['list'])) {
foreach ($view['view']['latest_point']['list'] as $key => $val) {
$view['view']['latest_point']['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val)
);
}
}
$view['view']['latest_post'] = $this->Post_model->get_admin_list(7, '', '', '', 'post_id', 'desc', '', '');
if (isset($view['view']['latest_post']['list']) && is_array($view['view']['latest_post']['list'])) {
foreach ($view['view']['latest_post']['list'] as $key => $val) {
$brd_key = $this->board->item_id('brd_key', element('brd_id', $val));
$view['view']['latest_post']['list'][$key]['post_url'] = post_url($brd_key, element('post_id', $val));
$view['view']['latest_post']['list'][$key]['display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
}
}
$view['view']['latest_comment'] = $this->Comment_model->get_admin_list(7, '', '', '', 'cmt_id', 'desc', '', '');
if (isset($view['view']['latest_comment']['list']) && is_array($view['view']['latest_comment']['list'])) {
foreach ($view['view']['latest_comment']['list'] as $key => $val) {
$post = $this->Post_model->get_one(element('post_id', $val), 'brd_id');
$brd_key = $this->board->item_id('brd_key', element('brd_id', $post));
$view['view']['latest_comment']['list'][$key]['post_url'] = post_url($brd_key, element('post_id', $val)) . '#comment_' . element('cmt_id', $val);
$view['view']['latest_comment']['list'][$key]['display_name'] = display_username(
element('cmt_userid', $val),
element('cmt_nickname', $val)
);
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'main');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,380 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Blame class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>신고 controller 입니다.
*/
class Blame extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/blame';
/**
* 모델을 로딩합니다
*/
protected $models = array('Blame', 'Board', 'Post', 'Comment');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Blame_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_blame_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('bla_id', 'target_id', 'target_type', 'blame.mem_id', 'target_mem_id', 'bla_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('bla_id', 'target_id', 'blame.mem_id', 'target_mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('bla_id'); // 정렬이 가능한 필드
$where = array();
if ($brdid = (int) $this->input->get('brd_id')) {
$where['blame.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['list'][$key]['target_member'] = $target_member = $this->Member_model->get_by_memid(element('target_mem_id', $val), $select);
$result['list'][$key]['target_display_name'] = display_username(
element('mem_userid', $target_member),
element('mem_nickname', $target_member),
element('mem_icon', $target_member)
);
$result['list'][$key]['num'] = $list_num--;
$select = 'post_id, brd_id, post_title, post_datetime, post_ip';
if (element('target_type', $val) === '1') {
$result['list'][$key]['target_name'] = '원글';
$result['list'][$key]['post'] = $post = $this->Post_model->get_one(element('target_id', $val), $select);
if ($post) {
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $post));
$result['list'][$key]['origin_content'] = element('post_title', $post);
$result['list'][$key]['origin_datetime'] = element('post_datetime', $post);
$result['list'][$key]['origin_ip'] = element('post_ip', $post);
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $post));
}
} elseif (element('target_type', $val) === '2') {
$result['list'][$key]['target_name'] = '댓글';
$commentselect = 'cmt_id, post_id, cmt_content, cmt_datetime, cmt_ip';
$result['list'][$key]['comment'] = $comment
= $this->Comment_model->get_one(element('target_id', $val), $commentselect);
if ($comment) {
$result['list'][$key]['post'] = $post
= $this->Post_model->get_one(element('post_id', $comment), $select);
$result['list'][$key]['origin_content'] = cut_str(element('cmt_content', $comment),40);
$result['list'][$key]['origin_datetime'] = element('cmt_datetime', $comment);
$result['list'][$key]['origin_ip'] = element('cmt_ip', $comment);
if ($post) {
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $post));
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $post)) . '#comment_id=' . element('cmt_id', $comment);
}
}
}
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('bla_ip' => '신고IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 신고현황을 그래프 형식으로 보는 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_blame_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_blame_count($datetype, $start_date, $end_date, $brd_id, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int) ($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=신고현황_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_blame_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$getdata = $this->{$this->modelname}->get_one($val);
if ( ! element('bla_id', $getdata)) {
continue;
}
$this->{$this->modelname}->delete($val);
$where = array(
'target_id' => element('target_id', $getdata),
'target_type' => element('target_type', $getdata),
);
$blame_cnt = $this->{$this->modelname}->count_by($where);
if (element('target_type', $getdata) === '1') { // 원글 신고의 경우
$updatedata = array(
'post_blame' => $blame_cnt,
);
$this->Post_model->update(element('target_id', $getdata), $updatedata);
} elseif (element('target_type', $getdata) === '2') { // 댓글 신고의 경우
$updatedata = array(
'cmt_blame' => $blame_cnt,
);
$this->Comment_model->update(element('target_id', $getdata), $updatedata);
}
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,727 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Boardgroup class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>게시판그룹관리 controller 입니다.
*/
class Boardgroup extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/boardgroup';
/**
* 모델을 로딩합니다
*/
protected $models = array('Board_group', 'Board_group_meta', 'Board', 'Board_group_admin');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Board_group_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_boardgroup_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'bgr_id' => $param->sort('bgr_id', 'asc'),
'bgr_key' => $param->sort('bgr_key', 'asc'),
'bgr_name' => $param->sort('bgr_name', 'asc'),
'bgr_order' => $param->sort('bgr_order', 'asc'),
);
$findex = $this->input->get('findex', null, 'bgr_order');
$forder = $this->input->get('forder', null, 'asc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('bgr_id', 'bgr_key', 'bgr_name', 'bgr_order'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('bgr_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('bgr_id', 'bgr_key', 'bgr_name', 'bgr_order'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$countwhere = array(
'bgr_id' => element('bgr_id', $val),
);
$result['list'][$key]['brd_cnt'] = $this->Board_model->count_by($countwhere);
$result['list'][$key]['meta'] = $this->Board_group_meta_model
->get_all_meta(element('bgr_id', $val));
$result['list'][$key]['group_skin_option'] = get_skin_name(
'group',
element('group_skin', $result['list'][$key]['meta']),
'기본설정따름'
);
$result['list'][$key]['group_mobile_skin_option'] = get_skin_name(
'group',
element('group_mobile_skin', $result['list'][$key]['meta']),
'기본설정따름'
);
$result['list'][$key]['group_layout_option'] = get_skin_name(
'_layout',
element('group_layout', $result['list'][$key]['meta']),
'기본설정따름'
);
$result['list'][$key]['group_mobile_layout_option'] = get_skin_name(
'_layout',
element('group_mobile_layout', $result['list'][$key]['meta']),
'기본설정따름'
);
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('bgr_key' => 'KEY', 'bgr_name' => '제목', 'bgr_order' => '정렬순서');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_update_url'] = admin_url($this->pagedir . '/listupdate/?' . $param->output());
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 게시판 글쓰기 또는 수정 페이지를 가져오는 메소드입니다
*/
public function write($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_boardgroup_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다
*/
if ($pid) {
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
}
$primary_key = $this->{$this->modelname}->primary_key;
/**
* 수정 페이지일 경우 기존 데이터를 가져옵니다
*/
if ($pid) {
$getdata = $this->{$this->modelname}->get_one($pid);
$board_group_meta = $this->Board_group_meta_model->get_all_meta($getdata['bgr_id']);
if (is_array($board_group_meta)) {
$getdata = array_merge($getdata, $board_group_meta);
}
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'bgr_name',
'label' => '그룹명',
'rules' => 'trim|required',
),
array(
'field' => 'bgr_order',
'label' => '그룹정렬순서',
'rules' => 'trim|required|numeric|is_natural',
),
array(
'field' => 'group_layout',
'label' => '레이아웃',
'rules' => 'trim',
),
array(
'field' => 'group_mobile_layout',
'label' => '모바일레이아웃',
'rules' => 'trim',
),
array(
'field' => 'group_sidebar',
'label' => '사이드바',
'rules' => 'trim',
),
array(
'field' => 'group_mobile_sidebar',
'label' => '모바일사이드바',
'rules' => 'trim',
),
array(
'field' => 'group_skin',
'label' => '스킨',
'rules' => 'trim',
),
array(
'field' => 'group_mobile_skin',
'label' => '모바일스킨',
'rules' => 'trim',
),
array(
'field' => 'header_content',
'label' => '상단내용',
'rules' => 'trim',
),
array(
'field' => 'footer_content',
'label' => '하단내용',
'rules' => 'trim',
),
array(
'field' => 'mobile_header_content',
'label' => '모바일상단내용',
'rules' => 'trim',
),
array(
'field' => 'mobile_footer_content',
'label' => '모바일하단내용',
'rules' => 'trim',
),
);
if ($this->input->post($primary_key)) {
$config[] = array(
'field' => 'bgr_key',
'label' => '페이지주소',
'rules' => 'trim|required|alpha_dash|min_length[3]|max_length[50]|is_unique[board_group.bgr_key.bgr_id.' . $getdata['bgr_id'] . ']',
);
} else {
$config[] = array(
'field' => 'bgr_key',
'label' => '페이지주소',
'rules' => 'trim|required|alpha_dash|min_length[3]|max_length[50]|is_unique[board_group.bgr_key]',
);
}
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$bgr_order = $this->input->post('bgr_order') ? $this->input->post('bgr_order') : 0;
$updatedata = array(
'bgr_key' => $this->input->post('bgr_key', null, ''),
'bgr_name' => $this->input->post('bgr_name', null, ''),
'bgr_order' => $bgr_order,
);
$array = array(
'group_layout', 'group_mobile_layout', 'group_sidebar', 'group_mobile_sidebar',
'group_skin', 'group_mobile_skin', 'header_content', 'footer_content',
'mobile_header_content', 'mobile_footer_content',);
$metadata = array();
if ($array) {
foreach ($array as $value) {
$metadata[$value] = $this->input->post($value, null, '');
}
}
/**
* 게시물을 수정하는 경우입니다
*/
if ($this->input->post($primary_key)) {
$this->{$this->modelname}->update($this->input->post($primary_key), $updatedata);
$this->Board_group_meta_model->save($pid, $metadata);
$view['view']['alert_message'] = '기본정보 설정이 저장되었습니다';
} else {
/**
* 게시물을 새로 입력하는 경우입니다
*/
$pid = $this->{$this->modelname}->insert($updatedata);
$this->Board_group_meta_model->save($pid, $metadata);
$this->session->set_flashdata(
'message',
'기본정보 설정이 저장되었습니다'
);
$redirecturl = admin_url($this->pagedir . '/write/' . $pid);
redirect($redirecturl);
}
}
$getdata = array();
if ($pid) {
$getdata = $this->{$this->modelname}->get_one($pid);
$board_group_meta = $this->Board_group_meta_model->get_all_meta($getdata['bgr_id']);
if (is_array($board_group_meta)) {
$getdata = array_merge($getdata, $board_group_meta);
}
}
$view['view']['data'] = $getdata;
$view['view']['data']['group_layout_option'] = get_skin_name(
'_layout',
set_value('group_layout', element('group_layout', $getdata)),
'기본설정따름'
);
$view['view']['data']['group_mobile_layout_option'] = get_skin_name(
'_layout',
set_value('group_mobile_layout', element('group_mobile_layout', $getdata)),
'기본설정따름'
);
$view['view']['data']['group_skin_option'] = get_skin_name(
'group',
set_value('group_skin', element('group_skin', $getdata)),
'기본설정따름'
);
$view['view']['data']['group_mobile_skin_option'] = get_skin_name(
'group',
set_value('group_mobile_skin', element('group_mobile_skin', $getdata)),
'기본설정따름'
);
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $primary_key;
$view['view']['grouplist'] = $this->Board_group_model->get_group_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 그룹관리자를 관리하는 페이지입니다
*/
public function write_admin($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_boardgroup_write_admin';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다
*/
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'bgr_id',
'label' => '그룹아이디',
'rules' => 'trim|required|numeric|is_natural',
),
array(
'field' => 'userid',
'label' => '회원아이디',
'rules' => 'trim|required|alpha_dash|min_length[3]|max_length[50]|callback__userid_check[' . $pid . ']',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$memdata = $this->Member_model
->get_by_userid($this->input->post('userid'), 'mem_id');
$mem_id = element('mem_id', $memdata);
$insertdata = array(
'bgr_id' => $this->input->post('bgr_id'),
'mem_id' => $mem_id,
);
$this->Board_group_admin_model->insert($insertdata);
}
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->Board_group_admin_model->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$getdata = $this->{$this->modelname}->get_one($pid);
$where = array(
'bgr_id' => $pid,
);
$result = $this->Board_group_admin_model
->get('', '', $where, '', '', $findex, $forder);
if ($result && is_array($result)) {
foreach ($result as $key => $val) {
$select = 'mem_id, mem_userid, mem_nickname, mem_email, mem_icon';
$result[$key]['member'] = $dbmember = $this->Member_model->get_by_memid(element('mem_id', $val), $select);
$result[$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
}
}
$view['view']['list'] = $result;
$view['view']['data'] = $getdata;
$primary_key = $this->Board_group_admin_model->primary_key;
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/write_admin_delete/' . $pid . '?' . $param->output());
$view['view']['primary_key'] = $primary_key;
$view['view']['grouplist'] = $this->Board_group_model->get_group_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write_admin');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 그룹 관리자 추가시 실제 존재하는 회원인지 체크합니다.
*/
public function _userid_check($str, $pid)
{
if (empty($str)) {
$this->form_validation->set_message(
'_userid_check',
'회원아이디가 입력되지 않았습니다'
);
return false;
}
$select = 'mem_id, mem_denied';
$getdata = $this->Member_model->get_by_userid($str, $select);
if ( ! element('mem_id', $getdata)) {
$this->form_validation->set_message(
'_userid_check',
$str . ' 은(는) 존재하지 않는 회원아이디입니다'
);
return false;
} elseif (element('mem_denied', $getdata)) {
$this->form_validation->set_message(
'_userid_check',
$str . ' 은(는) 탈퇴 또는 차단된 회원아이디입니다'
);
return false;
} else {
$where = array(
'bgr_id' => $pid,
'mem_id' => element('mem_id', $getdata),
);
$chkdata = $this->Board_group_admin_model->get_one('', '', $where);
if (element('mem_id', $chkdata)) {
$this->form_validation->set_message(
'_userid_check',
$str . ' 은(는) 이미 입력된 회원아이디입니다'
);
return false;
}
return true;
}
}
/**
* 목록 페이지에서 선택수정을 하는 경우 실행되는 메소드입니다
*/
public function listupdate()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_boardgroup_listupdate';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 업데이트를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
$bgr_name = $this->input->post('bgr_name');
$bgr_order = $this->input->post('bgr_order');
$group_layout = $this->input->post('group_layout');
$group_mobile_layout = $this->input->post('group_mobile_layout');
$group_sidebar = $this->input->post('group_sidebar');
$group_mobile_sidebar = $this->input->post('group_mobile_sidebar');
$group_skin = $this->input->post('group_skin');
$group_mobile_skin = $this->input->post('group_mobile_skin');
foreach ($this->input->post('chk') as $val) {
if ($val) {
$bgr_order_update = element($val, $bgr_order) ? element($val, $bgr_order) : 0;
$updatedata = array(
'bgr_name' => element($val, $bgr_name),
'bgr_order' => $bgr_order_update,
);
$this->{$this->modelname}->update($val, $updatedata);
$metadata = array(
'group_layout' => element($val, $group_layout),
'group_mobile_layout' => element($val, $group_mobile_layout),
'group_sidebar' => element($val, $group_sidebar),
'group_mobile_sidebar' => element($val, $group_mobile_sidebar),
'group_skin' => element($val, $group_skin),
'group_mobile_skin' => element($val, $group_mobile_skin),
);
$this->Board_group_meta_model->save($val, $metadata);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 업데이트가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 수정되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_boardgroup_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$msg = '';
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$countwhere = array(
'bgr_id' => $val,
);
$cnt = $this->Board_model->count_by($countwhere);
if ($cnt > 0) {
$this->session->set_flashdata(
'message',
'게시판이 존재하는 그룹은 삭제할 수 없습니다'
);
$msg = 1;
}
if ($cnt === 0) {
$this->{$this->modelname}->delete($val);
$deletewhere = array(
'bgr_id' => $val,
);
$this->Board_group_admin_model->delete_where($deletewhere);
$this->Board_group_meta_model->deletemeta($val);
}
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
if (empty($msg)) {
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
}
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 그룹관리자 삭제를 할 경우 실행되는 메소드입니다
*/
public function write_admin_delete($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_boardgroup_write_admin_delete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->Board_group_admin_model->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '/write_admin/' . $pid . '?' . $param->output());
redirect($redirecturl);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,239 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Comment class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>댓글관리 controller 입니다.
*/
class Comment extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/comment';
/**
* 모델을 로딩합니다
*/
protected $models = array('Comment', 'Board', 'Comment_meta');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Comment_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_comment_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = 'cmt_id';
$forder = 'desc';
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('cmt_id', 'comment.post_id', 'cmt_content', 'comment.mem_id', 'post.mem_id', 'cmt_username', 'cmt_nickname', 'cmt_datetime', 'cmt_ip', 'cmt_device'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('cmt_id', 'comment.post_id', 'comment.mem_id', 'post.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('cmt_id'); // 정렬이 가능한 필드
$where = array(
'cmt_del <>' => 2,
);
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('cmt_userid', $val),
element('cmt_nickname', $val)
);
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
$result['list'][$key]['num'] = $list_num--;
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $val));
$result['list'][$key]['commenturl'] = post_url(element('brd_key', $board), element('post_id', $val)) . '#comment_' . element('cmt_id', $val);
}
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('cmt_content' => '내용', 'cmt_username' => '실명', 'cmt_nickname' => '닉네임', 'cmt_datetime' => '날짜', 'cmt_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
$view['view']['list_trash_url'] = admin_url($this->pagedir . '/listtrash/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_comment_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->board->delete_comment($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 목록 페이지에서 휴지통을 클릭한 경우 실행되는 메소드입니다
*/
public function listtrash()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_comment_listtrash';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$updatedata = array(
'cmt_del' => 2,
);
$this->Comment_model->update($val, $updatedata);
$metadata = array(
'trash_mem_id' => $this->member->item('mem_id'),
'trash_datetime' => cdate('Y-m-d H:i:s'),
'trash_ip' => $this->input->ip_address(),
);
$this->Comment_meta_model->save($val, $metadata);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 휴지통으로 이동되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,356 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Editorimage class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>에디터이미지 controller 입니다.
*/
class Editorimage extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/editorimage';
/**
* 모델을 로딩합니다
*/
protected $models = array('Editor_image');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Editor_image_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'number');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_editorimage_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'eim_id' => $param->sort('eim_id', 'asc'),
'eim_filesize' => $param->sort('eim_filesize', 'asc'),
'eim_datetime' => $param->sort('eim_datetime', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('eim_id', 'editor_image.mem_id', 'eim_originname', 'eim_filename', 'eim_datetime', 'eim_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('eim_id', 'editor_image.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('eim_id', 'eim_filesize', 'eim_datetime'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['download_link'] = admin_url($this->pagedir . '/download/' . element('eim_id', $val));
$result['list'][$key]['origin_image_url'] = thumb_url('editor', element('eim_filename', $val));
$result['list'][$key]['thumb_url'] = thumb_url('editor', element('eim_filename', $val), '80');
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('eim_originname' => '파일명', 'eim_datetime' => '올린날짜', 'eim_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 파일 업로드 현황을 그래프 형식으로 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_editorimage_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_editor_file_by_date($datetype, $start_date, $end_date, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=에디터이미지_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_editorimage_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 파일다운로드시 실행되는 함수입니다
*/
public function download($eim_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_editorimage_download';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$eim_id = (int) $eim_id;
if (empty($eim_id) OR $eim_id < 1) {
show_404();
}
$file = $this->{$this->modelname}->get_one($eim_id);
if ( ! element('eim_id', $file)) {
show_404();
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
$this->load->helper('download');
$data = file_get_contents(config_item('uploads_dir') . '/editor/' . element('eim_filename', $file)); // Read the file's contents
$name = element('eim_originname', $file);
if ($name && $data) {
force_download($name, $data);
}
}
}

View File

@@ -0,0 +1,427 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Filedownload class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>파일다운로드 controller 입니다.
*/
class Filedownload extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/filedownload';
/**
* 모델을 로딩합니다
*/
protected $models = array('Board', 'Post_file_download_log');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_file_download_log_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'number');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_filedownload_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('pfd_id', 'pfi_id', 'post.post_id', 'post.mem_id', 'post_file_download_log.mem_id', 'pfd_datetime', 'pfd_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('pfd_id', 'pfi_id', 'post.post_id', 'post.mem_id', 'post_file_download_log.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('pfd_id'); // 정렬이 가능한 필드
$where = array();
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['list'][$key]['member'] = $dbmember = $this->Member_model->get_by_memid(element('mem_id', $val), $select);
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
$brd_key = $this->board->item_id('brd_key', element('brd_id', $val));
$result['list'][$key]['posturl'] = post_url($brd_key, element('post_id', $val));
$result['list'][$key]['download_link'] = admin_url('board/fileupload/download/' . element('pfi_id', $val));
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
}
if (element('pfd_useragent', $val)) {
$userAgent = get_useragent_info(element('pfd_useragent', $val));
$result['list'][$key]['browsername'] = $userAgent['browsername'];
$result['list'][$key]['browserversion'] = $userAgent['browserversion'];
$result['list'][$key]['os'] = $userAgent['os'];
$result['list'][$key]['engine'] = $userAgent['engine'];
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('pfd_datetime' => '날짜', 'pfd_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 파일 다운로드 현황을 그래프 형식으로 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_filedownload_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_post_file_download_count($datetype, $start_date, $end_date, $brd_id, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=파일다운로드_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_filedownload_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 오래된 파일다운로드로그 페이지입니다
*/
public function cleanlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_filedownload_cleanlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'pfd_datetime <=' => $this->input->post('criterion'),
);
$this->Post_file_download_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 파일다운로드로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'pfd_datetime <=' => $criterion,
);
$log_count = $this->Post_file_download_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 파일다운로드로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 파일다운로드로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cleanlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,379 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Fileupload class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>파일업로드 controller 입니다.
*/
class Fileupload extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/fileupload';
/**
* 모델을 로딩합니다
*/
protected $models = array('Board', 'Post_file', 'Post_file_download_log');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_file_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'number');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_fileupload_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'pfi_id' => $param->sort('pfi_id', 'asc'),
'pfi_filesize' => $param->sort('pfi_filesize', 'asc'),
'pfi_download' => $param->sort('pfi_download', 'asc'),
'pfi_datetime' => $param->sort('pfi_datetime', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('pfi_id', 'post.post_id', 'post.mem_id', 'pfi_originname', 'pfi_filename', 'pfi_datetime', 'pfi_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('pfi_id', 'post.post_id', 'post.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('pfi_id', 'pfi_filesize', 'pfi_download', 'pfi_datetime'); // 정렬이 가능한 필드
$where = array();
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
$brd_key = $this->board->item_id('brd_key', element('brd_id', $val));
$result['list'][$key]['posturl'] = post_url($brd_key, element('post_id', $val));
$result['list'][$key]['download_link'] = admin_url($this->pagedir . '/download/' . element('pfi_id', $val));
if (element('pfi_is_image', $val)) {
$result['list'][$key]['origin_image_url'] = thumb_url('post', element('pfi_filename', $val));
$result['list'][$key]['thumb_url'] = thumb_url('post', element('pfi_filename', $val), '80');
}
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('pfi_originname' => '파일명', 'pfi_datetime' => '올린날짜', 'pfi_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 파일 업로드 현황을 그래프 형식으로 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_fileupload_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_post_file_by_date($datetype, $start_date, $end_date, $brd_id, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=파일업로드_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_fileupload_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
$deletewhere = array(
'pfi_id' => $val,
);
$this->Post_file_download_log_model->delete_where($deletewhere);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 파일다운로드시 실행되는 함수입니다
*/
public function download($pfi_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_fileupload_download';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$pfi_id = (int) $pfi_id;
if (empty($pfi_id) OR $pfi_id < 1) {
show_404();
}
$file = $this->{$this->modelname}->get_one($pfi_id);
if ( ! element('pfi_id', $file)) {
show_404();
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
$this->load->helper('download');
// Read the file's contents
$data = file_get_contents(config_item('uploads_dir') . '/post/' . element('pfi_filename', $file));
$name = element('pfi_originname', $file);
if ($name && $data) {
force_download($name, $data);
}
}
}

View File

@@ -0,0 +1,534 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Like class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>추천/비추 controller 입니다.
*/
class Like extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/like';
/**
* 모델을 로딩합니다
*/
protected $models = array('Like', 'Board', 'Post', 'Comment');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Like_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_like_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('lik_id', 'target_id', 'target_type', 'post_id', 'like.mem_id', 'target_mem_id', 'lik_type', 'lik_datetime', 'lik_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('lik_id', 'target_id', 'target_type', 'post_id', 'like.mem_id', 'target_mem_id', 'lik_type'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('lik_id'); // 정렬이 가능한 필드
$where = array();
if ($brdid = (int) $this->input->get('brd_id')) {
$where['like.brd_id'] = $brdid;
}
if ($this->input->get('target_type')) {
$where['like.target_type'] = $this->input->get('target_type');
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['target_member'] = $target_member
= $this->Member_model->get_by_memid(element('target_mem_id', $val), 'mem_id, mem_userid, mem_nickname, mem_icon');
$result['list'][$key]['target_display_name'] = display_username(
element('mem_userid', $target_member),
element('mem_nickname', $target_member),
element('mem_icon', $target_member)
);
$result['list'][$key]['num'] = $list_num--;
if (element('target_type', $val) === '1') {
$result['list'][$key]['target_name'] = '원글';
$result['list'][$key]['post'] = $post = $this->Post_model->get_one(element('target_id', $val), 'post_id, brd_id, post_title');
if ($post) {
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $post));
$result['list'][$key]['origin_content'] = element('post_title', $post);
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $post));
}
} elseif (element('target_type', $val) === '2') {
$result['list'][$key]['target_name'] = '댓글';
$result['list'][$key]['comment'] = $comment = $this->Comment_model->get_one(element('target_id', $val), 'cmt_id, post_id, cmt_content');
if ($comment) {
$result['list'][$key]['post'] = $post = $this->Post_model->get_one(element('post_id', $comment));
$result['list'][$key]['origin_content'] = cut_str(element('cmt_content', $comment),40);
if ($post) {
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $post));
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $post)) . '#comment_id=' . element('cmt_id', $comment);
}
}
}
if (element('lik_type', $val) === '1') {
$result['list'][$key]['like_or_dislike'] = '<span class="label label-success">추천</span>';
} elseif (element('lik_type', $val) === '2') {
$result['list'][$key]['like_or_dislike'] = '<span class="label label-warning">비추</span>';
}
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('lik_datetime' => '날짜', 'lik_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 추천수를 그래프 형식으로 보는 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_like_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_like_count($datetype, $start_date, $end_date, $brd_id, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=추천_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 비추천 수를 그래프 형식으로 보는 페이지입니다
*/
public function graph_dislike($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_like_graph_dislike';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_dislike_count($datetype, $start_date, $end_date, $brd_id, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=비추천_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_dislike_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph_dislike');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_like_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$getdata = $this->{$this->modelname}->get_one($val);
$this->{$this->modelname}->delete($val);
$where = array(
'target_id' => element('target_id', $getdata),
'target_type' => element('target_type', $getdata),
'lik_type' => element('lik_type', $getdata),
);
$like_cnt = $this->{$this->modelname}->count_by($where);
if (element('target_type', $getdata) === '1') { // 원글 추천의 경우
if (element('lik_type', $getdata) === '1') {
$updatedata = array(
'post_like' => $like_cnt,
);
$this->Post_model->update(element('target_id', $getdata), $updatedata);
} elseif (element('lik_type', $getdata) === '2') {
$updatedata = array(
'post_dislike' => $like_cnt,
);
$this->Post_model->update(element('target_id', $getdata), $updatedata);
}
} elseif (element('target_type', $getdata) === '2') { // 댓글 추천의 경우
if (element('lik_type', $getdata) === '1') {
$updatedata = array(
'cmt_like' => $like_cnt,
);
$this->Comment_model->update(element('target_id', $getdata), $updatedata);
} elseif (element('lik_type', $getdata) === '2') {
$updatedata = array(
'cmt_dislike' => $like_cnt,
);
$this->Comment_model->update(element('target_id', $getdata), $updatedata);
}
}
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,429 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Linkclick class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>링크 클릭 controller 입니다.
*/
class Linkclick extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/linkclick';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post_link_click_log', 'Post_link', 'Board');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_link_click_log_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_linkclick_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('plc_id', 'pln_id', 'post.post_id', 'post.mem_id', 'post_link_click_log.mem_id', 'plc_datetime', 'plc_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('plc_id', 'pln_id', 'post.post_id', 'post.mem_id', 'post_link_click_log.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('plc_id'); // 정렬이 가능한 필드
$where = array();
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['list'][$key]['member'] = $dbmember = $this->Member_model->get_by_memid(element('mem_id', $val), $select);
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
$brd_key = $this->board->item_id('brd_key', element('brd_id', $val));
$result['list'][$key]['posturl'] = post_url($brd_key, element('post_id', $val));
$result['list'][$key]['post_link'] = $this->Post_link_model->get_one(element('pln_id', $val));
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
}
if (element('plc_useragent', $val)) {
$userAgent = get_useragent_info(element('plc_useragent', $val));
$result['list'][$key]['browsername'] = $userAgent['browsername'];
$result['list'][$key]['browserversion'] = $userAgent['browserversion'];
$result['list'][$key]['os'] = $userAgent['os'];
$result['list'][$key]['engine'] = $userAgent['engine'];
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('plc_datetime' => '날짜', 'plc_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 그래프 형식으로 보는 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_linkclick_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_link_click_count($datetype, $start_date, $end_date, $brd_id, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=링크클릭_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_linkclick_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 오래된 링크클릭로그삭제 페이지입니다
*/
public function cleanlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_linkclick_cleanlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'plc_datetime <=' => $this->input->post('criterion'),
);
$this->Post_link_click_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 링크클릭로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'plc_datetime <=' => $criterion,
);
$log_count = $this->Post_link_click_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 링크클릭로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 링크클릭로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cleanlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,281 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Naversyndilog class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>네이버 신디케이션 핑전송로그 controller 입니다.
*/
class Naversyndilog extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/naversyndilog';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post_naver_syndi_log', 'Board');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_naver_syndi_log_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_naversyndilog_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('pns_id', 'post_naver_syndi_log.post_id', 'post_naver_syndi_log.mem_id', 'pns_status', 'pns_return_code', 'pns_return_message', 'pns_receipt_number', 'pns_datetime'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('pns_id', 'post_naver_syndi_log.post_id', 'post_naver_syndi_log.mem_id', 'pns_return_code'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('pns_id', 'post_naver_syndi_log.post_id'); // 정렬이 가능한 필드
$where = array();
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['list'][$key]['member'] = $dbmember = $this->Member_model->get_by_memid(element('mem_id', $val), $select);
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
$brd_key = $this->board->item_id('brd_key', element('brd_id', $val));
$result['list'][$key]['posturl'] = post_url($brd_key, element('post_id', $val));
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('pns_return_code' => 'Return Code', 'pns_return_message' => 'Return Message', 'pns_receipt_number' => 'Receipt Number', 'pns_datetime' => '날짜');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_naversyndilog_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 오래된 링크클릭로그삭제 페이지입니다
*/
public function cleanlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_naversyndilog_cleanlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'pns_datetime <=' => $this->input->post('criterion'),
);
$this->Post_naver_syndi_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 네이버신디케이션전송로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'pns_datetime <=' => $criterion,
);
$log_count = $this->Post_naver_syndi_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 네이버신디케이션전송로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 네이버신디케이션전송로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cleanlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,248 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Post class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>게시물관리 controller 입니다.
*/
class Post extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/post';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post', 'Board', 'Post_file', 'Post_meta', 'Board_category');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_post_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = 'post_id';
$forder = 'desc';
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('post_id', 'post_title', 'post_content', 'mem_id', 'post_username', 'post_nickname', 'post_email', 'post_homepage', 'post_datetime', 'post_ip', 'post_device'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('post_id', 'mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('post_id'); // 정렬이 가능한 필드
$where = array(
'post_del <>' => 2,
);
if ($brdid = (int) $this->input->get('brd_id')) {
$where['brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
$result['list'][$key]['num'] = $list_num--;
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $val));
}
$result['list'][$key]['category'] = '';
if (element('post_category', $val)) {
$result['list'][$key]['category'] = $this->Board_category_model->get_category_info(element('brd_id', $val), element('post_category', $val));
}
if (element('post_image', $val)) {
$imagewhere = array(
'post_id' => element('post_id', $val),
'pfi_is_image' => 1,
);
$file = $this->Post_file_model->get_one('', '', $imagewhere, '', '', 'pfi_id', 'ASC');
$result['list'][$key]['thumb_url'] = thumb_url('post', element('pfi_filename', $file), 80);
} else {
$result['list'][$key]['thumb_url'] = get_post_image_url(element('post_content', $val), 80);
}
}
}
$view['view']['data'] = $result;
$select = 'brd_id, brd_name';
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('post_title' => '제목', 'post_content' => '내용', 'post_username' => '실명', 'post_nickname' => '닉네임', 'post_email' => '이메일', 'post_homepage' => '홈페이지', 'post_datetime' => '작성일', 'post_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
$view['view']['list_trash_url'] = admin_url($this->pagedir . '/listtrash/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_post_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->board->delete_post($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 목록 페이지에서 휴지통을 클릭한 경우 실행되는 메소드입니다
*/
public function listtrash()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_post_listtrash';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$updatedata = array(
'post_del' => 2,
);
$this->Post_model->update($val, $updatedata);
$metadata = array(
'trash_mem_id' => $this->member->item('mem_id'),
'trash_datetime' => cdate('Y-m-d H:i:s'),
'trash_ip' => $this->input->ip_address(),
);
$board = $this->Post_model->get_one($val, 'brd_id');
$this->Post_meta_model->save($val, element('brd_id', $board), $metadata);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 휴지통으로 이동되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,394 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Posthistory class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>게시물변경로그 controller 입니다.
*/
class Posthistory extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/posthistory';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post_history', 'Post', 'Board');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_history_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 함수입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_posthistory_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('phi_id', 'post_history.post_id', 'post_history.mem_id', 'phi_title', 'phi_content', 'phi_ip', 'phi_datetime'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('phi_id', 'post_history.post_id', 'post_history.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('phi_id'); // 정렬이 가능한 필드
$where = array(
'post.post_del' => 0,
);
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
$result['list'][$key]['num'] = $list_num--;
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $val));
}
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('phi_title' => '제목', 'phi_content' => '내용', 'phi_ip' => 'IP', 'phi_datetime' => '변경일');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 상세보기 페이지를 가져오는 함수입니다
*/
public function view($phi_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_posthistory_view';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$phi_id = (int) $phi_id;
if (empty($phi_id) OR $phi_id < 1) {
show_404();
}
$view = array();
$view['view'] = array();
$param =& $this->querystring;
$result = $this->{$this->modelname}->get_one($phi_id);
if ( ! element('phi_id', $result)) {
show_404();
}
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['member'] = $dbmember = $this->Member_model->get_by_memid(element('mem_id', $result), $select);
$result['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
$select = 'post_id, brd_id, post_title, post_userid, post_nickname, post_datetime, post_ip, post_hit, post_secret';
$result['post'] = $post = $this->Post_model->get_one(element('post_id', $result), $select);
if ($post) {
$result['board'] = $board = $this->board->item_all(element('brd_id', $post));
}
$result['post_display_name'] = display_username(
element('post_userid', $post),
element('post_nickname', $post)
);
$image_width = ($this->cbconfig->get_device_view_type() === 'mobile') ? element('post_mobile_image_width', $board) : element('post_image_width', $board);
$result['content'] = display_html_content(
element('phi_content', $result),
element('phi_content_html_type', $result),
$image_width
);
$where = array(
'post_id' => element('post_id', $result),
'phi_id <' => element('phi_id', $result),
);
$prev = $this->{$this->modelname}->get('', '', $where, 1, 0, 'phi_id', 'DESC');
if ($prev && element(0, $prev)) {
$prev[0]['content'] = display_html_content(
$prev[0]['phi_content'],
$prev[0]['phi_content_html_type'],
$image_width
);
$result['prev'] = $prev[0];
}
$view['view']['data'] = $result;
$view['view']['delete_url'] = admin_url($this->pagedir . '/delete/' . $phi_id . '?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'view');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_posthistory_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 상세페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function delete($phi_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_posthistory_delete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$phi_id = (int) $phi_id;
if (empty($phi_id) OR $phi_id < 1) {
show_404();
}
$this->{$this->modelname}->delete($phi_id);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 오래된 게시물변경로그 페이지입니다
*/
public function cleanlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_posthistory_cleanlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'phi_datetime <=' => $this->input->post('criterion'),
);
$this->Post_history_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 게시물변경로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'phi_datetime <=' => $criterion,
);
$log_count = $this->Post_history_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 게시물변경로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 게시물변경로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cleanlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,293 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Tag class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>태그관리 controller 입니다.
*/
class Tag extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/tag';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post_tag', 'Post', 'Board');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_tag_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_tag_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'pta_id' => $param->sort('pta_id', 'asc'),
'pta_tag' => $param->sort('pta_tag', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('pta_id', 'post_tag.post_id', 'post_tag.mem_id', 'post.mem_id', 'pta_tag', 'pta_datetime', 'post_title'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('pta_id', 'post_tag.post_id', 'pta_tag', 'post_tag.mem_id', 'post.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('pta_id', 'pta_tag'); // 정렬이 가능한 필드
$where = array(
'post.post_del' => 0,
);
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$brd_key = $this->board->item_id('brd_key', element('brd_id', $val));
$result['list'][$key]['post_display_name'] = display_username(
element('post_userid', $val),
element('post_nickname', $val)
);
$result['list'][$key]['posturl'] = post_url($brd_key, element('post_id', $val));
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('pta_tag' => '태그명', 'post_title' => '게시물제목', 'pta_datetime' => '태그입력일');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 그래프 형식으로 보는 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_tag_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
$brd_id = $this->input->get('brd_id', null, '');
$result = $this->{$this->modelname}->get_post_tag_count($datetype, $start_date, $end_date, $brd_id);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('pta_tag', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$view['view']['list'] = array();
$i = 0;
$k = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$view['view']['list'][$k]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$view['view']['list'][$k]['no'] = $no;
$view['view']['list'][$k]['key'] = $key;
$rate = ($count / $sum_count * 100);
$view['view']['list'][$k]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$view['view']['list'][$k]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$view['view']['list'][$k]['bar'] = $bar;
$k++;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=태그_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_tag_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,466 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Trash class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>휴지통 controller 입니다.
*/
class Trash extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/trash';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post', 'Comment', 'Board', 'Post_file', 'Post_meta', 'Comment_meta');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Post_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = 'post_id';
$forder = 'desc';
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('post_id', 'post_title', 'post_content', 'mem_id', 'post_username', 'post_nickname', 'post_email', 'post_homepage', 'post_datetime', 'post_ip', 'post_device'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('post_id', 'mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('post_id desc'); // 정렬이 가능한 필드
$where = array(
'post_del' => 2,
);
if ($brdid = (int) $this->input->get('brd_id')) {
$where['brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['meta'] = $meta = $this->Post_meta_model->get_all_meta(element('post_id', $val));
if (element('trash_mem_id', $meta)) {
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['list'][$key]['member'] = $dbmember = $this->Member_model->get_by_memid(element('trash_mem_id', $meta), $select);
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember)
);
}
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $val));
$result['list'][$key]['num'] = $list_num--;
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $val));
$filewhere = array(
'post_id' => element('post_id', $val),
'pfi_is_image' => 1,
);
$file = $this->Post_file_model->get_one('', '', $filewhere, '', '', 'pfi_id', 'ASC');
if (element('pfi_filename', $file)) {
$result['list'][$key]['origin_image_url'] = thumb_url('post', element('pfi_filename', $file));
$result['list'][$key]['thumb_url'] = thumb_url('post', element('pfi_filename', $file), '80');
}
}
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('post_title' => '제목', 'post_content' => '내용', 'post_username' => '실명', 'post_nickname' => '닉네임', 'post_email' => '이메일', 'post_homepage' => '홈페이지', 'post_datetime' => '작성일', 'post_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
$view['view']['list_truncate_url'] = admin_url($this->pagedir . '/truncate/?' . $param->output());
$view['view']['list_recover_url'] = admin_url($this->pagedir . '/listrecover/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 상세 페이지입니다
*/
public function view($post_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_view';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$post_id = (int) $post_id;
if (empty($post_id) OR $post_id < 1) {
show_404();
}
$param =& $this->querystring;
$result = $this->{$this->modelname}->get_one($post_id);
$result['meta'] = $this->Post_meta_model->get_all_meta($post_id);
if ( ! element('post_id', $result)) {
show_404();
}
if (element('post_del', $result) !== '2') {
show_404();
}
$result['post_display_name'] = display_username(
element('post_userid', $result),
element('post_nickname', $result)
);
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['member'] = $dbmember
= $this->Member_model->get_by_memid($result['meta']['trash_mem_id'], $select);
$result['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
$result['board'] = $board = $this->board->item_all($result['brd_id']);
if ($board) {
$result['boardurl'] = board_url(element('brd_key', $board));
}
$image_width = element('post_image_width', $board);
$result['content'] = display_html_content(
$result['post_content'],
$result['post_html'],
$image_width
);
$view['view']['data'] = $result;
$view['view']['delete_url'] = admin_url($this->pagedir . '/delete/' . $post_id . '?' . $param->output());
$view['view']['recover_url'] = admin_url($this->pagedir . '/recover/' . $post_id . '?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'view');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->board->delete_post($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 목록 페이지에서 복원을 하는 경우 실행되는 메소드입니다
*/
public function listrecover()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_listrecover';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$updatedata = array(
'post_del' => 0,
);
$this->Post_model->update($val, $updatedata);
$this->Post_meta_model->delete_meta_column('trash_ip');
$this->Post_meta_model->delete_meta_column('trash_mem_id');
$this->Post_meta_model->delete_meta_column('trash_datetime');
$where = array(
'post_id' => $val,
);
$cmts = $this->Comment_model->get('', 'cmt_id', $where);
if ($cmts && is_array($cmts)) {
foreach ($cmts as $cmt) {
$cmt_id = element('cmt_id', $cmt);
$updatedata = array(
'cmt_del' => 0,
);
$this->Comment_model->update($cmt_id, $updatedata);
$this->Comment_meta_model->delete_meta_column('trash_ip');
$this->Comment_meta_model->delete_meta_column('trash_mem_id');
$this->Comment_meta_model->delete_meta_column('trash_datetime');
}
}
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 복원되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 휴지통을 비웁니다
*/
public function truncate()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_truncate';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$where = array(
'post_del' => 2,
);
$result = $this->Post_model->get('', '', $where);
if ($result && is_array($result)) {
foreach ($result as $val) {
if (element('post_id', $val)) {
$post_id = element('post_id', $val);
$this->board->delete_post($post_id);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 뷰페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function delete($post_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_delete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$post_id = (int) $post_id;
if (empty($post_id) OR $post_id < 1) {
show_404();
}
$this->board->delete_post($post_id);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 뷰페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function recover($post_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_recover';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$post_id = (int) $post_id;
if (empty($post_id) OR $post_id < 1) {
show_404();
}
$updatedata = array(
'post_del' => 0,
);
$this->Post_model->update($post_id, $updatedata);
$this->Post_meta_model->delete_meta_column('trash_ip');
$this->Post_meta_model->delete_meta_column('trash_mem_id');
$this->Post_meta_model->delete_meta_column('trash_datetime');
$where = array(
'post_id' => $post_id,
);
$cmts = $this->Comment_model->get('', 'cmt_id', $where);
if ($cmts && is_array($cmts)) {
foreach ($cmts as $cmt) {
$cmt_id = element('cmt_id', $cmt);
$updatedata = array(
'cmt_del' => 0,
);
$this->Comment_model->update($cmt_id, $updatedata);
$this->Comment_meta_model->delete_meta_column('trash_ip');
$this->Comment_meta_model->delete_meta_column('trash_mem_id');
$this->Comment_meta_model->delete_meta_column('trash_datetime');
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 복원되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,429 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Trash_comment class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>게시판설정>휴지통(댓글) controller 입니다.
*/
class Trash_comment extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'board/trash_comment';
/**
* 모델을 로딩합니다
*/
protected $models = array('Post', 'Comment', 'Board', 'Comment_meta');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Comment_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_comment_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = 'cmt_id';
$forder = 'desc';
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('cmt_id', 'cmt_content', 'mem_id', 'cmt_username', 'cmt_nickname', 'cmt_email', 'cmt_datetime', 'cmt_ip', 'cmt_device'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('cmt_id', 'mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('cmt_id desc'); // 정렬이 가능한 필드
$where = array(
'cmt_del' => 2,
);
if ($brdid = (int) $this->input->get('brd_id')) {
$where['post.brd_id'] = $brdid;
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['meta'] = $meta = $this->Comment_meta_model->get_all_meta(element('cmt_id', $val));
$result['list'][$key]['member'] = $dbmember = $this->Member_model->get_by_memid($meta['trash_mem_id'], 'mem_id, mem_userid, mem_nickname, mem_icon');
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember)
);
$result['list'][$key]['post'] = $post = $this->Post_model->get_one(element('post_id', $val));
$result['list'][$key]['board'] = $board = $this->board->item_all(element('brd_id', $post));
$result['list'][$key]['content'] = display_html_content(
$val['cmt_content'],
$val['cmt_html'],
element('post_image_width', $board)
);
$result['list'][$key]['num'] = $list_num--;
if ($board) {
$result['list'][$key]['boardurl'] = board_url(element('brd_key', $board));
$result['list'][$key]['posturl'] = post_url(element('brd_key', $board), element('post_id', $val) . '#comment_id=' . element('cmt_id', $val));
}
}
}
$view['view']['data'] = $result;
$view['view']['boardlist'] = $this->Board_model->get_board_list();
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('cmt_content' => '내용', 'cmt_nickname' => '닉네임', 'cmt_email' => '이메일', 'cmt_datetime' => '작성일', 'cmt_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
$view['view']['list_truncate_url'] = admin_url($this->pagedir . '/truncate/?' . $param->output());
$view['view']['list_recover_url'] = admin_url($this->pagedir . '/listrecover/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 상세 페이지입니다
*/
public function view($cmt_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_comment_view';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$cmt_id = (int) $cmt_id;
if (empty($cmt_id) OR $cmt_id < 1) {
show_404();
}
$param =& $this->querystring;
$result = $this->{$this->modelname}->get_one($cmt_id);
$result['meta'] = $this->Comment_meta_model->get_all_meta($cmt_id);
if ( ! element('cmt_id', $result)) {
show_404();
}
if (element('cmt_del', $result) !== '2') {
show_404();
}
$result['cmt_display_name'] = display_username(
element('cmt_userid', $result),
element('cmt_nickname', $result)
);
$select = 'mem_id, mem_userid, mem_nickname, mem_icon';
$result['member'] = $dbmember
= $this->Member_model->get_by_memid($result['meta']['trash_mem_id'], $select);
$result['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
$result['post'] = $post = $this->Post_model->get_one(element('post_id', $result));
$result['board'] = $board = $this->board->item_all($post['brd_id']);
if ($board) {
$result['boardurl'] = board_url(element('brd_key', $board));
$result['posturl'] = post_url(element('brd_key', $board), element('post_id', $result) . '#comment_id=' . element('cmt_id', $result));
}
$result['content'] = display_html_content(
$result['cmt_content'],
$result['cmt_html'],
element('post_image_width', $board)
);
$view['view']['data'] = $result;
$view['view']['delete_url'] = admin_url($this->pagedir . '/delete/' . $cmt_id . '?' . $param->output());
$view['view']['recover_url'] = admin_url($this->pagedir . '/recover/' . $cmt_id . '?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'view');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_comment_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->board->delete_comment($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 목록 페이지에서 복원을 하는 경우 실행되는 메소드입니다
*/
public function listrecover()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_comment_listrecover';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$updatedata = array(
'cmt_del' => 0,
);
$this->Comment_model->update($val, $updatedata);
$this->Comment_meta_model->delete_meta_column('trash_ip');
$this->Comment_meta_model->delete_meta_column('trash_mem_id');
$this->Comment_meta_model->delete_meta_column('trash_datetime');
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 복원되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 휴지통을 비웁니다
*/
public function truncate()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_comment_truncate';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$where = array(
'cmt_del' => 2,
);
$result = $this->Comment_model->get('', '', $where);
if ($result && is_array($result)) {
foreach ($result as $val) {
if (element('cmt_id', $val)) {
$post_id = element('cmt_id', $val);
$this->board->delete_comment($cmt_id);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 뷰페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function delete($cmt_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_comment_delete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$cmt_id = (int) $cmt_id;
if (empty($cmt_id) OR $cmt_id < 1) {
show_404();
}
$this->board->delete_comment($cmt_id);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 뷰페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function recover($cmt_id = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_board_trash_comment_recover';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$cmt_id = (int) $cmt_id;
if (empty($cmt_id) OR $cmt_id < 1) {
show_404();
}
$updatedata = array(
'cmt_del' => 0,
);
$this->Comment_model->update($cmt_id, $updatedata);
$this->Comment_meta_model->delete_meta_column('trash_ip');
$this->Comment_meta_model->delete_meta_column('trash_mem_id');
$this->Comment_meta_model->delete_meta_column('trash_datetime');
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 복원되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,101 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Browscapupdate class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>Browscap 업데이트 controller 입니다.
*/
class Browscapupdate extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/browscapupdate';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* Browscap 업데이트 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_browscapupdate_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
public function update()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_browscapupdate_update';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
$dir = FCPATH . 'plugin/browscap';
if ( ! (is_readable($dir) && is_writeable($dir))) {
exit(json_encode(array('success' => 'no', 'message' => 'plugin/browscap 경로가 파일쓰기가 금지되어있습니다. 퍼미션 확인 후에 다시 실행바랍니다')));
}
ini_set('memory_limit', '-1');
require_once FCPATH . 'plugin/browscap/Browscap.php';
$browscap = new phpbrowscap\Browscap($dir);
$browscap->updateMethod = 'cURL';
$browscap->cacheFilename = 'browscap_cache.php';
$browscap->updateCache();
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
exit(json_encode(array('success' => 'ok', 'message' => 'Browscap 업데이트가 완료되었습니다')));
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,94 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Cbversion class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>버전정보 controller 입니다.
*/
class Cbversion extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/cbversion';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'file');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('requests'));
}
/**
* 버전정보 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cbversion_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
Requests::register_autoloader();
$headers = array('Accept' => 'application/json');
$postdata = array('requesturl' => current_full_url(), 'package' => CB_PACKAGE, 'version' => CB_VERSION);
try {
$request = Requests::post(config_item('ciboard_check_latest_version'), $headers, $postdata);
$view['view']['latest_versions'] = json_decode($request->body, true);
if (strtolower(CB_PACKAGE) === 'pro') {
$view['view']['latest_version_name'] = $view['view']['latest_versions']['pro_version'];
$view['view']['latest_download_url'] = $view['view']['latest_versions']['pro_downloadurl'];
} else {
$view['view']['latest_version_name'] = $view['view']['latest_versions']['lite_version'];
$view['view']['latest_download_url'] = $view['view']['latest_versions']['lite_downloadurl'];
}
} catch (Exception $e) {
log_message('error', 'Caught exception: '.$e->getMessage());
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,848 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Cleanlog class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>오래된로그삭제 controller 입니다.
*/
class Cleanlog extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/cleanlog';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'file');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 오래된로그 삭제>캐시삭제 페이지입니다
*/
public function index()
{
$this->cache();
}
/**
* 오래된로그 삭제>캐시삭제 페이지입니다
*/
public function cache()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_cache';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'execute',
'label' => '실행',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$result = $this->cache->clean();
if ($result !== false) {
$view['view']['alert_message'] = '캐시가 삭제되었습니다';
} else {
$view['view']['alert_message'] = '캐시 삭제에 실패했습니다';
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cache');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>썸네일삭제 페이지입니다
*/
public function thumbnail()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_thumbnail';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'execute',
'label' => '실행',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$result = delete_files(config_item('uploads_dir') . '/cache/', true);
if ($result !== false) {
$view['view']['alert_message'] = '썸네일이 모두 삭제되었습니다';
} else {
$view['view']['alert_message'] = '썸네일 삭제에 실패했습니다';
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'thumbnail');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>방문자로그삭제 페이지입니다
*/
public function visitlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_visitlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->model(array('Stat_count_model', 'Stat_count_date_model'));
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'sco_date <=' => $this->input->post('criterion'),
);
$this->Stat_count_model->delete_where($deletewhere);
$deletewhere = array(
'scd_date <=' => $this->input->post('criterion')
);
$this->Stat_count_date_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 '
. $this->input->post('day') . '일 이상된 방문자로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'sco_date <=' => $criterion,
);
$log_count = $this->Stat_count_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day')
. '일 이상된 방문자로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day')
. '일 이상된 방문자로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'visitlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>로그인로그삭제 페이지입니다
*/
public function loginlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_loginlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->model('Member_login_log_model');
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'mll_datetime <=' => $this->input->post('criterion'),
);
$this->Member_login_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 '
. $this->input->post('day') . '일 이상된 로그인로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'mll_datetime <=' => $criterion,
);
$log_count = $this->Member_login_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day')
. '일 이상된 로그인로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 로그인로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'loginlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>파일다운로드로그삭제 페이지입니다
*/
public function filedownloadlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_filedownloadlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->model('Post_file_download_log_model');
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'pfd_datetime <=' => $this->input->post('criterion'),
);
$this->Post_file_download_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 '
. $this->input->post('day') . '일 이상된 파일 다운로드 로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'pfd_datetime <=' => $criterion,
);
$log_count = $this->Post_file_download_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 파일 다운로드 로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 파일 다운로드 로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'filedownloadlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>게시물변경로그삭제 페이지입니다
*/
public function posthistory()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_posthistory';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->model('Post_history_model');
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'phi_datetime <=' => $this->input->post('criterion'),
);
$this->Post_history_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 게시물변경로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'phi_datetime <=' => $criterion,
);
$log_count = $this->Post_history_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 게시물변경로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 게시물변경로그로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'posthistory');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>링크클릭로그 삭제 페이지입니다
*/
public function linkclicklog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_linkclicklog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->model('Post_link_click_log_model');
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'plc_datetime <=' => $this->input->post('criterion'),
);
$this->Post_link_click_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 링크클릭로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'plc_datetime <=' => $criterion,
);
$log_count = $this->Post_link_click_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 링크클릭로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 링크클릭로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'linkclicklog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>오래된쪽지삭제 페이지입니다
*/
public function note()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_note';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$this->load->model('Note_model');
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'nte_datetime <=' => $this->input->post('criterion')
);
$this->Note_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 쪽지가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'nte_datetime <=' => $criterion,
);
$log_count = $this->Note_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 쪽지가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 쪽지가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'note');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 오래된로그 삭제>자동로그인로그삭제 페이지입니다
*/
public function autologin()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_cleanlog_autologin';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$this->load->model('Autologin_model');
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'aul_datetime <=' => $this->input->post('criterion'),
);
$this->Autologin_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 자동로그인로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'aul_datetime <=' => $criterion,
);
$log_count = $this->Autologin_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 자동로그인로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 자동로그인로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'autologin');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,130 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Dbupgrade class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>DB 업그레이드 controller 입니다.
*/
class Dbupgrade extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/dbupgrade';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 디비 업그레이드 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_dbupgrade_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 마이그레이션 라이브러리를 가져옵니다
*/
$this->load->library('migration');
$this->config->load('migration');
$row = $this->db->get('migrations')->row();
$view['view']['current_version'] = $row ? $row->version : 0;
$view['view']['latest_version'] = $latest_version = config_item('migration_version');
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'execute',
'label' => '실행',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->migration->version($latest_version) === false) {
$view['view']['alert_message'] = $this->migration->error_string();
} else {
$row = $this->db->get('migrations')->row();
$view['view']['current_version'] = $row ? $row->version : 0;
$view['view']['latest_version'] = config_item('migration_version');
$view['view']['alert_message'] = '최신버전으로 업그레이드가 완료되었습니다';
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,124 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Optimize class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>복구/최적화 controller 입니다.
*/
class Optimize extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/optimize';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 복구/최적화 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_optimize_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'execute',
'label' => '실행',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$view['view']['alert_message'] = '';
$this->load->dbutil();
$result = $this->dbutil->optimize_database();
if ($result !== false) {
foreach ($result as $key => $val) {
$view['view']['alert_message'] .= $key . ' : ' . $val['Msg_text'] . '<br />';
}
$view['view']['alert_message'] .= '복구/ 최적화가 완료되었습니다';
} else {
$view['view']['alert_message'] .= '복구/ 최적화에 실패했습니다';
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,68 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Phpinfo class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>phpinfo controller 입니다.
*/
class Phpinfo extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/phpinfo';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
}
/**
* phpinfo 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_phpinfo_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = false;
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,216 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Preview class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>Preview controller 입니다.
*/
class Preview extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/preview';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
}
/**
* Preview 페이지입니다
*/
public function preview($pagetype)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_preview_preview';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$pagename = array(
'main' => '메인페이지',
'board' => '게시판',
'group' => '게시판그룹',
'document' => '일반문서페이지',
'faq' => 'FAQ',
'register' => '회원가입',
'findaccount' => '아이디패스워드찾기',
'login' => '로그인',
'mypage' => '마이페이지',
'currentvisitor' => '현재접속자',
'search' => '검색페이지',
'tag' => '태그페이지',
'note' => '쪽지',
'profile' => '프로필',
'formmail' => '폼메일',
'notification' => '알림페이지',
'helptool' => '헬프툴',
);
if ( ! element($pagetype, $pagename)) {
alert('잘못된 접근입니다');
}
$previewurl = '';
$pageurl = '';
$use_sidebar_option = true;
if ($pagetype === 'main'
OR $pagetype === 'mypage'
OR $pagetype === 'currentvisitor'
OR $pagetype === 'notification'
OR $pagetype === 'login'
OR $pagetype === 'findaccount') {
$pageurl = $pagetype;
}
if ($pagetype === 'board') {
$this->load->model('Post_model');
$where = array('post_del' => 0);
$latest = $this->Post_model->get('', '', $where, 1, '', 'post_id', 'desc');
$val = element(0, $latest);
if (empty($val)) {
alert_close('최소 1개 이상의 게시물이 작성된 후에 미리보기가 가능합니다');
}
$pageurl = 'board_post/post/' . element('post_id', $val);
}
if ($pagetype === 'group') {
$this->load->model('Board_group_model');
$val = $this->Board_group_model->get_one();
if (empty($val)) {
alert_close('최소 1개 이상의 그룹이 생성된 후에 미리보기가 가능합니다');
}
$pageurl = 'group/index/' . element('bgr_key', $val);
}
if ($pagetype === 'document') {
$this->load->model('Document_model');
$latest = $this->Document_model->get('', '', '', 1, '', 'doc_id', 'desc');
$val = element(0, $latest);
if (empty($val)) {
alert_close('최소 1개 이상의 일반문서가 작성된 후에 미리보기가 가능합니다');
}
$pageurl = 'document/index/' . element('doc_key', $val);
}
if ($pagetype === 'faq') {
$this->load->model('Faq_group_model');
$latest = $this->Faq_group_model->get('', '', '', 1, '', 'fgr_id', 'desc');
$val = element(0, $latest);
if (empty($val)) {
alert_close('최소 1개 이상의 FAQ가 작성된 후에 미리보기가 가능합니다');
}
$pageurl = 'faq/index/' . element('fgr_key', $val);
}
if ($pagetype === 'search') {
$pageurl = 'search/?skeyword=검색&';
}
if ($pagetype === 'tag') {
$this->load->model('Post_tag_model');
$latest = $this->Post_tag_model->get('', '', '', 1, '', 'pta_id', 'desc');
$val = element(0, $latest);
if (empty($val)) {
alert_close('최소 1개 이상의 태그가 작성된 후에 미리보기가 가능합니다');
}
$pageurl = 'tags/?tag=' . element('pta_tag', $val) . '&';
}
if ($pagetype === 'note') {
$use_sidebar_option = false;
$this->load->model('Note_model');
$where = array(
'recv_mem_id' => $this->member->item('mem_id'),
'nte_type' => 1,
);
$latest = $this->Note_model->get('', '', $where, 1, '', 'nte_id', 'desc');
$val = element(0, $latest);
if (empty($val)) {
alert_close('최소 1개 이상의 쪽지를 수신한 후에 미리보기가 가능합니다');
}
$pageurl = 'note/view/recv/' . element('nte_id', $val);
}
if ($pagetype === 'profile') {
$use_sidebar_option = false;
$pageurl = 'profile/index/' . $this->member->item('mem_userid');
}
if ($pagetype === 'formmail') {
$use_sidebar_option = false;
$pageurl = 'formmail/write/' . $this->member->item('mem_userid');
}
if ($pagetype === 'helptool') {
$use_sidebar_option = false;
$pageurl = 'helptool/emoticon';
}
if ($pagetype === 'register') {
$pageurl = 'register/form';
}
$previewurl = admin_url('preview/adminshow/' . $pageurl);
$previewurl .= '?layout=' . $this->input->get('layout', null, '') . '&sidebar=' . $this->input->get('sidebar', null, '') . '&skin=' . $this->input->get('skin', null, '') . '&is_mobile=' . $this->input->get('is_mobile', null, '');
$view['view']['pagetype'] = $pagetype;
$view['view']['previewurl'] = $previewurl;
$view['view']['use_sidebar_option'] = $use_sidebar_option;
$view['view']['pagename'] = element($pagetype, $pagename);
$view['view']['layout_option'] = get_skin_name(
'_layout',
$this->input->get('layout', null, ''),
'기본설정따름'
);
$view['view']['skin_option'] = get_skin_name(
$pagetype,
$this->input->get('skin', null, ''),
'기본설정따름'
);
$view['view']['mobile_layout_option'] = get_skin_name(
'_layout',
$this->input->get('mobile_layout', null, ''),
'기본설정따름'
);
$view['view']['mobile_skin_option'] = get_skin_name(
$pagetype,
$this->input->get('mobile_skin', null, ''),
'기본설정따름'
);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout_popup', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,416 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Rssconfig class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>RSS 피드 controller 입니다.
*/
class Rssconfig extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/rssconfig';
/**
* 모델을 로딩합니다
*/
protected $models = array('Config', 'Board');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Config_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
}
/**
* 환경설정>RSS 피드 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_rssconfig_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'is_submit',
'label' => '전송',
'rules' => 'trim|numeric',
),
array(
'field' => 'use_total_rss_feed',
'label' => '통합 RSS 피드사용',
'rules' => 'trim|numeric',
),
array(
'field' => 'total_rss_feed_content',
'label' => '통합 RSS 내용공개',
'rules' => 'trim|numeric',
),
array(
'field' => 'total_rss_feed_title',
'label' => '통합 RSS 제목',
'rules' => 'trim',
),
array(
'field' => 'total_rss_feed_description',
'label' => '통합 RSS 설명',
'rules' => 'trim',
),
array(
'field' => 'total_rss_feed_copyright',
'label' => 'RSS 표시 저작권',
'rules' => 'trim',
),
array(
'field' => 'total_rss_feed_count',
'label' => 'RSS 출력 게시물수',
'rules' => 'trim|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$array = array(
'use_total_rss_feed', 'total_rss_feed_content', 'total_rss_feed_title',
'total_rss_feed_description', 'total_rss_feed_copyright', 'total_rss_feed_count'
);
foreach ($array as $value) {
$savedata[$value] = $this->input->post($value, null, '');
}
$post_brd_id = $this->input->post('brd_id');
$boardlist = $this->Board_model->get_board_list();
if ($boardlist && is_array($boardlist)) {
$this->load->model('Board_meta_model');
foreach ($boardlist as $key => $val) {
if (element(element('brd_id', $val), $post_brd_id)) {
$metadata = array('use_rss_total_feed' => '1');
} else {
$metadata = array('use_rss_total_feed' => '');
}
$this->Board_meta_model->save(element('brd_id', $val), $metadata);
}
}
$this->Config_model->save($savedata);
$view['view']['alert_message'] = 'RSS 피드설정이 저장되었습니다';
}
$getdata = $this->Config_model->get_all_meta();
$view['view']['data'] = $getdata;
$boardlist = $this->Board_model->get_board_list();
if ($boardlist && is_array($boardlist)) {
$this->load->model('Board_meta_model');
foreach ($boardlist as $key => $val) {
$whereboard = array(
'brd_id' => element('brd_id', $val),
'bmt_key' => 'use_rss_total_feed',
);
$userss = $this->Board_meta_model->get_one('', '', $whereboard);
$boardlist[$key]['userss'] = element('bmt_value', $userss);
}
}
$view['view']['boardlist'] = $boardlist;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 환경설정>사이트맵 페이지입니다
*/
public function sitemap()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_rssconfig_sitemap';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'is_submit',
'label' => '전송',
'rules' => 'trim|numeric',
),
array(
'field' => 'use_sitemap',
'label' => '사이트맵 사용',
'rules' => 'trim|numeric',
),
array(
'field' => 'sitemap_count',
'label' => '사이트맵 출력 게시물수',
'rules' => 'trim|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$array = array(
'use_sitemap', 'sitemap_count'
);
foreach ($array as $value) {
$savedata[$value] = $this->input->post($value, null, '');
}
$post_brd_id = $this->input->post('brd_id');
$boardlist = $this->Board_model->get_board_list();
if ($boardlist && is_array($boardlist)) {
$this->load->model('Board_meta_model');
foreach ($boardlist as $key => $val) {
if (element(element('brd_id', $val), $post_brd_id)) {
$metadata = array('use_sitemap' => '1');
} else {
$metadata = array('use_sitemap' => '');
}
$this->Board_meta_model->save(element('brd_id', $val), $metadata);
}
}
$this->Config_model->save($savedata);
$view['view']['alert_message'] = '사이트맵 설정이 저장되었습니다';
}
$getdata = $this->Config_model->get_all_meta();
if ( ! element('sitemap_count', $getdata)) {
$getdata['sitemap_count'] = 100;
}
$view['view']['data'] = $getdata;
$boardlist = $this->Board_model->get_board_list();
if ($boardlist && is_array($boardlist)) {
$this->load->model('Board_meta_model');
foreach ($boardlist as $key => $val) {
$whereboard = array(
'brd_id' => element('brd_id', $val),
'bmt_key' => 'use_sitemap',
);
$usesitemap = $this->Board_meta_model->get_one('', '', $whereboard);
$boardlist[$key]['usesitemap'] = element('bmt_value', $usesitemap);
}
}
$view['view']['boardlist'] = $boardlist;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'sitemap');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 환경설정>네이버 블로그 글쓰기 관리 페이지입니다
*/
public function naverblog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_rssconfig_naverblog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'is_submit',
'label' => '전송',
'rules' => 'trim|numeric',
),
array(
'field' => 'use_naver_blog_post',
'label' => '네이버 블로그 자동 글쓰기 기능 사용',
'rules' => 'trim|numeric',
),
array(
'field' => 'naver_blog_userid',
'label' => '네이버 블로그 회원 아이디',
'rules' => 'trim',
),
array(
'field' => 'naver_blog_api_key',
'label' => '네이버 블로그 글쓰기 API',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$array = array(
'use_naver_blog_post', 'naver_blog_userid', 'naver_blog_api_key'
);
foreach ($array as $value) {
$savedata[$value] = $this->input->post($value, null, '');
}
$post_brd_id = $this->input->post('brd_id');
$boardlist = $this->Board_model->get_board_list();
if ($boardlist && is_array($boardlist)) {
$this->load->model('Board_meta_model');
foreach ($boardlist as $key => $val) {
if (element(element('brd_id', $val), $post_brd_id)) {
$metadata = array('use_naver_blog_post' => '1');
} else {
$metadata = array('use_naver_blog_post' => '');
}
$this->Board_meta_model->save(element('brd_id', $val), $metadata);
}
}
$this->Config_model->save($savedata);
$view['view']['alert_message'] = '네이버 블로그 자동 글쓰기 설정이 저장되었습니다';
}
$getdata = $this->Config_model->get_all_meta();
$view['view']['data'] = $getdata;
$boardlist = $this->Board_model->get_board_list();
if ($boardlist && is_array($boardlist)) {
$this->load->model('Board_meta_model');
foreach ($boardlist as $key => $val) {
$whereboard = array(
'brd_id' => element('brd_id', $val),
'bmt_key' => 'use_naver_blog_post',
);
$usenaverblog = $this->Board_meta_model->get_one('', '', $whereboard);
$boardlist[$key]['usenaverblog'] = element('bmt_value', $usenaverblog);
}
}
$view['view']['boardlist'] = $boardlist;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'naverblog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,391 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Scheduler class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>스케쥴러 관리 controller 입니다.
*/
class Scheduler extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/scheduler';
/**
* 모델을 로딩합니다
*/
protected $models = array('Config');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Config_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
}
/**
* 스케쥴러 관리 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_scheduler_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 's',
'label' => '스케쥴러',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$updatedata = $this->input->post();
if ( ! isset($updatedata['library_name']) OR ! is_array($updatedata['library_name'])) {
$savedata = array(
'scheduler' => '',
);
$this->Config_model->save($savedata);
$view['view']['alert_message'] = '정상적으로 저장되었습니다';
} else {
$array_count_values = array_count_values($updatedata['library_name']);
$fail = false;
if ($fail === false) {
foreach ($array_count_values as $akey => $aval) {
if ($aval > 1) {
$view['view']['warning_message'] = $akey . ' 값이 ' . $aval . ' 회 중복 입력되었습니다. 라이브러리명이 중복되지 않게 입력해주세요';
$fail = true;
break;
}
}
}
if ($fail === false) {
foreach (element('library_name', $updatedata) as $fkey => $fval) {
if (empty($fval)) {
$view['view']['warning_message'] = '비어있는 라이브러리명이 있습니다. 라이브러리 값을 빠뜨리지 말고 입력해주세요';
$fail = true;
break;
}
}
}
if ($fail === false) {
$order = 0;
$update = array();
$alldata = $this->Config_model->get_all_meta();
$origindata = json_decode(element('scheduler', $alldata), true);
foreach (element('key', $updatedata) as $key => $value) {
if ($value) {
$update[$value] = array(
'library_name' => element($order, element('library_name', $updatedata)),
'interval_field_name' => element($value, element('interval_field_name', $updatedata)),
'lasttime' => element('lasttime', element(element($order, element('library_name', $updatedata)), $origindata)),
);
} else {
$update[$updatedata['library_name'][$order]] = array(
'library_name' => element($order, element('library_name', $updatedata)),
'interval_field_name' => element($key, element('interval_field_name', $updatedata)),
);
}
$order++;
}
$savedata = array(
'scheduler' => json_encode($update),
);
$this->Config_model->save($savedata);
$view['view']['alert_message'] = '정상적으로 저장되었습니다';
}
}
}
$getdata = $this->Config_model->get_all_meta();
$getdata['result'] = json_decode(element('scheduler', $getdata), true);
$getdata['scheduler_interval'] = json_decode(element('scheduler_interval', $getdata), true);
if ( ! element('scheduler_interval', $getdata) ) {
alert('스케쥴 주기명을 먼저 생성하신 후에 스케쥴러 등록이 가능합니다. 스케쥴 주기명 생성 페이지로 이동합니다', admin_url($this->pagedir . '/interval'));
}
if ($getdata['result'] && is_array($getdata['result'])) {
foreach ($getdata['result'] as $key => $value) {
$getdata['result'][$key]['class_exists'] = '';
if (file_exists(APPPATH . 'libraries/Scheduler/' . $key . '.php')) {
$this->load->library('Scheduler/' . $key);
if (class_exists($key)) {
$getdata['result'][$key]['class_exists'] = '1';
}
}
$getdata['result'][$key]['lastexecutetime'] = element('lasttime', $value) ? cdate("Y-m-d H:i:s", element('lasttime', $value)) : '-';
$getdata['result'][$key]['nextexecutetime'] = '-';
if (
element('lasttime', $value)
&& ($scheduler_interval = element('scheduler_interval', $getdata))
&& ($field_name = element(element('interval_field_name', $value), $scheduler_interval))
&& element('interval', $field_name)
) {
$nexttime = element('lasttime', $value) + element('interval', $field_name);
$getdata['result'][$key]['nextexecutetime'] = $nexttime ? cdate("Y-m-d H:i:s", $nexttime) : '-';
}
}
}
$view['view']['data'] = $getdata;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 스케쥴러 주기 관리 페이지입니다
*/
public function interval()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_scheduler_interval';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 's',
'label' => '스케쥴러',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$updatedata = $this->input->post();
if ( ! isset($updatedata['field_name']) OR ! is_array($updatedata['field_name'])) {
$savedata = array(
'scheduler_interval' => '',
);
$this->Config_model->save($savedata);
$view['view']['alert_message'] = '정상적으로 저장되었습니다';
} else {
$array_count_values = array_count_values($updatedata['field_name']);
$fail = false;
if ($fail === false) {
foreach ($array_count_values as $akey => $aval) {
if ($aval > 1) {
$view['view']['warning_message'] = $akey . ' 값이 ' . $aval . ' 회 중복 입력되었습니다. ID 값이 중복되지 않게 입력해주세요';
$fail = true;
break;
}
}
}
if ($fail === false) {
foreach (element('field_name', $updatedata) as $fkey => $fval) {
if (empty($fval)) {
$view['view']['warning_message'] = '비어있는 ID 값이 있습니다. ID 값을 빠뜨리지 말고 입력해주세요';
$fail = true;
break;
}
}
}
if ($fail === false) {
foreach (element('display_name', $updatedata) as $fkey => $fval) {
if (empty($fval)) {
$view['view']['warning_message'] = '비어있는 주기명이 있습니다. 입력항목제목 값을 빠뜨리지 말고 입력해주세요';
$fail = true;
break;
}
}
}
if ($fail === false) {
$order = 0;
$update = array();
foreach (element('key', $updatedata) as $key => $value) {
if ($value) {
$update[$value] = array(
'field_name' => element($order, element('field_name', $updatedata)),
'interval' => element($order, element('interval', $updatedata)),
'display_name' => element($order, element('display_name', $updatedata)),
);
} else {
$update[$updatedata['field_name'][$order]] = array(
'field_name' => element($order, element('field_name', $updatedata)),
'interval' => element($order, element('interval', $updatedata)),
'display_name' => element($order, element('display_name', $updatedata)),
);
}
$order++;
}
$savedata = array(
'scheduler_interval' => json_encode($update),
);
$this->Config_model->save($savedata);
$view['view']['alert_message'] = '정상적으로 저장되었습니다';
}
}
}
$getdata = $this->Config_model->get_all_meta();
$getdata['scheduler'] = json_decode(element('scheduler', $getdata), true);
$getdata['result'] = json_decode(element('scheduler_interval', $getdata), true);
if ($getdata['scheduler'] && is_array($getdata['scheduler'])) {
foreach ($getdata['scheduler'] as $key => $value) {
if ( ! isset($getdata['result'][element('interval_field_name', $value)]['registered_scheduler'])) {
$getdata['result'][element('interval_field_name', $value)]['registered_scheduler'] = 0;
}
$getdata['result'][element('interval_field_name', $value)]['registered_scheduler']++;
}
}
$view['view']['data'] = $getdata;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'interval');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 스케쥴러 실행 페이지입니다
*/
public function execute($libraryname)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_scheduler_execute';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
if (file_exists(APPPATH . 'libraries/Scheduler/' . $libraryname . '.php')) {
$this->load->library('Scheduler/' . $libraryname);
$s = new $libraryname();
if (method_exists($s, 'scheduler')) {
$s->scheduler();
$scheduler_data = $this->cbconfig->item('scheduler');
$scheduler_array = json_decode($scheduler_data, true);
$interval_data = $this->cbconfig->item('scheduler_interval');
$interval_array = json_decode($interval_data, true);
$scheduler_array[$libraryname]['lasttime'] = ctimestamp();
$savedata['scheduler'] = json_encode($scheduler_array);
$this->load->model('Config_model');
$this->Config_model->save($savedata);
exit(json_encode(array('success' => 'ok', 'message' => $libraryname . ' 라이브러리가 실행되었습니다.')));
} else {
exit(json_encode(array('success' => 'fail', 'message' => $libraryname . ' 클래스 안에 scheduler 메소드가 존재하지 않습니다.')));
}
} else {
exit(json_encode(array('success' => 'fail', 'message' => $libraryname . ' 라이브러리가 존재하지 않습니다.')));
}
}
}

View File

@@ -0,0 +1,135 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Testemail class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>환경설정>메일발송테스트 controller 입니다.
*/
class Testemail extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'config/testemail';
/**
* 모델을 로딩합니다
*/
protected $models = array();
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = '';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 테스트 이메일을 보내는 페이지입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_config_testemail_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$getdata['webmaster_email'] = $this->cbconfig->item('webmaster_email');
$getdata['webmaster_name'] = $this->cbconfig->item('webmaster_name');
$getdata['site_title'] = $this->cbconfig->item('site_title');
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'recv_email',
'label' => '받는이 이메일 주소',
'rules' => 'trim|required|valid_email',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$this->load->library('email');
$this->email->from(element('webmaster_email', $getdata), element('webmaster_name', $getdata));
$this->email->to($this->input->post('recv_email'));
$this->email->subject('이메일 발송 테스트입니다');
$emailform['emailform'] = $getdata;
$message = $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/email_form', $emailform, true);
$this->email->message($message);
if ($this->email->send() === false) {
$view['view']['alert_message'] = '이메일을 발송하지 못하였습니다. 메일 설정을 확인하여주세요';
} else {
$view['view']['alert_message'] = '이메일을 발송하였습니다';
}
//echo $this->email->print_debugger();
}
$view['view']['data'] = $getdata;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,538 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Loginlog class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>회원설정>로그인현황 controller 입니다.
*/
class Loginlog extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'member/loginlog';
/**
* 모델을 로딩합니다
*/
protected $models = array('Member_login_log');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Member_login_log_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_loginlog_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('mll_id', 'mll_userid', 'mll_success', 'member_login_log.mem_id', 'mll_datetime', 'mll_ip', 'mll_reason', 'mll_log_agent', 'mll_url', 'mll_referer'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('mll_id', 'member_login_log.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('mll_id'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
if (element('mll_useragent', $val)) {
$userAgent = get_useragent_info(element('mll_useragent', $val));
$result['list'][$key]['browsername'] = $userAgent['browsername'];
$result['list'][$key]['browserversion'] = $userAgent['browserversion'];
$result['list'][$key]['os'] = $userAgent['os'];
$result['list'][$key]['engine'] = $userAgent['engine'];
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('mll_datetime' => '날짜', 'mll_ip' => 'IP', 'mll_reason' => '이유');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 로그인 성공 기록을 그래프 형식으로 보는 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_loginlog_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$result = $this->{$this->modelname}->get_login_success_count($datetype, $start_date, $end_date, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=로그인성공기록_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 로그인 실패 기록을 그래프 형식으로 보는 페이지입니다
*/
public function graph_fail($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_loginlog_graph_fail';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$result = $this->{$this->modelname}->get_login_fail_count($datetype, $start_date, $end_date, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=로그인실패기록_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_fail_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph_fail');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_loginlog_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 오래된 로그인로그삭제 페이지입니다
*/
public function cleanlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_loginlog_cleanlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'mll_datetime <=' => $this->input->post('criterion'),
);
$this->Member_login_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 로그인로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'mll_datetime <=' => $criterion,
);
$log_count = $this->Member_login_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 로그인로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 로그인로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cleanlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,143 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Memberfollow class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>회원설정>팔로우현황 controller 입니다.
*/
class Memberfollow extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'member/memberfollow';
/**
* 모델을 로딩합니다
*/
protected $models = array('Follow');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Follow_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_memberfollow_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('mfo_id', 'mfg_id', 'mem_id', 'target_mem_id', 'mfo_datetime'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('mfo_id', 'mfg_id', 'mem_id', 'target_mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('mfo_id'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['member'] = $dbmember = $this->Member_model->get_by_memid(element('mem_id', $val), 'mem_id, mem_userid, mem_nickname, mem_icon');
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
$result['list'][$key]['target_member'] = $target_member = $this->Member_model->get_by_memid(element('target_mem_id', $val), 'mem_id, mem_userid, mem_nickname, mem_icon');
$result['list'][$key]['target_display_name'] = display_username(
element('mem_userid', $target_member),
element('mem_nickname', $target_member),
element('mem_icon', $target_member)
);
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('mfo_datetime' => '날짜');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_update_url'] = admin_url($this->pagedir . '/listupdate/?' . $param->output());
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,147 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Membergroup class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>회원설정>회원그룹관리 controller 입니다.
*/
class Membergroup extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'member/membergroup';
/**
* 모델을 로딩합니다
*/
protected $models = array('Member_group', 'Member_group_member');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Member_group_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 회원 그룹 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_membergroup_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$findex = 'mgr_order';
$forder = 'asc';
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 's',
'label' => '그룹명',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$updatedata = $this->input->post();
$this->{$this->modelname}->update_group($updatedata);
$view['view']['alert_message'] = '정상적으로 저장되었습니다';
}
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_order_field = array('mgr_order'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list('', '', '', '', $findex, $forder);
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$countwhere = array(
'mgr_id' => element('mgr_id', $val),
);
$result['list'][$key]['member_count'] = $this->Member_group_member_model->count_by($countwhere);
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,143 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Memberlevelhistory class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>회원설정>레벨히스토리 controller 입니다.
*/
class Memberlevelhistory extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'member/memberlevelhistory';
/**
* 모델을 로딩합니다
*/
protected $models = array('Member_level_history');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Member_level_history_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_memberlevelhistory_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('mlh_id', 'member_level_history.mem_id', 'member.mem_userid', 'member.mem_nickname', 'mlh_from', 'mlh_to', 'mll_datetime', 'mlh_reason', 'mlh_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('mlh_id', 'member_level_history.mem_id', 'mlh_from', 'mlh_to'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('mlh_id'); // 정렬이 가능한 필드
$where = array();
if (is_numeric($this->input->get('mlh_from'))) {
$where['mlh_from'] = $this->input->get('mlh_from');
}
if (is_numeric($this->input->get('mlh_to'))) {
$where['mlh_to'] = $this->input->get('mlh_to');
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('member.mem_userid' => '회원아이디', 'member.mem_nickname' => '회원닉네임', 'mlh_datetime' => '날짜', 'mlh_reason' => '이유', 'mlh_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,151 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Nickname class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>회원설정>닉네임변경이력 controller 입니다.
*/
class Nickname extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'member/nickname';
/**
* 모델을 로딩합니다
*/
protected $models = array('Member_nickname');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Member_nickname_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_nickname_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'mni_nickname' => $param->sort('mni_nickname', 'asc'),
'mni_start_datetime' => $param->sort('mni_start_datetime', 'asc'),
'mni_end_datetime' => $param->sort('mni_end_datetime', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('mni_id', 'member_nickname.mem_id', 'member.mem_userid', 'member.mem_nickname', 'mni_nickname'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('mni_id', 'member_nickname.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('mni_id', 'mni_nickname', 'mni_start_datetime', 'mni_end_datetime'); // 정렬이 가능한 필드
$where = array();
if ($this->input->get('use') === 'Y') {
$where['mni_end_datetime'] = null;
}
if ($this->input->get('use') === 'N') {
$where['mni_end_datetime >'] = '0000-00-00 00:00:00';
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('member.mem_userid' => '회원아이디', 'member.mem_nickname' => '현재닉네임', 'mni_nickname' => '닉네임');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_update_url'] = admin_url($this->pagedir . '/listupdate/?' . $param->output());
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,461 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Point class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>회원설정>포인트관리 controller 입니다.
*/
class Points extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'member/points';
/**
* 모델을 로딩합니다
*/
protected $models = array('Point');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Point_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring', 'point'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_points_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('poi_id', 'point.mem_id', 'poi_datetime', 'poi_content', 'poi_type', 'poi_action'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('poi_id', 'point.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('poi_id'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('poi_datetime' => '날짜', 'poi_content' => '내용');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 게시판 글쓰기 또는 수정 페이지를 가져오는 메소드입니다
*/
public function write()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_points_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$primary_key = $this->{$this->modelname}->primary_key;
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array();
if ($this->input->post('poi_type') === 'toall') {
$config = array(
array(
'field' => 'poi_point_all',
'label' => '포인트',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'poi_content_all',
'label' => '내용',
'rules' => 'trim|required',
),
);
} elseif ($this->input->post('poi_type') === 'toone') {
$config = array(
array(
'field' => 'mem_userid',
'label' => '회원아이디',
'rules' => 'trim|required|callback__real_userid',
),
array(
'field' => 'poi_point',
'label' => '포인트',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'poi_content',
'label' => '내용',
'rules' => 'trim|required',
),
);
}
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('poi_type') === 'toall') {
$where = array(
'mem_denied' => 0,
);
$mball = $this->Member_model->get('', 'mem_id', $where);
if ($mball && is_array($mball)) {
foreach ($mball as $mb) {
if (element('mem_id', $mb)) {
$this->point->insert_point(
element('mem_id', $mb),
$this->input->post('poi_point_all'),
$this->input->post('poi_content_all'),
'@byadmin',
element('mem_id', $mb),
$this->member->item('mem_id') . '-' . uniqid('')
);
}
}
}
} elseif ($this->input->post('poi_type') === 'toone') {
$mb = $this->Member_model->get_by_userid($this->input->post('mem_userid'), 'mem_id');
if (element('mem_id', $mb)) {
$this->point->insert_point(
element('mem_id', $mb),
$this->input->post('poi_point'),
$this->input->post('poi_content'),
'@byadmin',
element('mem_id', $mb),
$this->member->item('mem_id') . '-' . uniqid('')
);
}
}
$this->session->set_flashdata(
'message',
'정상적으로 입력되었습니다'
);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 게시물의 신규입력 또는 수정작업이 끝난 후 목록 페이지로 이동합니다
*/
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_points_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
$this->load->library('Point');
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->point->delete_point_by_pk($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 실제로 존재하는 회원인지를 체크합니다
*/
public function _real_userid($str)
{
$mb = $this->Member_model->get_by_userid($str, 'mem_id, mem_denied');
if ( ! element('mem_id', $mb)) {
$this->form_validation->set_message(
'_real_userid',
$str . ' 은 존재하지 않는 회원아이디입니다'
);
return false;
}
if (element('mem_denied', $mb)) {
$this->form_validation->set_message(
'_real_userid',
$str . ' 은 탈퇴, 차단된 회원아이디입니다'
);
return false;
}
return true;
}
/**
* 오래된 포인트로그 정리 페이지입니다
*/
public function cleanlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_member_point_cleanlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$criterion = $this->input->post('criterion');
$result = $this->Point_model->member_list_by_point_count(10, $criterion);
$mem_count = 0;
$poi_count = 0;
if ($result) {
foreach ($result as $value) {
$mem_count++;
$poi_count += element('cnt', $value);
$where = array(
'mem_id' => element('mem_id', $value),
'poi_datetime <=' => $criterion,
);
$this->Point_model->delete_where($where);
$this->point->insert_point(
element('mem_id', $value),
element('sum_point', $value),
$criterion . ' 까지의 포인트 ' . number_format(element('cnt', $value)) . '건 정리',
'@clean',
element('mem_id', $value),
element('mem_id', $value) . '-' . uniqid('')
);
}
}
$view['view']['alert_message'] = '총 ' . number_format($mem_count) . ' 명의 포인트 ' . number_format($poi_count) . ' 건이 정리되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$result = $this->Point_model->member_count_by_point_count(1, $criterion);
$member_count = count($result);
$point_sum = 0;
if ($result) {
foreach ($result as $k => $v) {
$point_sum += element('cnt', $v);
}
}
if ($member_count > 0) {
$view['view']['msg'] = '총 ' . number_format($member_count) . ' 명의 회원, ' . number_format($point_sum) . ' 건의 ' . $this->input->post('day') . '일 이상된 포인트 데이터가 발견되었습니다.<br />';
if ($member_count > 100) {
$view['view']['msg'] .= '이중 100명 회원의 포인트를 정리하시겠습니까?';
} else {
$view['view']['msg'] .= '이를 정리하시겠습니까?';
}
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 포인트 데이터가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cleanlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,616 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Banner class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>페이지설정>팝업관리 controller 입니다.
*/
class Banner extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'page/banner';
/**
* 모델을 로딩합니다
*/
protected $models = array('Banner', 'Banner_group');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Banner_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_banner_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'ban_id' => $param->sort('ban_id', 'asc'),
'ban_title' => $param->sort('ban_title', 'asc'),
'ban_url' => $param->sort('ban_url', 'asc'),
'ban_start_date' => $param->sort('ban_start_date', 'asc'),
'ban_end_date' => $param->sort('ban_end_date', 'asc'),
'ban_hit' => $param->sort('ban_hit', 'asc'),
'ban_order' => $param->sort('ban_order', 'asc'),
'ban_activated' => $param->sort('ban_activated', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('ban_id', 'ban_title', 'ban_url'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('ban_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('ban_id', 'ban_start_date', 'ban_end_date', 'ban_title', 'ban_url', 'ban_hit', 'ban_order', 'ban_activated'); // 정렬이 가능한 필드
$where = array();
if ($this->input->get('ban_activated') === 'Y') {
$where['ban_activated'] = '1';
}
if ($this->input->get('ban_activated') === 'N') {
$where['ban_activated'] = '0';
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
if (element('ban_image', $val)) {
$result['list'][$key]['thumb_url'] = thumb_url('banner', element('ban_image', $val), '80');
}
if (empty($val['ban_start_date']) OR $val['ban_start_date'] === '0000-00-00') {
$result['list'][$key]['ban_start_date'] = '미지정';
}
if (empty($val['ban_end_date']) OR $val['ban_end_date'] === '0000-00-00') {
$result['list'][$key]['ban_end_date'] = '미지정';
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('ban_title' => '이미지 설명', 'ban_url' => '이미지 URL');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 게시판 글쓰기 또는 수정 페이지를 가져오는 메소드입니다
*/
public function write($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_banner_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다
*/
if ($pid) {
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
}
$primary_key = $this->{$this->modelname}->primary_key;
/**
* 수정 페이지일 경우 기존 데이터를 가져옵니다
*/
$getdata = array();
if ($pid) {
$getdata = $this->{$this->modelname}->get_one($pid);
}
$group = $this->Banner_group_model->get_all_group();
if (empty($group)) {
alert('배너 위치를 먼저 생성하신 후에 배너 추가가 가능합니다. 배너위치 생성 페이지로 이동합니다', admin_url($this->pagedir . '/group'));
}
$view['view']['group'] = $group;
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'bng_name',
'label' => '배너위치',
'rules' => 'trim|required',
),
array(
'field' => 'ban_start_date',
'label' => '배너시작일',
'rules' => 'trim|alpha_dash|exact_length[10]',
),
array(
'field' => 'ban_end_date',
'label' => '배너종료일',
'rules' => 'trim|alpha_dash|exact_length[10]',
),
array(
'field' => 'ban_title',
'label' => '이미지 설명',
'rules' => 'trim|required',
),
array(
'field' => 'ban_url',
'label' => '이미지 URL',
'rules' => 'trim|valid_url',
),
array(
'field' => 'ban_target',
'label' => '타겟',
'rules' => 'trim',
),
array(
'field' => 'ban_device',
'label' => '배너표시기기',
'rules' => 'trim|required',
),
array(
'field' => 'ban_width',
'label' => '이미지 가로값',
'rules' => 'trim|required|numeric|is_natural',
),
array(
'field' => 'ban_height',
'label' => '이미지 세로값',
'rules' => 'trim|required|numeric|is_natural',
),
array(
'field' => 'ban_order',
'label' => '정렬순서',
'rules' => 'trim|required|numeric|is_natural',
),
array(
'field' => 'ban_activated',
'label' => '배너활성화',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
$form_validation = $this->form_validation->run();
$file_error = '';
$updatephoto = '';
if ($form_validation) {
$this->load->library('upload');
if (isset($_FILES) && isset($_FILES['ban_image']) && isset($_FILES['ban_image']['name']) && $_FILES['ban_image']['name']) {
$upload_path = config_item('uploads_dir') . '/banner/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$upload_path .= cdate('Y') . '/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$upload_path .= cdate('m') . '/';
if (is_dir($upload_path) === false) {
mkdir($upload_path, 0707);
$file = $upload_path . 'index.php';
$f = @fopen($file, 'w');
@fwrite($f, '');
@fclose($f);
@chmod($file, 0644);
}
$uploadconfig = array();
$uploadconfig['upload_path'] = $upload_path;
$uploadconfig['allowed_types'] = 'jpg|jpeg|png|gif';
$uploadconfig['max_size'] = '2000';
$uploadconfig['max_width'] = '1000';
$uploadconfig['max_height'] = '1000';
$uploadconfig['encrypt_name'] = true;
$this->upload->initialize($uploadconfig);
if ($this->upload->do_upload('ban_image')) {
$img = $this->upload->data();
$updatephoto = cdate('Y') . '/' . cdate('m') . '/' . element('file_name', $img);
} else {
$file_error = $this->upload->display_errors();
}
}
}
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($form_validation === false OR $file_error !== '') {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
$view['view']['message'] = $file_error;
if ($pid) {
if (empty($getdata['ban_start_date']) OR $getdata['ban_start_date'] === '0000-00-00') {
$getdata['ban_start_date'] = '';
}
if (empty($getdata['ban_end_date']) OR $getdata['ban_end_date'] === '0000-00-00') {
$getdata['ban_end_date'] = '';
}
$view['view']['data'] = $getdata;
}
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$content_type = $this->cbconfig->item('use_popup_dhtml') ? 1 : 0;
$ban_start_date = $this->input->post('ban_start_date');
if ( ! $ban_start_date) $ban_start_date = null;
$ban_end_date = $this->input->post('ban_end_date');
if ( ! $ban_end_date) $ban_end_date = null;
$ban_width = $this->input->post('ban_width') ? $this->input->post('ban_width') : 0;
$ban_height = $this->input->post('ban_height') ? $this->input->post('ban_height') : 0;
$ban_order = $this->input->post('ban_order') ? $this->input->post('ban_order') : 0;
$ban_activated = $this->input->post('ban_activated') ? 1 : 0;
$updatedata = array(
'ban_start_date' => $ban_start_date,
'ban_end_date' => $ban_end_date,
'ban_title' => $this->input->post('ban_title', null, ''),
'bng_name' => $this->input->post('bng_name', null, ''),
'ban_url' => $this->input->post('ban_url', null, ''),
'ban_target' => $this->input->post('ban_target', null, ''),
'ban_device' => $this->input->post('ban_device', null, ''),
'ban_width' => $ban_width,
'ban_height' => $ban_height,
'ban_order' => $ban_order,
'ban_activated' => $ban_activated,
);
if ($this->input->post('ban_image_del')) {
$updatedata['ban_image'] = '';
} elseif ($updatephoto) {
$updatedata['ban_image'] = $updatephoto;
}
if (element('ban_image', $getdata) && ($this->input->post('ban_image_del') OR $updatephoto)) {
// 기존 파일 삭제
@unlink(config_item('uploads_dir') . '/banner/' . element('ban_image', $getdata));
}
/**
* 게시물을 수정하는 경우입니다
*/
if ($this->input->post($primary_key)) {
$this->cache->delete('banner/banner-' . element('bng_name', $getdata) . '-random-' . cdate('Y-m-d'));
$this->cache->delete('banner/banner-' . element('bng_name', $getdata) . '-order-' . cdate('Y-m-d'));
$this->{$this->modelname}->update($this->input->post($primary_key), $updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 수정되었습니다'
);
} else {
/**
* 게시물을 새로 입력하는 경우입니다
*/
$updatedata['ban_datetime'] = cdate('Y-m-d H:i:s');
$updatedata['ban_ip'] = $this->input->ip_address();
$updatedata['mem_id'] = $this->member->item('mem_id');
$this->{$this->modelname}->insert($updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 입력되었습니다'
);
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 게시물의 신규입력 또는 수정작업이 끝난 후 목록 페이지로 이동합니다
*/
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}
/**
* 배너 위치관리 페이지를 가져오는 메소드입니다
*/
public function group()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_banner_group';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'bng_name',
'label' => '위치명',
'rules' => 'trim|required|alpha_dash|is_unique[banner_group.bng_name]',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$insertdata = array(
'bng_name' => $this->input->post('bng_name', null, ''),
);
$this->Banner_group_model->insert($insertdata);
}
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$findex = $this->input->get('findex', null, 'bng_group');
$forder = $this->input->get('forder', null, 'asc');
$result = $this->Banner_group_model
->get_admin_list(1000, 0, '', '', $findex, $forder);
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$countwhere = array(
'bng_name' => element('bng_name', $val),
);
$result['list'][$key]['banner_count'] = $this->Banner_model->count_by($countwhere);
}
}
$view['view']['data'] = $result;
$primary_key = $this->Banner_group_model->primary_key;
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/groupdelete/?' . $param->output());
$view['view']['primary_key'] = $primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'group');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_banner_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$getdata = $this->{$this->modelname}->get_one($val);
$this->cache->delete('banner/banner-' . element('bng_name', $getdata) . '-random-' . cdate('Y-m-d'));
$this->cache->delete('banner/banner-' . element('bng_name', $getdata) . '-order-' . cdate('Y-m-d'));
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function groupdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_banner_groupdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->Banner_group_model->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '/group?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,407 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Bannerclick class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>페이지설정>배너 클릭 controller 입니다.
*/
class Bannerclick extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'page/bannerclick';
/**
* 모델을 로딩합니다
*/
protected $models = array('Banner_click_log');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Banner_click_log_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_bannerclick_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('bcl_id', 'ban_id', 'bng_name', 'banner.mem_id', 'banner_click_log.mem_id', 'bcl_datetime', 'bcl_ip'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('bcl_id', 'ban_id', 'banner.mem_id', 'banner_click_log.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('bcl_id'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['member'] = $dbmember = $this->Member_model->get_by_memid(element('mem_id', $val), 'mem_id, mem_userid, mem_nickname, mem_icon');
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $dbmember),
element('mem_nickname', $dbmember),
element('mem_icon', $dbmember)
);
if (element('ban_image', $val)) {
$result['list'][$key]['thumb_url'] = thumb_url('banner', element('ban_image', $val), '80');
}
if (element('bcl_useragent', $val)) {
$userAgent = get_useragent_info(element('bcl_useragent', $val));
$result['list'][$key]['browsername'] = $userAgent['browsername'];
$result['list'][$key]['browserversion'] = $userAgent['browserversion'];
$result['list'][$key]['os'] = $userAgent['os'];
$result['list'][$key]['engine'] = $userAgent['engine'];
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('bcl_datetime' => '날짜', 'bcl_ip' => 'IP');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 그래프 형식으로 보는 페이지입니다
*/
public function graph($export = '')
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_bannerclick_graph';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
$param =& $this->querystring;
$datetype = $this->input->get('datetype', null, 'd');
if ($datetype !== 'm' && $datetype !== 'y') {
$datetype = 'd';
}
$start_date = $this->input->get('start_date') ? $this->input->get('start_date') : cdate('Y-m-01');
$end_date = $this->input->get('end_date') ? $this->input->get('end_date') : cdate('Y-m-d');
if ($datetype === 'y' OR $datetype === 'm') {
$start_year = substr($start_date, 0, 4);
$end_year = substr($end_date, 0, 4);
}
if ($datetype === 'm') {
$start_month = substr($start_date, 5, 2);
$end_month = substr($end_date, 5, 2);
$start_year_month = $start_year * 12 + $start_month;
$end_year_month = $end_year * 12 + $end_month;
}
$orderby = (strtolower($this->input->get('orderby')) === 'desc') ? 'desc' : 'asc';
$result = $this->{$this->modelname}->get_banner_click_count($datetype, $start_date, $end_date, $orderby);
$sum_count = 0;
$arr = array();
$max = 0;
if ($result && is_array($result)) {
foreach ($result as $key => $value) {
$s = element('day', $value);
if ( ! isset($arr[$s])) {
$arr[$s] = 0;
}
$arr[$s] += element('cnt', $value);
if ($arr[$s] > $max) {
$max = $arr[$s];
}
$sum_count += element('cnt', $value);
}
}
$result = array();
$i = 0;
$save_count = -1;
$tot_count = 0;
if (count($arr)) {
foreach ($arr as $key => $value) {
$count = (int) $arr[$key];
$result[$key]['count'] = $count;
$i++;
if ($save_count !== $count) {
$no = $i;
$save_count = $count;
}
$result[$key]['no'] = $no;
$result[$key]['key'] = $key;
$rate = ($count / $sum_count * 100);
$result[$key]['rate'] = $rate;
$s_rate = number_format($rate, 1);
$result[$key]['s_rate'] = $s_rate;
$bar = (int)($count / $max * 100);
$result[$key]['bar'] = $bar;
}
$view['view']['max_value'] = $max;
$view['view']['sum_count'] = $sum_count;
}
if ($datetype === 'y') {
for ($i = $start_year; $i <= $end_year; $i++) {
if( ! isset($result[$i])) $result[$i] = '';
}
} elseif ($datetype === 'm') {
for ($i = $start_year_month; $i <= $end_year_month; $i++) {
$year = floor($i / 12);
if ($year * 12 == $i) $year--;
$month = sprintf("%02d", ($i - ($year * 12)));
$date = $year . '-' . $month;
if( ! isset($result[$date])) $result[$date] = '';
}
} elseif ($datetype === 'd') {
$date = $start_date;
while ($date <= $end_date) {
if( ! isset($result[$date])) $result[$date] = '';
$date = cdate('Y-m-d', strtotime($date) + 86400);
}
}
if ($orderby === 'desc') {
krsort($result);
} else {
ksort($result);
}
$view['view']['list'] = $result;
$view['view']['start_date'] = $start_date;
$view['view']['end_date'] = $end_date;
$view['view']['datetype'] = $datetype;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
if ($export === 'excel') {
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename=배너클릭_' . cdate('Y_m_d') . '.xls');
echo $this->load->view('admin/' . ADMIN_SKIN . '/' . $this->pagedir . '/graph_excel', $view, true);
} else {
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'graph');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_bannerclick_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 오래된 배너클릭로그삭제 페이지입니다
*/
public function cleanlog()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_bannerclick_cleanlog';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'day',
'label' => '기간',
'rules' => 'trim|required|numeric|is_natural',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
if ($this->input->post('criterion') && $this->input->post('day')) {
$deletewhere = array(
'bcl_datetime <=' => $this->input->post('criterion'),
);
$this->Banner_click_log_model->delete_where($deletewhere);
$view['view']['alert_message'] = '총 ' . number_format($this->input->post('log_count')) . ' 건의 ' . $this->input->post('day') . '일 이상된 배너클릭로그가 모두 삭제되었습니다';
} else {
$criterion = cdate('Y-m-d H:i:s', ctimestamp() - $this->input->post('day') * 24 * 60 * 60);
$countwhere = array(
'bcl_datetime <=' => $criterion,
);
$log_count = $this->Banner_click_log_model->count_by($countwhere);
$view['view']['criterion'] = $criterion;
$view['view']['day'] = $this->input->post('day');
$view['view']['log_count'] = $log_count;
if ($log_count > 0) {
$view['view']['msg'] = '총 ' . number_format($log_count) . ' 건의 ' . $this->input->post('day') . '일 이상된 배너클릭로그가 발견되었습니다. 이를 모두 삭제하시겠습니까?';
} else {
$view['view']['alert_message'] = $this->input->post('day') . '일 이상된 배너클릭로그가 발견되지 않았습니다';
}
}
}
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'cleanlog');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
}

View File

@@ -0,0 +1,424 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Document class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>페이지설정>일반페이지 controller 입니다.
*/
class Document extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'page/document';
/**
* 모델을 로딩합니다
*/
protected $models = array('Document');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Document_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'dhtml_editor');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_document_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'doc_id' => $param->sort('doc_id', 'asc'),
'doc_key' => $param->sort('doc_key', 'asc'),
'doc_title' => $param->sort('doc_title', 'asc'),
'doc_layout' => $param->sort('doc_layout', 'asc'),
'doc_mobile_layout' => $param->sort('doc_mobile_layout', 'asc'),
'doc_skin' => $param->sort('doc_skin', 'asc'),
'doc_mobile_skin' => $param->sort('doc_mobile_skin', 'asc'),
'doc_updated_datetime' => $param->sort('doc_updated_datetime', 'asc'),
'doc_hit' => $param->sort('doc_hit', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('doc_id', 'doc_key', 'doc_title', 'doc_layout', 'doc_mobile_layout', 'doc_skin', 'doc_mobile_skin', 'doc_datetime', 'doc_updated_datetime', 'document.mem_id', 'doc_content', 'doc_mobile_content'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('doc_id', 'document.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('doc_id', 'doc_key', 'doc_title', 'doc_layout', 'doc_mobile_layout', 'doc_skin', 'doc_mobile_skin', 'doc_updated_datetime', 'doc_hit'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('doc_key' => 'KEY', 'doc_title' => '제목', 'doc_content' => '내용', 'doc_mobile_content' => '모바일용내용', 'doc_datetime' => '입력일', 'doc_updated_datetime' => '최종수정일');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 게시판 글쓰기 또는 수정 페이지를 가져오는 메소드입니다
*/
public function write($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_document_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다
*/
if ($pid) {
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
}
$primary_key = $this->{$this->modelname}->primary_key;
/**
* 수정 페이지일 경우 기존 데이터를 가져옵니다
*/
$getdata = array();
if ($pid) {
$getdata = $this->{$this->modelname}->get_one($pid);
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'doc_title',
'label' => '제목',
'rules' => 'trim|required',
),
array(
'field' => 'doc_content',
'label' => '내용',
'rules' => 'trim|required',
),
array(
'field' => 'doc_mobile_content',
'label' => '모바일내용',
'rules' => 'trim',
),
array(
'field' => 'doc_layout',
'label' => '레이아웃',
'rules' => 'trim',
),
array(
'field' => 'doc_sidebar',
'label' => '사이드바',
'rules' => 'trim',
),
array(
'field' => 'doc_skin',
'label' => '스킨',
'rules' => 'trim',
),
array(
'field' => 'doc_mobile_layout',
'label' => '모바일레이아웃',
'rules' => 'trim',
),
array(
'field' => 'doc_mobile_sidebar',
'label' => '모바일사이드바',
'rules' => 'trim',
),
array(
'field' => 'doc_mobile_skin',
'label' => '모바일스킨',
'rules' => 'trim',
),
);
if ($this->input->post($primary_key)) {
$config[] = array(
'field' => 'doc_key',
'label' => '페이지주소',
'rules' => 'trim|required|alpha_dash|min_length[3]|max_length[50]|is_unique[document.doc_key.doc_id.' . $getdata['doc_id'] . ']',
);
} else {
$config[] = array(
'field' => 'doc_key',
'label' => '페이지주소',
'rules' => 'trim|required|alpha_dash|min_length[3]|max_length[50]|is_unique[document.doc_key]',
);
}
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
$view['view']['data'] = $getdata;
$view['view']['data']['doc_layout_option'] = get_skin_name(
'_layout',
set_value('doc_layout', element('doc_layout', $getdata)),
'기본설정따름'
);
$view['view']['data']['doc_mobile_layout_option'] = get_skin_name(
'_layout',
set_value('doc_mobile_layout', element('doc_mobile_layout', $getdata)),
'기본설정따름'
);
$view['view']['data']['doc_skin_option'] = get_skin_name(
'document',
set_value('doc_skin', element('doc_skin', $getdata)),
'기본설정따름'
);
$view['view']['data']['doc_mobile_skin_option'] = get_skin_name(
'document',
set_value('doc_mobile_skin', element('doc_mobile_skin', $getdata)),
'기본설정따름'
);
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$content_type = $this->cbconfig->item('use_document_dhtml') ? 1 : 0;
$doc_sidebar = $this->input->post('doc_sidebar') ? $this->input->post('doc_sidebar') : 0;
$doc_mobile_sidebar = $this->input->post('doc_mobile_sidebar') ? $this->input->post('doc_mobile_sidebar') : 0;
$updatedata = array(
'doc_key' => $this->input->post('doc_key', null, ''),
'doc_title' => $this->input->post('doc_title', null, ''),
'doc_content' => $this->input->post('doc_content', null, ''),
'doc_mobile_content' => $this->input->post('doc_mobile_content', null, ''),
'doc_content_html_type' => $content_type,
'doc_layout' => $this->input->post('doc_layout', null, ''),
'doc_mobile_layout' => $this->input->post('doc_mobile_layout', null, ''),
'doc_sidebar' => $doc_sidebar,
'doc_mobile_sidebar' => $doc_mobile_sidebar,
'doc_skin' => $this->input->post('doc_skin', null, ''),
'doc_mobile_skin' => $this->input->post('doc_mobile_skin', null, ''),
'doc_updated_mem_id' => $this->member->item('mem_id'),
'doc_updated_datetime' => cdate('Y-m-d H:i:s'),
);
if ( $this->input->post($primary_key) != $pid ){
}
/**
* 게시물을 수정하는 경우입니다
*/
if ($pid) {
$this->{$this->modelname}->update($pid, $updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 수정되었습니다'
);
} else {
/**
* 게시물을 새로 입력하는 경우입니다
*/
$updatedata['doc_datetime'] = cdate('Y-m-d H:i:s');
$updatedata['mem_id'] = $this->member->item('mem_id');
$this->{$this->modelname}->insert($updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 입력되었습니다'
);
}
$list = $this->{$this->modelname}->get('', 'doc_id, doc_key');
$cachedata = '';
if ($list && is_array($list)) {
foreach ($list as $key => $val) {
$cachedata[$val['doc_key']] = element('doc_id', $val);
}
}
$this->cache->save('document-key-id-info', $cachedata, 86400*365);
// 이벤트가 존재하면 실행합니다
$view['view']['event']['after'] = Events::trigger('after', $eventname);
/**
* 게시물의 신규입력 또는 수정작업이 끝난 후 목록 페이지로 이동합니다
*/
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_document_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
$list = $this->{$this->modelname}->get('', 'doc_id, doc_key');
$cachedata = '';
if ($list && is_array($list)) {
foreach ($list as $key => $val) {
$cachedata[$val['doc_key']] = element('doc_id', $val);
}
}
$this->cache->save('document-key-id-info', $cachedata, 86400*365);
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,349 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Faq class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>페이지설정>FAQ관리 controller 입니다.
*/
class Faq extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'page/faq';
/**
* 모델을 로딩합니다
*/
protected $models = array('Faq', 'Faq_group');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Faq_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'dhtml_editor');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_faq_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'faq_id' => $param->sort('faq_id', 'asc'),
'faq_title' => $param->sort('faq_title', 'asc'),
'faq_order' => $param->sort('faq_order', 'asc'),
'faq_datetime' => $param->sort('faq_datetime', 'asc'),
);
$findex = $this->input->get('findex', null, 'faq_order');
$forder = $this->input->get('forder', null, 'asc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$fgr_id = $this->input->get('fgr_id', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
$where = array();
if ($fgr_id) {
$where = array('fgr_id' => $fgr_id);
}
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('faq_id', 'fgr_id', 'faq_title', 'faq_content', 'faq_mobile_content', 'faq_datetime', 'faq.mem_id'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('faq_id', 'fgr_id', 'faq.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('faq_id', 'faq_title', 'faq_order', 'faq_datetime'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$result['list'][$key]['faqgroup'] = $this->Faq_group_model->get_one(element('fgr_id', $val));
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('faq_title' => '제목', 'faq_content' => '내용', 'faq_mobile_content' => '모바일내용', 'faq_datetime' => '날짜');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url('page/faqgroup');
$view['view']['write_url'] = admin_url($this->pagedir . '/write?fgr_id=' . $fgr_id);
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 게시판 글쓰기 또는 수정 페이지를 가져오는 메소드입니다
*/
public function write($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_faq_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다
*/
if ($pid) {
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
}
$fgr_id = (int) $this->input->get('fgr_id');
if (empty($fgr_id) OR $fgr_id < 1) {
show_404();
}
$primary_key = $this->{$this->modelname}->primary_key;
/**
* 수정 페이지일 경우 기존 데이터를 가져옵니다
*/
if ($pid) {
$getdata = $this->{$this->modelname}->get_one($pid);
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'fgr_id',
'label' => 'FAQ그룹',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'faq_order',
'label' => '정렬순서',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'faq_title',
'label' => '질문',
'rules' => 'trim|required',
),
array(
'field' => 'faq_content',
'label' => '답변',
'rules' => 'trim|required',
),
array(
'field' => 'faq_mobile_content',
'label' => '모바일답변',
'rules' => 'trim',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
if ($pid) {
$view['view']['data'] = $getdata;
}
$view['view']['data']['faqgroup'] = $this->Faq_group_model->get_one($fgr_id);
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$content_type = $this->cbconfig->item('use_faq_dhtml') ? 1 : 0;
$faq_order = $this->input->post('faq_order') ? $this->input->post('faq_order') : 0;
$updatedata = array(
'fgr_id' => $this->input->post('fgr_id', null, 0),
'faq_title' => $this->input->post('faq_title', null, ''),
'faq_content' => $this->input->post('faq_content', null, ''),
'faq_mobile_content' => $this->input->post('faq_mobile_content', null, ''),
'faq_content_html_type' => $content_type,
'faq_order' => $faq_order,
);
/**
* 게시물을 수정하는 경우입니다
*/
if ($this->input->post($primary_key)) {
$this->{$this->modelname}->update($this->input->post($primary_key), $updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 수정되었습니다'
);
} else {
/**
* 게시물을 새로 입력하는 경우입니다
*/
$updatedata['faq_datetime'] = cdate('Y-m-d H:i:s');
$updatedata['faq_ip'] = $this->input->ip_address();
$updatedata['mem_id'] = $this->member->item('mem_id');
$this->{$this->modelname}->insert($updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 입력되었습니다'
);
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 게시물의 신규입력 또는 수정작업이 끝난 후 목록 페이지로 이동합니다
*/
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_faq_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,393 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Faqgroup class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>페이지설정>FAQ관리 controller 입니다.
*/
class Faqgroup extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'page/faqgroup';
/**
* 모델을 로딩합니다
*/
protected $models = array('Faq', 'Faq_group');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Faq_group_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_faqgroup_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'fgr_id' => $param->sort('fgr_id', 'asc'),
'fgr_title' => $param->sort('fgr_title', 'asc'),
'fgr_key' => $param->sort('fgr_key', 'asc'),
'fgr_layout' => $param->sort('fgr_layout', 'asc'),
'fgr_mobile_layout' => $param->sort('fgr_mobile_layout', 'asc'),
'fgr_skin' => $param->sort('fgr_skin', 'asc'),
'fgr_mobile_skin' => $param->sort('fgr_mobile_skin', 'asc'),
'fgr_datetime' => $param->sort('fgr_datetime', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('fgr_id', 'fgr_key', 'fgr_layout', 'sfield', 'fgr_skin', 'fgr_mobile_skin', 'faq_group.mem_id', 'fgr_title'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('fgr_id', 'faq_group.mem_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('fgr_id', 'fgr_key', 'fgr_layout', 'fgr_mobile_layout', 'fgr_skin', 'fgr_mobile_skin', 'fgr_datetime'); // 정렬이 가능한 필드
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, '', '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$result['list'][$key]['display_name'] = display_username(
element('mem_userid', $val),
element('mem_nickname', $val),
element('mem_icon', $val)
);
$countwhere = array(
'fgr_id' => element('fgr_id', $val),
);
$result['list'][$key]['faqcount'] = $this->Faq_model->count_by($countwhere);
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('fgr_title' => '제목', 'fgr_datetime' => '날짜');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 게시판 글쓰기 또는 수정 페이지를 가져오는 메소드입니다
*/
public function write($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_faqgroup_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다
*/
if ($pid) {
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
}
$primary_key = $this->{$this->modelname}->primary_key;
/**
* 수정 페이지일 경우 기존 데이터를 가져옵니다
*/
$getdata = array();
if ($pid) {
$getdata = $this->{$this->modelname}->get_one($pid);
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'fgr_title',
'label' => '제목',
'rules' => 'trim|required',
),
array(
'field' => 'fgr_layout',
'label' => '레이아웃',
'rules' => 'trim',
),
array(
'field' => 'fgr_sidebar',
'label' => '사이드바 사용',
'rules' => 'trim',
),
array(
'field' => 'fgr_skin',
'label' => '스킨',
'rules' => 'trim',
),
array(
'field' => 'fgr_mobile_layout',
'label' => '모바일레이아웃',
'rules' => 'trim',
),
array(
'field' => 'fgr_mobile_sidebar',
'label' => '모바일사이드바사용',
'rules' => 'trim',
),
array(
'field' => 'fgr_mobile_skin',
'label' => '모바일스킨',
'rules' => 'trim',
),
);
if ($this->input->post($primary_key)) {
$config[] = array(
'field' => 'fgr_key',
'label' => 'FAQ 주소',
'rules' => 'trim|required|alpha_dash|min_length[3]|max_length[50]|is_unique[faq_group.fgr_key.fgr_id.' . $getdata['fgr_id'] . ']',
);
} else {
$config[] = array(
'field' => 'fgr_key',
'label' => 'FAQ 주소',
'rules' => 'trim|required|alpha_dash|min_length[3]|max_length[50]|is_unique[faq_group.fgr_key]',
);
}
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
$view['view']['data'] = $getdata;
$view['view']['data']['fgr_layout_option'] = get_skin_name(
'_layout',
set_value('fgr_layout', element('fgr_layout', $getdata)),
'기본설정따름'
);
$view['view']['data']['fgr_mobile_layout_option'] = get_skin_name(
'_layout',
set_value('fgr_mobile_layout', element('fgr_mobile_layout', $getdata)),
'기본설정따름'
);
$view['view']['data']['fgr_skin_option'] = get_skin_name(
'faq',
set_value('fgr_skin', element('fgr_skin', $getdata)),
'기본설정따름'
);
$view['view']['data']['fgr_mobile_skin_option'] = get_skin_name(
'faq',
set_value('fgr_mobile_skin', element('fgr_mobile_skin', $getdata)),
'기본설정따름'
);
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$fgr_sidebar = $this->input->post('fgr_sidebar') ? $this->input->post('fgr_sidebar') : 0;
$fgr_mobile_sidebar = $this->input->post('fgr_mobile_sidebar') ? $this->input->post('fgr_mobile_sidebar') : 0;
$updatedata = array(
'fgr_title' => $this->input->post('fgr_title', null, ''),
'fgr_key' => $this->input->post('fgr_key', null, ''),
'fgr_layout' => $this->input->post('fgr_layout', null, ''),
'fgr_mobile_layout' => $this->input->post('fgr_mobile_layout', null, ''),
'fgr_sidebar' => $fgr_sidebar,
'fgr_mobile_sidebar' => $fgr_mobile_sidebar,
'fgr_skin' => $this->input->post('fgr_skin', null, ''),
'fgr_mobile_skin' => $this->input->post('fgr_mobile_skin', null, ''),
);
/**
* 게시물을 수정하는 경우입니다
*/
if ($this->input->post($primary_key)) {
$this->{$this->modelname}->update($this->input->post($primary_key), $updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 수정되었습니다'
);
} else {
/**
* 게시물을 새로 입력하는 경우입니다
*/
$updatedata['fgr_datetime'] = cdate('Y-m-d H:i:s');
$updatedata['fgr_ip'] = $this->input->ip_address();
$updatedata['mem_id'] = $this->member->item('mem_id');
$this->{$this->modelname}->insert($updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 입력되었습니다'
);
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 게시물의 신규입력 또는 수정작업이 끝난 후 목록 페이지로 이동합니다
*/
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_faqgroup_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
$deletewhere = array(
'fgr_id' => $val,
);
$this->Faq_model->delete_where($deletewhere);
}
}
}
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

View File

@@ -0,0 +1,316 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Pagemenu class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>페이지설정>메뉴관리 controller 입니다.
*/
class Pagemenu extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'page/pagemenu';
/**
* 모델을 로딩합니다
*/
protected $models = array('Menu');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Menu_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_pagemenu_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'men_name',
'label' => '메뉴명',
'rules' => 'trim|required',
),
array(
'field' => 'men_parent',
'label' => '메뉴위치',
'rules' => 'trim|numeric|is_natural',
),
array(
'field' => 'men_target',
'label' => '새창여부',
'rules' => 'trim',
),
array(
'field' => 'men_custom',
'label' => '커스텀',
'rules' => 'trim',
),
array(
'field' => 'men_order',
'label' => '순서',
'rules' => 'trim|numeric|is_natural',
),
array(
'field' => 'men_desktop',
'label' => 'PC사용',
'rules' => 'trim',
),
array(
'field' => 'men_mobile',
'label' => '모바일사용',
'rules' => 'trim',
),
array(
'field' => 'men_link',
'label' => '링크주소',
'rules' => 'trim|required|prep_url|valid_url',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$men_parent = $this->input->post('men_parent') ? $this->input->post('men_parent') : 0;
$men_desktop = $this->input->post('men_desktop') ? $this->input->post('men_desktop') : 0;
$men_mobile = $this->input->post('men_mobile') ? $this->input->post('men_mobile') : 0;
$men_order = $this->input->post('men_order') ? $this->input->post('men_order') : 0;
$updatedata = array(
'men_parent' => $men_parent,
'men_name' => $this->input->post('men_name', null, ''),
'men_link' => $this->input->post('men_link', null, ''),
'men_target' => $this->input->post('men_target', null, ''),
'men_desktop' => $men_desktop,
'men_mobile' => $men_mobile,
'men_custom' => $this->input->post('men_custom', null, ''),
'men_order' => $men_order,
);
$this->{$this->modelname}->insert($updatedata);
$view['view']['alert_message'] = '메뉴가 추가되었습니다';
$this->_delete_cache();
redirect(admin_url('page/pagemenu'), 'refresh');
}
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_order_field = array('men_order'); // 정렬이 가능한 필드
$where = array('men_parent' => 0);
$result = $this->{$this->modelname}
->get_admin_list($per_page = 1000, '', $where, '', $findex = 'men_order', $forder = 'ASC', '', '');
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
$subwhere = array('men_parent' => element('men_id', $val));
$subresult = $this->{$this->modelname}
->get_admin_list($per_page = 1000, '', $subwhere, '', $findex = 'men_order', $forder = 'ASC', '', '');
$result['list'][$key]['subresult'] = $subresult;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$view['view']['list_update_url'] = admin_url($this->pagedir . '/listupdate/?' . $param->output());
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 목록 페이지에서 선택수정을 하는 경우 실행되는 메소드입니다
*/
public function listupdate()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_pagemenu_listupdate';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 업데이트를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
$men_name = $this->input->post('men_name');
$men_target = $this->input->post('men_target');
$men_custom = $this->input->post('men_custom');
$men_order = $this->input->post('men_order');
$men_desktop = $this->input->post('men_desktop');
$men_mobile = $this->input->post('men_mobile');
$men_link = $this->input->post('men_link');
foreach ($this->input->post('chk') as $val) {
if ($val) {
$men_order_update = element($val, $men_order) ? element($val, $men_order) : 0;
$men_desktop_update = element($val, $men_desktop) ? element($val, $men_desktop) : 0;
$men_mobile_update = element($val, $men_mobile) ? element($val, $men_mobile) : 0;
$updatedata = array(
'men_name' => element($val, $men_name),
'men_target' => element($val, $men_target),
'men_custom' => element($val, $men_custom),
'men_order' => $men_order_update,
'men_desktop' => $men_desktop_update,
'men_mobile' => $men_mobile_update,
'men_link' => element($val, $men_link),
);
$this->{$this->modelname}->update($val, $updatedata);
}
}
}
$this->_delete_cache();
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 업데이트가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 수정되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_pagemenu_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
$this->_delete_cache();
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
/**
* 메뉴관련 캐시를 삭제합니다
*/
public function _delete_cache()
{
$this->cache->delete('pagemenu-mobile');
$this->cache->delete('pagemenu-desktop');
}
}

View File

@@ -0,0 +1,420 @@
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Popup class
*
* Copyright (c) CIBoard <www.ciboard.co.kr>
*
* @author CIBoard (develop@ciboard.co.kr)
*/
/**
* 관리자>페이지설정>팝업관리 controller 입니다.
*/
class Popup extends CB_Controller
{
/**
* 관리자 페이지 상의 현재 디렉토리입니다
* 페이지 이동시 필요한 정보입니다
*/
public $pagedir = 'page/popup';
/**
* 모델을 로딩합니다
*/
protected $models = array('Popup');
/**
* 이 컨트롤러의 메인 모델 이름입니다
*/
protected $modelname = 'Popup_model';
/**
* 헬퍼를 로딩합니다
*/
protected $helpers = array('form', 'array', 'dhtml_editor');
function __construct()
{
parent::__construct();
/**
* 라이브러리를 로딩합니다
*/
$this->load->library(array('pagination', 'querystring'));
}
/**
* 목록을 가져오는 메소드입니다
*/
public function index()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_popup_index';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 페이지에 숫자가 아닌 문자가 입력되거나 1보다 작은 숫자가 입력되면 에러 페이지를 보여줍니다.
*/
$param =& $this->querystring;
$page = (((int) $this->input->get('page')) > 0) ? ((int) $this->input->get('page')) : 1;
$view['view']['sort'] = array(
'pop_title' => $param->sort('pop_title', 'asc'),
'pop_device' => $param->sort('pop_device', 'asc'),
'pop_start_date' => $param->sort('pop_start_date', 'asc'),
'pop_end_date' => $param->sort('pop_end_date', 'asc'),
'pop_activated' => $param->sort('pop_activated', 'asc'),
);
$findex = $this->input->get('findex') ? $this->input->get('findex') : $this->{$this->modelname}->primary_key;
$forder = $this->input->get('forder', null, 'desc');
$sfield = $this->input->get('sfield', null, '');
$skeyword = $this->input->get('skeyword', null, '');
$per_page = admin_listnum();
$offset = ($page - 1) * $per_page;
/**
* 게시판 목록에 필요한 정보를 가져옵니다.
*/
$this->{$this->modelname}->allow_search_field = array('pop_id', 'pop_title', 'pop_content'); // 검색이 가능한 필드
$this->{$this->modelname}->search_field_equal = array('pop_id'); // 검색중 like 가 아닌 = 검색을 하는 필드
$this->{$this->modelname}->allow_order_field = array('pop_title', 'pop_device', 'pop_start_date', 'pop_end_date', 'pop_activated'); // 정렬이 가능한 필드
$where = array();
if ($this->input->get('pop_activated') === 'Y') {
$where['pop_activated'] = '1';
}
if ($this->input->get('pop_activated') === 'N') {
$where['pop_activated'] = '0';
}
$result = $this->{$this->modelname}
->get_admin_list($per_page, $offset, $where, '', $findex, $forder, $sfield, $skeyword);
$list_num = $result['total_rows'] - ($page - 1) * $per_page;
if (element('list', $result)) {
foreach (element('list', $result) as $key => $val) {
if (empty($val['pop_start_date']) OR $val['pop_start_date'] === '0000-00-00') {
$result['list'][$key]['pop_start_date'] = '미지정';
}
if (empty($val['pop_end_date']) OR $val['pop_end_date'] === '0000-00-00') {
$result['list'][$key]['pop_end_date'] = '미지정';
}
$result['list'][$key]['num'] = $list_num--;
}
}
$view['view']['data'] = $result;
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $this->{$this->modelname}->primary_key;
/**
* 페이지네이션을 생성합니다
*/
$config['base_url'] = admin_url($this->pagedir) . '?' . $param->replace('page');
$config['total_rows'] = $result['total_rows'];
$config['per_page'] = $per_page;
$this->pagination->initialize($config);
$view['view']['paging'] = $this->pagination->create_links();
$view['view']['page'] = $page;
/**
* 쓰기 주소, 삭제 주소등 필요한 주소를 구합니다
*/
$search_option = array('pop_title' => '제목', 'pop_content' => '내용');
$view['view']['skeyword'] = ($sfield && array_key_exists($sfield, $search_option)) ? $skeyword : '';
$view['view']['search_option'] = search_option($search_option, $sfield);
$view['view']['listall_url'] = admin_url($this->pagedir);
$view['view']['write_url'] = admin_url($this->pagedir . '/write');
$view['view']['list_delete_url'] = admin_url($this->pagedir . '/listdelete/?' . $param->output());
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'index');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
}
/**
* 게시판 글쓰기 또는 수정 페이지를 가져오는 메소드입니다
*/
public function write($pid = 0)
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_popup_write';
$this->load->event($eventname);
$view = array();
$view['view'] = array();
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before'] = Events::trigger('before', $eventname);
/**
* 프라이머리키에 숫자형이 입력되지 않으면 에러처리합니다
*/
if ($pid) {
$pid = (int) $pid;
if (empty($pid) OR $pid < 1) {
show_404();
}
}
$primary_key = $this->{$this->modelname}->primary_key;
/**
* 수정 페이지일 경우 기존 데이터를 가져옵니다
*/
$getdata = array();
if ($pid) {
$getdata = $this->{$this->modelname}->get_one($pid);
}
/**
* Validation 라이브러리를 가져옵니다
*/
$this->load->library('form_validation');
/**
* 전송된 데이터의 유효성을 체크합니다
*/
$config = array(
array(
'field' => 'pop_title',
'label' => '팝업명',
'rules' => 'trim|required',
),
array(
'field' => 'pop_start_date',
'label' => '팝업시작일',
'rules' => 'trim|alpha_dash|exact_length[10]',
),
array(
'field' => 'pop_end_date',
'label' => '팝업종료일',
'rules' => 'trim|alpha_dash|exact_length[10]',
),
array(
'field' => 'pop_is_center',
'label' => '팝업정렬',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'pop_left',
'label' => '좌측위치',
'rules' => 'trim|numeric',
),
array(
'field' => 'pop_top',
'label' => '상단위치',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'pop_width',
'label' => '팝업가로길이',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'pop_height',
'label' => '팝업세로길이',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'pop_device',
'label' => '팝업표시기기',
'rules' => 'trim|required',
),
array(
'field' => 'pop_page',
'label' => '팝업이뜨는페이지',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'pop_disable_hours',
'label' => '시간',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'pop_activated',
'label' => '팝업활성화',
'rules' => 'trim|required|numeric',
),
array(
'field' => 'pop_content',
'label' => '팝업내용',
'rules' => 'trim|required',
),
);
$this->form_validation->set_rules($config);
/**
* 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다.
* 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다
*/
if ($this->form_validation->run() === false) {
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formrunfalse'] = Events::trigger('formrunfalse', $eventname);
if ($pid) {
if (empty($getdata['pop_start_date']) OR $getdata['pop_start_date'] === '0000-00-00') {
$getdata['pop_start_date'] = '';
}
if (empty($getdata['pop_end_date']) OR $getdata['pop_end_date'] === '0000-00-00') {
$getdata['pop_end_date'] = '';
}
$view['view']['data'] = $getdata;
}
/**
* primary key 정보를 저장합니다
*/
$view['view']['primary_key'] = $primary_key;
// 이벤트가 존재하면 실행합니다
$view['view']['event']['before_layout'] = Events::trigger('before_layout', $eventname);
/**
* 어드민 레이아웃을 정의합니다
*/
$layoutconfig = array('layout' => 'layout', 'skin' => 'write');
$view['layout'] = $this->managelayout->admin($layoutconfig, $this->cbconfig->get_device_view_type());
$this->data = $view;
$this->layout = element('layout_skin_file', element('layout', $view));
$this->view = element('view_skin_file', element('layout', $view));
} else {
/**
* 유효성 검사를 통과한 경우입니다.
* 즉 데이터의 insert 나 update 의 process 처리가 필요한 상황입니다
*/
// 이벤트가 존재하면 실행합니다
$view['view']['event']['formruntrue'] = Events::trigger('formruntrue', $eventname);
$pop_start_date = $this->input->post('pop_start_date') ? $this->input->post('pop_start_date') : null;
$pop_end_date = $this->input->post('pop_end_date') ? $this->input->post('pop_end_date') : null;
$pop_is_center = $this->input->post('pop_is_center') ? $this->input->post('pop_is_center') : 0;
$pop_left = $this->input->post('pop_left') ? $this->input->post('pop_left') : 0;
$pop_top = $this->input->post('pop_top') ? $this->input->post('pop_top') : 0;
$pop_width = $this->input->post('pop_width') ? $this->input->post('pop_width') : 0;
$pop_height = $this->input->post('pop_height') ? $this->input->post('pop_height') : 0;
$content_type = $this->cbconfig->item('use_popup_dhtml') ? 1 : 0;
$pop_page = $this->input->post('pop_page') ? $this->input->post('pop_page') : 0;
$pop_disable_hours = $this->input->post('pop_disable_hours') ? $this->input->post('pop_disable_hours') : 0;
$pop_activated = $this->input->post('pop_activated') ? $this->input->post('pop_activated') : 0;
$updatedata = array(
'pop_title' => $this->input->post('pop_title', null, ''),
'pop_start_date' => $pop_start_date,
'pop_end_date' => $pop_end_date,
'pop_is_center' => $pop_is_center,
'pop_left' => $pop_left,
'pop_top' => $pop_top,
'pop_width' => $pop_width,
'pop_height' => $pop_height,
'pop_device' => $this->input->post('pop_device', null, ''),
'pop_page' => $pop_page,
'pop_disable_hours' => $pop_disable_hours,
'pop_activated' => $pop_activated,
'pop_content' => $this->input->post('pop_content', null, ''),
'pop_content_html_type' => $content_type,
);
/**
* 게시물을 수정하는 경우입니다
*/
if ($this->input->post($primary_key)) {
$this->{$this->modelname}->update($this->input->post($primary_key), $updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 수정되었습니다'
);
} else {
/**
* 게시물을 새로 입력하는 경우입니다
*/
$updatedata['pop_datetime'] = cdate('Y-m-d H:i:s');
$updatedata['pop_ip'] = $this->input->ip_address();
$updatedata['mem_id'] = $this->member->item('mem_id');
$this->{$this->modelname}->insert($updatedata);
$this->session->set_flashdata(
'message',
'정상적으로 입력되었습니다'
);
}
//오늘 생성된 팝업 캐시를 삭제합니다.
$this->cache->delete('popup/popup-info-' . cdate('Y-m-d'));
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 게시물의 신규입력 또는 수정작업이 끝난 후 목록 페이지로 이동합니다
*/
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}
/**
* 목록 페이지에서 선택삭제를 하는 경우 실행되는 메소드입니다
*/
public function listdelete()
{
// 이벤트 라이브러리를 로딩합니다
$eventname = 'event_admin_page_popup_listdelete';
$this->load->event($eventname);
// 이벤트가 존재하면 실행합니다
Events::trigger('before', $eventname);
/**
* 체크한 게시물의 삭제를 실행합니다
*/
if ($this->input->post('chk') && is_array($this->input->post('chk'))) {
foreach ($this->input->post('chk') as $val) {
if ($val) {
$this->{$this->modelname}->delete($val);
}
}
}
//오늘 생성된 팝업 캐시를 삭제합니다.
$this->cache->delete('popup/popup-info-' . cdate('Y-m-d'));
// 이벤트가 존재하면 실행합니다
Events::trigger('after', $eventname);
/**
* 삭제가 끝난 후 목록페이지로 이동합니다
*/
$this->session->set_flashdata(
'message',
'정상적으로 삭제되었습니다'
);
$param =& $this->querystring;
$redirecturl = admin_url($this->pagedir . '?' . $param->output());
redirect($redirecturl);
}
}

Some files were not shown because too many files have changed in this diff Show More