Diferencias de ejecucion con metadatos_compilados

Buen dia comunidad!!

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.

Saludos

Hola Oscar,

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:

metadatos_compilados/gene/toba_mc_gene__<ID PERFIL FUNCIONAL>.php

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.

Saludos

Hola Richard
Te contesto entre citas:

- luego de la actualizacion en produccion recompilaste el proyecto?
[b] SI[/b]
- el usuario que estas utilizando tiene algun perfil funcional que pueda estar restringiendo el acceso a la operacion?
[b] NO [/b]
- el comportamiento seria "si la env-var tiene este valor, se retira el item de menu.. sino se deja como esta"?
[b]SE RETIRA[/b]
- en que punto se estaria haciendo dicho control y modificacion del menu?
[b]EN EL TIPO PAGINA[/b]

La prueba que realizé en desarrollo fue compilar y forzar el uso de metadatos_compilados con el resultado que expongo en el primer asunto…

Hola Oscar

podrias incluirme una copia del tipo de pagina aqui?, quisiera ver la modificacion puntual para hacerme una idea mas acabada.

PD: Pudiste verificar si la lista de items llega completa al menu?

Saludos

Te pego la parte donde invoco o no el menu, adjunto el codigo completo en zip.
No pude verificar como llega el menú …

	
function __construct()
	{
		list($this->id_insti, $this->email, $this->tipo_doc, $this->nro_doc, $this->contrasenia) = explode('|', toba::memoria()->get_dato('tmp_usu'));
		$usr = toba::usuario()->get_id();

      if ( isset($this->email) && !empty($this->email) )
			$this->menu = toba::menu();

	}

generica.zip (2.09 KB)

Hola Oscar,

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?

Saludos

Corregí los problemas que mencionaste:
Ahora la variable de instancia de menú se genera siempre: (comente el if)

//if ( isset($this->email) && !empty($this->email) ) $this->menu = toba::menu();

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.

Hola Oscar,

Definitivamente entonces lo que hay que verificar es que items estan presentes en el archivo


metadatos_compilados/gene/toba_mc_gene__<ID PERFIL FUNCIONAL>.php

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.

Saludos

Saludos

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 …


gene.zip (1.72 KB)

Hola Oscar,

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

Saludos