Développement d'un bloc - Quelques questions...

Développement d'un bloc - Quelques questions...

par Aurélie M,
Nombre de réponses : 23
Bonjour,

Je travaille actuellement sur le développement d'un bloc, dans le cadre d'un stage.
Voici une semaine que je fouille tout ce que je trouve : MoodleDoc, Forum, code source de Moodle... Bref, je crois que je commence à saisir pas mal de choses! sourire

Il reste tout de même certains points sur lesquels tout n'est pas encore très clair, et parfois je n'arrive pas à trouver l'explication... pourtant, je n'pense pas bloquer sur du très compliqué!

Bref. Le bloc que je souhaite développer ne se comportera pas de la même façon si l'utilisateur se trouve sur la page d'un cours ou s'il se trouve sur la page "mymoodle". (Mon erreur vient peut-être de là. La création d'un bloc pour les pages de cours ou pour mymoodle se fait de la même façon?)
Du coup, j'ai besoin de savoir sur quelle page (ou plutôt sur quel type de page : cours ou mymoodle?) je me trouve pour pouvoir demander à mon bloc d'afficher son contenu en fonction de cette page. Quelles sont les variables qui m'indiquent cela? Existe-t-il une fonction que je peux utiliser?

Merci de votre aide. J'espère ne pas devoir faire appel à vous trop souvent! ^^
Moyenne des évaluations  -
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Apparemment ce serait la fonction get_type(), tout simplement. Si je pouvais avoir confirmation/infirmation... ;)

Merci. sourire
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Ce n'est pas très pratique, mais je ne peux pas modifier mes messages... Désolée donc pour le défilé de questions. (Je commence enfin à coder, mais je me heurte déjà à pas mal de soucis... J'ai des progrès à faire niveau méthode je crois. :/)

Mon bloc contient des liens, certains vers des pages que je vais coder donc.
C'est là que je suis un peu perdue. Comment intégrer cette page à Moodle? C'est-à-dire, comment conserver l'en-tête du site, la présentation générale, les variables dont je vais avoir besoin, etc...

Je me sens toute bête de ne pas réussir à démarrer. Je pense que c'est un coup à prendre... et que je n'ai pas su chercher aux bons endroits. :/
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Valery Fremaux,

T'inquiète pas, ça va venir.... clin d’œil

En tout cas continue à poser des questions bien ciblées comme ça et on va pouvoir te répondre illico !!

Pour l'examen du contexte, du disposes d'une variable globale $COURSE qui contient beaucoup d'informations sur le "cours" courant.

