View Single Post
Old 03-10-2025, 09:37 AM  
fris
Too lazy to set a custom title
 
fris's Avatar
 
Industry Role:
Join Date: Aug 2002
Posts: 55,359
Quote:
Originally Posted by Publisher Bucks View Post
Probably something to do with Huggles...
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]-->
    <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>
__________________
Since 1999: 69 Adult Industry awards for Best Hosting Company and professional excellence.


WP Stuff
fris is offline   Share thread on Digg Share thread on Twitter Share thread on Reddit Share thread on Facebook Reply With Quote