Blog system enhancements: fix publish/unpublish permissions, add action buttons to blog listings, update gallery to show only published blog images, improve blog card layout and description truncation
This commit is contained in:
258
index.php
258
index.php
@@ -20,25 +20,25 @@ if (isset($_SESSION['user_id']) && isset($conn) && $conn !== null) {
|
||||
|
||||
?>
|
||||
<style>
|
||||
.countdown-container {
|
||||
width: 100%;
|
||||
/* background: #111; */
|
||||
text-align: center;
|
||||
padding: 40px 10px;
|
||||
/* font-family: Arial, sans-serif; */
|
||||
}
|
||||
.countdown-container {
|
||||
width: 100%;
|
||||
/* background: #111; */
|
||||
text-align: center;
|
||||
padding: 40px 10px;
|
||||
/* font-family: Arial, sans-serif; */
|
||||
}
|
||||
|
||||
.countdown-container h1 {
|
||||
font-size: 3rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.countdown-container h1 {
|
||||
font-size: 3rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.countdown-container h1 {
|
||||
font-size: 3rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
}
|
||||
</style>
|
||||
<?php
|
||||
$bannerFolder = 'assets/images/banners/';
|
||||
$bannerImages = glob($bannerFolder . '*.{jpg,jpeg,png,webp}', GLOB_BRACE);
|
||||
@@ -96,22 +96,22 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
$result = $stmt->get_result();
|
||||
|
||||
if ($result->num_rows > 0) {
|
||||
// Loop through each row
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$trip_id = $row['trip_id'];
|
||||
$trip_name = $row['trip_name'];
|
||||
$location = $row['location'];
|
||||
$short_description = $row['short_description'];
|
||||
$start_date = $row['start_date'];
|
||||
$end_date = $row['end_date'];
|
||||
$capacity = $row['vehicle_capacity'];
|
||||
$cost_members = $row['cost_members'];
|
||||
$places_booked = $row['places_booked'];
|
||||
$remaining_places = $capacity - $places_booked;
|
||||
// Loop through each row
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$trip_id = $row['trip_id'];
|
||||
$trip_name = $row['trip_name'];
|
||||
$location = $row['location'];
|
||||
$short_description = $row['short_description'];
|
||||
$start_date = $row['start_date'];
|
||||
$end_date = $row['end_date'];
|
||||
$capacity = $row['vehicle_capacity'];
|
||||
$cost_members = $row['cost_members'];
|
||||
$places_booked = $row['places_booked'];
|
||||
$remaining_places = $capacity - $places_booked;
|
||||
|
||||
// Determine the badge text based on the status
|
||||
$badge_text = ($remaining_places > 0) ? $remaining_places . ' PLACES LEFT!!' : 'FULLY BOOKED';
|
||||
echo '
|
||||
// Determine the badge text based on the status
|
||||
$badge_text = ($remaining_places > 0) ? $remaining_places . ' PLACES LEFT!!' : 'FULLY BOOKED';
|
||||
echo '
|
||||
<div class="col-xxl-3 col-xl-4 col-md-6">
|
||||
<div class="destination-item" data-aos="fade-up" data-aos-duration="1500" data-aos-offset="50">
|
||||
<div class="image">
|
||||
@@ -129,10 +129,10 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
}
|
||||
} else {
|
||||
echo "No trips available.";
|
||||
}
|
||||
} else {
|
||||
echo "No trips available.";
|
||||
}
|
||||
} // end if (isset($conn) && $conn !== null)
|
||||
?>
|
||||
|
||||
@@ -190,13 +190,13 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
<!-- About Us Area end -->
|
||||
|
||||
<section class="hotel-area bgc-black py-100 rel z-1">
|
||||
<div class="countdown-container">
|
||||
<h1 style="color: #e5f5e0;" id="countdown">Loading countdown...</h1>
|
||||
<a href="events.php" class="theme-btn style-two bgc-secondary" style="margin-top: 20px; background-color: #e90000; padding: 10px 20px; color: white; text-decoration: none; border-radius: 25px;">
|
||||
<span data-hover="Events">Find out more!</span>
|
||||
<i class="fal fa-arrow-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="countdown-container">
|
||||
<h1 style="color: #e5f5e0;" id="countdown">Loading countdown...</h1>
|
||||
<a href="events.php" class="theme-btn style-two bgc-secondary" style="margin-top: 20px; background-color: #e90000; padding: 10px 20px; color: white; text-decoration: none; border-radius: 25px;">
|
||||
<span data-hover="Events">Find out more!</span>
|
||||
<i class="fal fa-arrow-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Features Area start -->
|
||||
@@ -302,8 +302,8 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
<!-- <li><i class="fal fa-router"></i> Internet</li> -->
|
||||
</ul>
|
||||
<div class="destination-footer">
|
||||
<span class="price"><span>R <?= getPrice('driver_training', 'member');?></span>/for members</span>
|
||||
<span class="price"><span>R <?= getPrice('driver_training', 'nonmember');?></span>/for non-members</span>
|
||||
<span class="price"><span>R <?= getPrice('driver_training', 'member'); ?></span>/for members</span>
|
||||
<span class="price"><span>R <?= getPrice('driver_training', 'nonmember'); ?></span>/for non-members</span>
|
||||
<a href="driver_training.php" class="read-more">Book Now <i class="fal fa-angle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -327,8 +327,8 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
<!-- <li><i class="fal fa-router"></i> Internet</li> -->
|
||||
</ul>
|
||||
<div class="destination-footer">
|
||||
<span class="price"><span>R <?= getPrice('bush_mechanics', 'member');?></span>/for members</span>
|
||||
<span class="price"><span>R <?= getPrice('bush_mechanics', 'nonmember');?></span>/for non-members</span>
|
||||
<span class="price"><span>R <?= getPrice('bush_mechanics', 'member'); ?></span>/for members</span>
|
||||
<span class="price"><span>R <?= getPrice('bush_mechanics', 'nonmember'); ?></span>/for non-members</span>
|
||||
<a href="bush_mechanics.php" class="read-more">Book Now <i class="fal fa-angle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -347,8 +347,8 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
<!-- <li><i class="fal fa-router"></i> Internet</li> -->
|
||||
</ul>
|
||||
<div class="destination-footer">
|
||||
<span class="price"><span>R <?= getPrice('rescue_recovery', 'member');?></span>/for members</span>
|
||||
<span class="price"><span>R <?= getPrice('rescue_recovery', 'nonmember');?></span>/for non-members</span>
|
||||
<span class="price"><span>R <?= getPrice('rescue_recovery', 'member'); ?></span>/for members</span>
|
||||
<span class="price"><span>R <?= getPrice('rescue_recovery', 'nonmember'); ?></span>/for non-members</span>
|
||||
<a href="rescue_recovery.php" class="read-more">Book Now <i class="fal fa-angle-right"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -379,68 +379,90 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
</div>
|
||||
<div class="row justify-content-center">
|
||||
<?php
|
||||
$sql = "SELECT blog_id, title, date, category, image, description, author, link, members_only FROM blogs WHERE status = 'published' ORDER BY date DESC LIMIT 3";
|
||||
$result = $conn->query($sql);
|
||||
$result = $conn->prepare("
|
||||
SELECT
|
||||
b.blog_id,
|
||||
b.title,
|
||||
b.description,
|
||||
b.category,
|
||||
b.status,
|
||||
b.date,
|
||||
b.image,
|
||||
b.members_only,
|
||||
CONCAT(u.first_name, ' ', u.last_name) AS author_name,
|
||||
u.email AS author_email,
|
||||
u.profile_pic
|
||||
FROM blogs b
|
||||
JOIN users u ON b.author = u.user_id
|
||||
WHERE b.status = 'published'
|
||||
ORDER BY b.date DESC
|
||||
");
|
||||
|
||||
if ($result->num_rows > 0) {
|
||||
$result->execute();
|
||||
$posts = $result->get_result();
|
||||
|
||||
if ($posts->num_rows > 0) {
|
||||
// Loop through each row
|
||||
while ($row = $result->fetch_assoc()) {
|
||||
$blog_id = $row['blog_id'];
|
||||
$blog_title = $row['title'];
|
||||
$blog_date = $row['date'];
|
||||
$blog_category = $row['category'];
|
||||
$blog_image = $row['image'];
|
||||
$blog_description = $row['description'];
|
||||
$blog_author = $row['author'];
|
||||
$members_only = $row['members_only'];
|
||||
if($members_only){
|
||||
if (!isset($_SESSION['user_id'])){
|
||||
$blog_link = "login.php";
|
||||
while ($post = $posts->fetch_assoc()):
|
||||
$blog_id = $post['blog_id'];
|
||||
$blog_title = $post['title'];
|
||||
$blog_date = $post['date'];
|
||||
$blog_category = $post['category'];
|
||||
$blog_image = $post['image'];
|
||||
$blog_description = $post['description'];
|
||||
$members_only = $post['members_only'];
|
||||
if ($members_only) {
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
$blog_link = "login";
|
||||
$button_hover = "Members Only";
|
||||
$icon = "fa-lock";
|
||||
}else{
|
||||
} else {
|
||||
if (getUserMemberStatus($_SESSION['user_id'])) {
|
||||
$blog_link = $row['link'];
|
||||
$blog_link = "blog_read?token=" . encryptData($blog_id, $salt);
|
||||
$button_hover = "Read More";
|
||||
$icon = "fa-arrow-right";
|
||||
}else{
|
||||
$blog_link = "membership.php";
|
||||
} else {
|
||||
$blog_link = "membership";
|
||||
$button_hover = "Members Only";
|
||||
$icon = "fa-lock";
|
||||
}
|
||||
}
|
||||
}else{
|
||||
$blog_link = $row['link'];
|
||||
} else {
|
||||
$blog_link = "blog_read?token=" . encryptData($blog_id, $salt);
|
||||
$button_hover = "Read More";
|
||||
$icon = "fa-arrow-right";
|
||||
}
|
||||
|
||||
|
||||
|
||||
echo '
|
||||
<div class="col-xl-4 col-md-6">
|
||||
<div class="blog-item" data-aos="fade-up" data-aos-duration="1500" data-aos-offset="50">
|
||||
<div class="content">
|
||||
<a href="#" class="category">' . $blog_category . '</a>
|
||||
<h5><a href="' . $blog_link . '">' . $blog_title . '</a></h5>
|
||||
<ul class="blog-meta">
|
||||
<li><i class="far fa-calendar-alt"></i> <a href="#">' . $blog_date . '</a></li>
|
||||
<li><i class="far fa-user"></i>' . getFullName($blog_author) . '</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="image">
|
||||
<img style="border-radius:20px;" src="assets/images/blog/' . $blog_id . '/' . $blog_image . '" alt="Blog List">
|
||||
</div>
|
||||
<a style="width:100%;" href="' . $blog_link . '" class="theme-btn">
|
||||
<span style="width:100%;" data-hover="'.$button_hover.'">Read More</span>
|
||||
<i class="fal '.$icon.'"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>';
|
||||
}
|
||||
// Close connection
|
||||
$conn->close();
|
||||
} ?>
|
||||
<div class="col-xl-4 col-md-6">
|
||||
<div class="blog-item" data-aos="fade-up" data-aos-duration="1500" data-aos-offset="50">
|
||||
<div class="content" style="width:100%;">
|
||||
|
||||
<div class="destination-header d-flex align-items-start gap-3">
|
||||
|
||||
<img src="' . $post["profile_pic"] . '" alt="Author" class="rounded-circle border" width="60" height="60">
|
||||
<div>
|
||||
<span class="badge bg-dark mb-1">' . strtoupper($post["category"]) . '</span>
|
||||
<h5 class="mb-0">' . $post["title"] . '</h5>
|
||||
<small class="text-muted">' . $post["author_name"] . '</small>
|
||||
</div>
|
||||
</div>
|
||||
<p style="max-height: 60px; overflow: hidden;">' . $post["description"] . '</p>
|
||||
</div>
|
||||
<div class="image">
|
||||
<img style="aspect-ratio: 4 / 3; object-fit: cover; object-position: center; border-radius:20px; width: 100%; display: block;" src="' . $blog_image . '" alt="Blog List">
|
||||
</div>
|
||||
<a style="width:100%;" href="' . $blog_link . '" class="theme-btn">
|
||||
<span style="width:100%;" data-hover="' . $button_hover . '">Read More</span>
|
||||
<i class="fal ' . $icon . '"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>';
|
||||
endwhile;
|
||||
} else {
|
||||
echo "<p>No blog posts available.</p>";
|
||||
}
|
||||
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -454,7 +476,7 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
<div class="footer-top pt-100 pb-30">
|
||||
<div class="row justify-content-between">
|
||||
<div class="col-xl-5 col-lg-6" data-aos="fade-up" data-aos-duration="1500" data-aos-offset="50">
|
||||
<div class="footer-widget footer-contact">
|
||||
<div class="footer-widget footer-contact">
|
||||
<a href="https://chat.whatsapp.com/JD9xQuJlVX5AAJwcLrpl2B" target="_blank" style="text-decoration: none; color: inherit;">
|
||||
<div style="display: flex; align-items: center; background-color: #e5f5e0; border-radius: 10px; padding: 10px; max-width: 100%; box-shadow: 0 2px 6px rgba(0,0,0,0.1);">
|
||||
<img src="assets/images/icons/whatsapp.png" alt="WhatsApp" style="width: 64px; height: 64px; margin-right: 15px;">
|
||||
@@ -531,36 +553,36 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
src="assets/images/icons/scroll-up.png" alt="Scroll Up"></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</footer>
|
||||
<!-- footer area end -->
|
||||
|
||||
</div>
|
||||
<!--End pagewrapper-->
|
||||
<?php if ($indemnityPending): ?>
|
||||
<!-- Bootstrap Modal -->
|
||||
<div class="modal fade" id="indemnityModal" tabindex="-1" aria-labelledby="indemnityModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content border-secondary">
|
||||
<div class="modal-header bg-secondary text-white">
|
||||
<h5 class="modal-title" id="indemnityModalLabel">Membership Application Incomplete</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
To link your existing FWDCSA membership, you need to sign and accept the indemnity aggreement before proceeding.<br>
|
||||
<a style="width:100%; border-radius:20px;" href="indemnity.php" class="btn btn-danger mt-3">Review and Accept</a>
|
||||
</div>
|
||||
<!-- Bootstrap Modal -->
|
||||
<div class="modal fade" id="indemnityModal" tabindex="-1" aria-labelledby="indemnityModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content border-secondary">
|
||||
<div class="modal-header bg-secondary text-white">
|
||||
<h5 class="modal-title" id="indemnityModalLabel">Membership Application Incomplete</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
To link your existing FWDCSA membership, you need to sign and accept the indemnity aggreement before proceeding.<br>
|
||||
<a style="width:100%; border-radius:20px;" href="indemnity.php" class="btn btn-danger mt-3">Review and Accept</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Show modal when page loads
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
var indemnityModal = new bootstrap.Modal(document.getElementById('indemnityModal'));
|
||||
indemnityModal.show();
|
||||
});
|
||||
</script>
|
||||
<script>
|
||||
// Show modal when page loads
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
var indemnityModal = new bootstrap.Modal(document.getElementById('indemnityModal'));
|
||||
indemnityModal.show();
|
||||
});
|
||||
</script>
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
@@ -588,7 +610,7 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
<script src="assets/js/script.js"></script>
|
||||
<script>
|
||||
// Set your target date and time
|
||||
const targetDate = new Date("<?php echo getNextOpenDayDate();?>T08:00:00"); // yyyy-mm-ddThh:mm:ss
|
||||
const targetDate = new Date("<?php echo getNextOpenDayDate(); ?>T08:00:00"); // yyyy-mm-ddThh:mm:ss
|
||||
|
||||
function updateCountdown() {
|
||||
const now = new Date();
|
||||
@@ -604,7 +626,7 @@ if (countUpcomingTrips() > 0) { ?>
|
||||
const minutes = Math.floor((diff / (1000 * 60)) % 60);
|
||||
const seconds = Math.floor((diff / 1000) % 60);
|
||||
|
||||
document.getElementById("countdown").innerHTML =
|
||||
document.getElementById("countdown").innerHTML =
|
||||
`${String(days).padStart(2, '0')} days ` +
|
||||
`${String(hours).padStart(2, '0')} hours ` +
|
||||
`${String(minutes).padStart(2, '0')} minutes ` +
|
||||
|
||||
Reference in New Issue
Block a user