Tu est, hosmis des pages très externes (certaines pages d'Admin), plus ou moins toujours dans un cours.

Pour la page d'acceuil : $COURSE->id == SITEID

Il existe aussi un id standard pour MyMoodle. (c'est un faux cours), visualise (print_object) ta variable $COURSE dans la page /my/index .php et tu verras.

Pour que ton bloc puisse donner accès à des pages "annexes", il vaut mieux en effet mettre ces pages dans le répertoire blocks/monbloc pour en faire ce qu'on appelle un "sideapp" (ou application "à côté" de Moodle). Ceci n'empêche pas de pouvoir récupérer et utiliser TOUT le contexte moodle.

Ce n'est en général pas le rôle des blocs que de faire çà (plutôt destinés à produire une petite "vue de données" encartables dans le portail), mais j'avoie que c'est une technique la plus utilisable pour amener une "sideapp" comme un plugin et non comme une modification centrale du code.

Donc revenons à la structure de base de ta page : appview.php par exemple, dans ton répertoire blocks/monbloc

Le canevas standard est :

    /**
    * Requires and includes
    */
    require('../../config.php'); // super important évidemment !!
    // TOUT CE DONT TU AS BESOIN ICI **/

    $id = required_param('id', PARAM_INT); // en général l'id du cours contexte ce qui permet de le donner à require_login()

    $course = get_record('course', 'id', "$id"); // pas sûr que ça serve, on a $COURSE

    /// Capability trap

    // s'assurer de l'accès et de l'enrollement
    require_login($course->id);
   
    // logguer dans le journal
    add_to_log($course->id, 'osia_sessions', "$view/$action", "manageall.php?id=$course->id", "$course->id");
   
    // attraper le contexte courant, une alternative est d'obtenir le contexte de niveau "bloc"
    $context = get_context_instance(CONTEXT_COURSE, $COURSE->id);
   
    if (!has_capability('block/monbloc:macapcite', $context)){
        error("Je vérifie encore quelques accès !!");
    }

    // je fabrique une navigation
    $navlinks[] = array(
                    'name' => get_string('managingsession', 'block_osia_session'),
                    'url' => NULL,
                    'type' => 'title',
                  );
   
    // j'imprime le header standard
    print_header_simple(get_string('managingsessions', 'block_osia_session'), get_string('managesessions', 'block_osia_session'), build_navigation($navlinks));

    // JE METS MON CODE A MOI //

    // queqlues variantes de sortie, avec ou sans paramètre -> http://phpdocs.moodle.org
    print_footer();

Good luck !!

Cheers.

 

 

Moyenne des évaluations Utile (1)
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Valery Fremaux,

Variable à examiner pour savoir ce qu"on a sous la main :

$CFG

$SITE

$THEME

$USER

$COURSE

(donne déjà plein de choses à manger, toutes globales).

clin d’œil

Moyenne des évaluations Utile (1)
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Nicolas Dunand,
Bonjour,

Pas aussi rapide et précis que Valéry, mais voici mon petit grain de sel pour essayer de t'aider à démarrer :
Sinon il y a aussi ce cours en ligne "Introduction to Moodle Programming" ici : http://dev.moodle.org/course/view.php?id=2

En réponse à Nicolas Dunand

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Merci beaucoup pour toutes ces infos!

Je commence à manipuler les variables qui sont à ma disposition, et à trouver les fonctions dont j'ai besoin (plutôt que de créer ce qui existe déjà...).

Merci pour cette structure de base d'une page, ça risque de m'être très utile. ;)


J'ai déjà consulté l'exemple qui concerne le développement de bloc et je garde de côté les listings de fonctions. Je découvre une page que je n'avais pas lue à chaque nouveau passage...

Je n'avais par contre pas trouvé de cours : Introduction to Moodle Programming, et je crois que je vais aller y mettre mon nez! L'Anglais ne me pose pas trop de problème (juste un bon mal de crâne en fin de journée).

Je commence à manipuler et à naviguer dans le code existant pour trouver ce dont j'ai besoin... Ca va venir! sourire


En tous cas, merci beaucoup pour ces premiers conseils et ces bases qui me seront forts utiles.

En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Bonjour,

Je commence à pas mal avancer dans mes découvertes, ce que je fais ressemble petit à petit à quelque chose. Je croule sous les fonctions, je note tout ce que je trouve, mais je m'en sortirai! x)
Merci pour vos réponses car les quelques indications et liens fournis m'ont permis de bien avancer et mieux de comprendre la logique de tout ça!



Mais ne vous inquiétez pas, je ne vous abandonne pas, je vais encore avoir besoin de vous!

Etant donné que je ne veux pas toucher à la base existante, je souhaite créer une ou deux nouvelles tables. J'ai beaucoup de mal à comprendre le fonctionnement de l'éditeur XMLDB.
J'ai repéré où ça se passe dans le menu Administrateur, mais je n'ai pas la possibilité de "Créer", sur la ligne qui correspond à mon bloc. Il me semble avoir compris que je dois créer un répertoire 'db' dans celui de mon bloc, mais ça ne change rien. Il y a certainement quelque chose (ou pas mal de choses) que je n'ai pas saisi.
Quelques indices pour comprendre le fonctionnement seront les bienvenus. ^^

Encore merci.
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Étienne Rozé,
Bonjour,

Peut-être une question de droit en écriture sur le répertoire db que l'utilisateur sous lequel tourne le serveur web n'a pas ?

Je reformule car je ne suis pas sur d'être clair :
Il faut que l'utilisateur sous lequel tourne le serveur web ait le droit en écriture sur le répertoire db.
En réponse à Étienne Rozé

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
C'est très clair et en effet c'était tout simplement le problème! Il me manque pas mal de réflexes. :x

Je pense qu'à présent toutes les aides en ligne sur l'editeur xmldb suffiront... J'y cours. ^^


Merci! sourire
En réponse à Étienne Rozé

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
J'ai encore un petit souci.

J'ai su créer ma table avec xmldb editor. J'ai créé mon fichier upgrade.php.


Mais je ne sais pas vraiment comment l'utiliser...

Pour l'instant, j'ai fait appel une fois à la fonction d'upgrade dans mes fichiers de code histoire que ma table soit créée et que je puisse travailler dessus (puisque je ne trouvais pas comment faire).
Mais j'imagine que normalement ce bidouillage n'aurait pas du se faire... Si quelqu'un a quelques explications à me fournir, je suis preneuse. En attendant, je reste dans mes bidouillages!


Merci. ^^
J'espère ne pas vous embêter trop avec toutes mes questions.. Mais je sens que j'avance et que je me débrouille seule de mieux en mieux!
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Valery Fremaux,
Normalement, XMLDB Editor ne sert qu'à créer le fichier install.xml que tu trouves dans le répertoire db des plugins.

Il te permet egalement comme tu as pu le voir, de générer la séquence ce PHP qui va bien dans le fichier upgrade.

Au tout début d'un bloc, il ne faut rien mettre dans upgrade.php, et laisser l'installation du bloc se faire toute seule par les notifications du menu Administration.

Une fois la première installation faite, tu peux générer les différences et corrections par l'upgrade, mais tant que le bloc n'est pas publié, cela reste à déconseiller. Le fichier upgrade.php est surtout utile pour mettre à jour des sites qui ont installé ton bloc. Tant qu'il reste expérimental, il n'y en a pas.

L'upgrade sera activé chaque fois que tu augmenteras la valeur de version de ton bloc. Il est donc tout à fait inutile de changer la version du bloc s'il n'y a ni changement de la base de données, ni changement des capacités ou définitions d'événements à enrgistrer dans Moodle. Cependant, certains développeurs augmentent tout de même ce numéro de version pour mieux gérer les demandes d'assistance (plutôt que de fouiller le code du demandeur pour savoir le code de quel jour c'était !!).

