Update "about" course page using a controller.

pull/3064/head
Julio 6 years ago
parent 76b5db7cad
commit 350c52b5ef
  1. 184
      public/main/course_info/about.php
  2. 189
      public/main/template/default/course_home/about.html.twig
  3. 150
      src/CoreBundle/Controller/CourseController.php
  4. 192
      src/ThemeBundle/Resources/views/Course/about.html.twig

@ -1,184 +0,0 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\CourseRelUser;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CCourseDescription;
/**
* Course about page
* Show information about a course.
*
* @author Alex Aragon Calixto <alex.aragon@beeznest.com>
*
* @package chamilo.course
*/
$cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$courseId = isset($_GET['course_id']) ? (int) $_GET['course_id'] : 0;
if (empty($courseId)) {
api_not_allowed(true);
}
$token = Security::get_existing_token();
$em = Database::getManager();
//userID
$userId = api_get_user_id();
/** @var Course $course */
$course = api_get_course_entity($courseId);
if (!$course) {
api_not_allowed(true);
}
$userRepo = UserManager::getRepository();
$fieldsRepo = $em->getRepository('ChamiloCoreBundle:ExtraField');
$fieldTagsRepo = $em->getRepository('ChamiloCoreBundle:ExtraFieldRelTag');
/** @var CCourseDescription $courseDescription */
$courseDescriptionTools = $em->getRepository('ChamiloCourseBundle:CCourseDescription')
->findBy(
[
'cId' => $course->getId(),
'sessionId' => 0,
],
[
'id' => 'DESC',
'descriptionType' => 'ASC',
]
);
$courseValues = new ExtraFieldValue('course');
$userValues = new ExtraFieldValue('user');
$urlCourse = api_get_path(WEB_PATH)."course/$courseId/about";
$courseTeachers = $course->getTeachers();
$teachersData = [];
/** @var CourseRelUser $teacherSubscription */
foreach ($courseTeachers as $teacherSubscription) {
$teacher = $teacherSubscription->getUser();
$userData = [
'complete_name' => UserManager::formatUserFullName($teacher),
'image' => UserManager::getUserPicture(
$teacher->getId(),
USER_IMAGE_SIZE_ORIGINAL
),
'diploma' => $teacher->getDiplomas(),
'openarea' => $teacher->getOpenarea(),
];
$teachersData[] = $userData;
}
$tagField = $fieldsRepo->findOneBy([
'extraFieldType' => ExtraField::COURSE_FIELD_TYPE,
'variable' => 'tags',
]);
$courseTags = [];
if (!is_null($tagField)) {
$courseTags = $fieldTagsRepo->getTags($tagField, $courseId);
}
$courseDescription = $courseObjectives = $courseTopics = $courseMethodology = $courseMaterial = $courseResources = $courseAssessment = '';
$courseCustom = [];
foreach ($courseDescriptionTools as $descriptionTool) {
switch ($descriptionTool->getDescriptionType()) {
case CCourseDescription::TYPE_DESCRIPTION:
$courseDescription = $descriptionTool->getContent();
break;
case CCourseDescription::TYPE_OBJECTIVES:
$courseObjectives = $descriptionTool;
break;
case CCourseDescription::TYPE_TOPICS:
$courseTopics = $descriptionTool;
break;
case CCourseDescription::TYPE_METHODOLOGY:
$courseMethodology = $descriptionTool;
break;
case CCourseDescription::TYPE_COURSE_MATERIAL:
$courseMaterial = $descriptionTool;
break;
case CCourseDescription::TYPE_RESOURCES:
$courseResources = $descriptionTool;
break;
case CCourseDescription::TYPE_ASSESSMENT:
$courseAssessment = $descriptionTool;
break;
case CCourseDescription::TYPE_CUSTOM:
$courseCustom[] = $descriptionTool;
break;
}
}
$topics = [
'objectives' => $courseObjectives,
'topics' => $courseTopics,
'methodology' => $courseMethodology,
'material' => $courseMaterial,
'resources' => $courseResources,
'assessment' => $courseAssessment,
'custom' => array_reverse($courseCustom),
];
$subscriptionUser = CourseManager::is_user_subscribed_in_course($userId, $course->getCode());
$allowSubscribe = false;
if ($course->getSubscribe() || api_is_platform_admin()) {
$allowSubscribe = true;
}
$plugin = BuyCoursesPlugin::create();
$checker = $plugin->isEnabled();
$courseIsPremium = null;
if ($checker) {
$courseIsPremium = $plugin->getItemByProduct(
$courseId,
BuyCoursesPlugin::PRODUCT_TYPE_COURSE
);
}
$courseItem = [
'code' => $course->getCode(),
'title' => $course->getTitle(),
'description' => $courseDescription,
'image' => Container::getIllustrationRepository()->getIllustrationUrl($course, 'course_picture_medium'),
'syllabus' => $topics,
'tags' => $courseTags,
'teachers' => $teachersData,
'extra_fields' => $courseValues->getAllValuesForAnItem(
$course->getId(),
null,
true
),
'subscription' => $subscriptionUser,
];
$metaInfo = '<meta property="og:url" content="'.$urlCourse.'" />';
$metaInfo .= '<meta property="og:type" content="website" />';
$metaInfo .= '<meta property="og:title" content="'.$courseItem['title'].'" />';
$metaInfo .= '<meta property="og:description" content="'.strip_tags($courseDescription).'" />';
$metaInfo .= '<meta property="og:image" content="'.$courseItem['image'].'" />';
$htmlHeadXtra[] = $metaInfo;
$htmlHeadXtra[] = api_get_asset('readmore-js/readmore.js');
$template = new Template($course->getTitle(), true, true, false, true, false);
$template->assign('course', $courseItem);
$essence = new Essence\Essence();
$template->assign('essence', $essence);
$template->assign('is_premium', $courseIsPremium);
$template->assign('allow_subscribe', $allowSubscribe);
$template->assign('token', $token);
$template->assign('url', $urlCourse);
$layout = $template->get_template('course_home/about.tpl');
$content = $template->fetch($layout);
$template->assign('content', $content);
$template->display_one_col_template();

