From 4ce93eaf760681222a95bcd5fffcc57b863eda83 Mon Sep 17 00:00:00 2001 From: Angel Fernando Quiroz Campos Date: Mon, 15 Aug 2022 04:06:48 -0500 Subject: [PATCH] Portfolio: Allow to send xAPI statement when viewing item - refs BT#18201 --- main/inc/lib/PortfolioController.php | 9 ++- main/inc/lib/hook/HookPortfolioItemViewed.php | 19 +++++++ .../HookPortfolioItemViewedEventInterface.php | 8 +++ ...okPortfolioItemViewedObserverInterface.php | 8 +++ .../XApiPortfolioItemViewedHookObserver.php | 25 ++++++++ .../Statement/PortfolioItem.php | 41 +++++++++++++ .../Statement/PortfolioItemShared.php | 57 ++++++------------- .../Statement/PortfolioItemViewed.php | 45 +++++++++++++++ plugin/xapi/src/XApiPlugin.php | 6 +- 9 files changed, 175 insertions(+), 43 deletions(-) create mode 100644 main/inc/lib/hook/HookPortfolioItemViewed.php create mode 100644 main/inc/lib/hook/interfaces/HookPortfolioItemViewedEventInterface.php create mode 100644 main/inc/lib/hook/interfaces/HookPortfolioItemViewedObserverInterface.php create mode 100644 plugin/xapi/src/Hook/XApiPortfolioItemViewedHookObserver.php create mode 100644 plugin/xapi/src/ToolExperience/Statement/PortfolioItem.php create mode 100644 plugin/xapi/src/ToolExperience/Statement/PortfolioItemViewed.php diff --git a/main/inc/lib/PortfolioController.php b/main/inc/lib/PortfolioController.php index 4f0ff9e5e3..78de08796f 100644 --- a/main/inc/lib/PortfolioController.php +++ b/main/inc/lib/PortfolioController.php @@ -1002,6 +1002,11 @@ class PortfolioController { global $interbreadcrumb; + HookPortfolioItemViewed::create() + ->setEventData(['portfolio' => $item]) + ->notifyItemViewed() + ; + $form = $this->createCommentForm($item); $commentsRepo = $this->em->getRepository(PortfolioComment::class); @@ -2760,7 +2765,7 @@ class PortfolioController get_lang('OriginallyPublishedAsXTitleByYUser'), [ "{$origin->getTitle()}", - $origin->getUser()->getCompleteName() + $origin->getUser()->getCompleteName(), ] ); } @@ -2773,7 +2778,7 @@ class PortfolioController get_lang('OriginallyCommentedByXUserInYItem'), [ $origin->getAuthor()->getCompleteName(), - "{$origin->getItem()->getTitle()}" + "{$origin->getItem()->getTitle()}", ] ); } diff --git a/main/inc/lib/hook/HookPortfolioItemViewed.php b/main/inc/lib/hook/HookPortfolioItemViewed.php new file mode 100644 index 0000000000..6a3122530a --- /dev/null +++ b/main/inc/lib/hook/HookPortfolioItemViewed.php @@ -0,0 +1,19 @@ +observers as $observer) { + $observer->hookItemViewed($this); + } + } +} diff --git a/main/inc/lib/hook/interfaces/HookPortfolioItemViewedEventInterface.php b/main/inc/lib/hook/interfaces/HookPortfolioItemViewedEventInterface.php new file mode 100644 index 0000000000..acaed500a1 --- /dev/null +++ b/main/inc/lib/hook/interfaces/HookPortfolioItemViewedEventInterface.php @@ -0,0 +1,8 @@ +getEventData()['portfolio']; + + $statement = (new PortfolioItemViewed($item))->generate(); + + $this->saveSharedStatement($statement); + } +} diff --git a/plugin/xapi/src/ToolExperience/Statement/PortfolioItem.php b/plugin/xapi/src/ToolExperience/Statement/PortfolioItem.php new file mode 100644 index 0000000000..bc8940eb92 --- /dev/null +++ b/plugin/xapi/src/ToolExperience/Statement/PortfolioItem.php @@ -0,0 +1,41 @@ +item = $item; + } + + protected function generateContext(): Context + { + $context = parent::generateContext(); + + $category = $this->item->getCategory(); + + if ($category) { + $categoryActivity = new PortfolioCategory($category); + + $contextActivities = $context + ->getContextActivities() + ->withAddedCategoryActivity( + $categoryActivity->generate() + ) + ; + + $context = $context->withContextActivities($contextActivities); + } + + return $context; + } +} diff --git a/plugin/xapi/src/ToolExperience/Statement/PortfolioItemShared.php b/plugin/xapi/src/ToolExperience/Statement/PortfolioItemShared.php index ec6d1eec79..cd2cc10ed3 100644 --- a/plugin/xapi/src/ToolExperience/Statement/PortfolioItemShared.php +++ b/plugin/xapi/src/ToolExperience/Statement/PortfolioItemShared.php @@ -4,12 +4,12 @@ namespace Chamilo\PluginBundle\XApi\ToolExperience\Statement; -use Chamilo\CoreBundle\Entity\Portfolio as PortfolioEntity; use Chamilo\CoreBundle\Entity\PortfolioAttachment; -use Chamilo\PluginBundle\XApi\ToolExperience\Activity\PortfolioCategory as PortfolioCategoryActivity; -use Chamilo\PluginBundle\XApi\ToolExperience\Activity\PortfolioItem as PortfolioItemActivity; -use Chamilo\PluginBundle\XApi\ToolExperience\Actor\User as UserActor; -use Chamilo\PluginBundle\XApi\ToolExperience\Verb\Shared as SharedVerb; +use Chamilo\PluginBundle\XApi\ToolExperience\Activity\PortfolioItem; +use Chamilo\PluginBundle\XApi\ToolExperience\Actor\User; +use Chamilo\PluginBundle\XApi\ToolExperience\Statement\PortfolioItem as PortfolioItemStatement; +use Chamilo\PluginBundle\XApi\ToolExperience\Verb\Shared; +use Database; use Xabbuh\XApi\Model\Statement; /** @@ -17,47 +17,24 @@ use Xabbuh\XApi\Model\Statement; * * @package Chamilo\PluginBundle\XApi\ToolExperience\Statement */ -class PortfolioItemShared extends BaseStatement +class PortfolioItemShared extends PortfolioItemStatement { - /** - * @var \Chamilo\CoreBundle\Entity\Portfolio - */ - private $portfolioItem; - - public function __construct(PortfolioEntity $item) - { - $this->portfolioItem = $item; - } - public function generate(): Statement { - $userActor = new UserActor( - $this->portfolioItem->getUser() - ); - $sharedVerb = new SharedVerb(); - $itemActivity = new PortfolioItemActivity($this->portfolioItem); + $itemAuthor = $this->item->getUser(); - $context = $this->generateContext(); - - if ($this->portfolioItem->getCategory()) { - $categoryActivity = new PortfolioCategoryActivity($this->portfolioItem->getCategory()); - - $contextActivities = $context - ->getContextActivities() - ->withAddedCategoryActivity( - $categoryActivity->generate() - ); + $userActor = new User($itemAuthor); + $sharedVerb = new Shared(); + $itemActivity = new PortfolioItem($this->item); - $context = $context->withContextActivities($contextActivities); - } + $context = $this->generateContext(); - $em = \Database::getManager(); - $itemAttachments = $em->getRepository(PortfolioAttachment::class)->findFromItem($this->portfolioItem); + $itemAttachments = Database::getManager() + ->getRepository(PortfolioAttachment::class) + ->findFromItem($this->item) + ; - $attachments = $this->generateAttachments( - $itemAttachments, - $this->portfolioItem->getUser() - ); + $attachments = $this->generateAttachments($itemAttachments, $itemAuthor); return new Statement( $this->generateStatementId('portfolio-item'), @@ -66,7 +43,7 @@ class PortfolioItemShared extends BaseStatement $itemActivity->generate(), null, null, - $this->portfolioItem->getCreationDate(), + $this->item->getCreationDate(), null, $context, $attachments diff --git a/plugin/xapi/src/ToolExperience/Statement/PortfolioItemViewed.php b/plugin/xapi/src/ToolExperience/Statement/PortfolioItemViewed.php new file mode 100644 index 0000000000..40ba56d6ef --- /dev/null +++ b/plugin/xapi/src/ToolExperience/Statement/PortfolioItemViewed.php @@ -0,0 +1,45 @@ +item->getUser(); + + $itemAttachments = Database::getManager() + ->getRepository(PortfolioAttachment::class) + ->findFromItem($this->item) + ; + + $actor = new User($itemAuthor); + $verb = new Viewed(); + $object = new PortfolioItem($this->item); + $context = $this->generateContext(); + $attachments = $this->generateAttachments($itemAttachments, $itemAuthor); + + return new Statement( + $this->generateStatementId('portfolio-item'), + $actor->generate(), + $verb->generate(), + $object->generate(), + null, + null, + $this->item->getCreationDate(), + null, + $context, + $attachments + ); + } +} diff --git a/plugin/xapi/src/XApiPlugin.php b/plugin/xapi/src/XApiPlugin.php index 86670d6e20..ac7172ad17 100644 --- a/plugin/xapi/src/XApiPlugin.php +++ b/plugin/xapi/src/XApiPlugin.php @@ -220,6 +220,7 @@ class XApiPlugin extends Plugin implements HookPluginInterface $quizEndHook = XApiQuizEndHookObserver::create(); $portfolioItemAddedHook = XApiPortfolioItemAddedHookObserver::create(); $portfolioItemCommentedHook = XApiPortfolioItemCommentedHookObserver::create(); + $portfolioItemViewedHook = XApiPortfolioItemViewedHookObserver::create(); $learningPathItemViewedEvent = HookLearningPathItemViewed::create(); $learningPathEndEvent = HookLearningPathEnd::create(); @@ -227,6 +228,7 @@ class XApiPlugin extends Plugin implements HookPluginInterface $quizEndEvent = HookQuizEnd::create(); $portfolioItemAddedEvent = HookPortfolioItemAdded::create(); $portfolioItemCommentedEvent = HookPortfolioItemCommented::create(); + $portfolioItemViewedEvent = HookPortfolioItemViewed::create(); if ('true' === $this->get(self::SETTING_LRS_LP_ITEM_ACTIVE)) { $learningPathItemViewedEvent->attach($learningPathItemViewedHook); @@ -255,9 +257,11 @@ class XApiPlugin extends Plugin implements HookPluginInterface if ('true' === $this->get(self::SETTING_LRS_PORTFOLIO_ACTIVE)) { $portfolioItemAddedEvent->attach($portfolioItemAddedHook); $portfolioItemCommentedEvent->attach($portfolioItemCommentedHook); + $portfolioItemViewedEvent->attach($portfolioItemViewedHook); } else { $portfolioItemAddedEvent->detach($portfolioItemAddedHook); - $portfolioItemCommentedEvent->attach($portfolioItemCommentedHook); + $portfolioItemCommentedEvent->detach($portfolioItemCommentedHook); + $portfolioItemViewedEvent->detach($portfolioItemViewedHook); } return $this;