Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Franck Pithois,
Nombre de réponses : 10

Bonjour à tous !

J'ai un souci de requête SQL pour les rapports personnalisables...

Contexte :

Sur notre Moodle 3.5, on utilise beaucoup d'url au sein de nos cours pour pointer vers une ressource unique déposée dans un autre cours (pour faciliter les mises à jour).

Il s'avère que des ressources sont restées malencontreusement cachées au sein de leur cours.

Les étudiants, suivant un parcours vont devoir consulter la ressource via l'url mais là, patatra, l'étudiant ne peut y accéder et Bibi ne se rappelle plus dans quel cours pointe l'url de la ressource mais il récupère l'id via l'url collée dans le parcours :

Ici je suppose que l'ID de la ressource est 113264.

(voici l'url complète pour un fichier : "https://moodle.enm-toulouse.fr/pluginfile.php/113264/mod_resource/content/17/audio.html")

Alors on utilise le rapport personnalisable en proposant un rapport mais je ne maitrise pas du tout les requetes SQL.

Il y a de superbes sources proposées et j'essaye de les adapter.

Après le contexte, la question !!

Voici donc une requête adaptée avec un exemple de pdf déposé dans un cours mais je ne suis pas sûr d'utiliser les bonnes tables:
"SELECT
r.id AS 'id resource',
r.name AS 'nom ressource',
r.course AS 'id cours',
CONCAT('<a href="%%WWWROOT%%/course/view.php?id=', r.course, '">',c.fullname,'</a>') AS 'lien cours'
FROM prefix_resource AS r
INNER JOIN prefix_course AS c ON c.id = r.course
WHERE r.id = '23168'

MAIS SOUCI !
Cela renvoi bien une ressource mais il y a un couac :
"23168    Cliquez ici pour ouvrir le PDF "climatologie des précipitations" (durée : ~15'+30')    1458    PRODUCTION CLIM FINALISEE : CATNAT INONDATION - Janvier 2021"

Mais si je retourne sur le cours renvoyé par la requête et en mettant le curseur sur la ressource pdf  "Cliquez ici pour ..." :

Je lis en bas à gauche du navigateur l'url suivante  :

?auth=co&id=ccf548b5-d9ec-4749-bdd8-ea2c14ea0b6b:373074&part=2.3

L'id semble donc être "39900"... A moins que je ne comprenne pas ce que cette url renvoie.

J'ai l'impression que je n'utilise pas la bonne étiquette de la table ressource.
J'avais trouvé ca : https://docs.moodle.org/19/fr/D%C3%A9veloppement:Tables_de_la_base_de_donn%C3%A9es#Description_table_des_ressources mais c'est obsolète semble-t-il (docs 1.9).
Ma collègue m'a donné ce lien : https://www.examulator.com/er/3.5/index.html
Mais je ne vois pas de "ressources".

Est-ce que j'utilise les bons arguments ?
un argument pour avoir une réponse : fraises tagada lors du prochain MoodleMoot en présentiel sourire

Merci par avance et bonne journée à vous.
Amicalement.
Franck

Moyenne des évaluations  -
En réponse à Franck Pithois

Re: Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles

Bonjour,

L'analyse de la 1ère URl ne me semble pas correcte :
https://moodle.enm-toulouse.fr/pluginfile.php/113264/mod_resource/content/17/audio.html

Dans la documentation https://docs.moodle.org/dev/File_API , il est indiqué :

The general form of the URL is something like
$url = $CFG->wwwroot/pluginfile.php/$contextid/$component/$filearea/arbitrary/extra/infomation.ext
113264 est en fait un id de contexte et non l'id de la ressource elle-même

Après, je ne comprends pas bien le reste du message entre l'URL qui indique quelque chose de la forme
?auth=co&id=.....
et l'id "39900"

Serait-il possible d'indiquer comment tout cela fonctionne ?
Comment sont déposés les fichiers ? au travers des fichiers intégrés ?

Bruno



En réponse à Bruno Malaval

Re: Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Franck Pithois,

Bonjour Bruno et merci pour ta réponse !

Tagada !

Nous utilisons des ressources classiques comme un fichier pdf ou support de présentation. La plupart du temps, c'est déposé via le glisser-déposer, nous ne passons que très rarement par des fichiers intégrés.

Nous utilisons également des diaporamas sonorisés (html), des sortes de mini-sites.

J'importe donc un zip, le décompresse et pointe le fichier .html comme fichier principal.

Le stagiaire clique alors sur l'url qui va directement sur le fichier .html du mini-site. C'est l'url donnée avec l'id de contexte.

Cela me donne donc deux soucis :

  • Existe-il une table de contextes dans Moodle ? Et si oui, comment l'utiliser ?
  • Si la ressource est un pdf, par contre, je reste avec un souci d'utilisation de la bonne id ?
Merci à toi pour tes réponses.
Bien amicalement.
Franck
En réponse à Franck Pithois

Re: Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles

Je n'ai pas étudié complètement l'API fichiers, mais globalement pour la question du contexte :

Il y a bien une table 'mdl_context'
Si je reprends ton exemple :
https://moodle.enm-toulouse.fr/pluginfile.php/113264/mod_resource/content/17/audio.html

tu devrais trouver dans la table des contextes :

mdl_context.id = 113264
mdl_context.contextlevel = 70 (càd un contexte de type MODULE , voir le fichier lib/accesslib.php)
mdl_context.instanceid = xxx , id de l'instance

Pour instanceid, vu qu'il s'agit d'un module, il faut chercher cet id dans mdl_course_modules.id
(s'il s'agissait d'un contexte de type COURSE, instanceid serait l'id d'un cours dans la table mdl_course)

mdl_course_modules.id = xxx
mdl_course_modules.module = 17 (Ressource , cf mdl_modules)
mdl_course_modules.instance = yyy

Et pour finir,

mdl_course_modules.instance = mdl_resource.id 

puisqu'il s'agit d'une ressource

Tout cela , c'est pour l'environnement de la ressource
Maintenant, tu peux retrouver directement le fichier dans la table mdl_files , en cherchant le contextid (113264) directement dans mdl_files.contextid

On retrouve dans la table les informations de l'URL .../mod_resource/content/ respectivement dans les champs component et filearea
Par contre, pour l'élément "arbitrary" (17 dans l'URL), je ne sais pas. Il semble qu'en changeant ce nombre, l'accès est identique.... à voir donc

Après, si le document est visible dans la section d'un cours, il est possible d'utiliser directement le lien vers ce document, qui serait de la forme :
https://moodle.enm-toulouse.fr/mod/resource/view.php?id= <instanceid>

J'ai essayé d'être clair, mais je ne me sentais pas de faire un schéma, désolé

PS : Possible de remplacer les tagadas par un ti'punch ?
on a beau être de grand enfants, je préfère les produits naturels : Citron-Rhum-Sucre (CRS pour les intimes 😁)

Bruno

Moyenne des évaluations Utile (3)
En réponse à Bruno Malaval

Re: Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Franck Pithois,
Bonjour Bruno,
pour les CRS, il y a moyen de s'arranger, j'en connais de Guyane clin d’œil

Merci pour ton aide, j'ai réussi à aboutir !
Voici la requête opérationnelle,
"
SELECT
cx.id AS 'id du contexte',
cx.instanceid AS 'id de la ressource',
c.id AS 'id du cours hébergeant',
CONCAT('',c.fullname,'') AS 'lien cours'
FROM prefix_context AS cx
INNER JOIN prefix_course_modules AS cm ON cm.id = cx.instanceid
INNER JOIN prefix_course AS c ON c.id = cm.course
WHERE cx.id = 113264 #(c'est l'id du contexte récupéré dans l'url externe de la ressource URL)
"

Je ne sais pas si elle servira mais je vous laisse la verser dans la bibliothèque qui va bien.

Encore merci pour ton aide !
Amicalement.
Franck
En réponse à Franck Pithois

Re: Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Franck Pithois,
Rebonjour !
Une dernière chose, j'aimerais récupérer le nom de la ressource associée au module (résultat du context.instanceid)
J'essaie de passer par la table ressource mais je n'ai pas trouvé de lien entre les tables course_modules, context et ressources...
Merci si vous avez encore une petite piste ! J'ajoute des citrons verts !
Amicalement.
Franck
En réponse à Franck Pithois

Re: Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Bruno Malaval,
Avatar Moodleurs particulièrement utiles
En fait si
le nom de la ressource (nom affiché dans le cours) est dans la table mdl_resource.
le lien se fait par :
mdl_course_modules.instance = mdl_resource.id
donc pour la requête, cela donnerait :

SELECT
cx.id AS 'id du contexte',
cx.instanceid AS 'id de la ressource',
r.name AS 'nom de la ressource',
c.id AS 'id du cours hébergeant',
CONCAT('',c.fullname,'') AS 'lien cours'
FROM prefix_context AS cx
INNER JOIN prefix_course_modules AS cm ON cm.id = cx.instanceid
INNER JOIN prefix_course AS c ON c.id = cm.course
INNER JOIN prefix_resource AS r ON r.id = cm.instance
WHERE cx.id = 113264

Pour le guyanais, si c'est "La belle C....." (Loi Evin oblige, pas de nom)  alors oui, il est vraiment excellent

Bruno
Moyenne des évaluations Utile (2)
En réponse à Bruno Malaval

(désolé) Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Luiggi Sansonetti,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Titulaires du Moodle Course Creator Certificate Avatar Traducteurs
Pour le guyanais, si c'est "La belle C....." (Loi Evin oblige, pas de nom) alors oui, il est vraiment excellent

"Evin, Eveux, Evrois zéro..."
(désolé...)
Moyenne des évaluations Utile (1)
En réponse à Luiggi Sansonetti

(désolé) Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Franck Pithois,
grand sourire
Ca, c'est parce que tu as fait du vélo : Sans les pieds !!! Puis Sans les mains !!! Et puis.... "fan les dents "...
Oui... je sais... je sors avec Luiggi.
En réponse à Bruno Malaval

Re: Requête SQL pour trouver un cours si je "connais" l'id d'une ressource

par Franck Pithois,
Bonjour Bruno !
Alors là ! Double dose, avec modération (d'habitude, on ne dira pas...)
Un très grand merci à toi !
Cela fonctionne parfaitement. Ta requête mérite d'être versée dans la librairie ad-hoc de Moodle.
Très bonne journée à tous.
Amicalement.
Franck