@ -1,189 +0,0 @@
{% autoescape false %}
<div id="about-course" class="about">
<div id="course-info-top">
<h2 class="session-title">{{ course.title }}</h2>
<div class="course-short">
<ul>
<li class="author">{{ "Professors"|get_lang }}</li>
{% for teacher in course.teachers %}
<li>{{ teacher.complete_name }} | </li>
{% endfor %}
</ul>
</div>
</div>
{% set course_video = '' %}
{% for extra_field in course.extra_fields %}
{% if extra_field.value.getField().getVariable() == 'video_url' %}
{% set course_video = extra_field.value.getValue() %}
{% endif %}
{% endfor %}
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-sm-5">
{% if course_video %}
<div class="course-video">
<div class="embed-responsive embed-responsive-16by9">
{{ essence.replace(course_video) }}
</div>
</div>
{% else %}
<div class="course-image">
<img src="{{ course.image }}" class="img-fluid" />
</div>
{% endif %}
{% if "display.hide_social_media_links" | api_get_setting == 'false' %}
<div class="share-social-media">
<ul class="sharing-buttons">
<li>
{{ "ShareWithYourFriends"|get_lang }}
</li>
<li>
<a href="https://www.facebook.com/sharer/sharer.php?u={{ url }}"
target="_blank" class="btn btn-facebook btn-inverse btn-sm">
<em class="fab fa-facebook-square"></em> Facebook
</a>
</li>
<li>
<a href="https://twitter.com/home?{{ {'status': course.title ~ ' ' ~ url }|url_encode }}"
target="_blank" class="btn btn-twitter btn-inverse btn-sm">
<em class="fab fa-twitter"></em> Twitter
</a>
</li>
<li>
<a href="https://www.linkedin.com/shareArticle?{{ {'mini': 'true', 'url': url , 'title': course.title }|url_encode }}"
target="_blank" class="btn btn-linkedin btn-inverse btn-sm">
<em class="fab fa-linkedin-in"></em> Linkedin
</a>
</li>
</ul>
</div>
{% endif %}
</div>
<div class="col-sm-7">
<div class="course-description">
{{ course.description }}
</div>
</div>
</div>
{% if course.tags %}
<ul class="list-inline course-tags d-flex flex-row bd-highlight mb-3">
<li class="px-2 bd-highlight">{{ 'Tags'|get_lang }} :</li>
{% for tag in course.tags %}
<li class="px-2 bd-highlight">
<span>{{ tag.getTag }}</span>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>
<section id="course-info-bottom" class="course">
<div class="row">
<div class="col-sm-8">
<div class="card">
<div class="card-body">
<h3 class="sub-title">{{ "CourseInformation"|get_lang }}</h3>
<div class="course-information">
{% for topic in course.syllabus %}
{% if topic.content != '' %}
<div class="topics">
<h4 class="title-info">
<em class="fa fa-book"></em> {{ topic.title }}
</h4>
<div class="content-info">
{{ topic.content }}
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="card">
<div class="card-body">
{% if is_premium == false %}
<h5>{{ 'CourseSubscription'|get_lang }}</h5>
<div class="session-subscribe">
{% if _u.logged == 0 %}
{% if 'allow_registration'|api_get_setting != 'false' %}
<a href="{{ _p.web_main ~ 'auth/inscription.php' ~ redirect_to_session }}" class="btn btn-success btn-block btn-lg">
<i class="fa fa-pencil" aria-hidden="true"></i> {{ 'SignUp'|get_lang }}
</a>
{% endif %}
{% elseif course.subscription %}
<a href="{{ _p.web }}courses/{{ course.code }}/index.php?id_session=0" class="btn btn-lg btn-success btn-block">{{ 'CourseHomepage'|get_lang }}</a>
{% else %}
<a href="{{ _p.web }}courses/{{ course.code }}/index.php?action=subscribe&sec_token={{ token }}" class="btn btn-lg btn-success btn-block">{{ 'Subscribe'|get_lang }}</a>
{% endif %}
</div>
{% else %}
<div class="session-price">
<div class="sale-price">
{{ 'SalePrice'|get_lang }}
</div>
<div class="price-text">
{{ is_premium.iso_code }} {{ is_premium.price }}
</div>
<div class="buy-box">
<a href="{{ _p.web }}plugin/buycourses/src/process.php?i={{ is_premium.product_id }}&t={{ is_premium.product_type }}" class="btn btn-lg btn-primary btn-block">{{ 'BuyNow'|get_lang }}</a>
</div>
</div>
{% endif %}
</div>
</div>
<div class="card">
<div class="card-body">
<div class="panel-teachers">
<h5 class="sub-title">{{ "Coaches"|get_lang }}</h5>
</div>
{% for teacher in course.teachers %}
<div class="coach-information">
<div class="coach-header">
<div class="coach-avatar">
<img class="img-fluid rounded-circle" src="{{ teacher.image }}" alt="{{ teacher.complete_name }}">
</div>
<div class="coach-title">
<h6>{{ teacher.complete_name }}</h6>
<p> {{ teacher.diploma }}</p>
</div>
</div>
<div class="open-area {{ course.teachers | length >= 2 ? 'open-more' : ' ' }}">
{{ teacher.openarea }}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</section>
</div>
<script>
$(function() {
$('.course-information').readmore({
speed: 100,
lessLink: '<a class="hide-content" href="#">{{ 'SetInvisible' | get_lang }}</a>',
moreLink: '<a class="read-more" href="#">{{ 'ReadMore' | get_lang }}</a>',
collapsedHeight: 730,
heightMargin: 100
});
$('.open-more').readmore({
speed: 100,
lessLink: '<a class="hide-content" href="#">{{ 'SetInvisible' | get_lang }}</a>',
moreLink: '<a class="read-more" href="#">{{ 'ReadMore' | get_lang }}</a>',
collapsedHeight: 90,
heightMargin: 20
});
});
</script>
{% endautoescape %}

