Add SkillRelCourse table see BT#13334

pull/2458/head
jmontoyaa 8 years ago
parent 02e3c30d35
commit f4188df2a1
  1. 80
      main/admin/skill_rel_course.php
  2. 48
      main/inc/ajax/skill.ajax.php
  3. 82
      main/inc/lib/skill.lib.php
  4. 8
      main/install/configuration.dist.php
  5. 37
      main/session/resume_session.php
  6. 8
      src/Chamilo/CoreBundle/Entity/Course.php
  7. 68
      src/Chamilo/CoreBundle/Entity/Skill.php
  8. 182
      src/Chamilo/SkillBundle/Entity/SkillRelCourse.php

@ -0,0 +1,80 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\SkillBundle\Entity\SkillRelCourse;
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
if (api_get_configuration_value('allow_skill_rel_items') == false) {
api_not_allowed(true);
}
$courseId = isset($_GET['course_id']) ? (int) $_GET['course_id'] : 0;
$course = api_get_course_entity($courseId);
if (empty($course)) {
api_not_allowed(true);
}
$sessionId = isset($_GET['session_id']) ? (int) $_GET['session_id'] : null;
$url = api_get_self().'?course_id='.$courseId.'&session_id='.$sessionId;
$form = new FormValidator('skills', 'post', $url);
$sessionName = $course->getTitleAndCode();
if (!empty($sessionId)) {
$session = api_get_session_entity($sessionId);
$sessionName = ' '.$session->getName().' - '.$course->getTitleAndCode();
}
$form->addHeader(get_lang('AddSkills').$sessionName);
$skillList = [];
$em = Database::getManager();
$items = $em->getRepository('ChamiloSkillBundle:SkillRelCourse')->findBy(
['course' => $courseId, 'session' => $sessionId]
);
/** @var SkillRelCourse $skillRelCourse */
foreach ($items as $skillRelCourse) {
$skillList[$skillRelCourse->getSkill()->getId()] = $skillRelCourse->getSkill()->getName();
}
$form->addHidden('course_id', $courseId);
$form->addHidden('session_id', $sessionId);
$form->addSelectAjax(
'skills',
get_lang('Skills'),
$skillList,
[
'url' => api_get_path(WEB_AJAX_PATH).'skill.ajax.php?a=search_skills',
'multiple' => 'multiple',
]
);
$form->addButtonSave(get_lang('Save'));
$form->setDefaults(['skills' => array_keys($skillList)]);
if ($form->validate()) {
Skill::saveSkillsToCourseFromForm($form);
Display::addFlash(Display::return_message(get_lang('Updated')));
header('Location: '.$url);
exit;
}
$content = $form->returnForm();
$interbreadcrumb[] = [
'url' => api_get_path(WEB_CODE_PATH).'session/session_list.php',
'name' => get_lang('SessionList'),
];
$interbreadcrumb[] = [
'url' => api_get_path(WEB_CODE_PATH).'session/resume_session.php?id_session='.$sessionId,
'name' => get_lang('SessionOverview'),
];
$template = new Template(get_lang('SkillRelCourses'));
$template->assign('content', $content);
$template->display_one_col_template();

