Ayuda: Categorias solo visualizadas por grupos de usuarios

Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
Número de respuestas: 17
Hola,

soy nuevo en el foro, he estado leyendo pero no consigo sacar nada claro, no se si podeis ayudarme, os lo agradeceria muchismo.

El caso es este:

Tengo una plataforma de moodle (1.9.8+) con usuarios pertenecientes a 3 empresas (A, B y C).

Y los cursos que hay creados estan metidos en tres categorias principales (Cursos de A, Cursos de B y Cursos de C).

¿Es posible agrupar los usuarios de forma que los usuarios de A solo puedan ver la categoria Cursos de A, los de B que solo vean la categoria Cursos de B y los de C la categoria Cursos de C?

Desconozco si existe alguna modificacion o modulo que lo permita, por lo menos no lo he encontrado.

He encontrado esto, pero creo que no es exactamente lo que quiero: http://moodle.org/mod/forum/discuss.php?d=139965

He pensado que igual creando un nuevo campo en los perfiles de usuario y alguna modificacion a nivel de codigo se podria hacer, o sino creando nuevos roles que no permitan ver algunas categorias (pero esto no se si es posible)... Pero lo ideal seria tener los usuarios divididos en grupos y que las categorias permitan alguna configuracion con permisos sobre grupos o usuarios...

Gracias de antemano!
Jon
Promedio de valoraciones: -
En respuesta a Jon Padró

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
El caso es bastante similar al del enlace que mencionas, lo que no me queda claro es si quieres que la portada muestra la categoría o solo los cursos. En el caso de que solo sean los cursos de dicha categoría, bastaría con activar MyMoodle, y con esto conseguirías que mostrara, para cada alumno, únicamente los cursos en que está matriculado. Como en este caso, cada alumno pertenece a una empresa, y cada empresa tiene una categoría, solo mostraría los cursos de la categoría relacionada con la empresa a la que pertenece el usuario.

Por otro lado, si aplicas el parche disponible en ese hilo, conseguirás más o menos el mismo efecto, ya que solo muestra las categorías de los cursos en que está matriculado el usuario. Si el usuario solo tiene cursos de la categoría A, solo mostrará dicha categoría.
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
Gracias por tu respuesta Xavier!

Ahora mismo la portada me muestra las categorias y cursos de esta forma:

  • Empresa A:
    • subcategoria1
      • curso1
      • curso2
    • subcategoria2
      • curso4

  • EmpresaB
    • Subcategoria3
      • curso5
      • curso6
      • ...
Entonces, yo que pertenezco a la empresa A quiero que cuando me valide, solo me muestre la portada:
  • Empresa A:
    • subcategoria1
      • curso1
      • curso2
    • subcategoria2
      • curso4
Pudiendo ver todos los cursos de esa categoria, y poder inscribirme como alumno, pero NO ver las demas categorias y por lo tanto no poder ni validarme.

No se si me explico...

Muchas gracias!



En respuesta a Jon Padró

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
Vale, osea que partimos de la base de que los alumnos no están matriculados y lo que hay que mostrar es todos los cursos a los que potencialmente se pueden matricular por pertenecer a una determinada empresa.

En ese caso a lo mejor antes de nada deberías hacer pruebas con los roles a nivel de categoría y jugar un poco con los permisos de visibilidad. Revisa también http://docs.moodle.org/es/Desarrollador:Roles
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
Efectivamente, eso es!

Yo habia pensado algo así, crear un rol por empresa y a los usuarios asignarles un rol empresa A o un Rol empresa B.

Pero a nivel de visualizacion de categorias como puedo hacerlo? Como puedo decirle que la categoria A y todas sus subcategorias y cursos son visualizables por los usuarios pertenecientes a el Rol empresa A? Este tema donde se podria configurar?

Gracias!
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
He pensado una cosa que igual es posible y no se si es tan dificil de hacer.

Al igual que se puede ocultar una categoria a todos los usuarios pero el Administrador siempre la ve, se podria ocultar todas las categorias principales "Empresa A", "Empresa B" y "Empresa C".

Se crean 3 nuevos roles A, B y C.

En la parte de codigo que comprueba si es administrador o no y que muestre todas las categorias, se puede añadir que si el usuario pertenece al Rol A que muestre la categoria Empresa A (que tendra un ID), si pertenece al Rol B que muestre la categoria Empresa B y lo mismo con el Rol C.

