이온디
호스팅센터
웹디벨로퍼
프리랜서카페
스레드

1. 검색 키워드가 있을 경우

2. 카테고리 1차인 경우 별도 출력

3. 카테고리 2차인 경우 별도 출력


이런 구조에서 카테고리 1차에서 2차는 더보기 식으로 나타내려고 함. 

카테고리1차 (더보기)

2차가 있을 경우 더보기 아이콘 노출 후

클릭하면 스크롤 가능한 구조로 나타내기.


@if($search_keyword)
    <div class="keyword-box">
        '{$search_keyword}'검색 결과 입니다. <span class="count">{$total_count}</span>
    </div>
@endif
@if($category_list && !$search_keyword)
    <div class="category-box">
        <div class="cat-root">
            @php
            $args = new stdClass();
            $args->module_srl = $module_info->module_srl;
            $output = executeQuery('document.getDocumentCount', $args);
            @endphp

            <a href="{getUrl('','mid',$mid,'category','','page','','document_srl','')}" class="on"|cond="empty($category)">전체 {$output->data->count}</a>
            @foreach($category_list as $val)
                @if($val->parent_srl=='0')
                    <a href="{getUrl('category',$val->category_srl,'page','','document_srl','')}" class="on"|cond="($category ?? 0) == $val->category_srl">{$val->title} @if($val->document_count!=='0')<span class="cnt">{$val->document_count?$val->document_count:""}</span>@endif</a>
                @endif
            @endforeach
        </div>
        <div class="cat-sub">
            @foreach($category_list as $val)
                @if($val->parent_srl!=='0' && $val->parent_srl==$category)
                    <a href="{getUrl('category',$val->category_srl,'page','','document_srl','')}" class="on"|cond="$val->selected">#{$val->title} {$val->document_count}</a>
                @endif
            @endforeach
        </div>
    </div>
@endif
@if($error=='idontknow')
    <div style="display:none;">
        @php
            $cate_list = array();
            $current_key = null;
        @endphp
        @foreach($category_list as $key=>$val)
            @if(!$val->depth)
                @php
                $cate_list[$key] = $val;
                $cate_list[$key]->children = array();
                $current_key = $key;
                @endphp
            @elseif($current_key)
                @php
                    $cate_list[$current_key]->children[] = $val
                @endphp
            @endif
        @endforeach
        @if($module_info->use_category=='Y')
            <ul class="cTab">
                <li class="on"|cond="!$category"><a href="{getUrl('category','','page','')}">{$lang->total}</a></li>
                @foreach($cate_list as $key => $val)
                    <li class="on"|cond="$category==$val->category_srl"><a href="{getUrl('category',$val->category_srl,'document_srl','', 'page', '')}">{$val->title}<!--<em cond="$val->document_count">[{$val->document_count}]</em>--></a>
                        @if(count($val->children))
                            <ul>
                                {$val->parent_srl}  / {$val->category_srl}
                                @foreach($val->children as $idx => $item)
                                    <li class="on"|cond="$category==$item->category_srl"><a href="{getUrl('category',$item->category_srl,'document_srl','', 'page', '')}">{$item->title}<!--<em cond="$val->document_count">[{$item->document_count}]</em>--></a></li>
                                @endforeach
                            </ul>
                        @endif
                    </li>
                @endforeach
            </ul>
        @endif
    </div>
@endif

이 코드는 라이믹스 CMS의 게시판 스킨에서 카테고리 목록을 출력하는 부분을 구현하고 있습니다. 블레이드 문법을 사용하여 카테고리를 1차와 2차로 나누어 표시하고 있습니다.

현재 코드 설명

  1. @if($category_list && !$search_keyword): 카테고리 목록이 있고 검색 키워드가 없을 때만 카테고리 박스를 표시합니다.
  2. <div class="cat-root">: 1차 카테고리들을 표시하는 영역입니다.
    • 먼저 전체 게시글 수를 가져오는 쿼리를 실행합니다.
    • "전체" 카테고리 링크와 게시글 수를 표시합니다.
    • parent_srl=='0'인 카테고리들(1차 카테고리)을 반복하여 표시합니다.
    • 각 카테고리 링크에는 해당 카테고리의 게시글 수도 함께 표시됩니다.
  3. <div class="cat-sub">: 2차 카테고리들을 표시하는 영역입니다.
    • 현재 선택된 1차 카테고리($category)의 하위 카테고리들을 표시합니다.
    • 각 2차 카테고리는 #으로 시작하고 게시글 수를 함께 표시합니다.
