Как вернуть отзывы о месте с зонами обслуживания, но без места? - PullRequest
1 голос
/ 27 марта 2020

Некоторое время назад я заметил проблему с возвратом отзывов при использовании Google Places API.

Действительно, для предприятий, имеющих местоположение, он работает без проблем.

Когда я использую идентификатор места компании, у которой нет местоположения, но есть зоны обслуживания, он больше не работает.

После нескольких анализов я замечаю, что при использовании console.log на " google.maps. place.PlacesServiceStatus", он возвращает" NOT FOUND"для предприятий без местоположения. И все же они существуют.

Вот мой код на Codepen с двумя идентификаторами мест. Первый имеет местоположение и работает, другой имеет зоны обслуживания и не работает.

 window.addEventListener("load", function() {

    //////////////////////////////////////////////  
    // ┌──────────────────────────────────────┐ //
    // │ Google Place                         │ //
    // │ Based on Google-Place.js             │ //
    // └──────────────────────────────────────┘ //
    //////////////////////////////////////////////

    var parameters = {

            selector : '#google-reviews',
            min_rating : 1,
            id : 'ChIJ4wzGc-h7wUcR3ncdI5-EELg' // (GMB ("FirewooD") with specified location) => Work, it return 5 last reviews
//    id : 'ChIJsWBxIXYhwkcRtbHQpK2MnNc' // (GMB ("MD Jardins") without location but with service areas) => Doesn't work

        }

    // ─────────────────────────────────────── //

    var initialize_place = function(c){

        var request = {

        placeId: parameters.id

        };

        var map = new google.maps.Map(document.getElementById('map-plug')),
              service = new google.maps.places.PlacesService(map);

        service.getDetails(request, function(place, status) {

        console.log("status: " + status);

        if (status == google.maps.places.PlacesServiceStatus.OK) {
          c(place.reviews);         
        }

        });

    } // end initialize_place()

    var sort_by_date = function(ray) {

      ray.sort(function(a, b){

        var keyA = new Date(a.time),
            keyB = new Date(b.time);

        // Compare the 2 dates
        if(keyA < keyB) return 1;
        if(keyA > keyB) return -1;

        return 0;

      });
        return ray;

    } // end sort_by_date()

    var filter_minimum_rating = function(reviews){

      for (var i = reviews.length -1; i >= 0; i--) {

          if(reviews[i].rating < parameters.min_rating){
            reviews.splice(i,1);
          }

      }

      return reviews;

    } // end filter_minimum_rating()

    var renderRating = function(rating){

          var html = "",
                star = renderAverageStars(rating);

          html = "<div class='average-rating'><h4>"+star+"</h4></div>";

    } // end renderRating()

    var shorten_name = function(name) {
      if (name.split(" ").length > 1) {

         var xname = "";
         xname = name.split(" ");
         return xname[0] + " " + xname[1][0] + ".";

      }
    } // end shorten_name()

    var renderReviews = function(reviews){

      reviews = sort_by_date(reviews);
          reviews = filter_minimum_rating(reviews);

      console.log(reviews);
          var html = "",
            row_count = (5 > 0)? 5 - 1 : reviews.length - 1;

      for (var i = 0; reviews.length > i; i++) {

          var stars = renderStars(reviews[i].rating),
              date = convertTime(reviews[i].time),
              name = reviews[i].author_name,
              photo = reviews[i].profile_photo_url,
              text = reviews[i].text;

          html = "<div class='review-item CJS_slide'><div class='inner'><img class='photo' src='"+photo+"' alt=\""+name+"\"><div class='review-wrap'>"+stars+"<span class='review-author'>"+name+"</span><span class='review-date'>"+date+"</span><p class='review-text'>"+text+"</p></div></div></div>";

          document.querySelector(parameters.selector+' .CJS_wrapper').innerHTML += html;

      }

    }; // end renderReviews()

    var renderStars = function(rating){

      var stars = "<div class='review-stars'><ul>";

      // fill in gold stars
      for (var i = 0; i < rating; i++) {
        stars = stars+"<li><i class='star'></i></li>";
      };

      // fill in empty stars
      if(rating < 5){
        for (var i = 0; i < (5 - rating); i++) {
          stars = stars+"<li><i class='star inactive'></i></li>";
        };
      }
      stars = stars+"</ul></div>";
      return stars;

  } // end renderStars()

    var convertTime = function(UNIX_timestamp){

      var a = new Date(UNIX_timestamp * 1000),
          months = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Decembre'],
          time = a.getDate() + ' ' + months[a.getMonth()] + ' ' + a.getFullYear();

      return time;
    } // end convertTime()

    initialize_place(renderReviews);


});

https://codepen.io/bprodagnc/pen/zYGRERj

Для получения идентификатора места I используйте DevTools на кнопке «Написать отзыв» ( Проверьте скриншот ).

Это ошибка? Как вернуть отзывы от бизнеса, который имеет только зоны обслуживания, чтобы отобразить их на сайте компании?

...