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
번호 분류 제목 글쓴이 날짜 조회 수
3752 자유 여름에 보는 눈 덮힌 산..... 3 file 아파치 2016.08.31 48
» 자유 스킨 수정만으로 확장변수 다중 검색? 복수 검색? 파라미터화? 멀티카테고리? 암튼 그런 거에 성공... 5 윤삼 2016.08.31 102
3750 자유 드뎌 한달 개근 하루 남았습니다. 1 이성민 2016.08.30 26
3749 자유 XE 무료 포인트 마켓 관련 제안 윤삼 2016.08.30 71
3748 자유 상황에 맞게 레이아웃이 변신!? 10 MIST 2016.08.30 326
3747 자유 개인 웹사이트 계획중인데 6 데버 2016.08.30 124
3746 자유 전자책 교환하실 분 계신가요? 9 이성민 2016.08.30 67
3745 자유 레드스톤 설치한 이후로... 1 Chronos 2016.08.30 67
3744 자유 이번 누리고 쇼핑몰 1.1.5 패치 받기전 주의할점. 1 람보 2016.08.29 90
3743 자유 평화로운 오후입니다~ 14 윤삼 2016.08.29 101
3742 자랑해요 나눔소식 + 마켓 디자인을 새로 하고 있습니다. 27 file xelayout 2016.08.29 233
3741 유머/엽기 보라 무시하는 코난 1 메테워 2016.08.29 107
3740 자유 한게시판에 게시물이 매우 많을경우.. 4 루딩 2016.08.29 84
3739 자유 xe town에 있는 1 도균짱 2016.08.29 72
3738 유머/엽기 2차대전 미군 저격수 훈련영상 4 이성민 2016.08.28 117
3737 자유 모든 sns에 동시에 글쓰는 법 없나여? 2 이성민 2016.08.28 91
3736 하소연 하아..xe 클라우드플레어 ssl 적용하는방법 설명해주실분 없나요..ㅠ 7 Overachiever 2016.08.28 124
3735 자유 새벽에 추워서 문 닫고 잤습니다. 4 구름이 2016.08.28 52
3734 자유 왜 출석 가산점이!? 2 file ffjkdjsfl 2016.08.28 83
3733 자유 시원하다못해 쌀쌀하군요.. 5 HyoBokKim 2016.08.27 51
Board Pagination Prev 1 ... 42 43 44 45 46 47 48 49 50 51 ... 234 Next
/ 234
위로
서버에 요청 중입니다. 잠시만 기다려 주십시오...