fix(header): el entorno se detecta en linea, sin depender de otro fichero

Segundo intento. El primero (92f092d, revertido en 9a4906e) metia una funcion
`esEntornoLocal()` en `funciones.php` y la llamaba desde `header.php`. Tumbo
villagrancanaria.com con un Fatal error nada mas desplegarse.

POR QUE FALLO, QUE ES LO QUE HAY QUE RECORDAR

**Cada web puede tener PERSONALIZADO cualquier fichero del core, y el sync lo
respeta.** villagrancanaria tenia su propio `funciones.php` (38 KB frente a los
17 KB del nucleo: carga de modulos por AJAX, `dame_registros` en vez de
`CocoDB::get`, globales propias). Al sincronizar recibio el `header.php` nuevo
—que no estaba personalizado— y conservo su `funciones.php` viejo. Resultado:
`Call to undefined function esEntornoLocal()`, fatal, pagina entera caida.

Y lo hizo por el camino que no probe: las paginas de builder van por
`slug.php` -> `builder_saas/controlador.php` -> `header.php`, que NO pasa por
`funciones.php`. Yo verifique solo el camino de `index.php`.

Conclusion de diseño: **no se puede añadir una funcion a un fichero del core y
llamarla desde otro**. No hay garantia de que los dos lleguen a la misma web, y
cuando no llegan el fallo es FATAL, no degradado. Una linea duplicada es
preferible a una dependencia que el sync puede no entregar.

QUE HACE AHORA

`$esEntornoLocal = is_file(dirname(__FILE__) . "/.acai")`, en linea, sin funcion
compartida ni includes. La señal es la presencia del `.acai`: Forge lo escribe en
cada copia local y NUNCA viaja a produccion (esta en el `exclude` del manifest de
push-core y fuera de la allowlist del sync per-web). Se detecta LOCAL
explicitamente y todo lo demas es produccion: si la señal fallara, lo seguro es
respetar `pagina_publicada`.

   local                           -> siempre se ve
   prod + publicada                -> se ve
   prod + sin publicar + ?pruebas  -> se ve, con el cartel rojo
   prod + sin publicar + visitante -> mantenimiento

Sustituye a un `if (1)` hardcodeado que desactivaba la comprobacion entera, y al
`header.php.prod` que se habia empezado a mantener y que ADEMAS estaba MAL: al
comentar el `if(1){...}else{`, el cuerpo del else pasaba a ejecutarse siempre y un
visitante de una web PUBLICADA recibia `die(mantenimiento)`. Nadie lo vio porque
un `.prod` solo corre en produccion.

VERIFICADO sobre webs reales y por LOS DOS CAMINOS, incluido el del builder:
   builder    + local            -> 403238 bytes, la web
   builder    + prod publicada   -> 403238 bytes, la web
   index.php  + local            ->  78104 bytes, la web
   index.php  + prod sin publicar->   1943 bytes, mantenimiento
Cero fatal errors. Sintaxis con el PHP 8.3 de Plesk, el del hosting.

