উন্নত স্থান বিবরণ উপাদান

প্লেস ডিটেইলস কম্পোনেন্টের অ্যাডভান্সড ভার্সনটি প্লেস ডিটেইলস এসেনশিয়ালস-এর মতোই ফিচারগুলো প্রদান করে। এছাড়াও এটি আপনাকে প্লেসের নাম প্রদর্শিত হবে কিনা তা বেছে নিতে, কম্পোনেন্টটির অ্যাকশন বাটনগুলো কনফিগার করতে এবং প্রদর্শিত রিভিউ ও মিডিয়ার ক্ষেত্রে সার্চ ও ফিল্টারিং অপশন প্রয়োগ করতে দেয়।

উন্নত স্থান বিবরণ কনফিগারেশন

উন্নত বৈশিষ্ট্যগুলো অ্যাক্সেস করতে AdvancedPlaceDetailsView অথবা AdvancedPlaceDetailsCompactView ব্যবহার করুন।

বিষয়বস্তু প্রদর্শনের বিকল্পগুলি

AdvancedPlaceDetailsContent এর enum ব্যবহার করে আপনি কোন কন্টেন্ট প্রদর্শন করবেন তা নির্দিষ্ট করে দিতে পারেন। আপনি Places Details Essentials-এর মতোই সমস্ত কন্টেন্ট কনফিগার করতে পারেন, সেইসাথে স্থানের নামটি প্রদর্শিত হবে কিনা তাও বেছে নিতে পারেন।

অ্যাকশন বাটন কনফিগার করুন

অ্যাকশন বাটনগুলো অপসারণ বা কাস্টমাইজ করতে AdvancedPlaceDetailsView অথবা AdvancedPlaceDetailsCompactView এর .cornerActions এবং .mainActions মেথডগুলো ব্যবহার করুন।

চাক্ষুষ অ্যাট্রিবিউশনের প্রয়োজনীয়তা

কাস্টমাইজড বোতাম ব্যবহার করে বিস্তারিত বিবরণের কম্প্যাক্ট ভিউ রাখুন
কাস্টমাইজড বোতাম সহ উন্নত স্থানের বিবরণের সংক্ষিপ্ত দৃশ্য

গুরুত্বপূর্ণ: যখন কোনো কাস্টম অ্যাকশন বাটন গুগল ছাড়া অন্য কোনো তৃতীয় পক্ষের সাথে ব্যবহারকারীর তথ্য শেয়ার করবে, তখন আপনাকে তা ব্যবহারকারীদের কাছে স্পষ্টভাবে জানিয়ে দিতে হবে। ভিজ্যুয়াল অ্যাট্রিবিউশনের আবশ্যকতাগুলো দেখুন।

ডানদিকের উদাহরণটিতে একটি কাস্টম ছবি দেখানো হয়েছে, যা থেকে স্পষ্ট বোঝা যায় যে ব্যবহারকারীর তথ্য "Altostrat"-এ পাঠানো হবে।

অনুসন্ধান এবং ফিল্টারিং বিকল্পগুলি প্রয়োগ করুন

মিডিয়া বা রিভিউ অনুসন্ধান ও ফিল্টার করার সুবিধা চালু করতে AdvancedPlaceDetailsView অথবা AdvancedPlaceDetailsCompactView এর .searchMediaOptions এবং .searchReviewOptions মেথডগুলো ব্যবহার করুন।

কাস্টম কন্টেন্ট স্লট তৈরি করুন

কাস্টম কন্টেন্ট স্লট প্লেসমেন্ট বিকল্পগুলি

কাস্টম কন্টেন্ট স্লট আপনাকে পূর্বনির্ধারিত লেআউট জোনগুলিতে সরাসরি আপনার নিজস্ব কন্টেন্ট (যেমন এআই-জেনারেটেড সারাংশ, ভ্রমণসূচীর টাইমস্ট্যাম্প বা কাস্টম ব্যাজ) যোগ করার সুযোগ দেয়।

কাস্টম কন্টেন্ট যোগ করতে, AdvancedPlaceDetailsCompactView এর .placeDetailsCompactContentSlot মেথডটি ব্যবহার করুন। উপলব্ধ পজিশনগুলো হলো .basicSectionTop এবং .basicSectionBottom ।

