diff --git a/basic_indemnity.php b/basic_indemnity.php
index ac02f49b..470759f1 100644
--- a/basic_indemnity.php
+++ b/basic_indemnity.php
@@ -38,33 +38,11 @@ if (isset($_SESSION['user_id'])) {
}
-
- 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
Indemnity
-
-
-
-
diff --git a/batch_update_banners.php b/batch_update_banners.php
new file mode 100644
index 00000000..734f5b6f
--- /dev/null
+++ b/batch_update_banners.php
@@ -0,0 +1,94 @@
+ ['pageTitle', [breadcrumbs]]
+$filesToUpdate = [
+ 'blog.php' => ['Blogs', [['Home' => 'index.php']]],
+ 'blog_details.php' => ['Blog Details', [['Home' => 'index.php'], ['Blogs' => 'blog.php']]],
+ 'bookings.php' => ['Bookings', [['Home' => 'index.php']]],
+ 'campsites.php' => ['Campsites', [['Home' => 'index.php']]],
+ 'contact.php' => ['Contact Us', [['Home' => 'index.php']]],
+ 'driver_training.php' => ['Driver Training', [['Home' => 'index.php']]],
+ 'events.php' => ['Events', [['Home' => 'index.php']]],
+ 'membership.php' => ['Membership', [['Home' => 'index.php']]],
+ 'membership_application.php' => ['Membership Application', [['Home' => 'index.php'], ['Membership' => 'membership.php']]],
+ 'membership_payment.php' => ['Membership Payment', [['Home' => 'index.php'], ['Membership' => 'membership.php']]],
+ 'trips.php' => ['Trips', [['Home' => 'index.php']]],
+ 'bush_mechanics.php' => ['Bush Mechanics', [['Home' => 'index.php']]],
+ 'rescue_recovery.php' => ['Rescue & Recovery', [['Home' => 'index.php']]],
+ 'best_of_the_eastern_cape_2024.php' => ['Best of Eastern Cape 2024', [['Home' => 'index.php']]],
+ '2025_agm_minutes.php' => ['2025 AGM Minutes', [['Home' => 'index.php']]],
+];
+
+$updated = 0;
+$skipped = 0;
+$failed = 0;
+
+foreach ($filesToUpdate as $filename => $config) {
+ $filepath = __DIR__ . '/' . $filename;
+
+ if (!file_exists($filepath)) {
+ echo "[MISSING] $filename\n";
+ $failed++;
+ continue;
+ }
+
+ $content = file_get_contents($filepath);
+
+ // Check if already uses banner component
+ if (strpos($content, 'components/banner.php') !== false) {
+ echo "[SKIP] $filename - Already uses banner component\n";
+ $skipped++;
+ continue;
+ }
+
+ // Check if file has page-banner-area
+ if (strpos($content, 'page-banner-area') === false) {
+ echo "[SKIP] $filename - No page-banner-area found\n";
+ $skipped++;
+ continue;
+ }
+
+ list($pageTitle, $breadcrumbs) = $config;
+
+ // Format breadcrumbs array for PHP code
+ $breadcrumbStr = '[';
+ foreach ($breadcrumbs as $item) {
+ $breadcrumbStr .= '[';
+ foreach ($item as $label => $url) {
+ $breadcrumbStr .= "'{$label}' => '{$url}', ";
+ }
+ $breadcrumbStr = rtrim($breadcrumbStr, ', ') . '], ';
+ }
+ $breadcrumbStr = rtrim($breadcrumbStr, ', ') . ']';
+
+ // Build replacement code
+ $replacement = "";
+
+ // Pattern: Match from ""
+ // This handles the PHP setup code + HTML section + closing comment
+ $pattern = '/[\s]*<\?php\s*\$bannerFolder\s*=\s*[\'"]assets\/images\/banners\/[\'"];[\s\S]*?<\/section>\s*/';
+
+ $newContent = preg_replace($pattern, $replacement, $content, 1, $count);
+
+ if ($count > 0 && file_put_contents($filepath, $newContent) !== false) {
+ $updated++;
+ echo "[UPDATE] $filename\n";
+ } else {
+ $failed++;
+ echo "[FAIL] $filename\n";
+ }
+}
+
+echo "\n";
+echo str_repeat("=", 50) . "\n";
+echo "BATCH UPDATE SUMMARY\n";
+echo str_repeat("=", 50) . "\n";
+echo "Updated: $updated\n";
+echo "Skipped: $skipped\n";
+echo "Failed: $failed\n";
+echo str_repeat("=", 50) . "\n";
+?>
diff --git a/best_of_the_eastern_cape_2024.php b/best_of_the_eastern_cape_2024.php
index 48575c2b..374a7672 100644
--- a/best_of_the_eastern_cape_2024.php
+++ b/best_of_the_eastern_cape_2024.php
@@ -1,5 +1,5 @@
-
@@ -67,31 +67,15 @@ $page_id = 'best_0f_ec';
float: right;
}
- .clearfix {
- clear: both;
- }
+
-
-
-
-
-
-
-
-
Best of the Eastern Cape 2024
-
-
-
-
-
-
+ 'index.php']];
+ require_once('components/banner.php');
+?>
diff --git a/blog.php b/blog.php
index 4b2a1b26..9500c534 100644
--- a/blog.php
+++ b/blog.php
@@ -1,5 +1,5 @@
-
-
-
-
- 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
-
Blogs
-
-
-
-
-
diff --git a/blog_details.php b/blog_details.php
index 4e5fb37f..488de786 100644
--- a/blog_details.php
+++ b/blog_details.php
@@ -1,5 +1,5 @@
-
'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
My Bookings
-
-
-
-
diff --git a/bush_mechanics.php b/bush_mechanics.php
index 0d9d944b..8d7f928f 100644
--- a/bush_mechanics.php
+++ b/bush_mechanics.php
@@ -20,32 +20,11 @@ $page_id = 'bush_mechanics';
font-size: 16px;
}
-
-
- 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
Bush Mechanics
-
-
-
-
-
diff --git a/campsites.php b/campsites.php
index 92222714..f3cff20f 100644
--- a/campsites.php
+++ b/campsites.php
@@ -1,5 +1,5 @@
-fetch_assoc()) {
.info-box img {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
- }
'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
Campsites
-
-
-
-
diff --git a/components/banner.php b/components/banner.php
new file mode 100644
index 00000000..3c440309
--- /dev/null
+++ b/components/banner.php
@@ -0,0 +1,72 @@
+
+ *
+ * Parameters:
+ * $pageTitle (required) - Page title to display
+ * $bannerImage (optional) - URL to banner background image. If not set, uses random banner
+ * $breadcrumbs (optional) - Array of breadcrumb items. Default: [['Home' => 'index.php']]
+ * $classes (optional) - Additional CSS classes for banner section
+ */
+
+// Default values
+$pageTitle = $pageTitle ?? 'Page';
+$bannerImage = $bannerImage ?? '';
+$breadcrumbs = $breadcrumbs ?? [['Home' => 'index.php']];
+$classes = $classes ?? '';
+
+// If no banner image provided, try to use random banner
+if (empty($bannerImage)) {
+ $bannerFolder = 'assets/images/banners/';
+ $bannerImages = glob($bannerFolder . '*.{jpg,jpeg,png,webp}', GLOB_BRACE);
+ $bannerImage = !empty($bannerImages) ? $bannerImages[array_rand($bannerImages)] : 'assets/images/base4/camping.jpg';
+}
+
+// Add the page title to breadcrumbs as last item (not a link)
+$breadcrumbItems = [];
+foreach ($breadcrumbs as $item) {
+ foreach ($item as $label => $url) {
+ $breadcrumbItems[] = ['label' => $label, 'url' => $url];
+ }
+}
+$breadcrumbItems[] = ['label' => $pageTitle, 'url' => null];
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/contact.php b/contact.php
index 1c1445ab..a78b81fa 100644
--- a/contact.php
+++ b/contact.php
@@ -26,32 +26,11 @@ include_once('header.php') ?>
display: block;
/* Prevents inline whitespace issues */
}
-
-
- 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
Contact Us
-
-
-
-
-
diff --git a/course_details.php b/course_details.php
index 56fae5db..de16b643 100644
--- a/course_details.php
+++ b/course_details.php
@@ -9,20 +9,11 @@ $result = $conn->query($sql);
-
-
-
-
-
4X4 Driver Training
-
-
-
-
+ 'index.php']];
+ require_once('components/banner.php');
+?>
diff --git a/driver_training.php b/driver_training.php
index 80b7a96f..3f904b40 100644
--- a/driver_training.php
+++ b/driver_training.php
@@ -24,32 +24,11 @@ $page_id = 'driver_training';
padding: 8px;
font-size: 16px;
}
-
-
- 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
4X4 Driver Training
-
-
-
-
-
diff --git a/events.php b/events.php
index c6420dfe..82dd07cd 100644
--- a/events.php
+++ b/events.php
@@ -1,5 +1,5 @@
-
'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
4WDCSA events
-
-
-
-
diff --git a/indemnity.php b/indemnity.php
index e145fb7d..e028ee0c 100644
--- a/indemnity.php
+++ b/indemnity.php
@@ -38,33 +38,11 @@ if (isset($_SESSION['user_id'])) {
}
-
- 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
Indemnity
-
-
-
-
diff --git a/membership.php b/membership.php
index cb0eeb06..fcc67c1a 100644
--- a/membership.php
+++ b/membership.php
@@ -15,33 +15,11 @@ $stmt->bind_param("i", $user_id);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
+?> 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
-
-
-
-
-
diff --git a/membership_application.php b/membership_application.php
index 7af11bd2..612c5339 100644
--- a/membership_application.php
+++ b/membership_application.php
@@ -20,34 +20,11 @@ $stmt->bind_param("i", $user_id);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();
+?> 'index.php'], ['Membership' => 'membership.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
-
Application
-
-
-
-
-
diff --git a/membership_payment.php b/membership_payment.php
index af679814..8e3492d0 100644
--- a/membership_payment.php
+++ b/membership_payment.php
@@ -67,36 +67,11 @@ $stmt->fetch();
$stmt->close();
$conn->close();
+?> 'index.php'], ['Membership' => 'membership.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
-
-
-
Payment
-
-
-
-
-
diff --git a/rescue_recovery.php b/rescue_recovery.php
index 14d289d0..d8ed5252 100644
--- a/rescue_recovery.php
+++ b/rescue_recovery.php
@@ -19,32 +19,11 @@ $page_id = 'rescue_recovery';
padding: 8px;
font-size: 16px;
}
-
-
- 'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
Rescue & Recovery
-
-
-
-
-
diff --git a/trips.php b/trips.php
index 9406f600..ea116ed8 100644
--- a/trips.php
+++ b/trips.php
@@ -1,5 +1,5 @@
-
@@ -14,44 +14,13 @@ include_once('header.php');
display: block;
/* Ensure proper block behavior */
}
-
- .image img {
- width: 100%;
- /* Image scales to fill the container */
- height: 100%;
- /* Image scales to fill the container */
- object-fit: cover;
- /* Fills the container while maintaining aspect ratio */
- object-position: top;
- /* Aligns the top of the image with the top of the container */
- display: block;
- /* Prevents inline whitespace issues */
- }
'index.php']];
+ require_once('components/banner.php');
?>
-
-
-
-
-
4WDCSA Trips
-
-
-
-