chamilo/chamilo-lms

View on GitHub
public/main/lp/lp_final_item.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/* For licensing terms, see /license.txt */

use Chamilo\CoreBundle\Framework\Container;

/**
 * Print a learning path finish page with details.
 *
 * @author Jose Loguercio <jose.loguercio@beeznest.com>
 */
$_in_course = true;

require_once __DIR__.'/../inc/global.inc.php';

$current_course_tool = TOOL_GRADEBOOK;

// Make sure no anonymous user gets here without permission
api_protect_course_script(true);

// Get environment variables
$courseCode = api_get_course_id();
$courseId = api_get_course_int_id();
$userId = api_get_user_id();
$sessionId = api_get_session_id();
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
$lpId = isset($_GET['lp_id']) ? intval($_GET['lp_id']) : 0;

// This page can only be shown from inside a learning path
if (!$id && !$lpId) {
    Display::return_message(get_lang('The file was not found'), 'warning');
    exit;
}

// Certificate and Skills Premium with Service check
$plugin = BuyCoursesPlugin::create();
$checker = $plugin->isEnabled() && $plugin->get('include_services');

if ($checker) {
    $userServiceSale = $plugin->getServiceSales(
        $userId,
        BuyCoursesPlugin::SERVICE_STATUS_COMPLETED,
        BuyCoursesPlugin::SERVICE_TYPE_LP_FINAL_ITEM,
        $lpId
    );

    if (empty($userServiceSale)) {
        // Instance a new template : No page tittle, No header, No footer
        $tpl = new Template(null, false, false);
        $url = api_get_path(WEB_PLUGIN_PATH).'buycourses/src/service_catalog.php';
        $content = sprintf(
            Display::return_message(
                get_lang('If you want to get the certificate and/or skills associated with this course, you need to buy the certificate service. You can go to the services catalog by clicking this link: %s'),
                'normal',
                false
            ),
            '<a href="'.$url.'">'.$url.'</a>'
        );
        $tpl->assign('content', $content);
        $tpl->display_blank_template();
        exit;
    }
}

// Initialize variables required for the template
$downloadCertificateLink = '';
$viewCertificateLink = '';
$badgeLink = '';
$finalItemTemplate = '';

// Check prerequisites and total completion of the learning path
$lpEntity = api_get_lp_entity($lpId);
$lp = new Learnpath($lpEntity, [], $userId);
$count = $lp->getTotalItemsCountWithoutDirs();
$completed = $lp->get_complete_items_count(true);
$currentItemId = $lp->get_current_item_id();
$currentItem = $lp->items[$currentItemId];
$currentItemStatus = $currentItem->get_status();
$accessGranted = false;

if ((0 == $count - $completed) ||
    (1 == $count - $completed && ('incomplete' == $currentItemStatus) || ('not attempted' == $currentItemStatus))
) {
    if ($lp->prerequisites_match($currentItemId)) {
        $accessGranted = true;
    }
}
// Update the progress in DB from the items completed
$lp->save_last();

// unset the (heavy) lp object to free memory - we don't need it anymore
unset($lp);
unset($currentItem);

// If for some reason we consider the requirements haven't been completed yet,
// show a prerequisites warning
if (false == $accessGranted) {
    echo Display::return_message(
        get_lang(
            'This learning object cannot display because the course prerequisites are not completed. This happens when a course imposes that you follow it step by step or get a minimum score in tests before you reach the next steps.'
        ),
        'warning'
    );
    $finalItemTemplate = '';
} else {
    $catLoad = Category::load(
        null,
        null,
        $courseId,
        null,
        null,
        $sessionId,
        'ORDER BY id'
    );
    // If not gradebook has been defined
    if (empty($catLoad)) {
        $finalItemTemplate = generateLPFinalItemTemplate(
            $id,
            $courseCode,
            $sessionId,
            $downloadCertificateLink,
            $badgeLink
        );
    } else {
        // A gradebook was found, proceed...
        /** @var Category $category */
        $category = $catLoad[0];
        $categoryId = $category->get_id();
        $link = LinkFactory::load(
            null,
            null,
            $lpId,
            null,
            $courseId,
            $categoryId
        );

        if ($link) {
            $cat = new Category();
            $show_message = Category::show_message_resource_delete($courseId);
            $repo = Container::getGradeBookCategoryRepository();
            $category = $repo->find($categoryId);

            if (empty($show_message) && !api_is_allowed_to_edit() && !api_is_excluded_user_type()) {
                $certificate = Category::generateUserCertificate($category, $userId);

                if (!empty($certificate['pdf_url']) ||
                    !empty($certificate['badge_link'])
                ) {
                    if (is_array($certificate)) {
                        $downloadCertificateLink = Category::getDownloadCertificateBlock($certificate);
                    }

                    if (is_array($certificate) && isset($certificate['badge_link'])) {
                        $courseId = api_get_course_int_id();
                        $badgeLink = generateLPFinalItemTemplateBadgeLinks(
                            $userId,
                            $courseId,
                            $sessionId
                        );
                    }
                }

                $currentScore = Category::getCurrentScore($userId, $category, true);
                Category::registerCurrentScore($currentScore, $userId, $categoryId);
            }
        }

        $finalItemTemplate = generateLPFinalItemTemplate(
            $id,
            $courseCode,
            $sessionId,
            $downloadCertificateLink,
            $badgeLink
        );

        if (!$finalItemTemplate) {
            echo Display::return_message(get_lang('The file was not found'), 'warning');
        }
    }
}

