Actualización

This commit is contained in:
Xes
2025-04-10 12:36:07 +02:00
parent 1da7c3f3b9
commit 4aff98e77b
3147 changed files with 320647 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Xabbuh\XApi\Model\Activity;
/**
* Class BaseActivity.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
abstract class BaseActivity
{
/**
* @var \Chamilo\UserBundle\Entity\User
*/
protected $user;
/**
* @var \Chamilo\CoreBundle\Entity\Course|null
*/
protected $course;
/**
* @var \Chamilo\CoreBundle\Entity\Session|null
*/
protected $session;
abstract public function generate(): Activity;
protected function generateIri(string $path, string $resource, array $params = []): string
{
$cidReq = api_get_cidreq();
$url = api_get_path($path).$resource;
if ($params) {
$url .= '?'.http_build_query($params).'&';
} elseif (empty($params) && $cidReq) {
$url .= '?';
}
if ($cidReq) {
$url .= $cidReq;
}
return $url;
}
}

View File

@@ -0,0 +1,40 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class Course.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class Course extends BaseActivity
{
public function generate(): Activity
{
$course = api_get_course_entity();
$session = api_get_session_entity();
$languageIso = api_get_language_isocode($course->getCourseLanguage());
$courseUrl = api_get_course_url(
$course->getCode(),
$session ? $session->getId() : 0
);
return new Activity(
IRI::fromString($courseUrl),
new Definition(
LanguageMap::create([$languageIso => $course->getTitle()]),
null,
IRI::fromString('http://id.tincanapi.com/activitytype/lms/course')
)
);
}
}

View File

@@ -0,0 +1,53 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Chamilo\CourseBundle\Entity\CLp;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class LearningPath.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class LearningPath extends BaseActivity
{
/**
* @var \Chamilo\CourseBundle\Entity\CLp
*/
private $lp;
public function __construct(CLp $lp)
{
$this->lp = $lp;
}
public function generate(): Activity
{
$lanIso = api_get_language_isocode();
$iri = $this->generateIri(
WEB_CODE_PATH,
'lp/lp_controller.php',
[
'action' => 'view',
'lp_id' => $this->lp->getId(),
'isStudentView' => 'true',
]
);
return new Activity(
IRI::fromString($iri),
new Definition(
LanguageMap::create([$lanIso => $this->lp->getName()]),
null,
IRI::fromString('http://adlnet.gov/expapi/activities/lesson')
)
);
}
}

View File