@if($category_list && !$search_keyword)
    <div class="category-box">
        <div class="cat-root">
            @php
                $args = new stdClass();
                $args->module_srl = $module_info->module_srl;
                $output = executeQuery('document.getDocumentCount', $args);
            @endphp

            <a href="{getUrl('','mid',$mid,'category','','page','','document_srl','')}" class="on"|cond="empty($category)">전체 {$output->data->count}</a>
            @foreach($category_list as $val)
                @if($val->parent_srl=='0')
                    @php
                        // 해당 1차 카테고리의 하위 카테고리가 있는지 확인
                        $has_subcategory = false;
                        foreach($category_list as $sub) {
                            if($sub->parent_srl == $val->category_srl) {
                                $has_subcategory = true;
                                break;
                            }
                        }
                    @endphp
                    <a href="{getUrl('category',$val->category_srl,'page','','document_srl','')}" class="on"|cond="($category ?? 0) == $val->category_srl">
                        {$val->title} @if($val->document_count!=='0')<span class="cnt">{$val->document_count?$val->document_count:""}</span>@endif
                        @if($has_subcategory)
                            <span class="more-icon" data-category="{$val->category_srl}"><i class="xi-angle-down-min"></i></span>
                        @endif
                    </a>
                @endif
            @endforeach
        </div>

        @foreach($category_list as $parent_val)
            @if($parent_val->parent_srl=='0')
                @php
                    // 현재 1차 카테고리에 해당하는 2차 카테고리 확인
                    $subcategories = [];
                    foreach($category_list as $sub) {
                        if($sub->parent_srl == $parent_val->category_srl) {
                            $subcategories[] = $sub;
                        }
                    }
                @endphp

                @if(count($subcategories) > 0)
                    <div class="cat-sub cat-sub-{$parent_val->category_srl}" style="display: none;">
                        <div class="cat-sub-scroll">
                            @foreach($subcategories as $sub)
                                <a href="{getUrl('category',$sub->category_srl,'page','','document_srl','')}" class="on"|cond="($category ?? 0) == $sub->category_srl">
                                    #{$sub->title} @if($sub->document_count!=='0')<span class="cnt">{$sub->document_count}</span>@endif
                                </a>
                            @endforeach
                        </div>
                    </div>
                @endif
            @endif
        @endforeach
    </div>

    <style>
        .category-box {
            position: relative;
        }
        .cat-root a {
            position: relative;
            display: inline-block;
            margin-right: 15px;
        }
        .more-icon {
            cursor: pointer;
            margin-left: 5px;
        }
        .more-icon.active i {
            transform: rotate(180deg);
        }
        .cat-sub {
            margin-top: 10px;
            max-height: 0;
            overflow: hidden;
            transition: max-height 0.3s ease;
        }
        .cat-sub.active {
            max-height: 200px;
            overflow-y: auto;
            border-top: 1px solid #eee;
            padding-top: 10px;
        }
        .cat-sub-scroll {
            display: flex;
            flex-wrap: wrap;
        }
        .cat-sub a {
            margin-right: 10px;
            margin-bottom: 5px;
        }
    </style>

    <script>
        $(document).ready(function() {
            $('.more-icon').click(function(e) {
                e.preventDefault();
                e.stopPropagation();

                var categoryId = $(this).data('category');
                var subCategory = $('.cat-sub-' + categoryId);

                // 다른 열린 서브카테고리 닫기
                $('.cat-sub.active').not(subCategory).removeClass('active');
                $('.more-icon.active').not(this).removeClass('active');

                // 현재 서브카테고리 토글
                $(this).toggleClass('active');
                subCategory.toggleClass('active');
            });
        });
    </script>