@ -4,14 +4,17 @@
namespace Chamilo\CoreBundle\Controller;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ExtraField;
use Chamilo\CoreBundle\Form\Type\CourseType;
use Chamilo\CoreBundle\Framework\Container;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use \UserManager;
use \CCourseDescription;
/**
* Class CourseController.
@ -63,12 +66,151 @@ class CourseController extends AbstractController
}
/**
* @Route("/{cid}/welcome", name="chamilo_core_course_welcome")
* @Route("/{cid}/about", name="chamilo_core_course_about")
*
* @Entity("course", expr="repository.find(cid)")
*/
public function welcomeAction(Course $course): Response
public function aboutAction(Course $course): Response
{
return $this->render('@ChamiloTheme/Course/welcome.html.twig', ['course' => $course]);
$courseId = $course->getId();
$userId = $this->getUser()->getId();
$userRepo = \UserManager::getRepository();
$em = $this->getDoctrine()->getManager();
$fieldsRepo = $em->getRepository('ChamiloCoreBundle:ExtraField');
$fieldTagsRepo = $em->getRepository('ChamiloCoreBundle:ExtraFieldRelTag');
/** @var CCourseDescription $courseDescription */
$courseDescriptionTools = $em->getRepository('ChamiloCourseBundle:CCourseDescription')
->findBy(
[
'cId' => $course->getId(),
'sessionId' => 0,
],
[
'id' => 'DESC',
'descriptionType' => 'ASC',
]
);
$courseValues = new \ExtraFieldValue('course');
$urlCourse = api_get_path(WEB_PATH)."course/$courseId/about";
$courseTeachers = $course->getTeachers();
$teachersData = [];
/** @var CourseRelUser $teacherSubscription */
foreach ($courseTeachers as $teacherSubscription) {
$teacher = $teacherSubscription->getUser();
$userData = [
'complete_name' => UserManager::formatUserFullName($teacher),
'image' => UserManager::getUserPicture(
$teacher->getId(),
USER_IMAGE_SIZE_ORIGINAL
),
'diploma' => $teacher->getDiplomas(),
'openarea' => $teacher->getOpenarea(),
];
$teachersData[] = $userData;
}
$tagField = $fieldsRepo->findOneBy([
'extraFieldType' => ExtraField::COURSE_FIELD_TYPE,
'variable' => 'tags',
]);
$courseTags = [];
if (!is_null($tagField)) {
$courseTags = $fieldTagsRepo->getTags($tagField, $courseId);
}
$courseDescription = $courseObjectives = $courseTopics = $courseMethodology = $courseMaterial = $courseResources = $courseAssessment = '';
$courseCustom = [];
foreach ($courseDescriptionTools as $descriptionTool) {
switch ($descriptionTool->getDescriptionType()) {
case CCourseDescription::TYPE_DESCRIPTION:
$courseDescription = $descriptionTool->getContent();
break;
case CCourseDescription::TYPE_OBJECTIVES:
$courseObjectives = $descriptionTool;
break;
case CCourseDescription::TYPE_TOPICS:
$courseTopics = $descriptionTool;
break;
case CCourseDescription::TYPE_METHODOLOGY:
$courseMethodology = $descriptionTool;
break;
case CCourseDescription::TYPE_COURSE_MATERIAL:
$courseMaterial = $descriptionTool;
break;
case CCourseDescription::TYPE_RESOURCES:
$courseResources = $descriptionTool;
break;
case CCourseDescription::TYPE_ASSESSMENT:
$courseAssessment = $descriptionTool;
break;
case CCourseDescription::TYPE_CUSTOM:
$courseCustom[] = $descriptionTool;
break;
}
}
$topics = [
'objectives' => $courseObjectives,
'topics' => $courseTopics,
'methodology' => $courseMethodology,
'material' => $courseMaterial,
'resources' => $courseResources,
'assessment' => $courseAssessment,
'custom' => array_reverse($courseCustom),
];
$subscriptionUser = \CourseManager::is_user_subscribed_in_course($userId, $course->getCode());
$allowSubscribe = false;
if ($course->getSubscribe() || api_is_platform_admin()) {
$allowSubscribe = true;
}
$plugin = \BuyCoursesPlugin::create();
$checker = $plugin->isEnabled();
$courseIsPremium = null;
if ($checker) {
$courseIsPremium = $plugin->getItemByProduct(
$courseId,
\BuyCoursesPlugin::PRODUCT_TYPE_COURSE
);
}
$image = Container::getIllustrationRepository()->getIllustrationUrl($course, 'course_picture_medium');
$params = [
'course' => $course,
'description' => $courseDescription,
'image' => $image,
'syllabus' => $topics,
'tags' => $courseTags,
'teachers' => $teachersData,
'extra_fields' => $courseValues->getAllValuesForAnItem(
$course->getId(),
null,
true
),
'subscription' => $subscriptionUser,
];
$metaInfo = '<meta property="og:url" content="'.$urlCourse.'" />';
$metaInfo .= '<meta property="og:type" content="website" />';
$metaInfo .= '<meta property="og:title" content="'.$course->getTitle().'" />';
$metaInfo .= '<meta property="og:description" content="'.strip_tags($courseDescription).'" />';
$metaInfo .= '<meta property="og:image" content="'.$image.'" />';
$htmlHeadXtra[] = $metaInfo;
$htmlHeadXtra[] = api_get_asset('readmore-js/readmore.js');
return $this->render('@ChamiloTheme/Course/about.html.twig', [$params]);
}
}

