'restaurant', '{{2}}' => 'book_now', ...] * @param Restaurant $restaurant * @param string|null $bookNowWidgetId Widget ID for book_now URL * @param array $bookNowExtraParams Extra params for evavel_action_book_now (e.g. ['missed_call' => 1]) * @param string|null $bookNowOverride Pre-generated URL that replaces the call to evavel_action_book_now * @return array ['field_key' => 'resolved_value', ...] */ public static function resolveVariables( array $fieldMapping, Restaurant $restaurant, $bookNowWidgetId = null, array $bookNowExtraParams = [], ?string $bookNowOverride = null, array $staticValues = [] ): array { $bookNowUrl = $bookNowOverride ?? self::getBookNowUrl($restaurant, $bookNowWidgetId, $bookNowExtraParams); $variables = []; foreach ($fieldMapping as $templateVar => $fieldKey) { if (empty($fieldKey)) { continue; } // If mapped to custom_link, use the static value if ($fieldKey === 'custom_link') { $staticValue = $staticValues[$templateVar] ?? ''; if ($staticValue !== '') { $variables[$templateVar] = (string) $staticValue; } continue; } $value = self::resolveField($fieldKey, $restaurant, $bookNowUrl); if ($value !== null && $value !== '') { $variables[$templateVar] = (string) $value; } } return $variables; } /** * Replace {tag} placeholders in a text message with restaurant values. * Used by WhatsApp custom messages and SMS. * * @param string $message Message with {restaurant}, {book_now}, etc. placeholders * @param Restaurant $restaurant * @param string|null $bookNowWidgetId Widget ID for book_now URL * @param array $bookNowExtraParams Extra params for evavel_action_book_now * @param string|null $bookNowOverride Pre-generated URL that replaces the call to evavel_action_book_now * @return string Message with placeholders replaced */ public static function replaceTags( string $message, Restaurant $restaurant, $bookNowWidgetId = null, array $bookNowExtraParams = [], ?string $bookNowOverride = null ): string { $bookNowUrl = $bookNowOverride ?? self::getBookNowUrl($restaurant, $bookNowWidgetId, $bookNowExtraParams); $dialCode = $restaurant->dial_code ?? ''; $phone = $restaurant->phone ?? ''; $timezone = $restaurant->timezone ?? 'UTC'; $replacements = [ '{restaurant}' => $restaurant->name ?? '', '{restaurant_phone}' => trim($dialCode . ' ' . $phone), '{book_now}' => $bookNowUrl, '{current_date}' => evavel_now_timezone_formatted($timezone, 'Y-m-d'), '{site_link}' => evavel_site_url(), '{restaurant_link}' => $restaurant->link_web ?? '', '{restaurant_facebook}' => $restaurant->link_facebook ?? '', '{restaurant_instagram}' => $restaurant->link_instagram ?? '', '{menu_link}' => $restaurant->link_menu ?? '', '{opening_link}' => $restaurant->link_opening ?? '', ]; return str_replace( array_keys($replacements), array_values($replacements), $message ); } /** * Generate a book_now URL. * Centralizes the call to evavel_action_book_now(). * * @param Restaurant $restaurant * @param string|null $bookNowWidgetId * @param array $extraParams Extra params like ['missed_call' => 1, 'utm_source' => 'sms'] * @return string */ public static function getBookNowUrl(Restaurant $restaurant, $bookNowWidgetId = null, array $extraParams = []): string { // If no widget_id passed explicitly, resolve from centralized setting if ($bookNowWidgetId === null) { $bookNowWidgetId = BookNowWidgetResolver::resolve($restaurant->id); } return evavel_action_book_now($restaurant->id, $bookNowWidgetId, $extraParams); } /** * Resolve a single restaurant-level field value. * * @param string $fieldKey * @param Restaurant $restaurant * @param string $bookNowUrl Pre-resolved book_now URL * @return string */ protected static function resolveField(string $fieldKey, Restaurant $restaurant, string $bookNowUrl): string { switch ($fieldKey) { case 'restaurant': return $restaurant->name ?? ''; case 'restaurant_phone': $dialCode = $restaurant->dial_code ?? ''; $phone = $restaurant->phone ?? ''; return trim($dialCode . ' ' . $phone); case 'book_now': return $bookNowUrl; case 'current_date': $timezone = $restaurant->timezone ?? 'UTC'; return evavel_now_timezone_formatted($timezone, 'Y-m-d'); case 'site_link': return evavel_site_url(); case 'restaurant_link': return $restaurant->link_web ?? ''; case 'restaurant_facebook': return $restaurant->link_facebook ?? ''; case 'restaurant_instagram': return $restaurant->link_instagram ?? ''; case 'menu_link': return $restaurant->link_menu ?? ''; case 'opening_link': return $restaurant->link_opening ?? ''; default: return ''; } } }