@@ -0,0 +1,54 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Chamilo\CourseBundle\Entity\CLpItem;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class LearningPathItem.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class LearningPathItem extends BaseActivity
{
/**
* @var \Chamilo\CourseBundle\Entity\CLpItem
*/
private $lpItem;
public function __construct(CLpItem $lpItem)
{
$this->lpItem = $lpItem;
}
public function generate(): Activity
{
$langIso = api_get_language_isocode();
$iri = $this->generateIri(
WEB_CODE_PATH,
'lp/lp_controller.php',
[
'action' => 'view',
'lp_id' => $this->lpItem->getLpId(),
'isStudentView' => 'true',
'lp_item' => $this->lpItem->getId(),
]
);
return new Activity(
IRI::fromString($iri),
new Definition(
LanguageMap::create([$langIso => $this->lpItem->getTitle()]),
null,
IRI::fromString('http://id.tincanapi.com/activitytype/resource')
)
);
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Chamilo\UserBundle\Entity\User;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
class Portfolio extends BaseActivity
{
/** @var User */
private $owner;
public function __construct(User $owner)
{
$this->owner = $owner;
}
public function generate(): Activity
{
$langIso = api_get_language_isocode();
$iri = $this->generateIri(
WEB_CODE_PATH,
'portfolio/index.php',
[
'action' => 'list',
'user' => $this->owner->getId(),
]
);
return new Activity(
IRI::fromString($iri),
new Definition(
LanguageMap::create(
[
$langIso => sprintf(
get_lang('XUserPortfolioItems'),
$this->owner->getCompleteNameWithUsername()
),
]
),
null,
IRI::fromString('http://id.tincanapi.com/activitytype/collection-simple')
)
);
}
}

View File

@@ -0,0 +1,58 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Chamilo\CoreBundle\Entity\PortfolioCategory as PortfolioCategoryEntity;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class PortfolioCategory.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class PortfolioCategory extends BaseActivity
{
/**
* @var \Chamilo\CoreBundle\Entity\PortfolioCategory
*/
private $category;
public function __construct(PortfolioCategoryEntity $category)
{
$this->category = $category;
}
public function generate(): Activity
{
$iri = $this->generateIri(
WEB_PATH,
'xapi/portfolio/',
[
'user' => $this->category->getUser()->getId(),
'category' => $this->category->getId(),
]
);
$langIso = api_get_language_isocode();
$categoryDescription = $this->category->getDescription();
$definitionDescription = $categoryDescription
? LanguageMap::create([$langIso => $categoryDescription])
: null;
return new Activity(
IRI::fromString($iri),
new Definition(
LanguageMap::create([$langIso => $this->category->getTitle()]),
$definitionDescription,
IRI::fromString('http://id.tincanapi.com/activitytype/category')
)
);
}
}

View File

@@ -0,0 +1,50 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Chamilo\CoreBundle\Entity\PortfolioComment as PortfolioCommentEntity;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
/**
* Class PortfolioComment.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class PortfolioComment extends BaseActivity
{
/**
* @var \Chamilo\CoreBundle\Entity\PortfolioComment
*/
private $comment;
public function __construct(PortfolioCommentEntity $comment)
{
$this->comment = $comment;
}
public function generate(): Activity
{
$iri = $this->generateIri(
WEB_CODE_PATH,
'portfolio/index.php',
[
'action' => 'view',
'id' => $this->comment->getItem()->getId(),
'comment' => $this->comment->getId(),
]
);
return new Activity(
IRI::fromString($iri),
new Definition(
null,
null,
IRI::fromString('http://activitystrea.ms/schema/1.0/comment')
)
);
}
}

View File

@@ -0,0 +1,49 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Chamilo\CoreBundle\Entity\Portfolio;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class PortfolioItem.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class PortfolioItem extends BaseActivity
{
/**
* @var \Chamilo\CoreBundle\Entity\Portfolio
*/
private $item;
public function __construct(Portfolio $item)
{
$this->item = $item;
}
public function generate(): Activity
{
$langIso = api_get_language_isocode();
$iri = $this->generateIri(
WEB_CODE_PATH,
'portfolio/index.php',
['action' => 'view', 'id' => $this->item->getId()]
);
return new Activity(
IRI::fromString($iri),
new Definition(
LanguageMap::create([$langIso => $this->item->getTitle()]),
null,
IRI::fromString('http://activitystrea.ms/schema/1.0/article')
)
);
}
}

View File

@@ -0,0 +1,57 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Chamilo\CourseBundle\Entity\CQuiz;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class Quiz.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class Quiz extends BaseActivity
{
/**
* @var \Chamilo\CourseBundle\Entity\CQuiz
*/
private $quiz;
public function __construct(CQuiz $quiz)
{
$this->quiz = $quiz;
}
public function generate(): Activity
{
$langIso = api_get_language_isocode();
$iri = $this->generateIri(
WEB_CODE_PATH,
'exercise/overview.php',
['exerciseId' => $this->quiz->getId()]
);
$definitionDescription = null;
if ($this->quiz->getDescription()) {
$definitionDescription = LanguageMap::create(
[$langIso => $this->quiz->getDescription()]
);
}
return new Activity(
IRI::fromString($iri),
new Definition(
LanguageMap::create([$langIso => $this->quiz->getTitle()]),
$definitionDescription,
IRI::fromString('http://adlnet.gov/expapi/activities/assessment')
)
);
}
}

View File

@@ -0,0 +1,170 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Answer;
use Chamilo\CourseBundle\Entity\CQuizQuestion;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Interaction\ChoiceInteractionDefinition;
use Xabbuh\XApi\Model\Interaction\InteractionComponent;
use Xabbuh\XApi\Model\Interaction\LongFillInInteractionDefinition;
use Xabbuh\XApi\Model\Interaction\MatchingInteractionDefinition;
use Xabbuh\XApi\Model\Interaction\OtherInteractionDefinition;
use Xabbuh\XApi\Model\Interaction\SequencingInteractionDefinition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class QuizQuestion.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class QuizQuestion extends BaseActivity
{
private $question;
public function __construct(CQuizQuestion $question)
{
$this->question = $question;
}
public function generate(): Activity
{
$iri = $this->generateIri(
WEB_CODE_PATH,
'xapi/quiz/',
['question' => $this->question->getId()]
);
return new Activity(
IRI::fromString($iri),
$this->generateActivityDefinitionFromQuestionType()
);
}
/**
* @return \Xabbuh\XApi\Model\Interaction\InteractionDefinition
*/
private function generateActivityDefinitionFromQuestionType()
{
$languageIso = api_get_language_isocode();
$courseId = api_get_course_int_id();
$questionTitle = strip_tags($this->question->getQuestion());
$questionTitle = trim($questionTitle);
$questionDescription = strip_tags($this->question->getDescription());
$questionDescription = trim($questionDescription);
$titleMap = LanguageMap::create([$languageIso => $questionTitle]);
$descriptionMap = $questionDescription ? LanguageMap::create([$languageIso => $questionDescription]) : null;
$objAnswer = new Answer($this->question->getId(), $courseId);
$objAnswer->read();
$type = IRI::fromString('http://adlnet.gov/expapi/activities/question');
switch ($this->question->getType()) {
case MULTIPLE_ANSWER:
case UNIQUE_ANSWER:
case UNIQUE_ANSWER_IMAGE:
case READING_COMPREHENSION:
$choices = [];
$correctResponsesPattern = [];
for ($i = 1; $i <= $objAnswer->nbrAnswers; $i++) {
$choices[] = new InteractionComponent(
$objAnswer->iid[$i],
LanguageMap::create([$languageIso => $objAnswer->selectAnswer($i)])
);
if ($objAnswer->isCorrect($i)) {
$correctResponsesPattern[] = $objAnswer->iid[$i];
}
}
return new ChoiceInteractionDefinition(
$titleMap,
$descriptionMap,
$type,
null,
null,
[implode('[,]', $correctResponsesPattern)],
$choices
);
case DRAGGABLE:
$choices = [];
for ($i = 1; $i <= $objAnswer->nbrAnswers; $i++) {
if ((int) $objAnswer->correct[$i] > 0) {
$choices[] = new InteractionComponent(
$objAnswer->correct[$i],
LanguageMap::create([$languageIso => $objAnswer->answer[$i]])
);
}
}
$correctResponsesPattern = array_slice($objAnswer->autoId, 0, $objAnswer->nbrAnswers / 2);
return new SequencingInteractionDefinition(
$titleMap,
$descriptionMap,
$type,
null,
null,
[implode('[,]', $correctResponsesPattern)],
$choices
);
case MATCHING:
case MATCHING_DRAGGABLE:
/** @var array|InteractionComponent[] $source */
$source = [];
/** @var array|InteractionComponent[] $source */
$target = [];
$correctResponsesPattern = [];
for ($i = 1; $i <= $objAnswer->nbrAnswers; $i++) {
$interactionComponent = new InteractionComponent(
$objAnswer->selectAutoId($i),
LanguageMap::create([$languageIso => $objAnswer->selectAnswer($i)])
);
if ((int) $objAnswer->correct[$i] > 0) {
$source[] = $interactionComponent;
$correctResponsesPattern[] = $objAnswer->selectAutoId($i).'[.]'.$objAnswer->correct[$i];
} else {
$target[] = $interactionComponent;
}
}
return new MatchingInteractionDefinition(
$titleMap,
$descriptionMap,
$type,
null,
null,
[implode('[,]', $correctResponsesPattern)],
$source,
$target
);
case FREE_ANSWER:
return new LongFillInInteractionDefinition($titleMap, $descriptionMap, $type);
case FILL_IN_BLANKS:
case HOT_SPOT:
case HOT_SPOT_DELINEATION:
case MULTIPLE_ANSWER_COMBINATION:
case UNIQUE_ANSWER_NO_OPTION:
case MULTIPLE_ANSWER_TRUE_FALSE:
case MULTIPLE_ANSWER_TRUE_FALSE_DEGREE_CERTAINTY:
case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE:
case GLOBAL_MULTIPLE_ANSWER:
case CALCULATED_ANSWER:
case ANNOTATION:
case ORAL_EXPRESSION:
default:
return new OtherInteractionDefinition($titleMap, $descriptionMap, $type);
}
}
}

View File

@@ -0,0 +1,33 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\PluginBundle\XApi\ToolExperience\Activity;
use Xabbuh\XApi\Model\Activity;
use Xabbuh\XApi\Model\Definition;
use Xabbuh\XApi\Model\IRI;
use Xabbuh\XApi\Model\LanguageMap;
/**
* Class Site.
*
* @package Chamilo\PluginBundle\XApi\ToolExperience\Activity
*/
class Site extends BaseActivity
{
public function generate(): Activity
{
$platformLanguageIso = api_get_language_isocode(
api_get_setting('platformLanguage')
);
$platform = api_get_setting('Institution').' - '.api_get_setting('siteName');
return new Activity(
IRI::fromString('http://id.tincanapi.com/activitytype/lms'),
new Definition(
LanguageMap::create([$platformLanguageIso => $platform])
)
);
}
}