묻고답하기

① 계정(호스팅-서버관리) 회사 이름 : 미리내
② php , mysql 버전 :  이거 어떻게 알아낼 수 있죠?잘 모르겠거든요,웹FTP가 지원되길래 들어가서 코드를 수정했습니다.
③ 제로보드 버젼(날짜 포함) : 1.1.5버젼 날짜는 어떻게 알 수 있죠?
④ 에러나는 주소와 에러 부분 소스(필수) : 아래 자세하게 설명해 놓았습니다.꼭 도와주세요!
⑤ 주로 쓰고 있는 스킨 이름이나 소스  : 이게 무슨뜻?그냥 제로보드 기본형 쓰는데요.
⑥ 질문 내용 : 읽을 때 마다 조회수 증가 하게 코드를 수정하고 싶은데요.안되요.(다음번에는 이거 관리자 모드에서 선택할 수 있도록 처리해주시면 안될까요?매우 중요한 기능인데 왜 이렇게 힘들게 수정을 해야 합니까?)아래 내용을 꼭 읽어 주시고 도와주세요!!!emoticon

http://www.xpressengine.com/?mid=zbxe_user_tip&search_target=title&search_keyword=%EC%A1%B0%ED%9A%8C%EC%88%98&document_srl=15972278
 여기 들어가보니까 코드를 수정하라고 하는데요.여기 있는 그대로 수정을 했는데 아래와 같은 에러가 뜨고 게시판이 정상적으로 열리지 않습니다.emoticon

'Parse error: syntax error, unexpected T_ELSE, expecting T_FUNCTION in /web/home/munsungjun/html/xe/modules/document/document.controller.php on line 566'가 나옵니다.

 

