feat: mejorar DB Manager para soportar ambas tablas (components y defaults)

- Agregar constante TABLE_DEFAULTS para tabla de valores por defecto
- Modificar get_table_name() para aceptar parámetro table_type
- Actualizar create_tables() para crear ambas tablas con estructura idéntica
- Modificar todos los métodos (get_config, save_config, delete_config, list_components) para aceptar table_type
- Actualizar Settings Manager get_defaults() para leer desde tabla defaults usando DB Manager
- Mantener compatibilidad hacia atrás con valor por defecto 'components'

Arquitectura final:
- wp_apus_theme_components_defaults = Valores por defecto del tema (escritura algoritmo)
- wp_apus_theme_components = Personalizaciones del usuario (escritura admin panel)
- Una sola clase (APUS_DB_Manager) maneja ambas tablas con misma estructura
This commit is contained in:
FrankZamora
2025-11-13 22:57:04 -06:00
parent e94b274ed0
commit 03c97d31d3
2 changed files with 72 additions and 26 deletions

View File

@@ -19,6 +19,11 @@ class APUS_DB_Manager {
*/ */
const TABLE_COMPONENTS = 'apus_theme_components'; const TABLE_COMPONENTS = 'apus_theme_components';
/**
* Nombre de la tabla de defaults (sin prefijo)
*/
const TABLE_DEFAULTS = 'apus_theme_components_defaults';
/** /**
* Versión de la base de datos * Versión de la base de datos
*/ */
@@ -39,9 +44,17 @@ class APUS_DB_Manager {
/** /**
* Obtener nombre completo de tabla con prefijo * Obtener nombre completo de tabla con prefijo
*
* @param string $table_type Tipo de tabla: 'components' (personalizaciones) o 'defaults' (valores por defecto)
* @return string Nombre completo de la tabla con prefijo
*/ */
public function get_table_name() { public function get_table_name($table_type = 'components') {
global $wpdb; global $wpdb;
if ($table_type === 'defaults') {
return $wpdb->prefix . self::TABLE_DEFAULTS;
}
return $wpdb->prefix . self::TABLE_COMPONENTS; return $wpdb->prefix . self::TABLE_COMPONENTS;
} }
@@ -59,14 +72,18 @@ class APUS_DB_Manager {
/** /**
* Crear tablas personalizadas * Crear tablas personalizadas
* Crea tanto la tabla de componentes (personalizaciones) como la de defaults
*/ */
public function create_tables() { public function create_tables() {
global $wpdb; global $wpdb;
$charset_collate = $wpdb->get_charset_collate(); $charset_collate = $wpdb->get_charset_collate();
$table_name = $this->get_table_name(); require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$sql = "CREATE TABLE $table_name ( $success = true;
// Estructura común para ambas tablas
$table_structure = "(
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
component_name VARCHAR(50) NOT NULL, component_name VARCHAR(50) NOT NULL,
config_key VARCHAR(100) NOT NULL, config_key VARCHAR(100) NOT NULL,
@@ -81,25 +98,42 @@ class APUS_DB_Manager {
INDEX idx_updated (updated_at) INDEX idx_updated (updated_at)
) $charset_collate;"; ) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); // Crear tabla de componentes (personalizaciones del usuario)
dbDelta($sql); $table_components = $this->get_table_name('components');
$sql_components = "CREATE TABLE $table_components $table_structure";
dbDelta($sql_components);
// Verificar si la tabla se creó correctamente if ($wpdb->get_var("SHOW TABLES LIKE '$table_components'") === $table_components) {
if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") === $table_name) { error_log("APUS DB Manager: Tabla $table_components creada/actualizada exitosamente");
error_log("APUS DB Manager: Tabla $table_name creada/actualizada exitosamente");
return true;
} else { } else {
error_log("APUS DB Manager: Error al crear tabla $table_name"); error_log("APUS DB Manager: Error al crear tabla $table_components");
return false; $success = false;
} }
// Crear tabla de defaults (valores por defecto del tema)
$table_defaults = $this->get_table_name('defaults');
$sql_defaults = "CREATE TABLE $table_defaults $table_structure";
dbDelta($sql_defaults);
if ($wpdb->get_var("SHOW TABLES LIKE '$table_defaults'") === $table_defaults) {
error_log("APUS DB Manager: Tabla $table_defaults creada/actualizada exitosamente");
} else {
error_log("APUS DB Manager: Error al crear tabla $table_defaults");
$success = false;
}
return $success;
} }
/** /**
* Verificar si una tabla existe * Verificar si una tabla existe
*
* @param string $table_type Tipo de tabla: 'components' o 'defaults'
* @return bool True si la tabla existe
*/ */
public function table_exists() { public function table_exists($table_type = 'components') {
global $wpdb; global $wpdb;
$table_name = $this->get_table_name(); $table_name = $this->get_table_name($table_type);
return $wpdb->get_var("SHOW TABLES LIKE '$table_name'") === $table_name; return $wpdb->get_var("SHOW TABLES LIKE '$table_name'") === $table_name;
} }
@@ -111,11 +145,12 @@ class APUS_DB_Manager {
* @param mixed $config_value Valor de configuración * @param mixed $config_value Valor de configuración
* @param string $data_type Tipo de dato (string, boolean, integer, json) * @param string $data_type Tipo de dato (string, boolean, integer, json)
* @param string $version Versión del tema * @param string $version Versión del tema
* @param string $table_type Tipo de tabla: 'components' (personalizaciones) o 'defaults' (valores por defecto)
* @return bool|int ID del registro o false en caso de error * @return bool|int ID del registro o false en caso de error
*/ */
public function save_config($component_name, $config_key, $config_value, $data_type = 'string', $version = null) { public function save_config($component_name, $config_key, $config_value, $data_type = 'string', $version = null, $table_type = 'components') {
global $wpdb; global $wpdb;
$table_name = $this->get_table_name(); $table_name = $this->get_table_name($table_type);
// Convertir valor según tipo // Convertir valor según tipo
if ($data_type === 'json' && is_array($config_value)) { if ($data_type === 'json' && is_array($config_value)) {
@@ -149,11 +184,12 @@ class APUS_DB_Manager {
* *
* @param string $component_name Nombre del componente * @param string $component_name Nombre del componente
* @param string $config_key Clave específica (opcional) * @param string $config_key Clave específica (opcional)
* @param string $table_type Tipo de tabla: 'components' (personalizaciones) o 'defaults' (valores por defecto)
* @return array|mixed Configuración completa o valor específico * @return array|mixed Configuración completa o valor específico
*/ */
public function get_config($component_name, $config_key = null) { public function get_config($component_name, $config_key = null, $table_type = 'components') {
global $wpdb; global $wpdb;
$table_name = $this->get_table_name(); $table_name = $this->get_table_name($table_type);
if ($config_key !== null) { if ($config_key !== null) {
// Obtener un valor específico // Obtener un valor específico
@@ -210,11 +246,12 @@ class APUS_DB_Manager {
* *
* @param string $component_name Nombre del componente * @param string $component_name Nombre del componente
* @param string $config_key Clave específica (opcional) * @param string $config_key Clave específica (opcional)
* @param string $table_type Tipo de tabla: 'components' (personalizaciones) o 'defaults' (valores por defecto)
* @return bool Éxito de la operación * @return bool Éxito de la operación
*/ */
public function delete_config($component_name, $config_key = null) { public function delete_config($component_name, $config_key = null, $table_type = 'components') {
global $wpdb; global $wpdb;
$table_name = $this->get_table_name(); $table_name = $this->get_table_name($table_type);
if ($config_key !== null) { if ($config_key !== null) {
return $wpdb->delete( return $wpdb->delete(
@@ -238,11 +275,12 @@ class APUS_DB_Manager {
/** /**
* Listar todos los componentes con configuraciones * Listar todos los componentes con configuraciones
* *
* @param string $table_type Tipo de tabla: 'components' (personalizaciones) o 'defaults' (valores por defecto)
* @return array Lista de nombres de componentes * @return array Lista de nombres de componentes
*/ */
public function list_components() { public function list_components($table_type = 'components') {
global $wpdb; global $wpdb;
$table_name = $this->get_table_name(); $table_name = $this->get_table_name($table_type);
return $wpdb->get_col( return $wpdb->get_col(
"SELECT DISTINCT component_name FROM $table_name ORDER BY component_name" "SELECT DISTINCT component_name FROM $table_name ORDER BY component_name"

View File

@@ -68,15 +68,23 @@ class APUS_Settings_Manager {
/** /**
* Valores por defecto * Valores por defecto
* NOTA: Los defaults se cargarán desde la tabla wp_apus_theme_components_defaults * Lee los defaults desde la tabla wp_apus_theme_components_defaults
*/ */
public function get_defaults() { public function get_defaults() {
return array( $db_manager = new APUS_DB_Manager();
$component_names = $db_manager->list_components('defaults');
$defaults = array(
'version' => APUS_ADMIN_PANEL_VERSION, 'version' => APUS_ADMIN_PANEL_VERSION,
'components' => array( 'components' => array()
// Los componentes se agregarán aquí cuando se ejecute el algoritmo
)
); );
// Obtener configuraciones de cada componente desde la tabla de defaults
foreach ($component_names as $component_name) {
$defaults['components'][$component_name] = $db_manager->get_config($component_name, null, 'defaults');
}
return $defaults;
} }
/** /**