어제 이런 글을 남긴 바 있는데요 https://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://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
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • profile
    와 주석이 엄청 친절 합니다 저도 한번 연구를 해봐야겠네요
  • profile profile
    연구해보시고 의견 생기시면 꼭 남겨주세요~
  • ?

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

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

  • ? profile
    xml로도... 역시 모듈을 따로 만드는 게 좋은가봐요.
  • profile ?

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

    저는 여기까지만 만족..