검색어를 포함한 식당만 검색

이명진·2022년 4월 5일
0

지금은 카테고리를 이용한 검색 기능만 있다.
검색어를 포함한 식당을 검색하려면 카테고리를 이용한 검색 기능도 거쳐서
두가지 다 해당하는 마커만 지도에 생성되도록 해야한다.

  //마커를 담을 배열
			var positions = [];

//num_rows()의 수만큼 각 행의 정보를 가져와서 마커에 정보를 담기
  <?php
    $query = "select R.* from restaurants R";
    
    $result = mysqli_query($dbcon,$query);
    while($row = mysqli_fetch_assoc($result)){

      $test[] = $row; 
      echo 'var positions = ' . json_encode($test) . ';';
    };
    

?>


var markers = [];
for(i = 0; i < positions.length; i++){
  var loc = positions[i].location;
  var [lat, lng] = loc.split(',');
  lat = Number(lat);
  lng = Number(lng);
  
  var marker = {
    index : positions[i].idx,
    title : positions[i].restaurantName,
    latlng : new kakao.maps.LatLng(lat, lng),
  content : '<div class="overlaybox">' +
  '    <div class="boxtitle">'+positions[i].restaurantName+'</div>' +
  '    <div class="first">' +
  '        <div class="triangle"></div>' +
  '        <div class="categori">'+positions[i].categori+'</div>' +
  '    </div>' +
  '    <div class="instaId">'+positions[i].instaId+'</div>' +
  '    <ul class="information">' +
  '        <li class="address">' +
  '            <div class="addr">주소</div>' +
  '            <div class="addr1">'+positions[i].addr1+'</div>' +
  '            <div class="addr2">'+positions[i].addr2+'</div>' +
  '        </li>' +
  '        <li class="review">' +
  '            <div class="review1">한줄평</div>' +
  '            <div class="review2">'+positions[i].review+'</div>' +
  '        </li>' +
  '    </ul>' +
  '</div>'
};
  markers.push(marker);
}


        var imageSrc = "https://t1.daumcdn.net/localimg/localimages/07/mapapidoc/markerStar.png";
        // 마커 이미지의 이미지 주소입니다
        
        
        </script>
    
    <script>
        //카테고리를 이용해서 마커 분류하기
        let createdMarker = [];

        function categorize(){
          const selectedCategori = document.querySelector("#selectCategori");
          const idx = selectedCategori.options.selectedIndex;
          const selectedValue = selectedCategori.options[idx].value;
          const categori = document.querySelector(".categori")
          
          for(var i = 0; i<createdMarker.length; i++){
            createdMarker[i].setMap(null);
          }
          
          //카테고리가 일치하는 마커만 다시 재생성
          for(var i = 0; i < markers.length; i++){
            const trueOrNot = markers[i].content.includes(selectedValue);
            // 마커 이미지의 이미지 크기 입니다
        var imageSize = new kakao.maps.Size(24, 35);

        // 마커 이미지를 생성합니다
        var markerImage = new kakao.maps.MarkerImage(imageSrc, imageSize);

        // 마커를 생성합니다
        var marker = new kakao.maps.Marker({
          map: map, // 마커를 표시할 지도
          position: markers[i].latlng, // 마커를 표시할 위치
          title : markers[i].title, // 마커의 타이틀, 마커에 마우스를 올리면 타이틀이 표시됩니다
        image : markerImage, // 마커 이미지
      });
      var customOverlay = new kakao.maps.CustomOverlay({
        position: markers[i].latlng,
        content: markers[i].content,
        clickable: true,
        xAnchor: 0.3,
        yAnchor: 0.91
      });
      marker.setMap(null);
      if(trueOrNot == true){
        marker.setMap(map);
        createdMarker.push(marker);
      }

현재 카테고리를 이용한 검색 방식이다.
두가지 다 해당하는 마커만 검색하려면 결국 두개 다 거쳐야한다.
지금 이미 카테고리에 해당하는 마커들을 포함하는 배열을 만들어 놓았으므로 검색어를 포함하는 식당이름을 가진 마커만 다시 뽑아서 새로 배열을 만드는 것이 가장 직관적인 것 같다.

지금은 식당이 1개뿐이므로 1개 더 등록하겠다.

함수가 실행되고 마커가 생성되기 전에 배열인 markers를 재정의하기

//식당이름에 검색어를 포함한 식당만 표시
//검색값 가져오기
var Name = document.querySelector(".form-control");
console.log(Name.value);


value값이 잘 불러와지는 걸 확인

//markers 베열에서 해당 값을 포함하는 식당이름을 가진 마커만 고르기
          for(i = 0; i < markers.length; i++){
            if()
          }

마커의 수만큼 전부 확인을 해야하므로 markers.length만큼 반복

markers[i].title이 식당의 이름이므로 이것이 Name.value의 값을 포함하는지 확인해봐야한다.

for(i = 0; i < markers.length; i++){
            console.log(markers[i].title);
            if(markers[i].title.includes(Name.value) == true){
              console.log('포함중');
            }
          }


포함된 경우에만 포함중이라고 나타나는 것을 볼 수 있다.
이제 새로운 배열에 push하기만 하면 된다.

편의상 원래 쓰던 배열을 preMarkers로 변경하고 글자를 포함하는 배열을 markers로 바꿨다.

for(i = 0; i < preMarkers.length; i++){
	if(preMarkers[i].title.includes(Name.value) == true){
			markers.push(preMarkers[i]);
		}
	};
console.log(markers);


잘 작동되는 것을 확인

profile
프론트엔드 뉴비

0개의 댓글