// Instance a new template : No page tittle, No header, No footer
$tpl = new Template(null, false, false);
$tpl->assign('content', $finalItemTemplate);
$tpl->display_blank_template();

// A few functions used only here...

/**
 * Return a HTML string to show as final document in learning path.
 *
 * @param int    $lpItemId
 * @param string $courseCode
 * @param int    $sessionId
 * @param string $downloadCertificateLink
 * @param string $badgeLink
 *
 * @return mixed|string
 */
function generateLPFinalItemTemplate(
    $lpItemId,
    $courseCode,
    $sessionId = 0,
    $downloadCertificateLink = '',
    $badgeLink = ''
) {
    $document = Container::getDocumentRepository()->find($lpItemId);
    $finalItemTemplate = Container::getDocumentRepository()->getResourceFileContent($document);

    $finalItemTemplate = str_replace('((certificate))', $downloadCertificateLink, $finalItemTemplate);
    $finalItemTemplate = str_replace('((skill))', $badgeLink, $finalItemTemplate);

    return $finalItemTemplate;
}

/**
 * Return HTML string with badges list.
 *
 * @param int $userId
 * @param int $courseId
 * @param int $sessionId
 *
 * @return string HTML string for badges
 */
function generateLPFinalItemTemplateBadgeLinks($userId, $courseId, $sessionId = 0)
{
    $em = Database::getManager();
    $skillRelUser = new SkillRelUserModel();
    $userSkills = $skillRelUser->getUserSkills($userId, $courseId, $sessionId);
    $skillList = '';
    $badgeLink = '';

    if ($userSkills) {
        foreach ($userSkills as $userSkill) {
            $skill = $em->find('ChamiloCoreBundle:Skill', $userSkill['skill_id']);
            if (!$skill) {
                continue;
            }
            $skillList .= "
                <div class='row'>
                    <div class='col-md-2 col-xs-4'>
                        <div class='thumbnail'>
                          <img class='skill-badge-img' src='".SkillModel::getWebIconPath($skill)."' >
                        </div>
                    </div>
                    <div class='col-md-8 col-xs-8'>
                        <h5><b>".$skill->getTitle()."</b></h5>
                        ".$skill->getDescription()."
                    </div>
                    <div class='col-md-2 col-xs-12'>
                        <h5><b>".get_lang('Share with your friends')."</b></h5>
                        <a href='http://www.facebook.com/sharer.php?u=".api_get_path(WEB_PATH)."badge/".$skill->getId()."/user/".$userId."' target='_new'>
                            <em class='fa fa-facebook-square fa-3x text-info' aria-hidden='true'></em>
                        </a>
                        <a href='https://twitter.com/home?status=".sprintf(get_lang('I have achieved skill %s on %s'), '"'.$skill->getTitle().'"', api_get_setting('siteName')).' - '.api_get_path(WEB_PATH).'badge/'.$skill->getId().'/user/'.$userId."' target='_new'>
                            <em class='fa fa-twitter-square fa-3x text-light' aria-hidden='true'></em>
                        </a>
                    </div>
                </div>
            ";
        }

        if (!empty($skillList)) {
            $badgeLink .= "
            <div class='panel panel-default'>
                <div class='panel-body'>
                    <h3 class='text-center'>".get_lang('Additionally, you have achieved the following skills')."</h3>
                    $skillList
                </div>
            </div>
        ";
        }
    }

    return $badgeLink;
}