View Single Post
Old 03-10-2025, 10:48 AM  
Publisher Bucks
Confirmed User
 
Industry Role:
Join Date: Oct 2018
Location: New Orleans, Louisiana. / Newcastle, England.
Posts: 1,123
Quote:
Originally Posted by fris View Post
cleaned it up a bit

Code:
<?php
// Database connection settings
$host = "localhost"; 
$username = "Username"; 
$password = "Password"; 
$dbname = "DB"; 

// Create connection
$conn = new mysqli($host, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Fetch categories from the BISAC table, ordered alphabetically
$sql = "SELECT ID, Code, Category, Comments FROM BISAC ORDER BY Category";
$result = $conn->query($sql);

if (!$result) {
    die("Query failed: " . $conn->error);
}

$categories = $result->fetch_all(MYSQLI_ASSOC);

// Close connection
$conn->close();

// Define the six main sections
$mainSections = [
    "Fiction",
    "NonFiction",
    "Juvenile Fiction",
    "Juvenile NonFiction",
    "Young Adult Fiction",
    "Young Adult NonFiction"
];

// Function to determine the section (Fiction, NonFiction, etc.)
function getMainSection(string $category): string {
    global $mainSections;

    foreach ($mainSections as $section) {
        if (stripos($category, $section . " >") === 0) {
            return $section;
        }
    }
    return "NonFiction"; // Default to NonFiction if not categorized
}

// Function to build category tree
function buildCategoryTree(array $categories): array {
    global $mainSections;

    $trees = array_fill_keys($mainSections, []);

    foreach ($categories as $item) {
        $mainSection = getMainSection($item['Category']);
        $categoryPath = explode(' > ', $item['Category']);
        $firstCategory = array_shift($categoryPath);

        // Ensure only top-level categories are stored correctly
        if (!isset($trees[$mainSection][$firstCategory])) {
            $trees[$mainSection][$firstCategory] = [
                'subcategories' => [],
                'id' => md5($mainSection . ' > ' . $firstCategory)
            ];
        }

        // Process only immediate subcategories and prevent recursion
        if (!empty($categoryPath)) {
            $subCategory = array_shift($categoryPath);
            if ($subCategory !== $mainSection && $subCategory !== $firstCategory) {
                if (!isset($trees[$mainSection][$firstCategory]['subcategories'][$subCategory])) {
                    $trees[$mainSection][$firstCategory]['subcategories'][$subCategory] = [
                        'subcategories' => [],
                        'id' => md5($mainSection . ' > ' . $firstCategory . ' > ' . $subCategory)
                    ];
                }
            }
        }
    }

    return $trees;
}

// Generate categorized trees
$categoryTree = buildCategoryTree($categories);

// Function to render categories
function renderCategories(array $tree): void {
    if (!empty($tree)) {
        echo '<ul>';
        foreach ($tree as $category => $data) {
            $hasSubcategories = !empty($data['subcategories']);
            $uniqueId = $data['id'];

            echo '<li>';
            if ($hasSubcategories) {
                echo '<input type="checkbox" id="toggle-' . $uniqueId . '" class="toggle">';
                echo '<label for="toggle-' . $uniqueId . '" class="category-label">' . htmlspecialchars($category) . ' <span class="expand-icon"></span></label>';
                echo '<ul class="subcategories">';
                foreach ($data['subcategories'] as $sub => $subData) {
                    echo '<li>' . htmlspecialchars($sub) . '</li>';
                }
                echo '</ul>';
            } else {
                echo htmlspecialchars($category);
            }
            echo '</li>';
        }
        echo '</ul>';
    }
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<base href="https://gfy.com/" /><!--[if IE]></base><![endif]-->
<base href="https://gfy.com/" /><!--[if IE]></base><![endif]-->
<base href="https://gfy.com/" /><!--[if IE]></base><![endif]-->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Categorized BISAC Dropdown</title>
    <style>
        .dropdown-container {
            width: 400px;
            border: 1px solid #ccc;
            padding: 10px;
            max-height: 500px;
            overflow-y: auto;
        }
        ul {
            list-style: none;
            padding-left: 0;
        }
        li {
            margin: 5px 0;
            position: relative;
        }
        .category-label {
            font-weight: bold;
            cursor: pointer;
            display: flex;
            justify-content: space-between;
            width: 100%;
        }
        .expand-icon {
            font-weight: bold;
            cursor: pointer;
            margin-left: 10px;
        }
        .toggle {
            display: none;
        }
        .toggle + .category-label + .subcategories {
            display: none;
        }
        .toggle:checked + .category-label + .subcategories {
            display: block;
        }
        .toggle + .category-label .expand-icon::before {
            content: " (+)";
        }
        .toggle:checked + .category-label .expand-icon::before {
            content: " (-)";
        }
    </style>
</head>
<body>
    <div class="dropdown-container">
        <ul>
            <?php foreach ($mainSections as $mainSection): ?>
                <li>
                    <input type="checkbox" id="toggle-<?php echo md5($mainSection); ?>" class="toggle">
                    <label for="toggle-<?php echo md5($mainSection); ?>" class="category-label"><?php echo htmlspecialchars($mainSection); ?> <span class="expand-icon"></span></label>
                    <?php if (!empty($categoryTree[$mainSection])): ?>
                        <ul class="subcategories">
                            <?php renderCategories($categoryTree[$mainSection]); ?>
                        </ul>
                    <?php endif; ?>
                </li>
            <?php endforeach; ?>
        </ul>
    </div>
</body>
</html>
Haha thanks but wasnt needed, that code above was the result of my throwing it through GPT to try and find the issue, I had my original code. It is quite shocking how much GPT messes with code sometimes

Appreciate the assistance though
__________________
SOMETHING EXTREME IS COMING SOON!
Publisher Bucks is offline   Share thread on Digg Share thread on Twitter Share thread on Reddit Share thread on Facebook Reply With Quote