কন্টেন্ট স্লটের জন্য অ্যাট্রিবিউশনের প্রয়োজনীয়তা এবং বিষয়বস্তু সংক্রান্ত পরামর্শ

যখন একটি কাস্টম কন্টেন্ট স্লট মাউন্ট করা হয়, তখন ডিসক্লোজারটি স্বয়ংক্রিয়ভাবে আপডেট হয়ে যায়, যা স্পষ্ট করে যে কোন কন্টেন্ট গুগল সরবরাহ করেছে এবং কিছু কন্টেন্ট তৃতীয় পক্ষ দ্বারা সরবরাহ করা হয়েছে।

করুন

তথ্যের উৎস সম্পর্কে কোনো অস্পষ্টতা এড়াতে গুগল প্লেসের বিবরণ এবং নিজস্ব কন্টেন্টের মধ্যে একটি সুস্পষ্ট দৃশ্যগত স্তরবিন্যাস বজায় রাখুন।

তথ্যের উৎস সম্পর্কে অস্পষ্টতা রোধ করুন

করুন

আপনার ব্যবহারকারীদের তাৎক্ষণিক লক্ষ্যের সাথে মানানসই, স্থানীয় ও মূল্যবান তথ্য বিবেচনা করুন। রিয়েল-টাইম বুকিং উইন্ডো বা বর্তমান প্রাপ্যতার মতো বিশেষভাবে তৈরি কন্টেন্ট ব্যবহারকারীদের দ্রুত এবং আরও ভালোভাবে জেনে-বুঝে সিদ্ধান্ত নিতে সাহায্য করে।

উচ্চ মূল্যবান অন্তর্দৃষ্টি প্রদান করুন

না

বিদ্যমান গুগল প্লেস-এর তথ্য, যেমন রেটিং, রিভিউ বা ব্যবসার সময়সূচী, নকল করবেন না, এমনকি যদি আপনি গুগল-প্রদত্ত কন্টেন্ট লুকিয়েও রাখেন। এমনটা করলে কন্টেন্টের উৎস এবং এটি গুগল নাকি কোনো তৃতীয় পক্ষ থেকে এসেছে, সে বিষয়ে ব্যবহারকারীরা বিভ্রান্ত হতে পারেন।

বিদ্যমান গুগল প্লেস বিবরণ নকল করবেন না।

না

উৎস উল্লেখ না করা কোনো দাবি বা ব্যাজ (যেমন, "সেরা সুপারিশ!") প্রদর্শন করবেন না, যা গুগলের আনুষ্ঠানিক অনুমোদন বলে ভুল হতে পারে। কাস্টম কন্টেন্টের ক্ষেত্রে অবশ্যই তার উৎসের সুস্পষ্ট উল্লেখ করতে হবে।

উৎস উল্লেখ নেই এমন দাবি বা ব্যাজ প্রদর্শন করবেন না।

না

কাস্টম প্লেস কন্টেইনারের মধ্যে বিজ্ঞাপন, মার্কেটিং কপি, প্রচারমূলক ছাড় বা সাবস্ক্রিপশনের অনুরোধ অন্তর্ভুক্ত করবেন না।

বিজ্ঞাপন, বিপণনমূলক লেখা, প্রচারমূলক ছাড় বা সাবস্ক্রিপশনের অনুরোধ অন্তর্ভুক্ত করবেন না।

উন্নত স্থানের বিবরণের উদাহরণ

স্থানের নাম বাদ দিন

স্থানের নাম বাদ দিতে চাইলে, AdvancedPlaceDetailsConfiguration এর content প্যারামিটারে .name অন্তর্ভুক্ত করবেন না।

সুইফট

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  // Query for loading the place details component.
  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  @State private var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content:[.address()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
  }
}

অ্যাকশন বাটনগুলি সরান

সুইফট

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .mainActions{ _ in
      return []
    }
  }
}

কাস্টম এবং পূর্বনির্ধারিত অ্যাকশন যোগ করুন