En général, les blocs ne produisent pas de table dans XMLDB, car l'existance des blocs est marquée par un enreigstrement générique dans "mdl_block_instance".

Ce n'est pas vrai pour les modules qui ont besoin d'une table nouvelle pour chaque module.

Continue à poser des questions aussi pertinentes, ça sera un plaisir que de te guider... et fera de la matière pour les prochains candidats développeurs !!
Moyenne des évaluations Utile (1)
En réponse à Valery Fremaux

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
J'ai du mal à suivre avec ma création de table. Je n'avais pas bien compris le fonctionnement donc n'ai pas bien expliqué mon problème je crois. sourire


"
En général, les blocs ne produisent pas de table dans XMLDB, car l'existance des blocs est marquée par un enreigstrement générique dans "mdl_block_instance".
Ce n'est pas vrai pour les modules qui ont besoin d'une table nouvelle pour chaque module.
"


Je me suis demandé si je ne devrais pas créer un bloc et un module plutôt que juste un bloc, mais a priori, ce que je cherche correspond plus à la fonction d'un bloc.
("Si la fonctionnalité que l'on recherche est et ne peut être que fonctionnellement unique dans l'espace du cours, il est préférable de pencher vers le concept de bloc.")

Pour être plus claire, le mieux est que j'explique en quelques mots ce que je compte faire. sourire
Je crée un bloc "suivi d'activités" qui permettra à un enseignant d'un cours de choisir de suivre, dans un premier temps, des devoirs.
Sur la page du cours, dans le bloc, l'enseignant pourra voir s'afficher "X devoirs en retard", par exemple (il s'agit de devoir non rendus alors que la date limite est passée). Et en cliquant sur ce lien, l'enseignant aurait accès à plus de détails.
(Cette fonctionnalité pourra par la suite être applicable à d'autres activités que les devoirs, et gérée d'une façon différente par l'étudiant sur sa page "MyMoodle", mais je n'y suis pas encore. ^^)

D'après ce que je lis sur les modules, c'est-à-dire qu'ils peuvent être instanciables plusieurs fois dans un cours, il me semble que ça ne correspond pas à ce que je veux faire.
Mais j'ai tout de même besoin d'un petit table en plus dans ma base de données, pour y enregistrer quelle activité est suivie dans quel cours.



Je viens de reprendre à zéro ma création de table.
Je l'ai donc créée avec XMLDB Editor, Enregistrée/Chargée. Mon fichier install.xml s'est créé. Je n'ai pas créé de upgrade.php cette fois-ci.
Mais ma table n'existe pas, je ne peux pas l'utiliser... J'ai beau la chercher en regardant du côté de phpmyadmin, je ne la vois pas.

Où est-ce que je me suis trompée, ou bien qu'est-ce que j'ai oublié de faire?


Merci, toujours. sourire
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Étienne Rozé,
Bonjour,

Je ne suis pas en mesure de répondre à ton problème. Je réagit simplement aux critères de choix modules/blocs. Un bloc peut être rendu "pluri-instanciable" ( excusez pour ce néologisme) : c'est un choix du développeur ( guidé bien sur par le rôle du bloc). Un exemple tout bête est le bloc html.
La différence entre le bloc et le module est plutôt que le premier aura un rôle d'affichage, d'information ou de lien vers des fonctionnalités (d'administration ou autre) et l'autre un rôle "orienté" activité pédagogique.
Mais ceci est à surement à nuancer et la souplesse de Moodle permet techniquement pas mal de choses y compris aller contre sa philosophie générale.

De ce que tu dis de tes objectifs, d'après moi, tu as fait le bon choix.
En réponse à Étienne Rozé

Re: Développement d'un bloc - Quelques questions...

par Valery Fremaux,
Je suis en effet d'accord avec cette nuance... le module définit bien une micro application pédagogique qui "fait partie" (en tant que constituant) d'un cours. C'est pour celà que l'API est plus complète et intègre notamment tous les mécanismes de notation que l'on ne trouve pas en "natif" dans l'API du bloc...
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Nicolas Dunand,
Je pense que le fichier install.xml n'est pas reconnu par Moodle car seulement pris en compte à l'installation. C'est-à-dire que si le bloc est installé et que le install.xml apparaît après, Moodle l'ignore.

Je ne suis pas sûr, mais p-ê que la suppression du bloc (via Administration du Site -> Gestion des Blocs) puis sa réinstallation aura pour effet de forcer Moodle à considérer le fichier install.xml, et dont à créer les tables y définies.

En réponse à Nicolas Dunand

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Aaah tout simplement oui!
Voilà ce que je n'avais pas bien compris.
Merci, c'était bien la manip' à réaliser! sourire
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Bonjour,

Le développement de mon bloc avance à grands pas, merci pour votre aide et/ou conseils. sourire


Certains paramètres seront définis par l'enseignant. J'ai donc voulu faire ma page pour définir ces paramètres dans un fichier config_instance.html . (De manière à ce que ma page de configuraiton soit accessible via le mode Edition.)
J'ai un formulaire, et je voudrais pouvoir le traiter. Le problème, c'est que quelle que soit l'adresse que j'indique dans l'attribut "action" de ma balise "form", un clic sur mon bouton submit me ramène systématiquement sur la page principale du cours. Pourtant, lorsque je regarde le code source donné par mon navigateur, l'adresse dans mon form est bien ce que j'ai demandé.

Si quelqu'un a déjà développé un bloc en utilisant le config_instance.html et a des informations à me donner concernant sa "manipulation", je suis preneuse!

En attendant, je vais contourner le problème.


Merci!
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
C'est toujours une fois que je me suis décidée à poser ma question que je réfléchis.

Je commence à comprendre comment fonctionne "l'objet" $this->config d'un bloc. (Pas encore saisi comment gérer ça avec les checkbox, mais je devrais vite repérer j'imagine!)

Bref, problème en partie résolu, mais ça ne m'empêche pas d'être preneuse pour tous conseils à ce niveau-là! sourire
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Valery Fremaux,
Aurelie,

config_instance.htm et config_global.htm sont deux "hooks" standard qui te permettent de rajouter rapidement des variable à l'objet $this->config, le premier par celui qui édite le bloc, le deuxième par les paramètres glbaux d'administration.

Tu n'as nullement besoin d'écrire un formulaire complet dans ces fichiers, mais seulement les différentes lignes de tableau qui proposent les entrées de formulaires adéquates.

ainsi ce code :

<table cellpadding="9" cellspacing="0">
<tr valign="top">
<td align="right">studentscanuse:</td>
<td>
<select name="studentscanuse">
<option value="1" <?php
if(isset($this->config->studentscanuse)) {
if ($this->config->studentscanuse) echo "SELECTED" ;
} ?> /><?php print_string('yes') ?></option>
<option value="0" <?php
if(isset($this->config->studentscanuse)) {
if (!$this->config->studentscanuse) echo "SELECTED" ;
} ?> /><?php print_string('no') ?></option>
</td>
<td>
<?php print_string('configstudentscanuse', 'block_use_stats') ?>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<input type="submit" value="<?php print_string('savechanges') ?>" /></td>
</tr>
</table>


est autosuffisant dans un fichier config_instance.htm (il y a des exemples plus simples).

Il y aura création implicite d'une entrée studentcanuse dans cet objet config. Il est cependant prudent de toujours considérer l'inexistance de ce paramètre à la première utilisation dans le bloc, et ajouter une valeur par défaut si elle n'est pas définie.

L'utilisation de ces hooks de config sont liés à la réponse de certaines fonctions clef de l'API de bloc :

has_config() doit répondre true pour exploiter le config_global.htm

instance_allow_config() doit répondre true pour donner à l'utilisateur le bouton d'édition. On peut donc trier les rôles ou les conditions par capacité pour que ce soit le cas.

instance_allow_multiple() permet d'autoriser la présence de plusieurs exemplaires du bloc dans la page/cours

user_can_addto() permet de déterminer qui peut ajouter/retirer le bloc du cours.

applicable_formats() permet de déterminer dans quels type sde pages de moodle le bloc peut être ajouté ('all', 'course', 'site', 'topic', etc.) la valeur est le code spécifique du format de page, détenu par la variable globale $PAGE.

Il y en a quelques autres... regarder attentivement le fichier blocks/moodleblock.class.php qui donne l'API complète du bloc et toutes les fonctions surchargeables.
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Bonjour,

Je m'en sors à peu près avec config_instance et config_global! sourire


Par contre ça fait un petit moment que je bute sur un autre souci, mais qui est un peu plus spécifique, j'espère trouver des pistes ici, parce que je sèche. :/

Sur une page, j'affiche un certain nombre de devoirs (assignments) rendus. Le tableau est proche de ce que l'on peut voir sur la page /mod/assignment/submissions.php (liste des rendus pour un devoir).

J'aimerais que l'enseignant puisse corriger des devoirs depuis cette page.
J'ai donc mis un lien vers la popup de correction. Jusque là tout va bien, si je corrige mon devoir dans cette fenêtre, tout se passe normalement.

Mais le système de correction rapide (sans popup) s'avèrerait être intéressant.
J'ai donc ajouté, à chaque ligne de mon tableau, une liste déroulante pour la note et une zone de texte pour le commentaire.

Au traitement, je mets à jour mon enregistrement dans la table assignment_submissions.
C'est là que j'ai un souci. Une fois cela fait, ma table s'est bien mise à jour, et l'enseignant peut voir la note et le commentaire qu'il a mis.
Par contre, l'étudiant qui vient d'être noté, lui, ne voit aucun changement.

Je ne comprends pas pourquoi l'étudiant ne peut pas voir des données qui sont bel et bien enregistrées dans la base. Il y a donc quelque chose que je n'ai pas modifié alors que j'aurais du. Mais où? Je fouille de fond en comble le code de moodle (qui au niveau des submissions commence à être lourd pour mon petit cerveau ^^), mais là je commence à déséspérer.

Quant à la solution d'utiliser les fonctions existantes, d'après mes tests il faudrait que je passe par la fonction d'affichage des devoirs rendus, qui ne peut pas s'appliquer à ce que je veux. Je n'arrive pas à trouver ce qui pourrait me convenir.


J'espère être compréhensible... et j'espère trouver quelqu'un qui a déjà eu à travailler autour de cette partie-là et qui la connaît un peu!


Merci, dans tous les cas.
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Bonjour,

Je viens de revenir à mon problème de mise à jour des Devoirs corrigés par un enseignant mais non visibles par l'étudiant.
Je suis sur une piste, je pense trouver les clefs ici : http://docs.moodle.org/en/Development:Grades

Je passais juste laisser l'info, on ne sait jamais, si quelqu'un cherche la même chose et tombe sur ce sujet. ;)
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Aurélie M,
Bonjour, me revoilà avec mon développement!

