Tengo problemas al poner en producción un proyecto hecho con toba 3.2.18 Php 7.2.5.
Lo que sucede es que no me muestra las opciones de menu con un tipo de página propio que revisa el valor de variables de sesión para mostrar u ocultar las opciones de menú.
Me llamaba la atención que en la instancia desarrollo funcionaba correctamente, hice mil cambios, hasta que forcé la ejecución de metadatos compilados en desarrollo y dejó de funcionar…
Entonces y para salir del paso estoy forzando la ejecucion desde metadatos en producción para que funcione sin problemas.
Tal parece que el problema está en los metadatos_compilados.
Te hago unas consultas para entender mejor la situacion:
luego de la actualizacion en produccion recompilaste el proyecto?
el usuario que estas utilizando tiene algun perfil funcional que pueda estar restringiendo el acceso a la operacion?
el comportamiento seria “si la env-var tiene este valor, se retira el item de menu… sino se deja como esta”?
en que punto se estaria haciendo dicho control y modificacion del menu?
Tal parece que el problema está en los metadatos_compilados.
Si se recompilo el proyecto, los metadatos compilados deberian tener el mismo contenido que la bd, la “compilacion” lo unico que hace es bajar a arreglos precalculados la informacion en bd.
Esto lo podes probar facilmente en desarrollo, fijate si luego de compilar el proyecto te falta alguna entrada de menu para el perfil funcional que tenes asignado, el archivo a buscar seria:
Si estan faltando de plano las operaciones ahi, hay que verificar la definicion del perfil en cuestion y si ahi hay acceso, entonces podria ser un bug en la compilacion.
Si estan pero aun asi no se ven, hay que revisar el cuando y como se quitan las opciones por si hay algo que quede en algun lado que no deberia, o si simplemente la lectura de la env-var termina haciendo que siempre se quiten.
un detalle, cuando quitas la opcion del menu lo haces invocando
toba::menu()->quitar_opcion('3000019'); // Cancelación de turnos
Pero en el constructor asignas la salida de toba::menu() a una variable local, con lo cual podes estar accediendo a 2 objetos distintos. Yo probaria con algo asi:
$this->menu->quitar_opcion('3000019'); // Cancelación de turnos
De todas formas, esto solo quita un item… el resto deberian estar presentes.
Lo otro extraño es que esa variable solo se inicialice si hay email… que muestra de lo contrario?
También modifiqué la forma de quitar las opciones de menú:
//toba::menu()->quitar_opcion('3000019'); // Cancelación de turnos
$this->menu->quitar_opcion('3000016'); // Solicitud de turnos ( esto no se quitaba en la version anterior)
$this->menu->quitar_opcion('3000019'); // Cancelación de turnos
A pesar de eso, sigue funcionando forma correcta sin metadatos_compilados, cuando lo compilo, nunca aparacen las opciones de menú, como ocurría en un principio.
No hay opcion, hay que ver que items estan presentes ahi dentro y a partir de alli determinar si faltan directamente desde la compilacion o si la eliminacion se produce luego y el motivo.
Fijate cual o cuales(por si hay mas de uno) son los perfiles funcionales que tiene el usuario que estass usando, todos tienen al menos uno asignado sino no tenes acceso directamente.
Busquemos por ahi.
Las operaciones son públicas por eso las tengo que sacar del menú.
Sin embargo veo que hay generados distintos perfiles, los adjunto para que las veas, por lo que vi tienen lo mismo los items públicos y los de usuario, los de administación funcionan bien …
lo que veo es que el perfil funcional usuario solo tiene en menu las 2 operaciones que justamente se eliminan desde el tipo de pagina… con lo cual, obviamente quedan sin nada.
Siendo que la lista de items accesibles en dicho perfil funcional es mayor a la lista de operaciones en el menu, lo que me pregunto es si dicho perfil no tiene asignado un menu especifico para el mismo.
Esto ultimo tendrias que poder verificarlo desde toba_usuarios via la operacion “Menues → Asociar Menu a Perfil Funcional” una vez eligiste el proyecto, fijate si aparece alguna entrada… si es asi, probablemente este asignada al perfil funcional en cuestion y quizas sea la causa del problema.
Si no hay asociacion alguna entre un menu especifico y el perfil funcional, por favor subime la respuesta a esta SQL (que en definitiva es lo que se usa sin metadatos compilados)
(
SELECT amo.padre,
amo.carpeta,
amo.proyecto,
amo.item,
amo.descripcion as nombre,
ai.orden as orden,
ai.imagen,
ai.imagen_recurso_origen,
amo.padre = 1 as es_primer_nivel
FROM
apex_usuario_grupo_acc auga
JOIN apex_menu_operaciones amo ON (auga.menu_usuario = amo.menu_id AND auga.proyecto = amo.proyecto)
JOIN apex_usuario_grupo_acc_item augai ON (auga.proyecto = augai.proyecto AND auga.usuario_grupo_acc = augai.usuario_grupo_acc AND augai.item = amo.item)
JOIN apex_item ai ON (augai.item = ai.item AND augai.proyecto = ai.proyecto)
WHERE (ai.menu = 1)
AND ai.item != ai.padre
AND (auga.usuario_grupo_acc IN ('usuario') OR ai.publico = 1)
AND (amo.proyecto = 'turnos')
AND auga.menu_usuario IS NOT NULL
UNION
SELECT ai.padre,
ai.carpeta,
ai.proyecto,
ai.item,
ai.nombre as nombre,
ai.orden as orden,
ai.imagen,
ai.imagen_recurso_origen,
ai.padre = $raiz as es_primer_nivel
FROM
apex_usuario_grupo_acc auga
JOIN apex_usuario_grupo_acc_item augai ON (auga.proyecto = augai.proyecto AND auga.usuario_grupo_acc = augai.usuario_grupo_acc)
JOIN apex_item ai ON (augai.item = ai.item AND augai.proyecto = ai.proyecto)
WHERE auga.menu_usuario is null
AND (ai.menu = 1)
AND ai.item != ai.padre
AND (auga.usuario_grupo_acc IN ('usuario') OR ai.publico = 1)
AND (ai.proyecto = 'turnos')
) ORDER BY 1, 6
Esto es suponiendo que entras unicamente con el perfil funcional usuario