Erro usuário inválido na versão 3.4 do Moodle

Erro usuário inválido na versão 3.4 do Moodle

por Lino Vaz Moniz -
Número de respostas: 0

Pela minha surpresa, a versão 3.4 dá erro Usuário inválido ao tentar cadastrar um novo usuário. Esse erro ocorre quando algum campo de perfil for criado.

Ao habilitar o debug, aparece o seguinte detalhe do erro:

Debug info: SELECT id FROM {user} WHERE id = ? AND deleted = ?
[array (
0 => -1,
1 => 0,
)]
Error code: invaliduser
×Stack trace:
line 1546 of /lib/dml/moodle_database.php: dml_missing_record_exception thrown
line 1522 of /lib/dml/moodle_database.php: call to moodle_database->get_record_select()
line 6015 of /lib/accesslib.php: call to moodle_database->get_record()
line 416 of /user/profile/lib.php: call to context_user::instance()
line 578 of /user/profile/lib.php: call to profile_field_base->is_visible()
line 149 of /user/editadvanced_form.php: call to profile_definition()
line 204 of /lib/formslib.php: call to user_editadvanced_form->definition()
line 155 of /user/editadvanced.php: call to moodleform->__construct()
Output buffer:

Trata-se de um erro do core do Moodle que veio na distribuição 3.4

Para resolver esse problema, adotei uma medita paliativa, uma gambiara na verdade. Simplesmente adicionei return true;  na linha 415 da função is_visible() do arquivo MOODLE_DIR_INSTALL/user/profile/lib.php 

No seu Moodle a linha pode não ser exatamente 415, mas basta colocar o código return true;   logo inicio da função. Assim a função não executa a parte que dá erro e retorna sempre true. Isso torna o campo visível mesmo que não seja. Nessa altura do campeonato, isso é o menor dos problemas quando a equipe pedagógica está no seu cangote.

Vaja o código completo da função alterada. O trecho do código na cor azul é o que adicionei para evitar erros.

public function is_visible() {
global $USER;
return true;
$context = $this->userid ? context_user::instance($this->userid) : context_system::instance(); switch ($this->field->visible) {
case PROFILE_VISIBLE_ALL:
return true;
case PROFILE_VISIBLE_PRIVATE:
if ($this->userid == $USER->id) {
return true;
} else {
return has_capability('moodle/user:viewalldetails', $context);
}
default:
return has_capability('moodle/user:viewalldetails', $context);
}
}

Isso é um hacker no código enquanto. Uma gambiara enquanto o Moodle não corrigir esse problema.