XETOWN

분수 광장

특정주제 없이 자유로운 이야기를 나눌 수 있습니다.
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

어제 이런 글을 남긴 바 있는데요 https://www.xetown.com/square/362752

드디어 페이지네이션까지 잘 작동하게 되었습니다. ^^/

 

(그나저나 그동안 저는 확장변수 교차 검색 방식? 암튼 루트/index.php?extra_vars1=XE&extra_vars2=Town 같은 형태로 페이지 로딩하는 것을 멀티 카테고리라고 생각했었는데, 휘즈님 이야길 들어보니 그게 아닌 것도 같고 정확한 명칭이 뭔지 모르겠네요ㅠ)

 

아무튼 핵심이 되는 변수 선언 부분을 다음과 같이 짜봤습니다.

게시판 스킨에 넣어서 테스트해봤구요.

확장변수들의 형식은 '단일선택'임을 전제로 합니다.

 

해당 모듈의 확장변수 1번과 2번의 eid 값을 파라미터처럼 보이게 트릭을 주는 방식이라고 할 수 있습니다.

(이런 식이라면 변수 3~4개 정도도 하드코딩으로 할 수 있을 것 같습니다. 다만 겁나 느려터지겠지만요ㅎㅎ)

 

{@
    $oDocumentModel = &getModel('document');
    $eKeys = $oDocumentModel->getExtraKeys($module_info->module_srl); // 현재 모듈의 확장변수를 불러옴
    $$eKeys[1]->eid = Context::get($eKeys[1]->eid);
    $$eKeys[2]->eid = Context::get($eKeys[2]->eid); // 확장변수의 eid값을 파라미터처럼 보이게 함. 가령 첫 번째 확장변수의 eid가 genre라면 주소창에는 genre=000처럼 뜨게 됨.

    if ($$eKeys[1]->eid||$$eKeys[2]->eid) : // 주소창, 즉 링크 주소에 확장변수가 기입됐는지 확인함
    
        $noticeTF = false;
        if($module_info->except_notice == 'Y') :
            $noticeTF = true;
        endif; // 여기는 문서 목록에 공지사항 포함되는지 확인하는 부분
        
        $args = new stdClass;
        $args->list_count = $total_count; // 문서 리스트 전체를 가져 옴
        $args->module_srl = $module_info->module_srl;
        $args->order_target = $module_info->order_target;
        $args->order_type = $module_info->order_type;
        $args->category_srl = $category_srl;
        $args->search_target = $search_target;
        $args->search_keyword = $search_keyword; // 확장변수를 파라미터처럼 사용해도 게시판 검색과 교차적으로 사용할 수 있도록 함
        
        $oDocumentModel = &getModel('document');
        $output = $oDocumentModel->getDocumentList($args, $noticeTF);
        
        if($$eKeys[1]->eid&&!$$eKeys[2]->eid) : // 주소창(링크 주소)에 확장변수 1번만 있는 경우,
            foreach($output->data as $key=>$val) : // 문서를 루프 돌려줌.
                if($$eKeys[1]->eid!=$val->getExtraValue(1)) : // 주소창의 파라미터 변수값과 해당 문서의 확장변수 1번의 변수값이 일치하지 않으면,
                    unset($output->data[$key]); // 문서 목록에서 해당 문서를 제거함
                endif;
            endforeach;
        elseif(!$$eKeys[1]->eid&&$$eKeys[2]->eid) : // 이번에는 확장변수 2번의 경우임
            foreach($output->data as $key=>$val) :
                if($$eKeys[2]->eid!=$val->getExtraValue(2)) :
                    unset($output->data[$key]);
                endif;
            endforeach;
        elseif($$eKeys[1]->eid&&$$eKeys[2]->eid) : // 이번에는 확장변수 두 개 모두가 주소창(링크 주소)에 들어 있는 경우임
            foreach($output->data as $key=>$val) :
                if($$eKeys[1]->eid!=$val->getExtraValue(1)||$$eKeys[2]->eid!=$val->getExtraValue(2)) : // 여기 조건문에서 ||을 쓰면 확장변수 두 개로 교차 검색(AND)이 되고, &&을 쓰면 포함 검색(OR)이 됨
                    unset($output->data[$key]);
                endif;
            endforeach;
        endif;
        
        $document_list = array_slice($output->data, $module_info->list_count*($page-1), $module_info->list_count, true); // 위에서 뽑아낸 문서 목록은 전체 문서 목록 갯수이므로, 모듈에 설정된 문서 목록 갯수에 맞춰 전체 목록을 나눠줌
        
        $page_navigation->total_count = count($output->data);
        $page_navigation->total_page = ceil($page_navigation->total_count/$module_info->list_count);
        if($page_navigation->total_page<$module_info->page_count) :
            $page_navigation->page_count = $page_navigation->total_page;
        else :
            $page_navigation->page_count = $module_info->page_count;
        endif;
        $page_navigation->last_page = $page_navigation->total_page; // 여기까지는 페이지네이션을 위한 설정임. 위에서 unset함수를 쓴 탓(?)인지 문서의 전체 갯수(total_count)는 제거된 부분이 반영되지 않은 채로 남음. 따라서 이 부분을 건너뛰면 페이지네이션이 뒤틀리게 됨. 편법이어서 정석과는 거리가 멀지만 어쨌든 현재까지 시뮬레이션으로는 별 무리 없이 작동하고 있음. 내가 봐도 어거지 같음.

    endif;
}

 