Les choses avancent, je commence à en voir la fin, avec un peu de chance ce sera rapidement fonctionnel. sourire


Là j'attaque une partie qui me semble un peu plus compliquée, à vrai dire je suis perdue et ne trouve pas par où commencer. :/
J'affiche un tableau avec une liste d'étudiant et des cases à cocher. Et j'aimerais qu'à la validation du formulaire, entre autres, un message-type (via la messagerie de moodle) soit envoyé aux étudiants qui ont été cochés.

Si quelqu'un peut me guider sur les fonctions à utiliser... :/

Merci.
En réponse à Aurélie M

Re: Développement d'un bloc - Quelques questions...

par Valery Fremaux,
Yo !! Ca c'est de la balle...

On suppose que les cases à cocher émettent les ID des étudiants en question.

Il faut récupérer les enregistrements des étudiants en tant qu'utilisateur :

foreach($validated as $valid){
get_record('user', 'id', $valid);

puis il faut compiler un message

$body= make_message(...);

// fonction à toi pour compiler un message type (joint une petite librairie de template pour les messages, peut servir les variables s'écrivent "<%%NOM%%>" et les templates sont des fichiers .tpl dans un sous répertoire mails/fr_utf8 du répertoire de plugin).

puis déclencher la fonction :

message_post_message($fromuser, $user, $body, $format, ...);
}