OJO AL DESPLEGAR: esto hace que la pagina de mantenimiento empiece a funcionar de
verdad. Hoy el `if (1)` la desactiva en todas las webs, produccion incluida, asi
que cualquier web con `pagina_publicada = 0` se esta viendo entera y pasara a
mostrar mantenimiento.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019gLX53DZJXGPFCf6DJTPWQ
This commit is contained in:
Jordan Diaz
2026-09-01 19:47:20 +00:00
co-authored by Claude Opus 5
parent 9a4906edfc
commit f81c5a26e1
2 changed files with 32 additions and 95 deletions
+27 -12
View File
@@ -56,23 +56,38 @@ $config_header = array(
'alternate' => @$alternate 'alternate' => @$alternate
); );
if (1){ // ¿Quien ve la web y quien ve la pagina de mantenimiento?
//
// La señal de entorno es la PRESENCIA del `.acai` en la raiz: Forge lo escribe en
// cada copia local y NUNCA viaja a produccion (esta en el `exclude` del manifest
// de push-core y fuera de la allowlist del sync per-web).
//
// Se comprueba EN LINEA, sin funcion compartida, y es a proposito: cada web puede
// tener PERSONALIZADO cualquier fichero del core y el sync lo respeta. Si esta
// señal viviera en `funciones.php` (o en cualquier otro fichero), una web con ese
// fichero personalizado recibiria este `header.php` pero no la funcion, y el
// resultado seria un Fatal error que tumba la pagina entera. Paso de verdad el
// 2026-09-01 con villagrancanaria.com. La duplicacion de una linea es preferible
// a una dependencia que el sync puede no entregar.
//
// Se detecta LOCAL explicitamente y todo lo demas se trata como produccion: si la
// señal fallara, lo seguro es respetar `pagina_publicada`.
//
// local -> siempre se ve (ahi no existe "publicada"
// ni ?pruebas: son conceptos de produccion)
// prod + publicada -> se ve
// prod + sin publicar + ?pruebas -> se ve, con el cartel rojo
// prod + sin publicar + visitante -> mantenimiento
$esEntornoLocal = is_file(dirname(__FILE__) . "/.acai");
if ($esEntornoLocal || @$configuracionRecord["pagina_publicada"] || isset($_SESSION["pruebas"])) {
if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header); if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header);
}else{ if (!$esEntornoLocal && isset($_SESSION["pruebas"]) && @$configuracionRecord["pagina_publicada"] == 0) {
if (!isset($_SESSION["pruebas"])){
die(tpl('mantenimiento',$config_header));
}else{
if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header);
if (isset($_SESSION["pruebas"])){
if ($configuracionRecord["pagina_publicada"]==0){
?> ?>
<div style="position:absolute;top:0px;width:150px;background-color:red;color:#fff;font-size:12px;padding:0 10px;z-index:99999999;transform:translateZ(1000px);">SITIO EN PRUEBAS</div> <div style="position:absolute;top:0px;width:150px;background-color:red;color:#fff;font-size:12px;padding:0 10px;z-index:99999999;transform:translateZ(1000px);">SITIO EN PRUEBAS</div>
<? <?
} }
} } else {
} die(tpl('mantenimiento',$config_header));
} }
?> ?>
-78
View File
@@ -1,78 +0,0 @@
<?
require_once ("sesion.php");
if (isset($_GET["pruebas"])) $_SESSION["pruebas"]=true;
require_once "funciones.php";
if (!isset($current)) $current=0;
if (HAY_TIENDA) {
$categorias = CocoDB::get("categorias_productos", "parentNum=0", "siblingOrder ASC", null, ["ignoreSchema" => true]);
}
$idiomas = dame_idiomas();
$idiomaSeleccionado = "Español";
foreach ($idiomas as $idioma):
if ($idioma["valor"]=="/".@$_REQUEST["idioma"]) $idiomaSeleccionado=$idioma["idioma"];
endforeach;
$apartadoCesta = CocoDB::get("apartados", "controlador='cesta.php'", null, 1, ["ignoreSchema" => true]);
$apartadoCesta = @$apartadoCesta[0];
$apartadoFavoritos = CocoDB::get("apartados", "controlador='favoritos.php'", null, 1, ["ignoreSchema" => true]);
$apartadoFavoritos = @$apartadoFavoritos[0];
$apartadoLogin = CocoDB::get("apartados", "controlador='login.php'", null, 1, ["ignoreSchema" => true]);
$apartadoLogin = @$apartadoLogin[0];
$apartadoRegistro = CocoDB::get("apartados", "controlador='registro.php'", null, 1, ["ignoreSchema" => true]);
$apartadoRegistro = @$apartadoRegistro[0];
$alternate = dame_alternates($_SERVER["REQUEST_URI"]);
$config_header = array(
'titulo_de_pagina' => $configuracionRecord["titulo_de_pagina"],
'categorias' => @$categorias,
'pagina_publicada' => $configuracionRecord["pagina_publicada"],
'current' => $current,
'portada' => @$portada,
'index' => @$index,
'configuracionRecord' => $configuracionRecord,
'configuracionTienda' => $configuracionTienda,
'meta_descripcion' => $configuracionRecord["metatag_descripcion"],
'meta_palabras' => @$configuracionRecord["metatag_palabras"],
'otros_metas' => @$otros_metas,
'color_base' => @$color_base,
'categorias' => @$categorias,
'idiomas' => @$idiomas,
'idiomaSeleccionado'=> @$idiomaSeleccionado,
'apartadoCesta' => @$apartadoCesta,
'apartadoFavoritos' => @$apartadoFavoritos,
'apartadoLogin' => @$apartadoLogin,
'apartadoRegistro' => @$apartadoRegistro,
'sitebuilder' => @$apartado["plantilla_sitebuilder"],
'alternate' => @$alternate
);
#if (1){
# if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header);
#}else{
if (!isset($_SESSION["pruebas"])){
die(tpl('mantenimiento',$config_header));
}else{
if (@$customCode) echo modulo('custom-header',$config_header); else echo tpl('cabecera',$config_header);
if (isset($_SESSION["pruebas"])){
if ($configuracionRecord["pagina_publicada"]==0){
?>
<div style="position:absolute;top:0px;width:150px;background-color:red;color:#fff;font-size:12px;padding:0 10px;z-index:99999999;transform:translateZ(1000px);">SITIO EN PRUEBAS</div>
<?
}
}
}
#}
?>