এই নমুনাটি পূর্বনির্ধারিত 'মানচিত্রে খুলুন' (Open in Maps) অ্যাকশনটির পাশাপাশি ব্যবহারকারীকে কোনো স্থানকে পছন্দের তালিকায় যুক্ত বা বাদ দেওয়ার একটি বিকল্প যোগ করে।

সুইফট

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  
  @State var favoritePlaces: Set<String> = []

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: AdvancedPlaceDetailsView.allContent,
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { result in
        if let place = result.place {
          print("Place: \(place.description)")
        } else {
          print("Error: \(String(describing: result.error))")
        }
      }
    )
    .mainActions{ place in
      var actions: [MainPlaceActionElement] = []
      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart.fill"),
              label: "Unfavorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            MainPlaceAction(
              image: Image(systemName: "heart"),
              label: "Favorite"
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
    .cornerActions { place in
      var actions: [CornerPlaceActionElement] = []
      let placeID = place.placeID!
      if self.favoritePlaces.contains(placeID) {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart.fill"),
              accessibilityLabel: "Unfavorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      } else {
        actions.append(
          .action(
            CornerPlaceAction(
              image: Image(systemName: "heart"),
              accessibilityLabel: "Favorite",
            ) { _ in self.toggleFavorite(placeID) }
          )
        )
      }
      actions.append(.actionId(.openMap(style: .primary)))
      return actions
    }
  }

  func toggleFavorite(_ placeID: String) {
    if favoritePlaces.contains(placeID) {
      favoritePlaces.remove(placeID)
    } else {
      favoritePlaces.insert(placeID)
    }
  }
}

পর্যালোচনা এবং মিডিয়া ফিল্টার করুন

এই কোড নমুনাটি শুধুমাত্র সেইসব মিডিয়া এবং রিভিউ দেখায় যেগুলিতে 'কফি'র উল্লেখ আছে।

সুইফট

struct DemoView: View {
  static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

  @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
    identifier: .placeID(peetsCoffeePlaceID)
  )
  let searchMediaOptions = SearchMediaOptions(query: "coffee")
  let searchReviewsOptions = SearchReviewsOptions(query: "coffee")

  var body: some View {
    AdvancedPlaceDetailsView(
      query: $query,
      configuration: AdvancedPlaceDetailsConfiguration(
        content: [.media(), .reviews()],
        theme: PlacesMaterialTheme()
      ),
      placeDetailsCallback: { _ in }
    )
    .searchMediaOptions(searchMediaOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
    .searchReviewsOptions(searchReviewsOptions) { results in
      guard let result = results.first else { return }
      switch result {
      case .success(let summary):
        print("Summary: \(summary)")
      case .failure(let error):
        print("Error: \(error)")
      }
    }
  }
}

কন্টেন্ট স্লট তৈরি করুন

এই নমুনাটি basicSectionTop এবং basicSectionBottom স্লটগুলিতে বিষয়বস্তু যোগ করে।

সুইফট

import SwiftUI
import PlacesSwift

struct ItineraryCard: View {
    static let peetsCoffeePlaceID = "ChIJT7FdmYiAhYAROFOvrIxRJDU"

    @State var query: PlaceDetailsQuery = PlaceDetailsQuery(
      identifier: .placeID(peetsCoffeePlaceID)
    )

    var body: some View {
      AdvancedPlaceDetailsCompactView(
        orientation: .vertical,
        query: $query,
        configuration: AdvancedPlaceDetailsCompactConfiguration(
          content: AdvancedPlaceDetailsCompactView.allContent,
          theme: PlacesMaterialTheme()
        ),
        placeDetailsCallback: { _ in }
      )
      .placeDetailsCompactContentSlot(position: .basicSectionTop) { place in
        Text("Day 2 • 2:30 PM")
          .font(.caption)
          .fontWeight(.bold)
          .foregroundColor(.accentColor)
      }
      .placeDetailsCompactContentSlot(position: .basicSectionBottom) { place in
        VStack(alignment: .leading, spacing: 4) {
          Text("AI Notes")
            .font(.caption)
            .bold()
          Text("Great quiet atmosphere for morning meetings. Famous for house-roasted pour-overs.")
            .font(.footnote)
            .foregroundColor(.secondary)
        }
        .padding(8)
        .background(Color(.systemGray6))
        .cornerRadius(8)
      }
    }
}