PHP

그누보드5.4 게시판 여러개 로테이션으로 출력 방법

먹세 2020. 1. 26. 23:36

게시판과 최신글을 다수 게시판의 글들을 한개씩 섞어가면서 출력하는 방법.

 

조건 :

1. 여러개의 게시판에서 최신글 내림차순(desc) 순으로 순서를 정한다.

2. 순서가 정해지면 그 다음 글부터는 날짜에 상관없이 최초 정해진 순서대로 글 한개씩 계속 로테이션 한다. 

ex)

갤러리게시판 최신글 오늘,

유머게시판 최신글 어제,

자유게시판 최신글 그저께.

위 같은 상황일 경우,

1. 갤러리, 2.유머, 3.자유, 4.갤러리, 5.유머, 6.자유, 7.갤러리 ..... 순으로 출력

 

해야할 것.

1. 게시판을 새로 생성 후 새로운 이름의 스킨으로 지정. bo_table 명은 total_board로 한다는 가정.

2. 관리자 -> 게시판 관리에서 bo_1 여분필드에 갤러리, 유머, 자유 등등 원하는 게시판의 bo_table 을 적는다.

ex) gallery,humor,free...

3. bbs/list.php 187 line (그누5.4기준) 수정

// 페이지의 공지개수가 목록수 보다 작을 때만 실행
if($page_rows > 0) {

	//통합게시판 추가
	if($bo_table=="total_board"){
		
		$sql_board_set = " select * from {$g5['board_table']} where bo_table = '{$bo_table}' ";
		$res_board_set = sql_query($sql_board_set);
		while($row = sql_fetch_array($res_board_set)){
			$board_set_row = $row;
		}

		$exp = explode(',',$board['bo_1']);
		
		//통합게시판 순서정하기
		$total_count = 0;
		for($i=0;$i<count($exp);$i++){
			$boards_sql[$i] = "select * from g5_write_{$exp[$i]} where wr_is_comment = 0 order by wr_num, wr_reply";
			$b_latest[$i] = sql_fetch_array(sql_query($boards_sql[$i]));
			//테이블 이름 추가
			$dates[$i]['bo_table'] = $exp[$i];
			$dates[$i]['latest_datetime'] = $b_latest[$i]['wr_datetime'];

			//total count set
			$board_count[$i] = "select * from {$g5['board_table']} where bo_table = '{$exp[$i]}'";
			$board_count_row = sql_fetch_array(sql_query($board_count[$i]));
			$total_count += $board_count_row['bo_count_write'];
			$total_page  = ceil($total_count / $page_rows);  // 전체 페이지 계산
		}

		//내림차순 정렬
		for($i=count($dates)-1;$i>0;$i--){
			for($j=0;$j<$i;$j++){
				if($dates[$j]['latest_datetime'] < $dates[$j+1]['latest_datetime']){ //desc
					$temp = $dates[$j+1];
					$dates[$j+1] = $dates[$j];
					$dates[$j] = $temp;
				}
			}
		}
		//print_r2($dates);

		//통합게시판 순서대로 최신글순으로 로테이션
		$i=0;
		$k=0;
		foreach($dates as $key => $value){
			$q[$key] = "select * from g5_write_{$value['bo_table']} where wr_is_comment = 0 order by wr_num, wr_reply";
			$q_result[$key] = sql_query($q[$key]);
			
			//list 게시판별 데이터 분리
			while($row2 = sql_fetch_array($q_result[$key])){
				if($list_arr[$value['bo_table']]){
					array_push($list_arr[$value['bo_table']], $row2);
				}else{
					$list_arr[$value['bo_table']][0]=$row2;
				}
			}

		}

		// list 게시판별 순서대로 한개씩 세팅
		$z=0; //게시판 갯수 체크
		$a=0; //배열 번호
		$rotation_list=[];
		$rotation_list_count=count($rotation_list);
		while($rotation_list_count<$total_count){
			$b_count=$a%count($dates);
			$board_name = $dates[$b_count]['bo_table'];
			//echo $board_name;
			//exit();
			if($list_arr[$board_name][$z]){
				$list_arr[$board_name][$z]['bo_table'] = $board_name; //게시판명 세팅
				array_push($rotation_list, $list_arr[$board_name][$z]);
			}
			
			if($a%count($dates)==count($dates)-1){
				$z++;
			}
			$a++;
			$rotation_list_count=count($rotation_list);
		}
	

		//list 세팅
		//배열 페이징
		$i=0;
		$k=0;
		foreach($rotation_list as $key => $value){
			$board['bo_table'] = $value['bo_table'];//링크를 위해 각 테이블에 맞게 다시 세팅
			$list[$i] = get_list($value, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']);
			if (strstr($sfl, 'subject')) {
				$list[$i]['subject'] = search_font($stx, $list[$i]['subject']);
			}
			$list[$i]['is_notice'] = false;
			$list_num = $total_count - ($page - 1) * $list_page_rows - $notice_count;
			$list[$i]['num'] = $list_num - $k;
			$i++;
			$k++;
		}
		
		$list = array_slice($list, $list_page_rows*($page-1), $list_page_rows);
		$i=0;
		$k=0;
		while($i<count($list)){
			$list_num = $total_count - ($page - 1) * $list_page_rows - $notice_count;
			$list[$i]['num'] = $list_num - $k;
			$i++;
			$k++;
		}

	}else{
		$result = sql_query($sql);

		$k = 0;
		while ($row = sql_fetch_array($result))
		{
			// 검색일 경우 wr_id만 얻었으므로 다시 한행을 얻는다
			if ($is_search_bbs)
				$row = sql_fetch(" select * from {$write_table} where wr_id = '{$row['wr_parent']}' ");

			$list[$i] = get_list($row, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']);
			if (strstr($sfl, 'subject')) {
				$list[$i]['subject'] = search_font($stx, $list[$i]['subject']);
			}
			$list[$i]['is_notice'] = false;
			$list_num = $total_count - ($page - 1) * $list_page_rows - $notice_count;
			$list[$i]['num'] = $list_num - $k;

			$i++;
			$k++;
		}
	} 
}
반응형