아래 코드는 제가 document.controller.php 파일을 열어서 314 번째 라인 부터 361 라인까지 조회수 증가 코드로 바꿔본 것입니다. 
무엇이 잘못되었습니까?제발 도와주세요!!!emoticon
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<?php
    /**
     * @class  documentController
     * @author zero (zero@nzeo.com)
     * @brief  document 紐⑤뱢??controller ?대옒??     **/

    class documentController extends document {

        /**
         * @brief 珥덇린??         **/
        function init() {
        }

        /**
         * @breif 寃뚯떆湲€??異붿쿇??泥섎━?섎뒗 action (Up)
         **/
        function procDocumentVoteUp() {
            if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request');

            $document_srl = Context::get('target_srl');
            if(!$document_srl) return new Object(-1, 'msg_invalid_request');

            $point = 1;
            return $this->updateVotedCount($document_srl, $point);
        }

        /**
         * @breif 寃뚯떆湲€??異붿쿇??泥섎━?섎뒗 action (Down)
         **/
        function procDocumentVoteDown() {
            if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request');

            $document_srl = Context::get('target_srl');
            if(!$document_srl) return new Object(-1, 'msg_invalid_request');

            $point = -1;
            return $this->updateVotedCount($document_srl, $point);
        }

        /**
         * @brief 寃뚯떆湲€???좉퀬??寃쎌슦 ?몄텧?섎뒗 action
         **/
        function procDocumentDeclare() {
            if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request');

            $document_srl = Context::get('target_srl');
            if(!$document_srl) return new Object(-1, 'msg_invalid_request');

            return $this->declaredDocument($document_srl);
        }

        /**
         * @brief 紐⑤뱢????젣?좊븣 ?깅줉??紐⑤뱺 湲€????젣?섎뒗 trigger
         **/
        function triggerDeleteModuleDocuments(&$obj) {
            $module_srl = $obj->module_srl;
            if(!$module_srl) return new Object();

            // document ??젣
            $oDocumentAdminController = &getAdminController('document');
            $output = $oDocumentAdminController->deleteModuleDocument($module_srl);
            if(!$output->toBool()) return $output;

            // category ??젣
            $oDocumentController = &getController('document');
            $output = $oDocumentController->deleteModuleCategory($module_srl);
            if(!$output->toBool()) return $output;

            return new Object();
        }

        /**
         * @brief 臾몄꽌??沅뚰븳 遺€??         * ?몄뀡媛믪쑝濡????묒냽?곹깭?먯꽌留??ъ슜 媛€??         **/
        function addGrant($document_srl) {
            $_SESSION['own_document'][$document_srl] = true;
        }

        /**
         * @brief 臾몄꽌 ?낅젰
         **/
        function insertDocument($obj, $manual_inserted = false) {
            // trigger ?몄텧 (before)
            $output = ModuleHandler::triggerCall('document.insertDocument', 'before', $obj);
            if(!$output->toBool()) return $output;

            // begin transaction
            $oDB = &DB::getInstance();
            $oDB->begin();

            // 湲곕낯 蹂€?섎뱾 ?뺣━
            if($obj->is_secret!='Y') $obj->is_secret = 'N';
            if($obj->allow_comment!='Y') $obj->allow_comment = 'N';
            if($obj->lock_comment!='Y') $obj->lock_comment = 'N';
            if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N';
            if($obj->homepage &&  !preg_match('/^http:\/\//i',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage;
            if($obj->notify_message != 'Y') $obj->notify_message = 'N';

            // $extra_vars瑜?serialize
            $obj->extra_vars = serialize($obj->extra_vars);

            // ?먮룞?€?μ슜 ?꾨뱶 ?쒓굅
            unset($obj->_saved_doc_srl);
            unset($obj->_saved_doc_title);
            unset($obj->_saved_doc_content);
            unset($obj->_saved_doc_message);

            // 二쇱뼱吏?臾몄꽌 踰덊샇媛€ ?놁쑝硫?臾몄꽌 踰덊샇 ?깅줉
            if(!$obj->document_srl) $obj->document_srl = getNextSequence();

            // 移댄뀒怨좊━媛€ ?덈굹 寃€?ы븯???녿뒗 移댄뀒怨좊━硫?0?쇰줈 ?명똿
            if($obj->category_srl) {
                $oDocumentModel = &getModel('document');
                $category_list = $oDocumentModel->getCategoryList($obj->module_srl);
                if(!$category_list[$obj->category_srl]) $obj->category_srl = 0;
            }

            // 議고쉶?? ?깅줉?쒖꽌 ?ㅼ젙
            if(!$obj->readed_count) $obj->readed_count = 0;
            $obj->update_order = $obj->list_order = getNextSequence() * -1;

            // ?섎룞?낅젰???€鍮꾪빐??鍮꾨?踰덊샇??hash?곹깭瑜??먭?, ?섎룞?낅젰???꾨땲硫?臾댁“嫄?md5 hash
            if($obj->password && !$obj->password_is_hashed) $obj->password = md5($obj->password);

            // ?섎룞 ?깅줉???꾨땲怨?濡쒓렇?????뚯썝??寃쎌슦 ?뚯썝???뺣낫瑜??낅젰
            if(Context::get('is_logged')&&!$manual_inserted) {
                $logged_info = Context::get('logged_info');
                $obj->member_srl = $logged_info->member_srl;
                $obj->user_id = $logged_info->user_id;
                $obj->user_name = $logged_info->user_name;
                $obj->nick_name = $logged_info->nick_name;
                $obj->email_address = $logged_info->email_address;
                $obj->homepage = $logged_info->homepage;
            }

            // ?쒕ぉ???놁쑝硫??댁슜?먯꽌 異붿텧
            settype($obj->title, "string");
            if($obj->title == '') $obj->title = cut_str(strip_tags($obj->content),20,'...');

            // ?댁슜?먯꽌 XE留뚯쓽 ?쒓렇瑜???젣
            $obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);

            // ?몄뀡?먯꽌 理쒓퀬 愿€由ъ옄媛€ ?꾨땲硫?iframe, script ?쒓굅
            if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);

            // DB???낅젰
            $output = executeQuery('document.insertDocument', $obj);
            if(!$output->toBool()) {
                $oDB->rollback();
                return $output;
            }

            // ?깃났?섏???寃쎌슦 category_srl???덉쑝硫?移댄뀒怨좊━ update
            if($obj->category_srl) $this->updateCategoryCount($obj->module_srl, $obj->category_srl);

            // trigger ?몄텧 (after)
            if($output->toBool()) {
              $trigger_output = ModuleHandler::triggerCall('document.insertDocument', 'after', $obj);
                if(!$trigger_output->toBool()) {
                    $oDB->rollback();
                    return $trigger_output;
                }
            }

            // commit
            $oDB->commit();

            // return
            $this->addGrant($obj->document_srl);
            $output->add('document_srl',$obj->document_srl);
            $output->add('category_srl',$obj->category_srl);
            return $output;
        }

        /**
         * @brief 臾몄꽌 ?섏젙
         **/
        function updateDocument($source_obj, $obj) {
            // trigger ?몄텧 (before)
            $output = ModuleHandler::triggerCall('document.updateDocument'+ '+ ', 'before', $obj);
            if(!$output->toBool()) return $output;

            // begin transaction
            $oDB = &DB::getInstance();
            $oDB->begin();

            // 湲곕낯 蹂€?섎뱾 ?뺣━
            if($obj->is_secret!='Y') $obj->is_secret = 'N';
            if($obj->allow_comment!='Y') $obj->allow_comment = 'N';
            if($obj->lock_comment!='Y') $obj->lock_comment = 'N';
            if($obj->allow_trackback!='Y') $obj->allow_trackback = 'N';
            if($obj->homepage &&  !preg_match('/^http:\/\//i'+ ',$obj->homepage)) $obj->homepage = 'http://'.$obj->homepage;
            if($obj->notify_message != 'Y') $obj->notify_message = 'N';

            // $extra_vars瑜?serialize
            $obj->extra_vars = serialize($obj->extra_vars);

            // ?먮룞?€?μ슜 ?꾨뱶 ?쒓굅
            unset($obj->_saved_doc_srl);
            unset($obj->_saved_doc_title);
            unset($obj->_saved_doc_content);
            unset($obj->_saved_doc_message);

            // 移댄뀒怨좊━媛€ 蹂€寃쎈릺?덉쑝硫?寃€?ы썑 ?녿뒗 移댄뀒怨좊━硫?0?쇰줈 ?명똿
            if($source_obj->get('+ 'category_srl')!=$obj->category_srl) {
                $oDocumentModel = &getModel('document');
                $category_list = $oDocumentModel->getCategoryList($obj->module_srl);
                if(!$category_list[$obj->category_srl]) $obj->category_srl = 0;
            }

            // ?섏젙 ?쒖꽌瑜?議곗젅
            $obj->update_order = getNextSequence() * -1;

            // 鍮꾨?踰덊샇媛€ ?덉쑝硫?md5 hash
            if($obj->password) $obj->password = md5($obj->password);

            // ?먮낯 ?묒꽦?멸낵 ?섏젙?섎젮???섏젙?몄씠 ?숈씪???쒖뿉 濡쒓렇???뚯썝???뺣낫瑜??낅젰
            if(Context::get('is_logged'+ ')) {
                $logged_info = Context::get('logged_info');
                if($source_obj->get('member_srl')==$logged_info->member_srl) {
                    $obj->member_srl = $logged_info->member_srl;
                    $obj->user_name = $logged_info->user_name;
                    $obj->nick_name = $logged_info->nick_name;
                    $obj->email_address = $logged_info->email_address;
                    $obj->homepage = $logged_info->homepage;
                }
            }

            // 濡쒓렇?명븳 ?좎?媛€ ?묒꽦??湲€?몃뜲 nick_name???놁쓣 寃쎌슦
            if($source_obj->get('member_srl')&& !$obj->nick_name) {
                $obj->member_srl = $source_obj->get('member_srl');
                $obj->user_name = $source_obj->get('user_name');
                $obj->nick_name = $source_obj->get('nick_name');
                $obj->email_address = $source_obj->get('email_address');
                $obj->homepage = $source_obj->get('homepage');
            }

            // ?쒕ぉ???놁쑝硫??댁슜?먯꽌 異붿텧
            settype($obj->title, "string");
            if($obj->title == '') $obj->title = cut_str(strip_tags($obj->content),20,'...');

            // ?댁슜?먯꽌 XE留뚯쓽 ?쒓렇瑜???젣
            $obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', ''+ ', $obj->content);

            // ?몄뀡?먯꽌 理쒓퀬 愿€由ъ옄媛€ ?꾨땲硫?iframe, script ?쒓굅
            if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);

            // DB???낅젰
            $output = executeQuery('document.updateDocument', $obj);
            if(!$output->toBool()) {
                $oDB->rollback();
                return $output;
            }

            // ?깃났?섏???寃쎌슦 category_srl???덉쑝硫?移댄뀒怨좊━ update
            if($source_obj->get('category_srl')!=$obj->category_srl) {
                if($source_obj->get('category_srl')) $this->updateCategoryCount($obj->module_srl, $source_obj->get('category_srl'));
                if($obj->category_srl) $this->updateCategoryCount($obj->module_srl, $obj->category_srl);
            }

            // trigger ?몄텧 (after)
            if($output->toBool()) {
                $trigger_output = ModuleHandler::triggerCall('document.updateDocument', 'after', $obj);
                if(!$trigger_output->toBool()) {
                    $oDB->rollback();
                    return $trigger_output;
                }
            }

            // commit
            $oDB->commit();

            // ?몃꽕???뚯씪 ?쒓굅
            FileHandler::removeDir(sprintf('files/cache/thumbnails/%s',getNumberingPath($obj->document_srl, 3)));

            $output->add('document_srl',$obj->document_srl);
            return $output;
        }

        /**
         * @brief 臾몄꽌 ??젣
         **/
        function deleteDocument($document_srl, $is_admin = false) {
            // trigger ?몄텧 (before)
            $trigger_obj->document_srl = $document_srl;
            $output = ModuleHandler::triggerCall('document.deleteDocument', 'before', $trigger_obj);
            if(!$output->toBool()) return $output;

            // begin transaction
            $oDB = &DB::getInstance();
            $oDB->begin();

            // document??model 媛앹껜 ?앹꽦
            $oDocumentModel = &getModel('document');

            // 湲곗〈 臾몄꽌媛€ ?덈뒗吏€ ?뺤씤
            $oDocument = $oDocumentModel->getDocument($document_srl, $is_admin);
            if(!$oDocument->isExists() || $oDocument->document_srl != $document_srl) return new Object(-1, 'msg_invalid_document');

            // 沅뚰븳???덈뒗吏€ ?뺤씤
            if(!$oDocument->isGranted()) return new Object(-1, 'msg_not_permitted');

            // 湲€ ??젣
            $args->document_srl = $document_srl;
            $output = executeQuery('document.deleteDocument', $args);
            if(!$output->toBool()) {
                $oDB->rollback();
                return $output;
            }

            // 移댄뀒怨좊━媛€ ?덉쑝硫?移댄뀒怨좊━ ?뺣낫 蹂€寃?            if($oDocument->get('category_srl')) $this->updateCategoryCount($oDocument->get('module_srl'),$oDocument->get('category_srl'));

            // ?좉퀬 ??젣
            executeQuery('document.deleteDeclared', $args);

            // trigger ?몄텧 (after)
            if($output->toBool()) {
                $trigger_obj = $oDocument->getObjectVars();
                $trigger_output = ModuleHandler::triggerCall('document.deleteDocument', 'after', $trigger_obj);
                if(!$trigger_output->toBool()) {
                    $oDB->rollback();
                    return $trigger_output;
                }
            }

            // ?몃꽕???뚯씪 ?쒓굅
            FileHandler::removeDir(sprintf('files/cache/thumbnails/%s',getNumberingPath($document_srl, 3)));

            // commit
            $oDB->commit();

            return $output;
        }

        /**
         * @brief 해당 document의 조회수 증가
         **/
        function updateReadedCount($oDocument) {
            $document_srl = $oDocument->document_srl;
            $member_srl = $oDocument->get('member_srl');
            $logged_info = Context::get('logged_info');

         // session에 정보로 조회수를 증가하였다고 생각하면 패스
            /*if($_SESSION['readed_document'][$document_srl]) return false;

            // 글의 작성 ip와 현재 접속자의 ip가 동일하면 패스
            if($document->ipaddress == $_SERVER['REMOTE_ADDR']) {
                $_SESSION['readed_document'][$document_srl] = true;
                return false;
            } */

            // document의 작성자가 회원일때 조사
            if($member_srl) {} /*

                // 글쓴이와 현재 로그인 사용자의 정보가 일치하면 읽었다고 생각하고 세션 등록후 패스
                if($member_srl && $logged_info->member_srl == $member_srl) {
                    $_SESSION['readed_document'][$document_srl] = true;
                    return false;
                }
            }*/

            // 로그인 사용자이면 member_srl, 비회원이면 ipaddress로 판단
            if($logged_info->member_srl) {
                $args->member_srl = $logged_info->member_srl;
            } else {
                $args->ipaddress = $_SERVER['REMOTE_ADDR'];
            }
            $args->document_srl = $document_srl;
            $output = executeQuery('document.getDocumentReadedLogInfo', $args);
  
            // 로그 정보에 조회 로그가 있으면 세션 등록후 패스
           /* if($output->data->count) return $_SESSION['readed_document'][$document_srl] = true; */

            // 조회수 업데이트
            $output = executeQuery('document.updateReadedCount', $args);

            // 로그 남기기
            $output = executeQuery('document.insertDocumentReadedLog', $args);

            // 세션 정보에 남김
            return $_SESSION['readed_document'][$document_srl] = true;
        }

 

        /**
         * @brief ?대떦 document??異붿쿇??利앷?
         **/
        function updateVotedCount($document_srl, $point = 1) {
            if($point > 0) $failed_voted = 'failed_voted';
            else $failed_voted = 'failed_blamed';

            // ?몄뀡 ?뺣낫??異붿쿇 ?뺣낫媛€ ?덉쑝硫?以묐떒
            if($_SESSION['voted_document'][$document_srl]) return new Object(-1, $failed_voted);

            // 臾몄꽌 ?먮낯??媛€?몄샂
            $oDocumentModel = &getModel('document');
            $oDocument = $oDocumentModel->getDocument($document_srl, false, false);

            // 湲€???묒꽦 ip?€ ?꾩옱 ?묒냽?먯쓽 ip媛€ ?숈씪?섎㈃ ?⑥뒪
            if($oDocument->get('ipaddress') == $_SERVER['+ 'REMOTE_ADDR']) {
                $_SESSION['voted_document'+ '][$document_srl] = true;
                return new Object(-1, $failed_voted);
            }

            // document???묒꽦?먭? ?뚯썝?쇰븣 議곗궗
            if($oDocument->get('member_srl')) {
                // member model 媛앹껜 ?앹꽦
                $oMemberModel = &getModel('member');
                $member_srl = $oMemberModel->getLoggedMemberSrl();

                // 湲€?댁씠?€ ?꾩옱 濡쒓렇???ъ슜?먯쓽 ?뺣낫媛€ ?쇱튂?섎㈃ ?쎌뿀?ㅺ퀬 ?앷컖?섍퀬 ?몄뀡 ?깅줉???⑥뒪
                if($member_srl && $member_srl == $oDocument->get('member_srl')) {
                    $_SESSION['voted_document'][$document_srl] = true;
                    return new Object(-1, $failed_voted);
                }
            }

            // 濡쒓렇???ъ슜?먯씠硫?member_srl, 鍮꾪쉶?먯씠硫?ipaddress濡??먮떒
            if($member_srl) {
                $args->member_srl = $member_srl;
            } else {
                $args->ipaddress = $_SERVER['REMOTE_ADDR'];
            }
            $args->document_srl = $document_srl;
            $output = executeQuery('document.getDocumentVotedLogInfo', $args);

            // 濡쒓렇 ?뺣낫??異붿쿇 濡쒓렇媛€ ?덉쑝硫??몄뀡 ?깅줉???⑥뒪
            if($output->data->count) {
                $_SESSION['voted_document'][$document_srl] = true;
                return new Object(-1, $failed_voted);
            }

            // 異붿쿇???낅뜲?댄듃
            if($point < 0)
            {
                $args->blamed_count = $oDocument->get('blamed_count') + $point;
                $output = executeQuery('document.updateBlamedCount', $args);
            }
            else
            {
                $args->voted_count = $oDocument->get('+ 'voted_count') + $point;
                $output = executeQuery('document.updateVotedCount', $args);
            }
            if(!$output->toBool()) return $output;

            // 濡쒓렇 ?④린湲?            $args->point = $point;
            $output = executeQuery('document.insertDocumentVotedLog', $args);
            if(!$output->toBool()) return $output;

            // ?몄뀡 ?뺣낫???④?
            $_SESSION['voted_document'][$document_srl] = true;

            $obj->member_srl = $oDocument->get('member_srl');
            $obj->module_srl = $oDocument->get('module_srl');
            $obj->point = $point;
            $output = ModuleHandler::triggerCall('document.updateVotedCount', 'after', $obj);
            if(!$output->toBool()) return $output;

            // 寃곌낵 由ы꽩
            if($point > 0)
                return new Object(0, 'success_voted');
            else
                return new Object(0, 'success_blamed');
        }

        /**
         * @brief 寃뚯떆湲€ ?좉퀬
         **/
        function declaredDocument($document_srl) {
            // ?몄뀡 ?뺣낫???좉퀬 ?뺣낫媛€ ?덉쑝硫?以묐떒
            if($_SESSION['declared_document'][$document_srl]) return new Object(-1, 'failed_declared');

            // ?대? ?좉퀬?섏뿀?붿? 寃€??            $args->document_srl = $document_srl;
            $output = executeQuery('document.getDeclaredDocument', $args);
            if(!$output->toBool()) return $output;
            $declared_count = $output->data->declared_count;

            // 臾몄꽌 ?먮낯??媛€?몄샂
            $oDocumentModel = &getModel('document');
            $oDocument = $oDocumentModel->getDocument($document_srl, false, false);

            // 湲€???묒꽦 ip?€ ?꾩옱 ?묒냽?먯쓽 ip媛€ ?숈씪?섎㈃ ?⑥뒪
            if($oDocument->get('ipaddress') == $_SERVER['REMOTE_ADDR']) {
                $_SESSION['declared_document'][$document_srl] = true;
                return new Object(-1, 'failed_declared');
            }

            // document???묒꽦?먭? ?뚯썝?쇰븣 議곗궗
            if($oDocument->get('member_srl')) {
                // member model 媛앹껜 ?앹꽦
                $oMemberModel = &getModel('member');
                $member_srl = $oMemberModel->getLoggedMemberSrl();

                // 湲€?댁씠?€ ?꾩옱 濡쒓렇???ъ슜?먯쓽 ?뺣낫媛€ ?쇱튂?섎㈃ ?쎌뿀?ㅺ퀬 ?앷컖?섍퀬 ?몄뀡 ?깅줉???⑥뒪
                if($member_srl && $member_srl == $oDocument->get('member_srl')) {
                    $_SESSION['+ 'declared_document'][$document_srl] = true;
                    return new Object(-1, 'failed_declared');
                }
            }

            // 濡쒓렇???ъ슜?먯씠硫?member_srl, 鍮꾪쉶?먯씠硫?ipaddress濡??먮떒
            if($member_srl) {
                $args->member_srl = $member_srl;
            } else {
                $args->ipaddress = $_SERVER['REMOTE_ADDR'];
            }
            $args->document_srl = $document_srl;
            $output = executeQuery('document.getDocumentDeclaredLogInfo', $args);

            // 濡쒓렇 ?뺣낫???좉퀬 濡쒓렇媛€ ?덉쑝硫??몄뀡 ?깅줉???⑥뒪
            if($output->data->count) {
                $_SESSION['declared_document'][$document_srl] = true;
                return new Object(-1, '+ 'failed_declared');
            }

            // ?좉퀬湲€ 異붽?
            if($declared_count > 0) $output = executeQuery('document.updateDeclaredDocument', $args);
            else $output = executeQuery('document.insertDeclaredDocument', $args);
            if(!$output->toBool()) return $output;

            // 濡쒓렇 ?④린湲?            $output = executeQuery('document.insertDocumentDeclaredLog', $args);

            // ?몄뀡 ?뺣낫???④?
            $_SESSION['declared_document'][$document_srl] = true;

            $this->setMessage('success_declared');
        }

        /**
         * @brief ?대떦 document???볤? ??利앷?
         * ?볤??섎? 利앷??쒗궎硫댁꽌 ?섏젙 ?쒖꽌?€ ?섏젙?? ?섏젙?먮? ?깅줉
         **/
        function updateCommentCount($document_srl, $comment_count, $last_updater, $comment_inserted = false) {
            $args->document_srl = $document_srl;
            $args->comment_count = $comment_count;

            if($comment_inserted) {
                $args->update_order = -1*getNextSequence();
                $args->last_updater = $last_updater;
            }

            return executeQuery('document.updateCommentCount', $args);
        }

        /**
         * @brief ?대떦 document????씤湲€ ?섏쬆媛€
         **/
        function updateTrackbackCount($document_srl, $trackback_count) {
            $args->document_srl = $document_srl;
            $args->trackback_count = $trackback_count;

            return executeQuery('document.updateTrackbackCount', $args);
        }

        /**
         * @brief 移댄뀒怨좊━ 異붽?
         **/
        function insertCategory($obj) {
            // ?뱀젙 移댄뀒怨좊━???섎떒?쇰줈 異붽????뺣젹?쒖꽌 ?ъ젙??            if($obj->parent_srl) {
                // 遺€紐?移댄뀒怨좊━ 援ы븿
                $oDocumentModel = &getModel('document');
                $parent_category = $oDocumentModel->getCategory($obj->parent_srl);
                $obj->list_order = $parent_category->list_order;
                $this->updateCategoryListOrder($parent_category->module_srl, $parent_category->list_order+1);
                if(!$obj->category_srl) $obj->category_srl = getNextSequence();
            } else {
                $obj->list_order = $obj->category_srl = getNextSequence();
            }

            $output = executeQuery('document.insertCategory', $obj);
            if($output->toBool()) {
                $output->add('category_srl', $obj->category_srl);
                $this->makeCategoryFile($obj->module_srl);
            }

            return $output;
        }

        /**
         * @brief ?뱀젙 移댄뀒怨좊━ 遺€??list_count 利앷?
         **/
        function updateCategoryListOrder($module_srl, $list_order) {
            $args->module_srl = $module_srl;
            $args->list_order = $list_order;
            return executeQuery('document.updateCategoryOrder', $args);
        }

        /**
         * @brief 移댄뀒怨좊━??臾몄꽌???レ옄瑜?蹂€寃?         **/
        function updateCategoryCount($module_srl, $category_srl, $document_count = 0) {
            // document model 媛앹껜 ?앹꽦
            $oDocumentModel = &getModel('document');
            if(!$document_count) $document_count = $oDocumentModel->getCategoryDocumentCount($category_srl);

            $args->category_srl = $category_srl;
            $args->document_count = $document_count;
            $output = executeQuery('document.updateCategoryCount'+ ', $args);
            if($output->toBool()) $this->makeCategoryFile($module_srl);

            return $output;
        }

        /**
         * @brief 移댄뀒怨좊━???뺣낫瑜??섏젙
         **/
        function updateCategory($obj) {
            $output = executeQuery('document.updateCategory', $obj);
            if($output->toBool()) $this->makeCategoryFile($obj->module_srl);
            return $output;
        }

        /**
        /**
         * @brief 移댄뀒怨좊━ ??젣
         **/
        function deleteCategory($category_srl) {
            $args->category_srl = $category_srl;
            $oDocumentModel = &getModel('document');
            $category_info = $oDocumentModel->getCategory($category_srl);

            // ?먯떇 移댄뀒怨좊━媛€ ?덈뒗吏€ 泥댄겕?섏뿬 ?덉쑝硫???젣 紐삵븳?ㅻ뒗 ?먮윭 異쒕젰
            $output = executeQuery('document.getChildCategoryCount', $args);
            if(!$output->toBool()) return $output;
            if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child');

            // 移댄뀒怨좊━ ?뺣낫瑜???젣
            $output = executeQuery('document.deleteCategory', $args);
            if(!$output->toBool()) return $output;

            $this->makeCategoryFile($category_info->module_srl);

            // ??移댄뀒怨좊━ 媛믪쓣 媛€吏€??臾몄꽌?ㅼ쓽 category_srl??0 ?쇰줈 ?명똿
            unset($args);

            $args->target_category_srl = 0;
            $args->source_category_srl = $category_srl;
            $output = executeQuery('document.updateDocumentCategory', $args);

            return $output;
        }

        /**
         * @brief ?뱀젙 紐⑤뱢??移댄뀒怨좊━瑜?紐⑤몢 ??젣
         **/
        function deleteModuleCategory($module_srl) {
            $args->module_srl = $module_srl;
            $output = executeQuery('document.deleteModuleCategory', $args);
            return $output;
        }

        /**
         * @brief 移댄뀒怨좊━瑜??곷떒?쇰줈 ?대룞
         **/
        function moveCategoryUp($category_srl) {
            $oDocumentModel = &getModel('document');

            // ?좏깮??移댄뀒怨좊━???뺣낫瑜?援ы븳??            $args->category_srl = $category_srl;
            $output = executeQuery('document.getCategory', $args);

            $category = $output->data;
            $list_order = $category->list_order;
            $module_srl = $category->module_srl;

            // ?꾩껜 移댄뀒怨좊━ 紐⑸줉??援ы븳??            $category_list = $oDocumentModel->getCategoryList($module_srl);
            $category_srl_list = array_keys($category_list);
            if(count($category_srl_list)<2) return new Object();

            $prev_category = NULL;
            foreach($category_list as $key => $val) {
                if($key==$category_srl) break;
                $prev_category = $val;
            }

            // ?댁쟾 移댄뀒怨좊━媛€ ?놁쑝硫?洹몃깷 return
            if(!$prev_category) return new Object(-1,Context::getLang('msg_category_not_moved'));

            // ?좏깮??移댄뀒怨좊━媛€ 媛€???꾩쓽 移댄뀒怨좊━?대㈃ 洹몃깷 return
            if($category_srl_list[0]==$category_srl) return new Object(-1,Context::getLang('msg_category_not_moved'));

            // ?좏깮??移댄뀒怨좊━???뺣낫
            $cur_args->category_srl = $category_srl;
            $cur_args->list_order = $prev_category->list_order;
            $cur_args->title = $category->title;
            $this->updateCategory($cur_args);

            // ?€??移댄뀒怨좊━???뺣낫
            $prev_args->category_srl = $prev_category->category_srl;
            $prev_args->list_order = $list_order;
            $prev_args->title = $prev_category->title;
            $this->updateCategory($prev_args);

            return new Object();
        }

        /**
         * @brief 移댄뀒怨좊━瑜??꾨옒濡??대룞
         **/
        function moveCategoryDown($category_srl) {
            $oDocumentModel = &getModel('document');

            // ?좏깮??移댄뀒怨좊━???뺣낫瑜?援ы븳??            $args->category_srl = $category_srl;
            $output = executeQuery('document.getCategory', $args);

            $category = $output->data;
            $list_order = $category->list_order;
            $module_srl = $category->module_srl;

            // ?꾩껜 移댄뀒怨좊━ 紐⑸줉??援ы븳??            $category_list = $oDocumentModel->getCategoryList($module_srl);
            $category_srl_list = array_keys($category_list);
            if(count($category_srl_list)<2) return new Object();

            for($i=0;$i<count($category_srl_list);$i++) {
                if($category_srl_list[$i]==$category_srl) break;
            }

            $next_category_srl = $category_srl_list[$i+1];
            if(!$category_list[$next_category_srl]) return new Object(-1,Context::getLang('msg_category_not_moved'));
            $next_category = $category_list[$next_category_srl];

            // ?좏깮??移댄뀒怨좊━???뺣낫
            $cur_args->category_srl = $category_srl;
            $cur_args->list_order = $next_category->list_order;
            $cur_args->title = $category->title;
            $this->updateCategory($cur_args);

            // ?€??移댄뀒怨좊━???뺣낫
            $next_args->category_srl = $next_category->category_srl;
            $next_args->list_order = $list_order;
            $next_args->title = $next_category->title;
            $this->updateCategory($next_args);

            return new Object();
        }

        /**
         * @brief document??20媛??뺤옣蹂€?섎? xml js filter ?곸슜???꾪빐 吏곸젒 ?곸슜
         * 紐⑤뱢?뺣낫瑜?諛쏆븘??20媛쒖쓽 ?뺤옣蹂€?섎? 泥댄겕?섏뿬 type, required?깆쓽 媛믪쓣 泥댄겕?섏뿬 header??javascript 肄붾뱶 異붽?
         **/
        function addXmlJsFilter($module_info) {
            $extra_vars = $module_info->extra_vars;
            if(!$extra_vars) return;

            $js_code = "";

            foreach($extra_vars as $key => $val) {
                $js_code .= sprintf('alertMsg["extra_vars%d"] = "%s";', $key, $val->name);
                $js_code .= sprintf('extra_vars[extra_vars.length] = "extra_vars%d";', $key);
                $js_code .= sprintf('target_type_list["extra_vars%d"] = "%s";', $key, $val->type);
                if($val->is_required == 'Y') $js_code .= sprintf('notnull_list[notnull_list.length] = "extra_vars%s";',$key);
            }

            $js_code = "<script type=\"text/javascript\">//<![CDATA[\n".$js_code."\n//]]></script>";
            Context::addHtmlHeader($js_code);
        }

        /**
         * @brief 移댄뀒怨좊━瑜?罹먯떆 ?뚯씪濡??€??         **/
        function makeCategoryFile($module_srl) {
            // 罹먯떆 ?뚯씪 ?앹꽦???꾩슂???뺣낫媛€ ?놁쑝硫?洹몃깷 return
            if(!$module_srl) return false;

            // 紐⑤뱢 ?뺣낫瑜?媛€?몄샂 (mid瑜?援ы븯湲??꾪빐)
            $oModuleModel = &getModel('module');
            $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
            $mid = $module_info->mid;

            if(!is_dir('./files/cache/document_category')) FileHandler::makeDir('./files/cache/document_category');

            // 罹먯떆 ?뚯씪???대쫫??吏€??            $xml_file = sprintf("./files/cache/document_category/%s.xml.php", $module_srl);
            $php_file = sprintf("./files/cache/document_category/%s.php", $module_srl);

            // 移댄뀒怨좊━ 紐⑸줉??援ы븿
            $args->module_srl = $module_srl;
            $args->sort_index = 'list_order';
            $output = executeQuery('document.getCategoryList', $args);

            $category_list = $output->data;

            if(!$category_list) {
                FileHandler::removeFile($xml_file);
                FileHandler::removeFile($php_file);
                return false;
            }
            if(!is_array($category_list)) $category_list = array($category_list);

            $category_count = count($category_list);
            for($i=0;$i<$category_count;$i++) {
                $category_srl = $category_list[$i]->category_srl;
                if(!preg_match('/^[0-9,]+$/', $category_list[$i]->group_srls)) $category_list[$i]->group_srls = '';
                $list[$category_srl] = $category_list[$i];
            }

            // 援ы빐???곗씠?곌? ?녿떎硫??몃뱶?곗씠?곌? ?녿뒗 xml ?뚯씪留??앹꽦
            if(!$list) {
                $xml_buff = "<root />";
                FileHandler::writeFile($xml_file, $xml_buff);
                FileHandler::writeFile($php_file, '<?php if(!defined("__ZBXE__")) exit(); ?>');
                return $xml_file;
            }

            // 援ы빐???곗씠?곌? ?섎굹?쇰㈃ array濡?諛붽씀?댁쨲
            if(!is_array($list)) $list = array($list);

            // 猷⑦봽瑜??뚮㈃??tree 援ъ꽦
            foreach($list as $category_srl => $node) {
                $node->mid = $mid;
                $parent_srl = (int)$node->parent_srl;
                $tree[$parent_srl][$category_srl] = $node;
            }

            // 罹먯떆 ?뚯씪??沅뚰븳怨?洹몃9 ?ㅼ젙???꾪븳 怨듯넻 ?ㅻ뜑
            $header_script =
                '$lang_type = Context::getLangType(); '.
                '$is_logged = Context::get(\'is_logged\'); '.
                '$logged_info = Context::get(\'logged_info\'); '.
                'if($is_logged) {'.
                    'if($logged_info->is_admin=="Y") $is_admin = true; '.
                    'else $is_admin = false; '.
                    '$group_srls = array_keys($logged_info->group_list); '.
                '} else { '.
                    '$is_admin = false; '.
                    '$group_srsl = array(); '.
                '} ';

            // xml 罹먯떆 ?뚯씪 ?앹꽦 (xml罹먯떆???곕줈 ?숈옉?섍린??session 吏€?뺤쓣 ?댁<?댁빞 ??
            $xml_buff = sprintf(
                '<?php '.
                'define(\'__ZBXE__\', true); '.
                'require_once(\'../../../config/config.inc.php\'); '.
                '$oContext = &Context::getInstance(); '.
                '$oContext->init(); '.
                'header("Content-Type: text/xml; charset=UTF-8"); '.
                'header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); '.
                'header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); '.
                'header("Cache-Control: no-store, no-cache, must-revalidate"); '.
                'header("Cache-Control: post-check=0, pre-check=0", false); '.
                'header("Pragma: no-cache"); '.
                '%s'.
                '?>'.
                '<root>%s</root>',
                $header_script,
                $this->getXmlTree($tree[0], $tree)
            );

            // php 罹먯떆 ?뚯씪 ?앹꽦
            $php_output = $this->getPhpCacheCode($tree[0], $tree, 0);
            $php_buff = sprintf(
                '<?php '.
                'if(!defined("__ZBXE__")) exit(); '.
                '%s; '.
                '%s; '.
                '$menu->list = array(%s); '.
                '?>',
                $header_script,
                $php_output['category_title_str'],
                $php_output['buff']
            );

            // ?뚯씪 ?€??            FileHandler::writeFile($xml_file, $xml_buff);
            FileHandler::writeFile($php_file, $php_buff);
            return $xml_file;
        }

        /**
         * @brief array濡??뺣젹???몃뱶?ㅼ쓣 parent_srl??李몄“?섎㈃??recursive?섍쾶 ?뚮㈃??xml ?곗씠???앹꽦
         * 硫붾돱 xml?뚯씪?€ node?쇰뒗 tag媛€ 以묒꺽?쇰줈 ?ъ슜?섎ʼn ??xml doc?쇰줈 愿€由ъ옄 ?섏씠吏€?먯꽌 硫붾돱瑜?援ъ꽦?댁쨲\n
         * (tree_menu.js ?먯꽌 xml?뚯씪??諛붾줈 ?쎄퀬 tree menu瑜?援ы쁽)
         **/
        function getXmlTree($source_node, $tree) {
            if(!$source_node) return;

            foreach($source_node as $category_srl => $node) {
                $child_buff = "";

                // ?먯떇 ?몃뱶???곗씠??媛€?몄샂
                if($category_srl && $tree[$category_srl]) $child_buff = $this->getXmlTree($tree[$category_srl], $tree);

                // 蹂€???뺣━
                $title = str_replace(array('&','"','<','>'),array('&amp;','&quot;','&lt;','&gt;'),$node->title);
                $expand = $node->expand;
                $group_srls = $node->group_srls;
                $mid = $node->mid;
                $module_srl = $node->module_srl;
                $parent_srl = $node->parent_srl;
                $color = $node->color;
                // node->group_srls媛믪씠 ?덉쑝硫?                if($group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$group_srls);
                else $group_check_code = "true";

                $attribute = sprintf(
                        'mid="%s" module_srl="%d" node_srl="%d" parent_srl="%d" category_srl="%d" text="<?php echo (%s?"%s":"")?>" url="%s" expand="%s" color="%s" document_count="%d" ',
                        $mid,
                        $module_srl,
                        $category_srl,
                        $parent_srl,
                        $category_srl,
                        $group_check_code,
                        $title,
                        getUrl('','mid',$node->mid,'category',$category_srl),
                        $expand,
                        $color,
                        $node->document_count
                );

                if($child_buff) $buff .= sprintf('<node %s>%s</node>', $attribute, $child_buff);
                else $buff .=  sprintf('<node %s />', $attribute);
            }
            return $buff;
        }

        /**
         * @brief array濡??뺣젹???몃뱶?ㅼ쓣 php code濡?蹂€寃쏀븯??return
         * 硫붾돱?먯꽌 硫붾돱瑜?tpl???ъ슜??xml?곗씠?곕? ?ъ슜???섎룄 ?덉?留?蹂꾨룄??javascript ?ъ슜???꾩슂?섍린??         * php濡???罹먯떆?뚯씪??留뚮뱾?댁꽌 db?댁슜?놁씠 諛붾줈 硫붾돱 ?뺣낫瑜?援ы븷 ???덈룄濡??쒕떎
         * ??罹먯떆??ModuleHandler::displayContent() ?먯꽌 include?섏뿬 Context::set() ?쒕떎
         **/
        function getPhpCacheCode($source_node, $tree) {
            $output = array("buff"=>"", "category_srl_list"=>array());
            if(!$source_node) return $output;

            // 猷⑦봽瑜??뚮㈃??1李?諛곗뿴濡??뺣━?섍퀬 include?????덈뒗 php script 肄붾뱶瑜??앹꽦
            foreach($source_node as $category_srl => $node) {

                // ?먯떇 ?몃뱶媛€ ?덉쑝硫??먯떇 ?몃뱶???곗씠?곕? 癒쇱? ?살뼱??
                if($category_srl&&$tree[$category_srl]) $child_output = $this->getPhpCacheCode($tree[$category_srl], $tree);
                else $child_output = array("buff"=>"", "category_srl_list"=>array());

                // 蹂€???뺣━
                $category_title_str = sprintf('$_category_title[%d] = "%s"; %s', $node->category_srl, $node->title, $child_output['category_title_str']);

                // ?꾩옱 ?몃뱶??url媛믪씠 怨듬????꾨땲?쇰㈃ category_srl_list 諛곗뿴媛믪뿉 ?낅젰
                $child_output['category_srl_list'][] = $node->category_srl;
                $output['category_srl_list'] = array_merge($output['category_srl_list'], $child_output['category_srl_list']);

                // node->group_srls媛믪씠 ?덉쑝硫?
                if($node->group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$node->group_srls);
                else $group_check_code = "true";

                // 蹂€???뺣━
                $selected = '"'.implode('","',$child_output['category_srl_list']).'"';
                $child_buff = $child_output['buff'];
                $expand = $node->expand;

                // ?띿꽦???앹꽦?쒕떎 ( category_srl_list瑜??댁슜?댁꽌 ?좏깮??硫붾돱???몃뱶???랁븯?붿?瑜?寃€?ы븳?? 苑곸닔吏€留?鍮좊Ⅴ怨?媛뺣젰?섎떎怨??앷컖;;)
                $attribute = sprintf(
                    '"mid" => "%s", "module_srl" => "%d","node_srl"=>"%s","category_srl"=>"%s","parent_srl"=>"%s","text"=>$_category_title[%d],"selected"=>(in_array(Context::get("category"),array(%s))?1:0),"expand"=>"%s","color"=>"%s", "list"=>array(%s),"document_count"=>"%d","grant"=>%s?true:false',
                    $node->mid,
                    $node->module_srl,
                    $node->category_srl,
                    $node->category_srl,
                    $node->parent_srl,
                    $node->category_srl,
                    $selected,
                    $expand,
                    $node->color,
                    $child_buff,
                    $node->document_count,
                    $group_check_code
                );
               
                // buff ?곗씠?곕? ?앹꽦?쒕떎
                $output['buff'] .=  sprintf('%s=>array(%s),', $node->category_srl, $attribute);
                $output['category_title_str'] .= $category_title_str;
            }
            return $output;
        }

        /**
         * @brief 寃뚯떆臾쇱쓽 ??寃뚯떆臾쇱쓣.. ?대┃???섑??섎뒗 ?앹뾽 硫붾돱瑜?異붽??섎뒗 method
         **/
        function addDocumentPopupMenu($url, $str, $icon = '', $target = 'self') {
            $document_popup_menu_list = Context::get('document_popup_menu_list');
            if(!is_array($document_popup_menu_list)) $document_popup_menu_list = array();

            $obj->url = $url;
            $obj->str = $str;
            $obj->icon = $icon;
            $obj->target = $target;
            $document_popup_menu_list[] = $obj;

            Context::set('+ 'document_popup_menu_list', $document_popup_menu_list);
        }


    }
?>

글쓴이 제목 최종 글
XE 공지 글 쓰기,삭제 운영방식 변경 공지 [16] 2019.03.05 by 남기남
해피해킹 레이아웃 접근 권한 막기 문제  
나관주 썸네일 출력관련  
송용호 여기 홈에서 쓰고있는 에디터 스킨은 어디에서 구하나요  
rkttu.com Web Platform Installer 링크가 깨진것 같네요.  
xe초보에요 안녕하세요 XE공부하다 막히는 부분이 있어서 질문드립니다. [1] 2011.04.01 by NetCabin
환이아범 다음뷰 애드온에 대한 질문입니다.  
들꽃426 php.ini 만들기 [1] 2011.04.01 by NetCabin
재헌이 다운로드 어떻게 해결하나요  
martez Core update [1] 2011.04.01 by 공듀
시냅스 페이지 설정 메뉴가 사라져서 안 보입니다.ㅠㅠ  
Spes 텍스타일 댓글이 제대로작동하지 않습니다.  
Spes 텍스타일 댓글이 작동하지 않습니다.  
Chris Cha 홈피 주소 redirecting 시에 질문  
하쟁 게시판 글쓰기 할때 !! [1] 2011.04.01 by 카리미
곽준영751 메인페이지에 보여줄 내용을 지정할 수 있는 방법은? [1] 2011.04.01 by 카리미
유승현765 회원가입 창 붙이기 [1] 2011.04.01 by 카리미
스킵 레벨아이콘 질문  
1243312 사이트 로그인 질문입니다 [1] 2011.04.01 by 카리미
카리미 본문 부분에 로그인 하라고 뜨는 창의 코드변경하려면 어느 화일을 봐야 하나요? [1] 2011.04.01 by 카리미
코튼캔디 xe 외부페이지 flash 관련 질문입니다.