이상과 같이 기본 셋팅이 끝났습니다.

 

그러면 실제로 $$eKeys[1]->eid와 $$eKeys[2]->eid를 써먹을 링크 주소를 만들어야겠죠?

우선 확장변수(단일선택 형식)의 기본값들을 열거해야 합니다.

(저는 이걸 다국어로 치환하도록 하는 바람에(https://www.xetown.com/354803 참조) 코드가 복잡해졌는데, 암튼 이 부분은 팁들이 널려 있으니 금방 구현할 수 있을 겁니다. 그러니까 이건 했다 치고...)

확장변수의 기본값들에 링크를 걸어줍니다.

 

예컨대 저는 이렇게 했습니다.

{@ $eval1 = array_map('trim',explode(',',$eKeys[1]->default)); } // 확장변수 1번의 기본값들을 배열화함
<block loop="$eval1=>$idx1,$item1"> // 위에서 만든 배열변수 $eval1을 루프 돌림
    <a href="{getUrl('page','',$eKeys[1]->eid,$item1)}"> // 이로써 구현되는 링크는 페이지 넘버를 초기화하는 한편 "확장변수1번=변수값"의 형태로 나타남. 예컨대 확장변수 1번의 eid가 genre고 열거된 변수값이 Note라면, 주소창에는 루트/index.php?mid=000&genre=Note라고 찍힘
        {$item1}
    </a>
</block>

 

마찬가지로 확장변수 2번도 이런 식으로 나열하고 각각 링크를 걸어주면 됩니다.

위에서 숫자만 바꾸면 되니까 어렵지 않을 겁니다.

 

그리고... 실제 페이지에서 위의 링크들을 순차적으로 클릭하게 되면 어떻게 될까요?

어떻게 되긴요... (적어도 형태적으로는)  교차 검색(또는 포함 검색)이 가능하게 되죠.

 

... 이상입니다.

 

물론 여전히 이 소스는 불완전합니다.

멀쩡한 (GG님이 힌트 주신) 서브쿼리 놔두고 스킨 수정으로 땜빵을 하고 있으니 소스가 지저분해지는 건 물론이고, 게시물이 많으면 많을수록 서버에 부담이 될 겁니다(아마도요...?).

게다가 페이지네이션 처리한 부분은 제가 봐도 불안합니다.

언제든 문제의 소지가 될 수 있을 것 같아요.ㅠㅠ

 

암튼 그동안 '뭐라 제목 정하기 애매한' 이 짓거리를 하느라 며칠을 보냈는데, 개발자분들이 보시기엔 영 이상하고 답답하겠지만 일단 제 수준에선 만족할 만합니다.

꼼수로나마 하고싶은 걸 해낸 묘한 성취감이랄까요.

당분간은 발 쭉 뻗고 잘 수 있을 것 같아요. ㅎㅎ

  • profile
    Sunup 2016.08.31 20:10:26
    와 주석이 엄청 친절 합니다 저도 한번 연구를 해봐야겠네요
  • profile
    윤삼 2016.08.31 20:31:59
    연구해보시고 의견 생기시면 꼭 남겨주세요~
  • profile
    앞구르기 2016.09.02 13:35:39

    저도 필요한 기능이라 만들고있엇는데 XML로 확장변수 한 20개 정도 검색 가능하게 하니 인덱싱이 안걸리더군요..

    ㅠㅠ 대신 속도는 별차이없더라고욥

  • profile
    윤삼 2016.09.02 13:39:48
    xml로도... 역시 모듈을 따로 만드는 게 좋은가봐요.
  • profile
    앞구르기 2016.09.02 15:37:17

    음 .. 저는 제가 쓸려고 만든거니 따로 만들필요를 못느껴서요 ㅎㅎ...
    확장변수 20개까지 필터링하니 인덱싱도 거의 필요없는거같네요ㅎㅎ

    저는 여기까지만 만족..


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
화제의 글 자유 엑스이타운에 파티가 열렸어요 68 제이엔지 2016.11.30 302
화제의 글 자랑해요 최근 개발한 스티커 모듈 22 file 후하니 2016.12.05 255
화제의 글 자유 닉네임이 사라졌는데 71 제이엔지 2016.11.28 340
3787 자유 xetown 첫화면 위젯 정렬이 문제가 있는것 같아요 5 구름이 2016.09.02 55
3786 자유 아침부터 비가 많이오네요!! 1 이성민 2016.09.02 18
3785 자유 안녕하세요~ 3 다이오니 2016.09.02 30
3784 자유 커피를 4잔 마셨더니 잠이 안오네요. 4 구름이 2016.09.02 46
3783 자유 저도 윈도우 정품 유저되엇습니다.ㅋ 7 언션 2016.09.01 119
3782 자유 안녕하세요. 처음 가입했습니다. 5 동시성 2016.09.01 41
3781 자유 사실 전 다둥이 아빠랍니다 ㅎㅎ! 반 푸념..ㅎ; 21 MIST 2016.09.01 97
3780 자유 저희 사이트에 엘라스틱 서치 + xe 를 의뢰해서 적용예정중인데.. 말그대로 죽여줍다 6 약사이다 2016.09.01 214
3779 자유 헐.. 여기에 스팸이.ㅎㄷㄷㄷㄷ 5 약사이다 2016.09.01 103
3778 자유 보통 개인 홈페이지에서 일일 트래픽 어느정도나오나요 4 systemx 2016.08.31 149
3777 자유 어 급상승 포인트 이상하네요 3 file 이성민 2016.08.31 73
3776 자유 삼성전자, 이통 3사에 갤럭시노트7 입고 중단 3 Chronos 2016.08.31 122
3775 자유 얼마전에 무지개 못 보신분들을 위하여... 5 file 천년 2016.08.31 62
3774 하소연 rtmp 프로토콜을 지원하는 html5 플레이어가 있나요? 4 이성민 2016.08.31 70
3773 이슈/토론 여러분들은 라면을 먹을때 몇개로 먹나요? 18 언션 2016.08.31 92
3772 자유 비가 옵니다 4 언션 2016.08.31 24
3771 자유 출석 매우 아쉽네요. ㅋ 9 file 구름이 2016.08.31 60
3770 자유 여름에 보는 눈 덮힌 산..... 3 file 아파치 2016.08.31 48
» 자유 스킨 수정만으로 확장변수 다중 검색? 복수 검색? 파라미터화? 멀티카테고리? 암튼 그런 거에 성공... 5 윤삼 2016.08.31 73
3768 자유 드뎌 한달 개근 하루 남았습니다. 1 이성민 2016.08.30 26
Board Pagination Prev 1 ... 24 25 26 27 28 29 30 31 32 33 ... 218 Next
/ 218
위로
서버에 요청 중입니다. 잠시만 기다려 주십시오...