@endif

구현된 기능 설명

  1. 더보기 아이콘 추가:
    • 1차 카테고리에 하위 카테고리가 있는 경우에만 더보기 아이콘(화살표)을 표시합니다.
    • data-category 속성을 통해 어떤 1차 카테고리에 속하는지 식별합니다.
  2. 2차 카테고리 구조 변경:
    • 각 1차 카테고리별로 별도의 2차 카테고리 영역을 생성합니다.
    • 클래스에 1차 카테고리 ID를 포함시켜 연결합니다 (cat-sub-{$parent_val->category_srl}).
    • 기본적으로 숨겨져 있습니다 (display: none).
  3. 스크롤 가능한 구조:
    • 2차 카테고리가 많을 경우를 대비해 스크롤 가능한 구조로 만들었습니다.
    • 최대 높이를 설정하고 overflow-y를 auto로 설정하여 스크롤을 구현합니다.
  4. JavaScript 기능:
    • 더보기 아이콘 클릭 시 해당 2차 카테고리만 토글됩니다.
    • 다른 열려있는 2차 카테고리는 자동으로 닫힙니다.
    • 아이콘도 활성화 상태에 따라 회전합니다.
  5. CSS 스타일링:
    • 부드러운 애니메이션 효과를 위한 transition을 추가했습니다.
    • 2차 카테고리는 flex를 사용해 가로로 나열되며 필요시 여러 줄로 표시됩니다.

이 구현은 사용자가 1차 카테고리 옆의 더보기 아이콘을 클릭하면 해당 카테고리의 2차 카테고리가 나타나고, 다시 클릭하거나 다른 카테고리의 더보기를 클릭하면 닫히는 방식으로 작동합니다.

 


내용을 입력하세요
0
댓글은 로그인 사용자만 작성 가능합니다. 로그인하기
  • Profile
    2025 년 02 월 25 일 (01:49)
    <ul class="cTab">
        <li class="on"|cond="empty($category)"><a href="{getUrl('category','','page','')}">전체 {$output->data->count}</a></li>
        @foreach($cate_list as $key => $val)
    
            <li class="depth1 @if(($category ?? 0) == $val->category_srl)on@endif"><a href="{getUrl('category',$val->category_srl,'document_srl','', 'page', '')}">{$val->title} @if($val->document_count!=='0')<span class="cnt">{$val->document_count?$val->document_count:""}</span>@endif</a>
                @if(!empty($val->children))
                    <button class="btnCateMore">더보기</button>
                    <ul class="depth2">
                        @foreach($val->children as $idx => $item)
                            <li class="on"|cond="$category==$item->category_srl">
                                <a href="{getUrl('category',$item->category_srl,'document_srl','', 'page', '')}">{$item->title} @if($item->document_count!=='0')<span class="cnt">{$item->document_count?$item->document_count:""}</span>@endif</a>
                            </li>
                        @endforeach
                    </ul>
                @endif
    
            </li>
        @endforeach
    </ul>
    <script>
        $(document).ready(function() {
            $(".btnCateMore").click(function(event) {
                var $depth2 = $(this).next(".depth2");
    
                // 모든 .depth2에서 on 제거 (현재 클릭한 요소 제외)
                $(".depth2").not($depth2).removeClass("on");
    
                // 클릭한 버튼의 다음 depth2에 on 클래스 토글
                $depth2.toggleClass("on");
    
                // 이벤트 버블링 방지 (document 클릭 방지)
                event.stopPropagation();
            });
    
            // 문서 클릭 시 .depth2의 on 제거
            $(document).click(function() {
                $(".depth2").removeClass("on");
            });
    
            // 스크롤 시 .depth2의 on 제거
            $(window).on("scroll", function() {
                $(".depth2").removeClass("on");
            });
    
            // depth1 내부에 선택된 항목이 있으면 on 클래스 추가
            $(".depth1").each(function() {
                if ($(this).find("li.on").length > 0) {
                    $(this).addClass("on");
                }
            });
        });
    </script>
    답변 달기
  • Profile
    2025 년 02 월 25 일 (01:50)


    답변 달기