Categorías infinitas dinámica con PHP y MySQL
¿Cómo crear categoría y subcategoría infinita con PHP?
Categorías infinitas dinámica de varios niveles con PHP y MySQL. En este articulo mostraremos un script para generar categorías infinitas con una sola tabla MySQL y PHP.
¿Cómo construir una categoría anidada dinámica infinita?
Se puede crear de varios niveles con PHP y servidor MySQL. Aquí mostraré un ejemplo de nivel infinito de categorías y subcategorías usando una base de datos MySQL.
Así que voy a dar un ejemplo sobre la categoría anidada multinivel infinito con PHP y MySQL.
Requisitos previos para crear categoría infinita
- MySQL 8.0.17 – 8.0.26
- PHP 7.4.3 – 7.4.27
- Apache 2.4
Categorías infinitas dinámica: Configuración
En primera instancia se supone que ha configurado Apache y PHP en el sistema Windows.
Ahora crearemos un directorio raíz del proyecto llamado CATEGORIA_INFINITA
en la carpeta htdocs del servidor Apache.
Pasos para crear categorías infinitas dinámica
A continuación, detallaremos los pasos para lograr nuestro objetivo.
Primer paso: Creación de tabla MySQL
Primero debe crear una tabla llamada «categorías
» en la base de datos de nombre «multiple_categorias
» en el servidor MySQL porque queremos crear la categoría anidada de varios niveles a partir de la tabla de base de datos.
Para crear la base de datos e importar la tabla podemos usar la herramienta PHPMyAdmin, a continuación, la tabla categorías infinitas.
CREATE TABLE `categorias` ( `category_id` int unsigned NOT NULL AUTO_INCREMENT, `category_name` varchar(50) NOT NULL, `category_link` varchar(255) NOT NULL, `parent_id` int unsigned NOT NULL DEFAULT '0', `sort_order` int NOT NULL DEFAULT '0', PRIMARY KEY (`category_id`), UNIQUE KEY `unique` (`category_name`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Análisis de la tabla creada
Hemos creado la estructura de la tabla de categorías. Esta tabla de categorías tiene un identificador de categoría principal que identifica la categoría principal de este elemento secundario.
Si en la columna parent_id hay 0, asumiremos que esta categoría es la categoría de nivel superior.
La tabla tiene las siguientes cinco columnas:
category_id: Valor int positivo incrementado automáticamente, la clave principal también
category_name: Nombre o nivel de la categoría visible, la clave única
category_link: URL para esta categoría
parent_id: Identifica quién es el padre de esta categoría. Para la categoría raíz, el parent_id es 0.
sort_order: El orden de las categorías
Segundo paso: Importar datos a la tabla categorías
En el punto anterior hemos creado la tabla categorías. Por lo tanto, ahora para probar la aplicación una vez que esté terminada, necesita algunos datos en ella. importaremos los siguientes registros a la tabla.
insert into `categorias`(`category_id`,`category_name`,`category_link`,`parent_id`,`sort_order`) values (1,'Home','',0,0), (2,'Tutorials','#',0,1), (3,'Java','java',2,1), (4,'Liferay','liferay',2,1), (5,'Frameworks','#',0,2), (6,'JSF','jsf',5,2), (7,'Struts','struts',5,2), (8,'Spring','spring',5,2), (9,'Hibernate','hibernate',5,2), (10,'Webservices','#',0,3), (11,'REST','rest',10,3), (12,'SOAP','soap',10,3), (13,'Contact','contact',0,4), (14,'About','about',0,5);
Tercer paso: Obtener datos de la tabla
En este punto usaremos una consulta SQL para poder mostrar el contenido de la tabla MySQL. Sin embargo, en la consulta SQL tenemos que declarar las columnas que deseamos visualizar, por ejemplo: category_id, category_name, category_link, parent_id y sort_order para construir la categoría anidada infinita de varios niveles usando PHP y MySQL.
SELECT `category_id`, `category_name`, `category_link`, `parent_id`, `sort_order` FROM categorias ORDER BY parent_id, sort_order, category_name;
Aquí está el resultado final después de ejecutar la consulta anterior:
Cuarto paso: Creación de jerarquía padre-hijo
Primero realizaremos la conexión de PHP con MySQL para que podamos realizar las consultas sin inconvenientes.
La siguiente lógica recupera los resultados de la tabla de categorías y coloca los resultados en una matriz multidimensional.
La matriz $category
contiene otras dos matrices, las categorías contienen todos los resultados de la consulta de la tabla de categorías y la matriz parent_cats contiene una lista de todos los identificadores de categoría que tienen hijos.
Quinto paso: Ciclo while
A continuación, usamos una instrucción while para ejecutar los resultados de sql y asignar una fila a las matrices.
Si el identificador primario de la fila ya existe en la matriz parent_cats, se sobrescribirá, por lo que solo aparecerá uno de cada identificador primario en la lista.
$dbConn = mysqli_connect('localhost', 'root', 'root', 'mis_datos') or die('MySQL connect failed. ' . mysqli_connect_error()); //select all rows from the category table $result = mysqli_query($dbConn, "SELECT category_id, category_name, category_link, parent_id, sort_order FROM categorias ORDER BY parent_id, sort_order, category_name"); //create a multidimensional array to hold a list of category and parent category $category = array( 'categories' => array(), 'parent_cats' => array() ); //build the array lists with data from the category table while ($row = mysqli_fetch_assoc($result)) { //creates entry into categories array with current category id ie. $categories['categories'][1] $category['categories'][$row['category_id']] = $row; //creates entry into parent_cats array. parent_cats array contains a list of all categories with children $category['parent_cats'][$row['parent_id']][] = $row['category_id']; }
Sexto paso: Función buildCategory
Ahora debemos de crear la función de categoría y subcategoría que mostrará los resultados finales para la categoría anidada multinivel infinito.
En la siguiente función asumimos que el identificador de categoría principal tiene un valor 0 y es la categoría de nivel superior y todas las demás categorías caen dentro de esa categoría principal.
Aquí usamos la función recursiva para construir la categoría anidada multinivel infinita. La lógica es simplemente verificar si hay alguna categoría secundaria y luego llamar a la función recursivamente, de lo contrario, escriba la categoría en el padre o escriba como una categoría principal.
function buildCategory($parent, $category) { $html = ""; if (isset($category['parent_cats'][$parent])) { $html .= "<ul>\n"; foreach ($category['parent_cats'][$parent] as $cat_id) { if (!isset($category['parent_cats'][$cat_id])) { $html .= "<li>\n <a href='" . $category['categories'][$cat_id]['category_link'] . "'>" . $category['categories'][$cat_id]['category_name'] . "</a>\n</li> \n"; } if (isset($category['parent_cats'][$cat_id])) { $html .= "<li>\n <a href='" . $category['categories'][$cat_id]['category_link'] . "'>" . $category['categories'][$cat_id]['category_name'] . "</a> \n"; $html .= buildCategory($cat_id, $category); $html .= "</li> \n"; } } $html .= "</ul> \n"; } return $html; }
Séptimo paso: Usar la función
Una vez que haya terminado de crear la función anterior, debemos de saber cómo usarla. Por lo tanto, si desea usar la función debe usar el código que a continuación y debe llamar donde quiera mostrar (principalmente en el área del menú) la categoría infinita de varios niveles.
Detalle de uso
Muestre el resultado con el siguiente ejemplo:
echo buildCategory(0, $category);
Resultado final
Salida final en el navegador presionando la URL http://localhost/CATEGORIA_INFINITA/vategoria_infinita.php en el navegador:
Conclusión
En este articulo hemos aprendido a implementar una secuencia de categorías infinitas, es decir categoría padre, categoría hijo y así sucesivamente usando una tabla MySQL con el lenguaje PHP.
Si desean pueden incorporar un CRUD para gestionar las categorías usando métodos GET o método POST
Hemos usado una función para disponer de las categorías. Además, hemos usado el ciclo FOREACH y ciclo WHILE
Espero que con esta explicación tengas una idea y puedas construir una categoría y subcategoría anidada multinivel infinita.