@ -36,12 +36,12 @@ switch ($action) {
case 'find_skills':
$skills = $skill->find('all', ['where' => ['name LIKE %?% '=>$_REQUEST['q']]]);
$return_skills = [[
'items' => []
'items' => [],
]];
foreach ($skills as $skill) {
$return_skills['items'][] = [
'id' => $skill['id'],
'text' => $skill['name']
'text' => $skill['name'],
];
}
header('Content-Type: application/json');
@ -77,7 +77,7 @@ switch ($action) {
$courseInfo = api_get_course_info($_REQUEST['code']);
$courses = CourseManager::processHotCourseItem(
[
['c_id' => $courseInfo['real_id']]
['c_id' => $courseInfo['real_id']],
]
);
Display::display_no_header();
@ -177,7 +177,7 @@ switch ($action) {
$return[$skill['data']['id']] = [
'id' => $skill['data']['id'],
'name' => $skill['data']['name'],
'passed'=> $skill['data']['passed']
'passed'=> $skill['data']['passed'],
];
}
}
@ -188,7 +188,7 @@ switch ($action) {
$result = [
'success' => $success,
'data' => $return
'data' => $return,
];
echo json_encode($result);
break;
@ -200,7 +200,7 @@ switch ($action) {
$return [$skill['data']['id']] = [
'id' => $skill['data']['id'],
'parent_id' => $skill['data']['parent_id'],
'name' => $skill['data']['name']
'name' => $skill['data']['name'],
];
}
echo json_encode($return);
@ -240,7 +240,7 @@ switch ($action) {
if (!isset($user_skills[$my_skill['skill_id']])) {
$user_skills[$my_skill['skill_id']] = [
'skill_id' => $my_skill['skill_id'],
'found' => false
'found' => false,
];
}
$total_skills_to_search[$my_skill['skill_id']] = $my_skill['skill_id'];
@ -329,7 +329,7 @@ switch ($action) {
$isDeleted = $skillProfile->delete($profileId);
echo json_encode([
'status' => $isDeleted
'status' => $isDeleted,
]);
}
break;
@ -345,18 +345,42 @@ switch ($action) {
$skills = $skill->find(
'all',
[
'where' => ['name LIKE %?% ' => $_REQUEST['q']]
'where' => ['name LIKE %?% ' => $_REQUEST['q']],
]
);
$returnSkills = [];
foreach ($skills as $skill) {
$returnSkills[] = [
'id' => $skill['id'],
'text' => $skill['name']
'text' => $skill['name'],
];
}
echo json_encode([
'items' => $returnSkills
'items' => $returnSkills,
]);
break;
case 'search_skills_in_course':
$courseId = isset($_REQUEST['course_id']) ? (int) $_REQUEST['course_id'] : 0;
$sessionId = isset($_REQUEST['session_id']) ? (int) $_REQUEST['session_id'] : null;
if (empty($courseId)) {
exit;
}
$em = Database::getManager();
$skills = $em->getRepository('ChamiloSkillBundle:SkillRelCourse')->findBy(
['course' => $courseId, 'session' => $sessionId]
);
$returnSkills = [];
/** @var \Chamilo\SkillBundle\Entity\SkillRelCourse $skill */
foreach ($skills as $skill) {
$returnSkills[] = [
'id' => $skill->getSkill()->getId(),
'text' => $skill->getSkill()->getName(),
];
}
echo json_encode([
'items' => $returnSkills,
]);
break;
case 'update_skill_rel_user':
@ -399,7 +423,7 @@ switch ($action) {
if ($skillRelItem) {
$criteria = [
'user' => $userId,
'skillRelItem' => $skillRelItem
'skillRelItem' => $skillRelItem,
];
$skillRelItemRelUser = $em->getRepository('ChamiloSkillBundle:SkillRelItemRelUser')->findOneBy($criteria);
if ($skillRelItemRelUser) {

@ -7,6 +7,8 @@ use Fhaculty\Graph\Vertex;
use Fhaculty\Graph\Graph;
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
use Chamilo\SkillBundle\Entity\SkillRelItem;
use Chamilo\SkillBundle\Entity\SkillRelCourse;
use Chamilo\CoreBundle\Entity\Skill as SkillEntity;
/**
* Class SkillProfile
@ -2454,12 +2456,16 @@ class Skill extends Model
}
}
$courseId = api_get_course_int_id();
$sessionId = api_get_session_id();
$url = api_get_path(WEB_AJAX_PATH).'skill.ajax.php?a=search_skills_in_course&course_id='.$courseId.'&session_id='.$sessionId;
$form->addSelectAjax(
'skills',
get_lang('Skills'),
$skillList,
[
'url' => api_get_path(WEB_AJAX_PATH).'skill.ajax.php?a=search_skills',
'url' => $url,
'multiple' => 'multiple',
]
);
@ -2671,7 +2677,7 @@ class Skill extends Model
// Add new one
if (!empty($skills)) {
foreach ($skills as $skillId) {
/** @var \Chamilo\CoreBundle\Entity\Skill $skill */
/** @var SkillEntity $skill */
$skill = $em->getRepository('ChamiloCoreBundle:Skill')->find($skillId);
if ($skill) {
if (!$skill->hasItem($typeId, $itemId)) {
@ -2693,4 +2699,76 @@ class Skill extends Model
}
}
}
/**
* Relate skill with an item (exercise, gradebook, lp, etc)
* @param FormValidator $form
* @throws \Doctrine\ORM\OptimisticLockException
*/
public static function saveSkillsToCourseFromForm(FormValidator $form)
{
$skills = (array) $form->getSubmitValue('skills');
$courseId = (int) $form->getSubmitValue('course_id');
$sessionId = $form->getSubmitValue('session_id');
self::saveSkillsToCourse($skills, $courseId, $sessionId);
}
/**
* @param array $skills
* @param int $courseId
* @param int $sessionId
* @throws \Doctrine\ORM\OptimisticLockException
* @return bool
*/
public function saveSkillsToCourse($skills, $courseId, $sessionId)
{
$allowSkillInTools = api_get_configuration_value('allow_skill_rel_items');
if (!$allowSkillInTools) {
return false;
}
$em = Database::getManager();
$sessionId = empty($sessionId) ? null : (int) $sessionId;
$course = api_get_course_entity($courseId);
$session = null;
if (!empty($sessionId)) {
$session = api_get_session_entity($sessionId);
}
// Delete old ones
$items = $em->getRepository('ChamiloSkillBundle:SkillRelCourse')->findBy(
['course' => $courseId, 'session' => $sessionId]
);
if (!empty($items)) {
/** @var SkillRelCourse $item */
foreach ($items as $item) {
if (!in_array($item->getSkill()->getId(), $skills)) {
$em->remove($item);
}
}
$em->flush();
}
// Add new one
if (!empty($skills)) {
foreach ($skills as $skillId) {
$item = new SkillRelCourse();
$item->setCourse($course);
$item->setSession($session);
/** @var SkillEntity $skill */
$skill = $em->getRepository('ChamiloCoreBundle:Skill')->find($skillId);
if ($skill) {
if (!$skill->hasCourseAndSession($item)) {
$skill->addToCourse($item);
$em->persist($skill);
}
}
}
$em->flush();
}
return true;
}
}

@ -744,6 +744,14 @@ ALTER TABLE skill_rel_item_rel_user ADD CONSTRAINT FK_D1133E0DA76ED395 FOREIGN K
ALTER TABLE skill_rel_item ADD CONSTRAINT FK_EB5B2A0D5585C142 FOREIGN KEY (skill_id) REFERENCES skill (id);
ALTER TABLE skill_rel_item_rel_user ADD result_id INT DEFAULT NULL;
CREATE TABLE skill_rel_course (id INT AUTO_INCREMENT NOT NULL, skill_id INT DEFAULT NULL, c_id INT NOT NULL, session_id INT NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_E7CEC7FA5585C142 (skill_id), INDEX IDX_E7CEC7FA91D79BD3 (c_id), INDEX IDX_E7CEC7FA613FECDF (session_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE skill_rel_course ADD CONSTRAINT FK_E7CEC7FA5585C142 FOREIGN KEY (skill_id) REFERENCES skill (id);
ALTER TABLE skill_rel_course ADD CONSTRAINT FK_E7CEC7FA91D79BD3 FOREIGN KEY (c_id) REFERENCES course (id);
ALTER TABLE skill_rel_course ADD CONSTRAINT FK_E7CEC7FA613FECDF FOREIGN KEY (session_id) REFERENCES session (id);
ALTER TABLE skill_rel_item ADD CONSTRAINT FK_EB5B2A0D5585C142 FOREIGN KEY (skill_id) REFERENCES skill (id);
*/
//$_configuration['allow_skill_rel_items'] = false;

@ -5,6 +5,7 @@ use Chamilo\CoreBundle\Entity\Repository\SequenceRepository;
use Chamilo\CoreBundle\Entity\SequenceResource;
use Chamilo\CoreBundle\Entity\Promotion;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\Course;
use Doctrine\Common\Collections\Criteria;
use Chamilo\CoreBundle\Entity\SessionRelUser;
use Chamilo\CoreBundle\Entity\Repository\SessionRepository;
@ -32,7 +33,7 @@ SessionManager::protectSession($sessionId);
$tool_name = get_lang('SessionOverview');
$interbreadcrumb[] = [
'url' => 'session_list.php',
'name' => get_lang('SessionList')
'name' => get_lang('SessionList'),
];
$orig_param = '&origin=resume_session';
@ -160,6 +161,9 @@ if ($sessionInfo['nbr_courses'] == 0) {
$courseItem = '';
$courses = $sessionRepository->getCoursesOrderedByPosition($session);
$allowSkills = api_get_configuration_value('allow_skill_rel_items');
/** @var Course $course */
foreach ($courses as $course) {
// Select the number of users
$numberOfUsers = SessionManager::getCountUsersInCourseSession(
@ -168,8 +172,7 @@ if ($sessionInfo['nbr_courses'] == 0) {
);
// Get coachs of the courses in session
$namesOfCoaches = [];
$coachSubscriptions = $session
->getUserCourseSubscriptionsByStatus($course, Session::COACH)
$coachSubscriptions = $session->getUserCourseSubscriptionsByStatus($course, Session::COACH)
->forAll(function ($index, SessionRelCourseRelUser $subscription) use (&$namesOfCoaches) {
$namesOfCoaches[] = $subscription->getUser()->getCompleteNameWithUserName();
@ -211,14 +214,20 @@ if ($sessionInfo['nbr_courses'] == 0) {
).'</td>';
$courseItem .= '<td>'.($namesOfCoaches ? implode('<br>', $namesOfCoaches) : get_lang('None')).'</td>';
$courseItem .= '<td>'.$numberOfUsers.'</td>';
$courseItem .= '
<td>
<a href="'. $courseUrl.'">'.
Display::return_icon('course_home.gif', get_lang('Course')).'</a>
'.$orderButtons.'
<a href="session_course_user_list.php?id_session='.$sessionId.'&course_code='.$course->getCode().'">'.
Display::return_icon('user.png', get_lang('Users'), '', ICON_SIZE_SMALL).'</a>
<a href="'.api_get_path(WEB_CODE_PATH).'user/user_import.php?action=import&cidReq='.$course->getCode().'&id_session='.$sessionId.'">'.
$courseItem .= '<td>';
$courseItem .= Display::url(Display::return_icon('course_home.gif', get_lang('Course')), $courseUrl);
if ($allowSkills) {
$courseItem .= Display::url(
Display::return_icon('skills.png', get_lang('Skills')),
api_get_path(WEB_CODE_PATH).'admin/skill_rel_course.php?session_id='.$sessionId.'&course_id='.$course->getId()
);
}
$courseItem .= $orderButtons;
$courseItem .= '<a href="session_course_user_list.php?id_session='.$sessionId.'&course_code='.$course->getCode().'">'.
Display::return_icon('user.png', get_lang('Users'), '', ICON_SIZE_SMALL).'</a>';
$courseItem .= '<a href="'.api_get_path(WEB_CODE_PATH).'user/user_import.php?action=import&cidReq='.$course->getCode().'&id_session='.$sessionId.'">'.
Display::return_icon('import_csv.png', get_lang('ImportUsersToACourse'), null, ICON_SIZE_SMALL).'</a>
<a href="'.api_get_path(WEB_CODE_PATH).'user/user_export.php?file_type=csv&course_session='.$course->getCode().':'.$sessionId.'&addcsvheader=1">'.
Display::return_icon('export_csv.png', get_lang('ExportUsersOfACourse'), null, ICON_SIZE_SMALL).'</a>
@ -227,9 +236,9 @@ if ($sessionInfo['nbr_courses'] == 0) {
<a href="session_course_edit.php?id_session='.$sessionId.'&page=resume_session.php&course_code='.$course->getCode().''.$orig_param.'">'.
Display::return_icon('teacher.png', get_lang('ModifyCoach'), '', ICON_SIZE_SMALL).'</a>
<a href="'.api_get_self().'?id_session='.$sessionId.'&action=delete&idChecked[]='.$course->getCode().'" onclick="javascript:if(!confirm(\''.get_lang('ConfirmYourChoice').'\')) return false;">'.
Display::return_icon('delete.png', get_lang('Delete')).'</a>
</td>
</tr>';
Display::return_icon('delete.png', get_lang('Delete')).'</a>';
$courseItem .= '</td></tr>';
$count++;
}
$courseListToShow .= $courseItem;

@ -656,6 +656,14 @@ class Course
return $this->title;
}
/**
* @return string
*/
public function getTitleAndCode()
{
return $this->getTitle().' ('.$this->getCode().')';
}
/**
* Set description
*

@ -5,6 +5,7 @@ namespace Chamilo\CoreBundle\Entity;
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
use Chamilo\SkillBundle\Entity\Profile;
use Chamilo\SkillBundle\Entity\SkillRelCourse;
use Chamilo\SkillBundle\Entity\SkillRelItem;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria;
@ -103,6 +104,12 @@ class Skill
*/
protected $items;
/**
* // uncomment if api_get_configuration_value('allow_skill_rel_items')
* ORM\OneToMany(targetEntity="Chamilo\SkillBundle\Entity\SkillRelCourse", mappedBy="skill", cascade={"persist"})
*/
protected $courses;
/**
* @return string
*/
@ -415,4 +422,65 @@ class Skill
$skillRelItem->setSkill($this);
$this->items[] = $skillRelItem;
}
/**
* @return ArrayCollection
*/
public function getCourses()
{
return $this->courses;
}
/**
* @param ArrayCollection $courses
* @return Skill
*/
public function setCourses($courses)
{
$this->courses = $courses;
return $this;
}
/**
* @param SkillRelCourse $searchItem
*
* @return bool
*/
public function hasCourseAndSession(SkillRelCourse $searchItem)
{
if ($this->getCourses()->count()) {
$found = false;
/** @var SkillRelCourse $item */
foreach ($this->getCourses() as $item) {
$sessionPassFilter = false;
$session = $item->getSession();
$sessionId = !empty($session) ? $session->getId() : 0;
$searchSessionId = !empty($searchItem->getSession()) ? $searchItem->getSession()->getId() : 0;
if ($sessionId === $searchSessionId) {
$sessionPassFilter = true;
}
if ($item->getCourse()->getId() == $searchItem->getCourse()->getId() &&
$sessionPassFilter
) {
$found = true;
break;
}
}
return $found;
}
return false;
}
/**
* @param SkillRelCourse $item
*/
public function addToCourse(SkillRelCourse $item)
{
$item->setSkill($this);
$this->courses[] = $item;
}
}

@ -0,0 +1,182 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\SkillBundle\Entity;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\Skill;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* SkillRelCourse
*
* @ORM\Table(name="skill_rel_course")
* ORM\Entity // uncomment if api_get_configuration_value('allow_skill_rel_items')
*/
class SkillRelCourse
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
protected $id;
/**
* @var Skill
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Skill", inversedBy="courses")
* @ORM\JoinColumn(name="skill_id", referencedColumnName="id")
**/
protected $skill;
/**
* @var Course
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="skills", cascade={"persist"})
* @ORM\JoinColumn(name="c_id", referencedColumnName="id", nullable=false)
*/
protected $course;
/**
* @var Session
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Session", inversedBy="skills", cascade={"persist"})
* @ORM\JoinColumn(name="session_id", referencedColumnName="id", nullable=false)
*/
protected $session;
/**
* @var \DateTime $created
*
* @Gedmo\Timestampable(on="create")
* @ORM\Column(name="created_at", type="datetime")
*/
protected $createdAt;
/**
* @var \DateTime $updated
*
* @Gedmo\Timestampable(on="update")
* @ORM\Column(name="updated_at", type="datetime")
*/
protected $updatedAt;
/**
* SkillRelItem constructor.
*/
public function __construct()
{
$this->createdAt = new \DateTime('now');
$this->updatedAt = new \DateTime('now');
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @param int $id
* @return SkillRelCourse
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @return Skill
*/
public function getSkill()
{
return $this->skill;
}
/**
* @param Skill $skill
* @return SkillRelCourse
*/
public function setSkill($skill)
{
$this->skill = $skill;
return $this;
}
/**
* @return Course
*/
public function getCourse()
{
return $this->course;
}
/**
* @param Course $course
* @return SkillRelCourse
*/
public function setCourse($course)
{
$this->course = $course;
return $this;
}
/**
* @return Session
*/
public function getSession()
{
return $this->session;
}
/**
* @param Session $session
* @return SkillRelCourse
*/
public function setSession($session)
{
$this->session = $session;
return $this;
}
/**
* @return \DateTime
*/
public function getCreatedAt()
{
return $this->createdAt;
}
/**
* @param \DateTime $createdAt
* @return SkillRelCourse
*/
public function setCreatedAt($createdAt)
{
$this->createdAt = $createdAt;
return $this;
}
/**
* @return \DateTime
*/
public function getUpdatedAt()
{
return $this->updatedAt;
}
/**
* @param \DateTime $updatedAt
* @return SkillRelCourse
*/
public function setUpdatedAt($updatedAt)
{
$this->updatedAt = $updatedAt;
return $this;
}
}
Loading…
Cancel
Save