Commit 5275fe76 authored by Thomas Fradet's avatar Thomas Fradet
Browse files

Merge branch 'dev'

parents 7b43c9fb 56c42ebc
# 19/02/19
# Changelog
## 21/06/2019
Refonte de l'interface et mise en compatibilité avec Moodle 37.
L'administration des parcours est modifiée pour être plus agréable et efficace. Pour l'ajout de coches sexy, crédit à : https://jalokim.graphics/playground/fancy-checkbox-radios
L'apparence du bloc en lui-même est améliorée.
L'apparence de la page présentant un parcours est refondue pour être plus agréable et claire.
Amélioration de la sécurité.
Correction de bugs divers, notamment dus au passage de version.
......@@ -44,7 +44,12 @@ class block_career extends block_base
*/
function instance_allow_config()
{
return true;
}
function has_config()
{
return true;
}
/**
......@@ -52,9 +57,7 @@ class block_career extends block_base
*/
public function get_content()
{
global $CFG;
global $COURSE;
global $DB;
global $CFG, $COURSE, $DB, $USER;
if ($this->content !== null) {
return $this->content;
......@@ -69,11 +72,11 @@ class block_career extends block_base
$active = "";
$this->content = new stdClass;
$this->content->text .= '<a href="' . $CFG->wwwroot . '/course/view.php?id=' . $COURSE->id . '" class="btn btn-success btn-career-block mb-3">Accueil du cours</a>';
// $image = "";
$this->content->text .= '<div class="list-group">';
$this->content->text = '';
$this->content->text .= '<div class="list-group career-list-group font-weight-light">';
$this->content->text .= '<a href="' . $CFG->wwwroot . '/course/view.php?id=' . $COURSE->id . '" class="list-group-item list-group-item-success list-group-item-action" style="border-top-left-radius: .15rem; border-top-right-radius: .15rem; border-top: none;">Accueil du cours</a>';
foreach ($request as $value) {
......@@ -87,19 +90,21 @@ class block_career extends block_base
$active = "";
}
$this->content->text .= "<a href='" . $CFG->wwwroot . "/blocks/career/career_unit.php?career=" . $value->id . "' class='list-group-item $active'>$value->name</a>";
$this->content->text .= "<a href='{$CFG->wwwroot}/blocks/career/career_unit.php?career={$value->id}&courseid={$COURSE->id}' class='list-group-item list-group-item-action {$active}'>{$value->name}</a>";
// $this->content->text .= "<a href='" . $CFG->wwwroot . "/blocks/career/career_unit.php?career=" . $value->id . "' class='full list-group-item list-group-item-action $active'><div class=' left img_center'>$image</div>
// &nbsp&nbsp $value->name</a><br>";
}
if (has_capability('moodle/course:update', $context = context_course::instance($COURSE->id), $USER->id)) {
$this->content->text .= '<a href="' . $CFG->wwwroot . '/blocks/career/career_list.php?courseid=' . $COURSE->id . '" " class="list-group-item list-group-item-primary list-group-item-action" style="border-bottom-left-radius: .15rem; border-bottom-right-radius: .15rem; border-bottom: none;">Gérer les parcours</a>';
}
$this->content->text .= '</div>';
if (empty($request)) {
$this->content->text .= "<p>" . get_string('any_carrer', 'block_career') . "</p>";
$this->content->text .= "<p class='alert alert-secondary m-t-1'>" . get_string('any_carrer', 'block_career') . "</p>";
}
$this->content->text .= '<a href="' . $CFG->wwwroot . '/blocks/career/career_list.php?course=' . $COURSE->id . '" type="button " class="btn btn-primary btn-career-block mt-3">Gérer les parcours</a>';
// $this->content->text .= "<p></p>";
return $this->content;
......
<?php
define('NO_OUTPUT_BUFFERING', true);
require_once('../../config.php');
require_once('entity/block_career_ressource.php');
require_once('entity/block_career_section.php');
require_once('view/view_career_list.php');
global $COURSE;
global $USER;
global $DB;
global $CFG;
require_once($CFG->libdir . '/adminlib.php');
$id_course = required_param('course', PARAM_INT);
$url = new moodle_url('/blocks/career/career_list.php', array('course' => $id_course));
// define('NO_OUTPUT_BUFFERING', true);
require_once('../../config.php');
require_once('entity/block_career_ressource.php');
require_once('entity/block_career_section.php');
require_once('view/view_career_list.php');
global $USER, $DB, $CFG;
require_once($CFG->libdir . '/adminlib.php');
$id_course = required_param('courseid', PARAM_INT);
$url = new moodle_url('/blocks/career/career_list.php', array('courseid' => $id_course));
//Check if the user has capability to update course
if (!has_capability('moodle/course:update', $context = context_course::instance($id_course), $USER->id)) {
header("Location: {$_SERVER['HTTP_REFERER']}");
exit;
}
$PAGE->set_url($url);
$PAGE->set_pagelayout('admin');
$course = $DB->get_record('course', array('id' => $id_course), '*', MUST_EXIST);
require_login($course, false, NULL);
$PAGE->set_title(get_string('title_plugin', 'block_career'));
$PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header outline'));
$ressource = new block_career_ressource();
$section = new block_career_section();
echo $OUTPUT->header();
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">";
$content = new view_career_list();
echo $content->get_content();
echo $OUTPUT->footer();
\ No newline at end of file
if (!has_capability('moodle/course:update', $context = context_course::instance($id_course), $USER->id)) {
$link = $CFG->wwwroot . '/course/view.php?id=' . $id_course;
header("Location: {$link}");
exit;
}
$PAGE->set_url($url);
$PAGE->set_pagelayout('admin');
$course = $DB->get_record('course', array('id' => $id_course), '*', MUST_EXIST);
require_login($course, false, NULL);
$PAGE->set_title(get_string('title_plugin', 'block_career'));
$PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header outline'));
// $ressource = new block_career_ressource();
// $section = new block_career_section();
echo $OUTPUT->header();
// echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">";
$content = new view_career_list();
echo $content->get_content();
echo $OUTPUT->footer();
\ No newline at end of file
<?php
ob_start();
require_once('../../config.php');
global $COURSE, $DB, $CFG;
require_once("$CFG->libdir/formslib.php");
require_once('entity/block_career_ressource.php');
require_once('entity/block_career_section.php');
require_once('view/view_career_setting.php');
$id_course = required_param('course', PARAM_INT);
$url = new moodle_url('/blocks/career/career_setting.php', array('course' => $id_course));
$PAGE->set_pagelayout('course');
$PAGE->set_url($url);
$course = $DB->get_record('course', array('id' => $id_course), '*', MUST_EXIST);
require_login($course, false, NULL);
$PAGE->set_title(get_string('title_plugin', 'block_career'));
$PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header outline'));
echo $OUTPUT->header();
$PAGE->requires->js("/blocks/career/js/jquery.min.js");
$PAGE->requires->js("/blocks/career/js/file.js");
ob_start();
require_once('../../config.php');
global $COURSE, $DB, $CFG, $USER;
require_once("$CFG->libdir/formslib.php");
require_once('entity/block_career_ressource.php');
require_once('entity/block_career_section.php');
require_once('view/view_career_setting.php');
$id_course = required_param('courseid', PARAM_INT);
$url = new moodle_url('/blocks/career/career_setting.php', array('courseid' => $id_course));
$PAGE->set_pagelayout('course');
$PAGE->set_url($url);
// $course = $DB->get_record('course', array('id' => $id_course), '*', MUST_EXIST);
require_login($id_course, false, NULL);
// $COURSE is === "1" before require_login !!!
if (!has_capability('moodle/course:update', $context = context_course::instance($COURSE->id), $USER->id)) {
$link = $CFG->wwwroot . '/course/view.php?id=' . $COURSE->id;
header("Location: {$link}");
exit;
}
$PAGE->set_title(get_string('title_plugin', 'block_career'));
$PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header outline'));
echo $OUTPUT->header();
$PAGE->requires->js("/blocks/career/js/jquery.min.js");
$PAGE->requires->js("/blocks/career/js/file.js");
// echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">";
$content = new view_career_setting();
echo $content->get_content();
$content = new view_career_setting();
echo $content->get_content();
// Delete career
if (isset($_GET["delete"]) && $_GET["delete"] == 1) {
$DB->execute("DELETE FROM {block_career} WHERE id = ?", array($_GET["id"]));
header("Location: $CFG->wwwroot/blocks/career/career_list.php?course=" . $_GET["course"]);
}
if (!empty($_POST["careerName"])) {
$ressourses = "";
foreach ($_POST["ressource"] as $value) {
if ($value === end($_POST["ressource"])) {
$ressourses .= "$value";
} else {
$ressourses .= "$value,";
}
if (isset($_GET["delete"]) && $_GET["delete"] == 1) {
$DB->execute("DELETE FROM {block_career} WHERE id = ?", array($_GET["id"]));
header("Location: $CFG->wwwroot/blocks/career/career_list.php?courseid=" . $_GET["courseid"]);
}
if (!empty($_POST["careerName"])) {
$ressourses = "";
foreach ($_POST["ressource"] as $value) {
if ($value === end($_POST["ressource"])) {
$ressourses .= "$value";
} else {
$ressourses .= "$value,";
}
}
//$record is use for insert/update in database
$record = new stdClass();
$record->course = intval($_GET["course"]);
$record->name = $_POST["careerName"];
$record->description = $_POST["descriptionName"]["text"];
$record = new stdClass();
$record->course = intval($_GET["courseid"]);
$record->name = $_POST["careerName"];
$record->description = $_POST["descriptionName"]["text"];
// if (isset($_FILES['imageName']['tmp_name'])) {
// $pathDir = "img/";
// $pathFile = $pathDir . basename($_FILES["imageName"]["name"]);
......@@ -61,22 +68,22 @@
// } else {
// $record->image = $_POST["imagePath"];
// }
$record->image = "";
$record->ressources = $ressourses;
if ($_POST["careerId"] != 0) {
$record->id = intval($_POST["careerId"]);
$lastinsertid = $DB->update_record('block_career', $record);
} else {
$lastinsertid = $DB->insert_record('block_career', $record);
}
if ($lastinsertid != 0) {
header("Location: $CFG->wwwroot/blocks/career/career_list.php?course=" . $_GET["course"]);
}
$record->image = "";
$record->ressources = $ressourses;
if ($_POST["careerId"] != 0) {
$record->id = intval($_POST["careerId"]);
$lastinsertid = $DB->update_record('block_career', $record);
} else {
$lastinsertid = $DB->insert_record('block_career', $record);
}
if ($lastinsertid != 0) {
header("Location: $CFG->wwwroot/blocks/career/career_list.php?courseid=" . $_GET["courseid"]);
}
echo $OUTPUT->footer();
}
echo $OUTPUT->footer();
<?php
require_once('../../config.php');
require_once('entity/block_career_ressource.php');
require_once('entity/block_career_section.php');
global $COURSE, $DB;
$careerId = required_param('career', PARAM_INT);
$url = new moodle_url('/blocks/career/career_unit.php', array('career' => $careerId));
$requete = $DB->get_record_sql('SELECT course FROM {block_career} WHERE id = ?', array($careerId));
$PAGE->set_pagelayout('course');
$PAGE->set_url($url);
// Getting DB data for the course
$course = $DB->get_record('course', array('id' => $requete->course), '*', MUST_EXIST);
// Must be logged in
require_login($course, false, NULL);
require_once('../../config.php');
require_once('entity/block_career_ressource.php');
require_once('entity/block_career_section.php');
global $DB;
$careerId = required_param('career', PARAM_INT);
$courseid = required_param('courseid', PARAM_INT);
$url = new moodle_url('/blocks/career/career_unit.php', array('career' => $careerId, 'courseid' => $courseid));
$course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
require_login($course, false, NULL);
$PAGE->set_context(context_course::instance($courseid));
$PAGE->set_pagelayout('course');
$PAGE->set_url($url);
$requete = $DB->get_record_sql('SELECT * FROM {block_career} WHERE id = ?', array($careerId));
if ($requete == false) {
$PAGE->set_title("Erreur");
$PAGE->set_heading("Erreur");
echo $OUTPUT->header();
echo "<div class='alert alert-danger'>Le parcours demandé n'existe pas ou a été supprimé. </div>";
echo $OUTPUT->footer();
} else {
$PAGE->set_title(get_string('title_plugin', 'block_career'));
$PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header outline'));
$PAGE->set_heading($course->fullname);
echo $OUTPUT->header();
$PAGE->requires->js("/blocks/career/js/jquery.min.js");
$PAGE->requires->js("/blocks/career/js/file.js");
echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">";
$PAGE->requires->js("/blocks/career/js/sect-descr.js");
require_once('view/view_career_unit.php');
echo $OUTPUT->footer();
}
\ No newline at end of file
......@@ -11,7 +11,7 @@
function specific_definition($mform)
{
// Adding an element to the form
$mform->addElement('header', 'configheader', get_string('blocksettings', 'block'));
// $mform->addElement('header', 'configheader', get_string('blocksettings', 'block'));
}
}
......
......@@ -76,7 +76,7 @@
*
* @return array<block_career_ressource> $ressources
*/
public function get_ressources_by_id_section($id_section)
public static function get_ressources_by_id_section($id_section)
{
global $DB;
$requete = $DB->get_records_sql('SELECT id FROM {course_modules} WHERE section = ? AND deletioninprogress = 0', array($id_section));
......
......@@ -58,7 +58,7 @@
*
* @return array<block_career_section> $sections
*/
public function get_sections_by_id_course($id_course)
public static function get_sections_by_id_course($id_course)
{
global $DB;
......
;(function () {
/* Descriptions */
var descr_area = document.querySelectorAll('.career-descr-fold');
/* Links to expand description if it has been folded */
var descr_icons = document.querySelectorAll('.career-descr-fold-icon');
/* If > 175px (too big) => change to 150px + link to unfold to normal size. */
for (var i = 0; i < descr_area.length; i++) {
var height = descr_area[i].offsetHeight
if (height > 175) {
descr_area[i].dataset.foldsize = "small"
} else {
var icon = descr_area[i].querySelector('.career-descr-fold-icon');
icon.setAttribute('hidden', 'hidden');
}
}
/* onclick on link => target parent section descr and change the foldsize attribute to cause css changes (unfold & icon) */
for (var i = 0; i < descr_icons.length; i++) {
descr_icons[i].onclick = function(e) {
e.preventDefault();
var target = e.target;
while ( target ) {
if (target.getAttribute('class') != null){
if (target.getAttribute('class').indexOf('career-descr career-descr-fold') > -1) {
break;
}
}
target = target.parentNode;
}
target.dataset.foldsize == "small" ? target.dataset.foldsize = 'full' : target.dataset.foldsize = 'small';
}
}
})();
\ No newline at end of file
......@@ -10,9 +10,10 @@
$string['titleaddname_plugin'] = 'Name';
$string['titleadddesc_plugin'] = 'Description';
$string['titleaddimg_plugin'] = 'Course picture';
$string['titleaddelem_plugin'] = 'Course elements';
$string['titleaddelemdesc_plugin'] = 'Drag and drop the elements of the course you want to add to this course';
$string['heading_plugin'] = 'The path allow you to group some course resources in a particular sequence.';
$string['titleaddelem_plugin'] = 'Path content';
$string['titleaddelemdesc_plugin'] = 'Select course ressources and activities you want in your path.';
$string['heading_plugin'] = 'You can create a Path to group activities and ressources appart from the other inside a learning path. ';
$string['add_path'] = 'Add a path';
$string['any_carrer'] = 'No Path in this course';
$string['any_carrer'] = 'No Path in this course.';
$string['list_title'] = 'Edit path list';
?>
\ No newline at end of file
......@@ -9,9 +9,10 @@
$string['titleaddname_plugin'] = 'Nom';
$string['titleadddesc_plugin'] = 'Description';
$string['titleaddimg_plugin'] = 'Image du parcours';
$string['titleaddelem_plugin'] = 'Elements du parcours';
$string['titleaddelemdesc_plugin'] = 'Glissez-déposez les élements du cours que vous souhaitez ajouter à ce parcours';
$string['heading_plugin'] = 'Les parcours permettent de regrouper certaines ressources du cours dans un enchaînement particulier.';
$string['titleaddelem_plugin'] = 'Contenu du parcours';
$string['titleaddelemdesc_plugin'] = 'Sélectionnez des activités et ressources du cours que vous souhaitez ajouter au parcours.';
$string['heading_plugin'] = 'Les parcours permettent de regrouper certaines ressources du cours dans un enchaînement particulier à part des autres.';
$string['add_path'] = 'Ajouter un parcours';
$string['any_carrer'] = 'Pas de parcours';
$string['any_carrer'] = 'Pas de parcours.';
$string['list_title'] = 'Édition des parcours';
?>
\ No newline at end of file
# Bloc parcours
Plugin MOODLE de type bloc de cours qui permet d'afficher une liste de certaines activités existante du cours sur une page à part. P.ex. pour créer des parcours de niveaux, thématiques, etc. dans un cours volumineux.
Plugin MOODLE de type bloc de cours qui permet d'afficher une liste de certaines activités existante du cours sur une page à part. P.ex. pour créer des parcours de niveaux, thématiques, etc. dans un cours volumineux. Crée des parcours différents dans le cours.
## Auteurs
......@@ -10,9 +10,7 @@ Plugin MOODLE de type bloc de cours qui permet d'afficher une liste de certaines
## Compatibility
MOODLE 3.5
Stabilité : expérimental.
MOODLE 3.7
## Contribution
......@@ -26,11 +24,15 @@ Pour tout autre question : <iena-contact@univ-lorraine.fr>.
Other : <iena-contact@univ-lorraine.fr>.
## Installation
You _have to rename_ the folder "career" at the path `/blocks/career`.
## Fonctionnalités
L'enseignant ajoute un parcours en lui donnant un nom et en sélectionnant plusieurs ressources ou activités du cours.
L'enseignant ajoute un parcours en lui donnant un nom et en sélectionnant plusieurs ressources ou activités du cours à y inclure.
L'étudiant voit une liste des parcours dans le bloc. En cliquant sur le nom d'un parcours, il voit une page qui lui présente la liste des ressoures et activités du cours choisies par l'enseignant pour ce parcours.
L'étudiant voit une liste des parcours dans le bloc. En cliquant sur le nom de l'un des parcours, il voit une page qui lui présente la liste des ressoures et activités du cours choisies par l'enseignant pour ce parcours.
---
......@@ -38,12 +40,8 @@ Teacher add a path with name and ressources and activity subset / selection from
Student see path list quand by clicking one of them, can access to the list of ressources and activity choosen by the teacher for this learning path.
## Problèmes connus
- Affichage peu élégant de la liste des ressources et activités.
- Pas de possibilité de passer d'un élément à l'autre du parcours sans revenir à la page du parcours.
## Amélioration à effectuer
## Roadmap
- Améliorer l'apparence de la liste des activités et ressources d'un parcours.
- Permettre de consulter les éléments d'un parcours avec un meilleur enchaînement.
[ ] Permettre de consulter les éléments d'un parcours avec un meilleur enchaînement.
[ ] Intégrer l'achèvement d'activité avec visualisation des activités achevées, et pourcentage de complétion du parcours dans la page du parcours et dans le bloc
[ ] Ajouter un tableau de bord de progression dans les parcours pour l'enseignant
.btn-career-block {
width: 100%;
/* Path view */
.career-section-title {
background-color: #008196;
}
/*.left {
float: left;
}*/
/*.img_moodle_course {
max-width: 100%;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
border-radius: 50%;
display: block;
margin: -1px;
min-height: 64px;
min-width: 64px;
}*/
/*.padding_column {
padding: 2rem;
}*/
/*.align_center {
display: flex;
justify-content: center;
align-items: center;
}*/
/*.button {
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);
}*/
/*.img_center {
top: 1rem;
left: 1rem;
}*/
/*.img_moodle_list {
max-width: 100%;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
border-radius: 50%;
display: block;
margin: -1px;
height: 32px;
width: 32px;
}*/
.left_course_elements, .right_course_elements {
width: 33%;
float: left;
padding: 1%;
color: white;
text-align: center;
-webkit-box-shadow: 0 1px 3px 0 #d4d4d5, 0 0 0 1px #d4d4d5;
box-shadow: 0 1px 3px 0 #d4d4d5, 0 0 0 1px #d4d4d5;
.career-section-title > h3 {
color: #fafafa;
padding: 0.6rem 1rem;
margin-bottom: 0;
}
.left_course_elements {
background: #2d2d2d;
.career-descr {
padding: .75rem 1.25rem;
margin-bottom: 0;
border: 0 solid transparent;
border-color: #f1f3f5;
color: #6b6e71;
background-color: #f5f6f8;