죄송합니다.

좀 전에 당분간 코드를 멀리할 것처럼 해놓고 막상 글을 써놓고 나니까 갑자기 코드가 보고 싶어져서 또 봐버렸습니다ㅜㅜ

 

그러다 그냥 우연히 얻어걸린 건데요.

일반적으로 문서 리스트를 출력할 때 카테고리 하나만 선택이 가능하다고 생각을 해왔잖아요?

 

근데 _setSearchOption 함수를 보니

https://github.com/rhymix/rhymix/blob/922025ae8ed5de58dd75d1cac20494eb25153f23/modules/document/document.model.php#L1370-L1380

목록화 작업을 할 때 카테고리는 배열로 넘어가더라구요.

 

실제로 getDocumentList 쿼리에서도 category_srl은 equal이 아니라 in으로 가져오게 되더라구요.

https://github.com/rhymix/rhymix/blob/922025ae8ed5de58dd75d1cac20494eb25153f23/modules/document/queries/getDocumentList.xml#L11

즉, 배열도 받아준다는 이야기겠죠?

 

그래서 주소창에 분류번호를 넘기는 category 대신에 category_srl=17330,13007,12438 이런 식으로 쿼리스트링을 넘겨봤습니다.

이를 위해 getDocumentList 함수에서 $obj를 _setSearchOption 함수로 넘겨주기 직전에

https://github.com/rhymix/rhymix/blob/922025ae8ed5de58dd75d1cac20494eb25153f23/modules/document/document.model.php#L239

$obj->category_srl = Context::get('category_srl') ?: $obj->category_srl;

이거를 삽입하고 getDocumentList 쿼리로 전달되는 category_srl 변수를 가로채봤습니다.

(기존 주소 체계의 쿼리스트링 형식에서 카테고리 번호의 파라미터는 category이니, category_srl을 파라미터로 넘기는 이 방법은 기존 체계에 영향을 주지 않을 겁니다. 물론 쿼리스트링에 category_srl이 있으면 category 파라미터를 덮어버릴 테지만요ㅎ)

 

그리고 주소창에 https://dev.aporia.blog/board_fKje43?category_srl=17330,13007,12438 이런 식으로 url을 입력했더니... ㄷㄷㄷ

여러 개의 카테고리가 선택된 문서가 목록으로 출력됐습니다. 대박.

 

물론 debug 패널에 에러메시지가 있긴 했는데, 이거는 _setSearchOption 함수를 조금 수정해주면 사라지더군요.

아까 전에 category_srl을 넘겨주던 부분을 이런 식으로요.

// add subcategories
if(isset($args->category_srl) && $args->category_srl)
{
    $category_list = self::getCategoryList($args->module_srl);
    if ( !is_array($args->category_srl) )
    {
        $args->category_srl = explode(',', preg_replace('/[^0-9\,]+/s', '', $args->category_srl));
    }
    foreach ( $args->category_srl as $category_srl )
    {
        if(isset($category_list[$category_srl]) && !empty($category_list[$category_srl]->childs))
        {
            $args->category_srl = array_merge($args->category_srl, $category_list[$category_srl]->childs);
        }
    }
}

 

이거 근데 이렇게 해도 되는 거겠죠?

그리고 원래 알 만한 분들은 알던 팁이었을까요?

윤삼

profile
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • profile

    글쓸때 여러개 선택해서 저장하는건가요?

    https://github.com/rhymix/rhymix/blob/master/modules/document/schemas/documents.xml#L4

    디비기본 타입이 number인데 그게 가능한가요?\

     

    그냥 검색하는 정도라면 해당 카테고리에 해당되는 글을 가져오라고 in 으로 카테고리 넣어서 쿼리문을 만들었을거예요

  • profile profile
    목록을 만드는 것 자체는 다른 쿼리에서 하는 것 같더라구요.
    https://github.com/rhymix/rhymix/blob/master/modules/document/queries/getDocumentList.xml#L11
  • profile profile
    목록 가져오는거라면 가능하겠네요 ㅎㅎ 저는 글쓸때 여러 카테고리를 넣어서 검색하는줄 알았습니다.
  • profile profile

    아 네 테이블의 컬럼 자체는 숫자만 들어가니까...
    어쨌든 오류도 없이 깔끔하게 목록이 만들어져서 깜짝 놀랐습니다;;;

  • profile profile
    참고로 in 으로 쿼리한것은 a,b,c 이렇게 해서 굳이 array으로 안만들고 string으로 보내두 알아서 해줍니다.
  • profile profile
    쉼표 단위로 알아서 찾아준다는 말씀이시군요!
  • profile profile
    https://github.com/rhymix/rhymix/blob/master/common/framework/parsers/dbquery/variablebase.php#L106
    알아서 만들어주고 넘겨줍니다 ㅎㅎ
  • profile

    주소 호출 방식을 변경해봤습니다.
    이제는 이렇게 접속이 됩니다~
    https://dev.aporia.blog/board_fKje43?category_srls[]=17330&category_srls[]=12438&category_srls[]=13007

     

    관련 소스도 다음과 같이 해야 하구요.

    $obj->category_srl = Context::get('category_srls') ?: $obj->category_srl;

     

    // add subcategories
    if ( isset($args->category_srl) && $args->category_srl )
    {
        $category_list = DocumentModel::getCategoryList($args->module_srl);
        if ( !is_array($args->category_srl) )
        {
            $args->category_srl = explode(',', preg_replace('/[^0-9\,]+/s', '', $args->category_srl));
        }
        foreach ( $args->category_srl as $category_srl )
        {
            if ( isset($category_list[$category_srl]) && !empty($category_list[$category_srl]->childs) )
            {
                $args->category_srl = array_merge($args->category_srl, $category_list[$category_srl]->childs);
            }
        }
    }