que os parece la idea? La veis viable?

Yo no se mucho de programar, no se si alguien podria ayudarme con el codigo.

Gracias
En respuesta a Jon Padró

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
Es lo más razonable, y de hecho, es lo que hace el parche de portada que había creado. Comprueba si eres admin o tienes permiso para ver todo a nivel de plataforma, en cuyo caso muestra todos los cursos sin restricciones.

En tu caso, habría que incluir otro control previo al momento de mostrar las categorías, donde se compruebe el rol actual del usuario y se especifiquen las relaciones entre roles y categorías que se deben mostrar.

El fichero que hay que tocar sería course/lib.php, más concretamente la función print_whole_category_list a partir más o menos de la línea 1768...
 
function print_whole_category_list($category=NULL, $displaylist=NULL, $parentslist=NULL, $depth=-1, $showcourses = true) {
/// Recursive function to print out all the categories in a nice format
/// with or without courses included
global $CFG,$USER;

// maxcategorydepth == 0 meant no limit
if (!empty($CFG->maxcategorydepth) && $depth >= $CFG->maxcategorydepth) {
return;
}

if (!$displaylist) {
make_categories_list($displaylist, $parentslist);
}

if ($category) {
//por defecto suponemos que hay que mostrar la categoria
$showcat = true;
//es admin o creador de cursos?
if ((!is_siteadmin($USER->id)) && (!user_can_create_courses()) ){
//relacion de categorías especiales con roles especiales, $category id => role id
$roles_cats = array('2'=>9,'3'=>10,'4'=>11);

//obtenemos el contexto de la categoría
$contextcat = get_context_instance(CONTEXT_COURSECAT,$category->id);

//obtenemos el rol del usuario en esa categoría
$users_withrole_cat = get_role_users($roles_cat[$category->id],$contextcat,false);

//comprobamos si el usuario está entre los que tienen rol especial
//asociado a la categoria
$show_cat = false;
foreach($users_withrole_cat as $user_cat){
if ($USER->id == $user_cat->id){
$show_cat = true;
}
}
}

//tiene permiso para ver categorias ocultas? tiene rol en categoria asociada?
//no importa si categoria está visible
if (has_capability('moodle/category:viewhiddencategories', get_context_instance(CONTEXT_SYSTEM)) or $show_cat) {
print_category_info($category, $depth, $showcourses);
} else {
return; // Don't bother printing children of invisible categories
}

} else {
$category->id = "0";
}

if ($categories = get_child_categories($category->id)) { // Print all the children recursively
$countcats = count($categories);
$count = 0;
$first = true;
$last = false;
foreach ($categories as $cat) {
$count++;
if ($count == $countcats) {
$last = true;
}
$up = $first ? false : true;
$down = $last ? false : true;
$first = false;

print_whole_category_list($cat, $displaylist, $parentslist, $depth + 1, $showcourses);
}
}
}


Este código se basa en una serie de supuestos:
  • Los roles asociados a las categorías se otorgan a nivel de categoría.
  • Se conocen los id de los roles especiales.
  • Se conocen los id de las categorías especiales.
  • Las categorías especiales cuelgan directamente de la portada (categoría con id = 1)


Tal vez haya que pulirlo un poco, haciendo que los nombres de las categorías no sean enlaces, para que el los usuarios de una categoría no puedan saltar a la lista general de categorías y acceder a las que no le corresponden, pero esta es más o menos la idea. Recuerda de actualizar los valores de los id de los roles y categorías de la variable $roles_cats

Yo lo he probado en Moodle 1.9.7 y funciona.

En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
Hola Xavier!

Como puedes ser tan grande!!!!????? Voy a probarlo ahora mismo!

El trozo este de codigo... lo tengo que adjuntar a esa funcion o sustituyo la funcion por el codigo que me has pasado?


En respuesta a Jon Padró

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
Haz una copia del archivo original por si acaso, y sustituye el código de la función por el que aparece en el comentario anterior.

Una cosa más. No lo he probado en un escenario con categorías y subcategorías, por tanto no sé si se pueden dar casos extraños pero en teoría debería funcionar igualmente, ya que la función es recursiva, es decir, empieza desde la categoría de portada y va bajando por la jerarquía de categorías hasta que llega al punto en que ya no hay más categorías hijas.

