Antes de crear la funcionalidad de productos y categorías, pensemos en la información que necesitarán nuestros clientes y los administradores del sitio. Es necesario proporcionar suficiente información sobre el producto: debemos mostrar el nombre del producto, su descripción detallada y su precio. También podemos incluir una imagen principal del producto y otras imágenes adicionales. Puede que necesitemos el peso del producto para calcular los costos de envío. También es importante conocer el stock disponible, para no vender productos que ya no tenemos. Para los administradores, se necesitará un ID de producto y una URL legible para los motores de búsqueda.
Como resultado, deberíamos tener al menos los siguientes campos:
Dato |
Descripción |
ID |
Número de producto para uso interno del sitio |
Name |
Nombre del producto |
URL amigable |
Principalmente para motores de búsqueda |
Description |
Información detallada del producto |
SKU |
Código del producto para los usuarios |
Price |
Precio del producto |
Stock |
Cantidad disponible en el sitio |
Imagen principal |
Imagen destacada |
Imágenes adicionales |
Otras imágenes del producto |
En artículos posteriores ampliaremos esta lista, pero por ahora es suficiente.
Las categorías de productos tienen su propio conjunto de campos:
Dato |
Descripción |
ID |
Número interno de categoría |
Name |
Nombre de la categoría |
Description |
Descripción de la categoría |
URL amigable |
URL legible para motores de búsqueda |
Podríamos seguir adelante y construir la estructura de datos y funcionalidad para mostrar productos y categorías usando nuestro framework, pero si lo hiciéramos ahora, perderíamos mucha flexibilidad. La mayoría del contenido comparte información común. Si identificamos esta información y creamos un tipo de contenido abstracto, nuestro framework será más flexible. Así podremos reutilizar funcionalidades comunes sin duplicar código. Algunas de estas funcionalidades podrían ser:
- Versionado de contenido
- Control de acceso
- Comentarios para contenidos, páginas y productos
- Valoraciones de páginas y productos
Páginas
Las páginas serán secciones estáticas del sitio: Contacto, información sobre envíos y pagos, etc. Estos son los datos asociados:
Dato |
Descripción |
Nombre |
Nombre de la página |
URL amigable |
Ruta de la página |
ID |
ID interno de la página |
Heading |
Contenido de la etiqueta h1 |
Title |
Contenido de la etiqueta <title> |
Content |
Contenido de la página |
Keywords |
Contenido de la metaetiqueta de palabras clave |
Description |
Contenido de la metaetiqueta de descripción |
Contenido
Las páginas serán el tipo de contenido principal que extenderemos cuando sea necesario agregar más campos. Las páginas de categoría son esencialmente iguales pero con campos adicionales para asociarlas con productos.
Dato |
Descripción |
ID |
ID interno |
Nombre |
Nombre del contenido |
URL amigable |
|
Contenido |
Contenido de la página |
Tipo |
Tipo de contenido (por ejemplo, página, producto, categoría) |
Orden |
Orden de aparición, por ejemplo en menús |
Padre |
Elemento padre, útil para jerarquías como subcategorías |
Meta keywords |
Palabras clave |
Meta description |
Meta descripción |
Fecha de creación |
Fecha de creación del contenido |
Autor |
Autor del contenido |
Activo |
Si el contenido está visible para los visitantes |
Protegido |
Restricción de acceso, por ejemplo solo para usuarios registrados |
Revisiones
Al igual que en Drupal, tendremos nuestro propio sistema de revisiones.
Dato |
Descripción |
ID |
ID interno del contenido |
Revisión actual |
Número de la versión actual |
Ahora que hemos definido nuestros tipos de contenido, podemos proceder a crear la base de datos. Para cada tipo se creará una tabla independiente. Estas serán las tablas principales:
Tabla |
Descripción |
Contenido |
Relaciona versiones activas con información inmutable como autor |
Versiones |
Datos de cada versión de contenido |
Tipos de contenido |
Tipos de contenido definidos en el framework |
Productos |
Extensión de datos específicos para productos |
Historial de revisiones |
Registro de revisiones |
Contenido
Todo el contenido del sitio se almacenará en esta tabla. Si deseamos extender un tipo específico (como productos), lo haremos en una tabla separada relacionada por ID.
Campo |
Tipo |
Descripción |
ID |
Integer (auto increment) |
Clave para relaciones |
Revisión actual |
Integer |
Vinculación a la tabla de versiones |
Activo |
Boolean |
Indica si el contenido está publicado |
Protegido |
Boolean |
Si solo está accesible para usuarios registrados |
Padre |
Integer |
Elemento padre del contenido |
Orden |
Integer |
Orden de visualización |
Autor |
Integer |
ID del creador del contenido |
Tipo |
Integer |
ID del tipo de contenido |
Ruta |
Varchar |
Campo para la URL amigable |
Ahora podemos ejecutar la consulta para crear la tabla de contenido:
CREATE TABLE `content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`current_revision` int(11) NOT NULL,
`active` tinyint(1) NOT NULL,
`secure` tinyint(1) NOT NULL,
`parent` int(11) NOT NULL,
`order` int(11) NOT NULL,
`author` int(11) NOT NULL,
`type` int(11) NOT NULL,
`path` char(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;