أمثلة التكامل
تطبيقات كاملة للويدجت لحالات استخدام مختلفة.
التطبيق الأساسي
أبسط مثال: ويدجت مضمن في صفحة الحجوزات الخاصة بك.
HTML
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>حجز موعد | Mi Salon</title>
<style>
body {
font-family: system-ui, sans-serif;
max-width: 600px;
margin: 40px auto;
padding: 0 20px;
}
h1 {
text-align: center;
margin-bottom: 30px;
}
</style>
</head>
<body>
<h1>احجز موعدك</h1>
<div id="salonbookit-widget"></div>
<script src="https://app.salonbookit.com/static/widget/v1/salonbookit-widget.min.js"></script>
<script>
SalonBookIt.init({
apiKey: 'مفتاح_API_الخاص_بك',
container: '#salonbookit-widget',
theme: 'light',
locale: 'es'
});
</script>
</body>
</html>
زر يفتح النافذة المنبثقة
زر عائم يفتح الويدجت في نافذة منبثقة. مثالي للصفحات الرئيسية.
HTML
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>صالون التجميل الخاص بي</title>
<style>
.hero {
text-align: center;
padding: 100px 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.hero h1 {
font-size: 3rem;
margin-bottom: 20px;
}
</style>
</head>
<body>
<section class="hero">
<h1>مرحباً بك في صالوني</h1>
<p>أفضل المحترفين في انتظارك</p>
<!-- سيتم عرض الزر هنا -->
<div id="booking-button" style="margin-top: 30px;"></div>
</section>
<script src="https://app.salonbookit.com/static/widget/v1/salonbookit-widget.min.js"></script>
<script>
SalonBookIt.init({
apiKey: 'مفتاح_API_الخاص_بك',
container: '#booking-button',
mode: 'button',
buttonText: 'احجز الآن',
buttonStyle: 'solid',
primaryColor: '#ffffff',
theme: 'dark',
onBookingComplete: (booking) => {
// إعادة التوجيه لصفحة التأكيد
window.location.href = '/gracias?reserva=' + booking.codigo;
}
});
</script>
</body>
</html>
خدمة مختارة مسبقاً
مفيد لصفحات الخدمات الفردية حيث تريد أن يكون للويدجت خدمة مختارة بالفعل.
HTML
<!-- الصفحة: /servicios/corte-clasico -->
<div class="service-page">
<h1>القص الكلاسيكي</h1>
<p>أكثر قصات الشعر شعبية للرجال.</p>
<p><strong>السعر: 25€</strong> | <strong>المدة: 30 min</strong></p>
<h2>حجز هذه الخدمة</h2>
<div id="widget"></div>
</div>
<script src="https://app.salonbookit.com/static/widget/v1/salonbookit-widget.min.js"></script>
<script>
// معرف الخدمة تحصل عليه من الخلفية أو الرابط
const serviceId = 15; // ID del "القص الكلاسيكي"
SalonBookIt.init({
apiKey: 'مفتاح_API_الخاص_بك',
container: '#widget',
serviceId: serviceId, // اختيار مسبق لهذه الخدمة
allowMultipleServices: false // يسمح بهذه الخدمة فقط
});
</script>
التكامل مع Google Analytics
تتبع كل خطوة من مسار الحجز.
JavaScript
SalonBookIt.init({
apiKey: 'مفتاح_API_الخاص_بك',
container: '#widget',
onReady: (business) => {
gtag('event', 'widget_loaded', {
'business_name': business.nombre
});
},
onStepChange: (step, data) => {
gtag('event', 'booking_step', {
'step_name': step,
'services_count': data.services?.length || 0
});
},
onServiceSelect: (service, selected, allSelected) => {
if (selected) {
gtag('event', 'add_to_cart', {
'items': [{
'id': service.id,
'name': service.nombre,
'price': service.precio
}]
});
}
},
onBookingComplete: (booking) => {
gtag('event', 'purchase', {
'transaction_id': booking.id,
'value': booking.total,
'currency': 'EUR',
'items': booking.servicios.map(s => ({
'id': s.id,
'name': s.nombre,
'price': s.precio
}))
});
// Facebook Pixel
fbq('track', 'Purchase', {
value: booking.total,
currency: 'EUR'
});
},
onPaymentComplete: (payment) => {
gtag('event', 'payment_complete', {
'payment_method': 'stripe',
'amount': payment.amount
});
},
onError: (error) => {
gtag('event', 'exception', {
'description': error.message,
'fatal': false
});
}
});
أنماط مخصصة
خصص مظهر الويدجت بالكامل ليتناسب مع علامتك التجارية.
HTML + CSS
<style>
/* مظهر مخصص */
#mi-widget .sbk-widget {
/* ألوان العلامة التجارية */
--sbk-primary: #ff6b6b;
--sbk-primary-hover: #ee5a5a;
--sbk-background: #fafafa;
--sbk-surface: #ffffff;
--sbk-text: #2d3436;
--sbk-text-secondary: #636e72;
--sbk-border: #dfe6e9;
/* حدود أكثر استدارة */
--sbk-radius-sm: 8px;
--sbk-radius-md: 12px;
--sbk-radius-lg: 20px;
/* خط مخصص */
--sbk-font-family: 'Poppins', sans-serif;
/* ظلال أكثر وضوحاً */
--sbk-shadow-md: 0 10px 40px rgba(0,0,0,0.15);
}
/* نمط الزر الرئيسي */
#mi-widget .sbk-btn-primary {
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* بطاقات الخدمات */
#mi-widget .sbk-service-card {
border: 2px solid transparent;
transition: all 0.3s ease;
}
#mi-widget .sbk-service-card:hover {
border-color: var(--sbk-primary);
transform: translateY(-2px);
}
#mi-widget .sbk-service-card.selected {
border-color: var(--sbk-primary);
background: rgba(255, 107, 107, 0.05);
}
</style>
<div id="mi-widget"></div>
<script src="https://app.salonbookit.com/static/widget/v1/salonbookit-widget.min.js"></script>
<script>
SalonBookIt.init({
apiKey: 'مفتاح_API_الخاص_بك',
container: '#mi-widget',
primaryColor: '#ff6b6b',
borderRadius: '20px',
fontFamily: 'Poppins, sans-serif'
});
</script>
مكون React كامل
React (TypeScript)
import React, { useEffect, useRef, useState } from 'react';
interface BookingWidgetProps {
apiKey: string;
serviceId?: number;
staffId?: number;
onBookingComplete?: (booking: any) => void;
onError?: (error: any) => void;
}
declare global {
interface Window {
SalonBookIt: any;
}
}
const BookingWidget: React.FC<BookingWidgetProps> = ({
apiKey,
serviceId,
staffId,
onBookingComplete,
onError
}) => {
const containerRef = useRef<HTMLDivElement>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
useEffect(() => {
const loadScript = () => {
return new Promise<void>((resolve, reject) => {
if (window.SalonBookIt) {
resolve();
return;
}
const script = document.createElement('script');
script.src = 'https://app.salonbookit.com/static/widget/v1/salonbookit-widget.min.js';
script.async = true;
script.onload = () => resolve();
script.onerror = () => reject(new Error('خطأ في تحميل الويدجت'));
document.body.appendChild(script);
});
};
const initWidget = async () => {
try {
await loadScript();
if (!containerRef.current) return;
window.SalonBookIt.init({
apiKey,
container: containerRef.current,
serviceId,
staffId,
locale: 'es',
onReady: () => setLoading(false),
onBookingComplete: (booking: any) => {
onBookingComplete?.(booking);
},
onError: (err: any) => {
setError(err.message);
onError?.(err);
}
});
} catch (err) {
setError('خطأ في تحميل الويدجت');
}
};
initWidget();
return () => {
// Cleanup إذا لزم الأمر
};
}, [apiKey, serviceId, staffId]);
if (error) {
return (
<div className="widget-error">
<p>Error: {error}</p>
<button onClick={() => window.location.reload()}>
إعادة المحاولة
</button>
</div>
);
}
return (
<div className="widget-wrapper">
{loading && (
<div className="widget-loading">
<div className="spinner" />
<p>جارٍ التحميل...</p>
</div>
)}
<div ref={containerRef} style={{ opacity: loading ? 0 : 1 }} />
</div>
);
};
export default BookingWidget;
// الاستخدام:
// <BookingWidget
// apiKey="hh_pub_live_..."
// serviceId={15}
// onBookingComplete={(booking) => navigate(`/confirmacion/${booking.id}`)}
// />
WordPress مع Shortcode
إنشاء shortcode لإدراج الويدجت بسهولة في المنشورات والصفحات.
PHP (functions.php)
<?php
/**
* Shortcode لويدجت SalonBookIt
* الاستخدام: [salonbookit_widget service="15" staff="3"]
*/
function salonbookit_widget_shortcode($atts) {
$atts = shortcode_atts([
'service' => '',
'staff' => '',
'mode' => 'inline',
'button_text' => 'حجز موعد'
], $atts);
// إنشاء معرف فريد للحاوية
$container_id = 'sbk-widget-' . uniqid();
// بناء خيارات JS
$options = [
'apiKey' => get_option('salonbookit_api_key'),
'container' => '#' . $container_id,
'mode' => esc_attr($atts['mode']),
'buttonText' => esc_attr($atts['button_text']),
'locale' => substr(get_locale(), 0, 2)
];
if (!empty($atts['service'])) {
$options['serviceId'] = intval($atts['service']);
}
if (!empty($atts['staff'])) {
$options['staffId'] = intval($atts['staff']);
}
$options_json = json_encode($options);
ob_start();
?>
<div id="<?php echo esc_attr($container_id); ?>"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
if (window.SalonBookIt) {
SalonBookIt.init(<?php echo $options_json; ?>);
}
});
</script>
<?php
return ob_get_clean();
}
add_shortcode('salonbookit_widget', 'salonbookit_widget_shortcode');
// وضع السكريبت في قائمة الانتظار
function salonbookit_enqueue_scripts() {
wp_enqueue_script(
'salonbookit-widget',
'https://app.salonbookit.com/static/widget/v1/salonbookit-widget.min.js',
[],
'1.0',
true
);
}
add_action('wp_enqueue_scripts', 'salonbookit_enqueue_scripts');
الاستخدام في محرر WordPress:
Shortcode
[salonbookit_widget]
[salonbookit_widget service="15"]
[salonbookit_widget mode="button" button_text="طلب موعد"]