@ -0,0 +1,192 @@
{% extends "@ChamiloTheme/Layout/layout_one_col.html.twig" %}
{% block content %}
{% autoescape false %}
<div id="about-course" class="about">
<div id="course-info-top">
<h2 class="session-title">{{ course.title }}</h2>
<div class="course-short">
<ul>
<li class="author">{{ "Professors"|trans }}</li>
{% for teacher in teachers %}
<li>{{ teacher.complete_name }} | </li>
{% endfor %}
</ul>
</div>
</div>
{% set course_video = '' %}
{% for extra_field in extra_fields %}
{% if extra_field.value.getField().getVariable() == 'video_url' %}
{% set course_video = extra_field.value.getValue() %}
{% endif %}
{% endfor %}
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-sm-5">
{% if course_video %}
<div class="course-video">
<div class="embed-responsive embed-responsive-16by9">
{{ essence.replace(course_video) }}
</div>
</div>
{% else %}
<div class="course-image">
<img src="{{ image }}" class="img-fluid" />
</div>
{% endif %}
{% if "display.hide_social_media_links" | api_get_setting == 'false' %}
<div class="share-social-media">
<ul class="sharing-buttons">
<li>
{{ "ShareWithYourFriends"|trans }}
</li>
<li>
<a href="https://www.facebook.com/sharer/sharer.php?u={{ url }}"
target="_blank" class="btn btn-facebook btn-inverse btn-sm">
<em class="fab fa-facebook-square"></em> Facebook
</a>
</li>
<li>
<a href="https://twitter.com/home?{{ {'status': course.title ~ ' ' ~ url }|url_encode }}"
target="_blank" class="btn btn-twitter btn-inverse btn-sm">
<em class="fab fa-twitter"></em> Twitter
</a>
</li>
<li>
<a href="https://www.linkedin.com/shareArticle?{{ {'mini': 'true', 'url': url , 'title': course.title }|url_encode }}"
target="_blank" class="btn btn-linkedin btn-inverse btn-sm">
<em class="fab fa-linkedin-in"></em> Linkedin
</a>
</li>
</ul>
</div>
{% endif %}
</div>
<div class="col-sm-7">
<div class="course-description">
{{ description }}
</div>
</div>
</div>
{% if tags %}
<ul class="list-inline course-tags d-flex flex-row bd-highlight mb-3">
<li class="px-2 bd-highlight">{{ 'Tags'|trans }} :</li>
{% for tag in tags %}
<li class="px-2 bd-highlight">
<span>{{ tag.getTag }}</span>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
</div>
<section id="course-info-bottom" class="course">
<div class="row">
<div class="col-sm-8">
<div class="card">
<div class="card-body">
<h3 class="sub-title">{{ "CourseInformation"|trans }}</h3>
<div class="course-information">
{% for topic in syllabus %}
{% if topic.content != '' %}
<div class="topics">
<h4 class="title-info">
<em class="fa fa-book"></em> {{ topic.title }}
</h4>
<div class="content-info">
{{ topic.content }}
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="card">
<div class="card-body">
{% if is_premium == false %}
<h5>{{ 'CourseSubscription'|trans }}</h5>
<div class="session-subscribe">
{% if _u.logged == 0 %}
{% if 'allow_registration'|api_get_setting != 'false' %}
<a href="{{ _p.web_main ~ 'auth/inscription.php' ~ redirect_to_session }}" class="btn btn-success btn-block btn-lg">
<i class="fa fa-pencil" aria-hidden="true"></i> {{ 'SignUp'|trans }}
</a>
{% endif %}
{% elseif subscription %}
<a href="{{ _p.web }}courses/{{ course.code }}/index.php?id_session=0" class="btn btn-lg btn-success btn-block">{{ 'CourseHomepage'|trans }}</a>
{% else %}
<a href="{{ _p.web }}courses/{{ course.code }}/index.php?action=subscribe&sec_token={{ token }}" class="btn btn-lg btn-success btn-block">{{ 'Subscribe'|trans }}</a>
{% endif %}
</div>
{% else %}
<div class="session-price">
<div class="sale-price">
{{ 'SalePrice'|trans }}
</div>
<div class="price-text">
{{ is_premium.iso_code }} {{ is_premium.price }}
</div>
<div class="buy-box">
<a href="{{ _p.web }}plugin/buycourses/src/process.php?i={{ is_premium.product_id }}&t={{ is_premium.product_type }}" class="btn btn-lg btn-primary btn-block">{{ 'BuyNow'|trans }}</a>
</div>
</div>
{% endif %}
</div>
</div>
<div class="card">
<div class="card-body">
<div class="panel-teachers">
<h5 class="sub-title">{{ "Coaches"|trans }}</h5>
</div>
{% for teacher in teachers %}
<div class="coach-information">
<div class="coach-header">
<div class="coach-avatar">
<img class="img-fluid rounded-circle" src="{{ teacher.image }}" alt="{{ teacher.complete_name }}">
</div>
<div class="coach-title">
<h6>{{ teacher.complete_name }}</h6>
<p> {{ teacher.diploma }}</p>
</div>
</div>
<div class="open-area {{ teachers | length >= 2 ? 'open-more' : ' ' }}">
{{ teacher.openarea }}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</section>
</div>
<script>
$(function() {
$('.course-information').readmore({
speed: 100,
lessLink: '<a class="hide-content" href="#">{{ 'SetInvisible' | trans }}</a>',
moreLink: '<a class="read-more" href="#">{{ 'ReadMore' | trans }}</a>',
collapsedHeight: 730,
heightMargin: 100
});
$('.open-more').readmore({
speed: 100,
lessLink: '<a class="hide-content" href="#">{{ 'SetInvisible' | trans }}</a>',
moreLink: '<a class="read-more" href="#">{{ 'ReadMore' | trans }}</a>',
collapsedHeight: 90,
heightMargin: 20
});
});
</script>
{% endautoescape %}
{% endblock %}
Loading…
Cancel
Save