Duda con access.php en Moodle 1.9

Duda con access.php en Moodle 1.9

de Jose Martinez -
Número de respuestas: 12

Buenos días!

Estoy realizando mi proyecto de fin de carrera para Moodle, y para ello he creado un bloque en Moodle 1.9. Mi problema es a la hora de asignar permisos "para que sea visible", puesto que es un bloque que solo profesores y administradores deberían ver.

Mi bloque, llamemosle hola, esta situado en moodle/blocks/hola. Dentro de aquí tengo block_hola.php con el siguiente codigo:

<?php
class block_hola extends block_base {
function init() {
$this->title =get_string('hola','block_hola');
$this->version = 2011041316;
}
function get_content() {
if($this->content !== NULL) {
return $this->content;
}
$context = get_context_instance(CONTEXT_SYSTEM);
if(has_capability('block/hola:view', $context)) {
$this->content = new stdClass;
$this->content->text = 'Bloque de prueba';
return  $this->content;
}
}
}
?>

Mi problema es que siempre muestra el bloque a profesores y administrador, y NO a estudiantes (así está establecido por defecto en usuarios/permisos/definir roles. En verdad es lo que quería, pero yo quiero manejar esos permisos a código, por tanto me creé mi carpeta db y ahi dentro access.php con el siguiente codigo:

<?php
$block_hola_capabilities = array(
'block/hola:view' => array(
'captype' => 'read',
'contextlevel' => CONTEXT_SYSTEM,
'legacy' => array(
'guest' => CAP_PROHIBIT,
'student' => CAP_PROHIBIT,
'teacher' => CAP_PROHIBIT,
'editingteacher' => CAP_PROHIBIT,
'coursecreator' => CAP_PROHIBIT,
'admin' => CAP_ALLOW
)
)
);
?>

Lo de CAP_PROHIBIT es un ejemplo "crítico" para que no se me muestre excepto a admin. El caso es que no me hace caso, siempre mantiene los permisos por defecto, le ponga lo que le ponga en access.php.

Nota: No se me olvida actualizar la version a traves de notificaciones.

¿Podríais ayudarme?

Un saludo y gracias!

 

Promedio de valoraciones: -
En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Xavier Paz -

Te falta pasarle el id de usuario, para que compruebe sus permisos para ese contexto.

function has_capability($capability, $context, $userid=NULL, $doanything=true)

En respuesta a Xavier Paz

Re: Duda con access.php en Moodle 1.9

de Jose Martinez -

Hola Xavier!

Ante todo, gracias por tu respuesta.

Pero sigue sin funcionar lo que quiero, te explico mejor:

Yo quiero modificar los permisos de mi bloque para los roles, en este caso, me gustaría que tuvieran acceso los profesores y los administradores. Da la casualidad que por defecto es así, pero...a la hora de pasarlo a otro Moodle (el oficial al que lo debo pasar) no se cómo estarían los permisos. Por tanto, quiero programar esos permisos manualmente.

Para ello, como dice un libro que tengo, creé la carpeta db dentro del bloque, y ahí dentro, el archivo access.php. Por probar, les he puesto a todos los roles excepto el de admin: cap_prohibit. Pero probando un usuario creado de profesor, se sigue mostrando el bloque, y sin embargo con una cuenta de estudiante no se ve. Pero decepcionadamente, esto lo hace así por los permisos por defecto, es decir que mi archivo access.php no está funcionando como debería.

Como me dijiste, cambié la linea has_capability por la siguiente:

if(has_capability('block/hola:view', $context,$userid=NULL, $doanything=true))

pero no se si la variable userid hay que hacerle algo mas...

Te repito, y os repito a todos, muchísimas gracias por vuestra dedicación.

¿Se os ocurre alguna idea más de por qué puede ser?

En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Xavier Paz -

No, me entendiste mal, lo que yo ponía era la definición de la función, lo que tu tendrías que poner es:

if(has_capability('block/hola:view', $context,$USER->id))

y has de usar la variable global $USER porque lo que quieres saber qué capacidades tiene el usuario que actualmente está usando moodle, en ese momento.

En respuesta a Xavier Paz

Re: Duda con access.php en Moodle 1.9

de Jose Martinez -

He puesto lo que me dijiste y he declarado la variable como global, es decir:

global $USER;

Pero supongo que habrá que poner una sentencia para asignarle a esa variable el usuario, del tipo... $USER->id = $this....¿?¿??¿    no?

Perdona mi ignorancia

En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Jose Martinez -

Por lo que he estado probando, $USER->id no hay que asignarlo a nada, sino que lo asigna automáticamente, y devuelve un número que representa el rol. Pero sigue sin funcionarme triste

 

function get_content() {
global $USER;
if($this->content !== NULL) {
return $this->content;
}
$context = get_context_instance(CONTEXT_SYSTEM);
if(has_capability('block/redsoc:view', $context,$USER->id)) {
$this->content = new stdClass;
$this->content->text = $USER->id;
return  $this->content;
}
}

En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Jose Martinez -

Aunque acabo de leer en la documentacion:

param: integer $userid - a userid number, empty if current $USER

Eso es lo que me interesaria no? es decir dejar el parámetro vacio...

En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Xavier Paz -

Vale, en efecto, si no especificas el parámetro, toma $USER->id como valor por defecto. De todas formas, ya creo saber cuál es el problema. El contexto en que estás mirando no es el adecuado.

En vez mirar en un contexto tipo SYSTEM, debería hacerlo en un contexto tipo BLOCK, ya que es un bloque donde quieres comprobar si los permisos del usuario son los adecuados.

function get_content() {
  global $USER;
  if($this->content !== NULL) {
      return $this->content;
  }

  $context = get_context_instance(CONTEXT_BLOCK,$id_bloque);
  if(has_capability('block/redsoc:view', $context,$USER->id)) {
          $this->content = new stdClass;
          $this->content->text = $USER->id;
          return  $this->content;
  }
}

En get_context_instance, como segundo parámetro debes pasarle el id de la instancia del bloque, para lo cual no se si servirá con poner $this->id.

En respuesta a Xavier Paz

Re: Duda con access.php en Moodle 1.9

de Jose Martinez -

Xavier, si pongo CONTEXT_BLOCK en vez de CONTEXT_SYSTEM, no se me muestra el bloque para ningún usuario, ya sea admin, teacher o student. Sólo puedo acceder al bloque activando la edición. Por otra parte, en los permisos sigue permitido para teacher y admin.

Qué extraño...he probado ya de todo...

Muchísimas gracias

En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Jose Martinez -

Mi archivo principal: blocks/redsoc/block_redsoc.php

<?php
class block_redsoc extends block_base {

function init() {
$this->title =get_string('redsoc','block_redsoc');
$this->version = 2011041400;
}

function get_content() {
global $USER;

if($this->content !== NULL) {
return $this->content;
}

$context = get_context_instance(CONTEXT_BLOCK, $id_bloque);

if (has_capability('block/redsoc:view', $context,$USER->id)) {
$this->content = new stdClass;
$this->content->text = 'Hello World';
return $this->content;
}
}
}

?>

 

EN EL ARCHIVO access.php SITUADO EN blocks/redsoc/db/access.php

<?php

$block_redsoc_capabilities = array(
'block/redsoc:view' => array(
'captype' => 'read',
'contextlevel' => CONTEXT_BLOCK,
'legacy' => array(
'student' => CAP_PROHIBIT,
'teacher' => CAP_PROHIBIT,
'admin' => CAP_ALLOW
)
)
);

?>

En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Xavier Paz -

Te falta obtener el parámetro $id_bloque, que yo he metido en el código a modo indicativo, pero no he puesto como obtener su valor. Ese parámetro se corresponde con el id de la instancia del bloque actual, el cual estás intentando generar.

Por eso, en mi anterior comentario, te decía que no se si para obtener dicho valor te valdría con poner $id_bloque = $this->id o algo similar. El caso es que tienes que obtener ese id para que moodle pueda obtener los datos de ese contexto tipo bloque en concreto, al cual estan asociados los permisos definidos por ti en el access.php.

En respuesta a Xavier Paz

Re: Duda con access.php en Moodle 1.9

de Jose Martinez -

Xavier...no hace exactamente lo que quería, pero "me vale".

Resulta que para que actualice los roles, tengo que desinstalar el bloque e instalarlo de nuevo, si ya esta instalado y le cambio los roles y la versión, al darle a notificaciones, me lo actualiza, pero me aparece una cosa extraña:

Por ejemplo: yo el rol student lo tenía en prevent. Ahora lo cambio a prohibit y actualizo. Al mirar los permisos, en usuarios, roles, definir roles, student...al buscar mi bloque para el rol student, me aparece lo siguiente: seleccionado en prevent...pero el recuadro sale sombreado pero sin seleccionar en prohibit. Es decir, me hace el amago (o reconocimiento) de cambiarme el rol, pero ¿no puede? ya que no se selecciona el que quiero, solo se oscurece el recuadro.

Por otra parte, y para las personas que lo necesiten, pongo la "solución provisional" a mi problema.

$context = get_context_instance(CONTEXT_BLOCK,$this->instance->id);

if (has_capability('block/redessoc:view', $context)) {

....

}

¿sabría alguien por qué no me actualiza los permisos de los roles para mi bloque, y sin embargo si desinstalo e instalo de nuevo sí que los pone como quiero?

Gracias de antemano!

En respuesta a Jose Martinez

Re: Duda con access.php en Moodle 1.9

de Xavier Paz -

Hay una serie de funciones que hay que definir en el bloque para que permita la configuración, como has_config(), que sirven para indicar a moodle que el bloque tiene parámetros de configuración entre los que supongo se encuentran los permisos.