@ -3,6 +3,7 @@
use Chamilo\PluginBundle\Entity\LtiProvider\Platform;
use Chamilo\PluginBundle\Entity\LtiProvider\PlatformKey;
use Chamilo\PluginBundle\Entity\LtiProvider\Result;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\Tools\SchemaTool;
@ -14,6 +15,9 @@ use Doctrine\ORM\Tools\SchemaTool;
class LtiProviderPlugin extends Plugin
{
public const TABLE_PLATFORM = 'plugin_lti_provider_platform';
public const LAUNCH_PATH = 'lti_provider/tool/start.php';
public const LOGIN_PATH = 'lti_provider/tool/login.php';
public const REDIRECT_PATH = 'lti_provider/tool/start.php';
public $isAdminPlugin = true;
@ -24,48 +28,87 @@ class LtiProviderPlugin extends Plugin
$message = Display::return_message($this->get_lang('Description'));
$launchUrlHtml = '';
$loginUrlHtml = '';
$redirectUrlHtml = '';
if ($this->areTablesCreated()) {
$publicKey = $this->getPublicKey();
$pkHtml = '< div class = "form-group" >
< label for = "lti_provider_public_key" class = "col-sm-2 control-label" > '
.$this->get_lang('PublicKey').'< / label >
< div class = "col-sm-8" >
< pre > '.$publicKey.'< / pre >
< / div >
< div class = "col-sm-2" > < / div >
< / div > ';
$pkHtml = $this->getSettingHtmlReadOnly(
$this->get_lang('PublicKey'),
'public_key',
$publicKey
);
$launchUrlHtml = $this->getSettingHtmlReadOnly(
$this->get_lang('LaunchUrl'),
'launch_url',
api_get_path(WEB_PLUGIN_PATH).self::LAUNCH_PATH
);
$loginUrlHtml = $this->getSettingHtmlReadOnly(
$this->get_lang('LoginUrl'),
'login_url',
api_get_path(WEB_PLUGIN_PATH).self::LOGIN_PATH
);
$redirectUrlHtml = $this->getSettingHtmlReadOnly(
$this->get_lang('RedirectUrl'),
'redirect_url',
api_get_path(WEB_PLUGIN_PATH).self::REDIRECT_PATH
);
} else {
$pkHtml = $this->get_lang('GenerateKeyPairInfo');
}
$settings = [
$message => 'html',
'name' => 'text',
'launch_url' => 'text',
'login_url' => 'text',
'redirect_url' => 'text',
'name' => 'hidden ',
$launchUrlHtml => 'html ',
$loginUrlHtml => 'html ',
$redirectUrlHtml => 'html ',
$pkHtml => 'html',
'enabled' => 'boolean',
];
parent::__construct($version, $author, $settings);
}
/**
* Get the value by default and readonly for the configuration html form.
*
* @param $label
* @param $id
* @param $value
*
* @return string
*/
public function getSettingHtmlReadOnly($label, $id, $value)
{
$html = '< div class = "form-group" >
< label for = "lti_provider_'.$id.'" class = "col-sm-2 control-label" > '
.$label.'< / label >
< div class = "col-sm-8" >
< pre > '.$value.'< / pre >
< / div >
< div class = "col-sm-2" > < / div >
< input type = "hidden" name = "'.$id.'" value = "'.$value.'" / >
< / div > ';
return $html;
}
/**
* Get a selectbox with quizzes in courses , used for a tool provider.
*
* @param null $issuer
* @param null $clientId
*
* @return string
*/
public function getQuizzesSelect($issuer = null)
public function getQuizzesSelect($clientId = null)
{
$courses = CourseManager::get_courses_list();
$toolProvider = $this->getToolProvider($issuer);
$htmlcontent = '< div class = "form-group" >
$toolProvider = $this->getToolProvider($clientId );
$htmlcontent = '< div class = "form-group select-tool" id = "select-quiz " >
< label for = "lti_provider_create_platform_kid" class = "col-sm-2 control-label" > '.$this->get_lang('ToolProvider').'< / label >
< div class = "col-sm-8" >
< select name = "tool_provider" > ';
< select name = "tool_provider" class = "sbox-tool" id = "sbox-tool-quiz" disabled = "disabled" > ';
$htmlcontent .= '< option value = "" > -- '.$this->get_lang('SelectOneActivity').' --< / option > ';
foreach ($courses as $course) {
$courseInfo = api_get_course_info($course['code']);
@ -91,6 +134,47 @@ class LtiProviderPlugin extends Plugin
return $htmlcontent;
}
/**
* Get a selectbox with quizzes in courses , used for a tool provider.
*
* @param null $clientId
*
* @return string
*/
public function getLearnPathsSelect($clientId = null)
{
$courses = CourseManager::get_courses_list();
$toolProvider = $this->getToolProvider($clientId);
$htmlcontent = '< div class = "form-group select-tool" id = "select-lp" style = "display:none" >
< label for = "lti_provider_create_platform_kid" class = "col-sm-2 control-label" > '.$this->get_lang('ToolProvider').'< / label >
< div class = "col-sm-8" >
< select name = "tool_provider" class = "sbox-tool" id = "sbox-tool-lp" disabled = "disabled" > ';
$htmlcontent .= '< option value = "" > -- '.$this->get_lang('SelectOneActivity').' --< / option > ';
foreach ($courses as $course) {
$courseInfo = api_get_course_info($course['code']);
$optgroupLabel = "{$course['title']} : ".get_lang('Learnpath');
$htmlcontent .= '< optgroup label = "'.$optgroupLabel.'" > ';
$list = new LearnpathList(
api_get_user_id(),
$courseInfo
);
$flatList = $list->get_flat_list();
foreach ($flatList as $id => $details) {
$selectValue = "{$course['code']}@@lp-{$id}";
$htmlcontent .= '< option value = "'.$selectValue.'" ' . ( $ toolProvider = = $ selectValue ? ' selected = "selected" ' : ' ' ) . ' > '.Security::remove_XSS($details['lp_name']).'< / option > ';
}
$htmlcontent .= '< / optgroup > ';
}
$htmlcontent .= "< / select > ";
$htmlcontent .= ' < / div >
< div class = "col-sm-2" > < / div >
< / div > ';
return $htmlcontent;
}
/**
* Get the public key.
*/
@ -108,15 +192,65 @@ class LtiProviderPlugin extends Plugin
return $publicKey;
}
public function getToolLearnPathResult($startDate, $endDate)
{
$dql = "SELECT
a.issuer,
count(DISTINCT(a.userId)) as cnt
FROM
ChamiloPluginBundle:LtiProvider\Result a
WHERE
a.toolName = 'lp' AND
a.startDate BETWEEN '$startDate' AND '$endDate'
GROUP BY a.issuer";
$qb = Database::getManager()->createQuery($dql);
$issuersValues = $qb->getResult();
$result = [];
if (!empty($issuersValues)) {
foreach ($issuersValues as $issuerValue) {
$issuer = $issuerValue['issuer'];
$dqlLp = "SELECT
a.toolId,
a.userId
FROM
ChamiloPluginBundle:LtiProvider\Result a
WHERE
a.toolName = 'lp' AND
a.startDate BETWEEN '$startDate' AND '$endDate' AND
a.issuer = '".$issuer."'
GROUP BY a.toolId, a.userId";
$qbLp = Database::getManager()->createQuery($dqlLp);
$lpValues = $qbLp->getResult();
$lps = [];
foreach ($lpValues as $lp) {
$uinfo = api_get_user_info($lp['userId']);
$lps[$lp['toolId']]['users'][$lp['userId']] = [
'firstname' => $uinfo['firstname'],
'lastname' => $uinfo['lastname'],
];
}
$result[] = [
'issuer' => $issuer,
'count_iss_users' => $issuerValue['cnt'],
'learnpaths' => $lps,
];
}
}
return $result;
}
/**
* Get the tool provider.
*/
public function getToolProvider($issuer): string
public function getToolProvider($clientId ): string
{
$toolProvider = '';
$platform = Database::getManager()
->getRepository('ChamiloPluginBundle:LtiProvider\Platform')
->findOneBy(['issuer' => $issuer]);
->findOneBy(['clientId' => $clientId ]);
if ($platform) {
$toolProvider = $platform->getToolProvider();
@ -125,9 +259,9 @@ class LtiProviderPlugin extends Plugin
return $toolProvider;
}
public function getToolProviderVars($issuer ): array
public function getToolProviderVars($clientId ): array
{
$toolProvider = $this->getToolProvider($issuer );
$toolProvider = $this->getToolProvider($clientId );
list($courseCode, $tool) = explode('@@', $toolProvider);
list($toolName, $toolId) = explode('-', $tool);
$vars = ['courseCode' => $courseCode, 'toolName' => $toolName, 'toolId' => $toolId];
@ -172,7 +306,7 @@ class LtiProviderPlugin extends Plugin
{
$em = Database::getManager();
if ($em->getConnection()->getSchemaManager()->tablesExist(['sfu_post' ])) {
if ($em->getConnection()->getSchemaManager()->tablesExist([self::TABLE_PLATFORM ])) {
return;
}
@ -181,6 +315,7 @@ class LtiProviderPlugin extends Plugin
[
$em->getClassMetadata(Platform::class),
$em->getClassMetadata(PlatformKey::class),
$em->getClassMetadata(Result::class),
]
);
}
@ -234,7 +369,7 @@ class LtiProviderPlugin extends Plugin
{
$em = Database::getManager();
if (!$em->getConnection()->getSchemaManager()->tablesExist(['sfu_post' ])) {
if (!$em->getConnection()->getSchemaManager()->tablesExist([self::TABLE_PLATFORM ])) {
return;
}
@ -243,6 +378,7 @@ class LtiProviderPlugin extends Plugin
[
$em->getClassMetadata(Platform::class),
$em->getClassMetadata(PlatformKey::class),
$em->getClassMetadata(Result::class),
]
);
}
@ -255,6 +391,52 @@ class LtiProviderPlugin extends Plugin
}
}
public function saveResult($values, $ltiLaunchId = null)
{
$em = Database::getManager();
if (!empty($ltiLaunchId)) {
$repo = $em->getRepository(Result::class);
/** @var Result $objResult */
$objResult = $repo->findOneBy(
[
'ltiLaunchId' => $ltiLaunchId,
]
);
if ($objResult) {
$objResult->setScore($values['score']);
$objResult->setProgress($values['progress']);
$objResult->setDuration($values['duration']);
$em->persist($objResult);
$em->flush();
return $objResult->getId();
}
} else {
$objResult = new Result();
$objResult
->setIssuer($values['issuer'])
->setUserId($values['user_id'])
->setClientUId($values['client_uid'])
->setCourseCode($values['course_code'])
->setToolId($values['tool_id'])
->setToolName($values['tool_name'])
->setScore(0)
->setProgress(0)
->setDuration(0)
->setStartDate(new DateTime())
->setUserIp(api_get_real_ip())
->setLtiLaunchId($values['lti_launch_id'])
;
$em->persist($objResult);
$em->flush();
return $objResult->getId();
}
return false;
}
private function areTablesCreated(): bool
{
$entityManager = Database::getManager();