Teóricamente, si no procesas la categoría padre, el algoritmo no continúa hacia abajo para procesar el resto de la jerarquía, pero no puedo asegurarlo al 100%. Haz alguna prueba en este sentido.
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
Hola,

He hecho como em dices, sustituyendo la funcion por la que me has dado y sustituyendo los valores en la variable por los los ids de los roles y las categorias que me corresponden.

He creado los roles grupo empresa a, grupo empresa b y grupo empresa c. Los he configurado diciendo que no hereden los roles de ningun otro rol padre. y he metido los usuarios en cada grupo.

He configurado las categorias principales como invisibles.

cuando entro con administrador se ven todas, eso perfecto, pero cuando entro con algun usuario, me muestra el listado de categorias vacio, no sale ninguna.

Sabes que puedo estar haciendo algo mal?


En respuesta a Jon Padró

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
Asegúrate de que la variable $roles_cats tiene los valores organizados mediante tuplas de 'id categoria' => id rol especial y no al revés. Asegúrate también de que los roles los has otorgado a nivel de categoría, y no a nivel de curso o a nivel global.

Por último, en principio podría ser también porque has ocultado las categorías principales. Esta modificación comprueba si el usuario tiene permiso para ver categorías ocultas, además de comprobar si tiene el rol asociado a la categoría. Si ocultas la categoría principal, no se cumplirá ninguna de ambas condiciones y por tanto, no mostrará nada.

PD: ¿Podrías poner una captura de pantalla de la portada vista como administrador, para comprobar como están organizados los elementos?
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
Hola,

Me he asegurado de poner bien los datos en la variable, estan correctos.

Lo que no se es cómo puedo otorgar los roles a nivel de categoria. Yo he creado los roles sin heredar de ningun otro rol y sin configurar nada dentro de ellos. Despues para meter los usuarios en los roles lo he hecho desde Asignar roles globales. (Esto es lo que puede estar mal?)

Te adjunto como tengo la portada:
En respuesta a Jon Padró

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
Posiblemente sea eso. Para otorgar roles a nivel de categoría, tienes que ir a Administración / ► Cursos / ► Agregar/editar cursos , a continuación pulsas en la categoría que quieras y en la esquina superior derecha debería aparecer un enlace Asignar roles. Pulsa y selecciona el rol asociado a la categoría desde la que pulsaste en el enlace. A partir de ahí, el proceso es el habitual para otorgar roles. Tienes que repetir el proceso para todas las categorías.

Por otro lado, para que funcione correctamente es preferible que configures la portada como lista combo en vez de mostrar la lista de categorías.
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
Haciendo pruebas me he dado cuenta de que hay otra forma de arreglarlo sin tener que otorgar el rol en todos lados. En la línea siguiente
 
$users_withrole_cat = get_role_users($roles_cat[$category->id],$contextcat,false);

donde pone false, pon true. Con esto fuerzas a que compruebe si el usuario tiene ese rol en la categoría actual o en contextos superiores. De esta manera, si el usuario tiene el rol a nivel de la categoría empresa A, podrá ver todas las subcategorías sin necesidad de tener que otorgar el rol en todos ellas.
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Jon Padró -
Hola,

Acabo de probar todo y sale perfecto!!! Esto es exactamente lo que queria!! Eres un crack Xavier!!!

Lo unico que me queda es a la hora de meterte en una categoria principal, muestra un combo con todas las categorias y salen tambien las demas. Voy a ver si detecto donde esta ese combo y puedo desactivarlo. O decirle que solo muestre ese listado cuando sea Administrador.

Lo dicho Xavier, muchas gracias y espero que esto pueda servir a alguien mas.



En respuesta a Jon Padró

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de Xavier Paz -
Me alegro de que hayas conseguido que funcione. gran sonrisa

Como te decía en comentarios anteriores, tendrías que desactivar otras posibles vías de acceso a zonas no permitidas para el alumno, como la caja de texto para buscar cursos que aparece en la portada (bajo la lista de categorías y cursos), la posibilidad de que los nombres de las categorías sean enlaces que te den acceso a la lista del resto de categorías y por supuesto el detalle que tu mencionas.
En respuesta a Xavier Paz

Re: Ayuda: Categorias solo visualizadas por grupos de usuarios

de eduardo olivares -

Buena tardes, yo quiero realizar esto mismo pero en moodle 2.8, intente hacer lo mismo pero al ingresar al archivo lib.php no esta la función mencionada, espero su respuesta, muchas gracias.