Format code LTIBundle

pull/3844/head
Julio Montoya 5 years ago
parent 81a85824b7
commit 708b469444
  1. 2
      ecs.php
  2. 5
      src/LtiBundle/ChamiloLtiBundle.php
  3. 30
      src/LtiBundle/Component/OutcomeDeleteRequest.php
  4. 11
      src/LtiBundle/Component/OutcomeDeleteResponse.php
  5. 27
      src/LtiBundle/Component/OutcomeReadRequest.php
  6. 14
      src/LtiBundle/Component/OutcomeReadResponse.php
  7. 35
      src/LtiBundle/Component/OutcomeReplaceRequest.php
  8. 11
      src/LtiBundle/Component/OutcomeReplaceResponse.php
  9. 51
      src/LtiBundle/Component/OutcomeRequest.php
  10. 20
      src/LtiBundle/Component/OutcomeResponse.php
  11. 30
      src/LtiBundle/Component/OutcomeResponseStatus.php
  12. 14
      src/LtiBundle/Component/OutcomeUnsupportedRequest.php
  13. 9
      src/LtiBundle/Component/OutcomeUnsupportedResponse.php
  14. 33
      src/LtiBundle/Controller/AdminController.php
  15. 171
      src/LtiBundle/Controller/CourseController.php
  16. 23
      src/LtiBundle/Controller/ServiceController.php
  17. 96
      src/LtiBundle/Entity/ExternalTool.php
  18. 57
      src/LtiBundle/Form/ExternalToolType.php
  19. 27
      src/LtiBundle/Util/Utils.php

@ -64,7 +64,7 @@ return static function (ContainerConfigurator $containerConfigurator): void {
__DIR__.'/src/CourseBundle/Component/*', __DIR__.'/src/CourseBundle/Component/*',
__DIR__.'/src/CoreBundle/Hook/*', __DIR__.'/src/CoreBundle/Hook/*',
__DIR__.'/src/CoreBundle/Traits/*', __DIR__.'/src/CoreBundle/Traits/*',
__DIR__.'/src/LtiBundle/*', //__DIR__.'/src/LtiBundle/*',
IncrementStyleFixer::class => 'post', IncrementStyleFixer::class => 'post',
PropertyTypeHintSniff::class.'.'.PropertyTypeHintSniff::CODE_MISSING_TRAVERSABLE_TYPE_HINT_SPECIFICATION, PropertyTypeHintSniff::class.'.'.PropertyTypeHintSniff::CODE_MISSING_TRAVERSABLE_TYPE_HINT_SPECIFICATION,
\PhpCsFixer\Fixer\DoctrineAnnotation\DoctrineAnnotationArrayAssignmentFixer::class, \PhpCsFixer\Fixer\DoctrineAnnotation\DoctrineAnnotationArrayAssignmentFixer::class,

@ -1,14 +1,13 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle; namespace Chamilo\LtiBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\HttpKernel\Bundle\Bundle;
/**
* Class ChamiloLtiBundle.
*/
class ChamiloLtiBundle extends Bundle class ChamiloLtiBundle extends Bundle
{ {
} }

@ -1,21 +1,19 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
use Chamilo\CoreBundle\Entity\GradebookEvaluation; use Chamilo\CoreBundle\Entity\GradebookEvaluation;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Result;
use SimpleXMLElement;
/**
* Class OutcomeDeleteRequest.
*/
class OutcomeDeleteRequest extends OutcomeRequest class OutcomeDeleteRequest extends OutcomeRequest
{ {
/** public function __construct(SimpleXMLElement $xml)
* OutcomeDeleteRequest constructor.
*/
public function __construct(\SimpleXMLElement $xml)
{ {
parent::__construct($xml); parent::__construct($xml);
@ -23,7 +21,7 @@ class OutcomeDeleteRequest extends OutcomeRequest
$this->xmlRequest = $this->xmlRequest->deleteResultRequest; $this->xmlRequest = $this->xmlRequest->deleteResultRequest;
} }
protected function processBody() protected function processBody(): void
{ {
$resultRecord = $this->xmlRequest->resultRecord; $resultRecord = $this->xmlRequest->resultRecord;
$sourcedId = (string) $resultRecord->sourcedGUID->sourcedId; $sourcedId = (string) $resultRecord->sourcedGUID->sourcedId;
@ -34,7 +32,8 @@ class OutcomeDeleteRequest extends OutcomeRequest
if (empty($sourcedParts)) { if (empty($sourcedParts)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR) ->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
@ -47,28 +46,31 @@ class OutcomeDeleteRequest extends OutcomeRequest
if (empty($evaluation) || empty($user)) { if (empty($evaluation) || empty($user)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS) ->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
$results = \Result::load(null, $user->getId(), $evaluation->getId()); $results = Result::load(null, $user->getId(), $evaluation->getId());
if (empty($results)) { if (empty($results)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS) ->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
/** @var \Result $result */ /** @var Result $result */
$result = $results[0]; $result = $results[0];
$result->addResultLog($user->getId(), $evaluation->getId()); $result->addResultLog($user->getId(), $evaluation->getId());
$result->delete(); $result->delete();
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS) ->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_SUCCESS); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_SUCCESS)
;
} }
} }

@ -1,18 +1,19 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
/** use SimpleXMLElement;
* Class OutcomeDeleteResponse.
*/
class OutcomeDeleteResponse extends OutcomeResponse class OutcomeDeleteResponse extends OutcomeResponse
{ {
/** /**
* OutcomeDeleteResponse constructor. * OutcomeDeleteResponse constructor.
* *
* @param mixed|null $bodyParam * @param null|mixed $bodyParam
*/ */
public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null) public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null)
{ {
@ -21,7 +22,7 @@ class OutcomeDeleteResponse extends OutcomeResponse
parent::__construct($statusInfo, $bodyParam); parent::__construct($statusInfo, $bodyParam);
} }
protected function generateBody(\SimpleXMLElement $xmlBody) protected function generateBody(SimpleXMLElement $xmlBody): void
{ {
$xmlBody->addChild('deleteResultResponse'); $xmlBody->addChild('deleteResultResponse');
} }

@ -1,21 +1,19 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
use Chamilo\CoreBundle\Entity\GradebookEvaluation; use Chamilo\CoreBundle\Entity\GradebookEvaluation;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Result;
use SimpleXMLElement;
/**
* Class OutcomeReadRequest.
*/
class OutcomeReadRequest extends OutcomeRequest class OutcomeReadRequest extends OutcomeRequest
{ {
/** public function __construct(SimpleXMLElement $xml)
* OutcomeReadRequest constructor.
*/
public function __construct(\SimpleXMLElement $xml)
{ {
parent::__construct($xml); parent::__construct($xml);
@ -23,7 +21,7 @@ class OutcomeReadRequest extends OutcomeRequest
$this->xmlRequest = $this->xmlRequest->readResultRequest; $this->xmlRequest = $this->xmlRequest->readResultRequest;
} }
protected function processBody() protected function processBody(): void
{ {
$resultRecord = $this->xmlRequest->resultRecord; $resultRecord = $this->xmlRequest->resultRecord;
$sourcedId = (string) $resultRecord->sourcedGUID->sourcedId; $sourcedId = (string) $resultRecord->sourcedGUID->sourcedId;
@ -34,7 +32,8 @@ class OutcomeReadRequest extends OutcomeRequest
if (empty($sourcedParts)) { if (empty($sourcedParts)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR) ->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
@ -47,18 +46,19 @@ class OutcomeReadRequest extends OutcomeRequest
if (empty($evaluation) || empty($user)) { if (empty($evaluation) || empty($user)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS) ->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
$results = \Result::load(null, $user->getId(), $evaluation->getId()); $results = Result::load(null, $user->getId(), $evaluation->getId());
$ltiScore = ''; $ltiScore = '';
$responseDescription = $this->translator->trans('Score not set'); $responseDescription = $this->translator->trans('Score not set');
if (!empty($results)) { if (!empty($results)) {
/** @var \Result $result */ /** @var Result $result */
$result = $results[0]; $result = $results[0];
$ltiScore = 0; $ltiScore = 0;
@ -76,7 +76,8 @@ class OutcomeReadRequest extends OutcomeRequest
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS) ->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_SUCCESS) ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_SUCCESS)
->setDescription($responseDescription); ->setDescription($responseDescription)
;
$this->responseBodyParam = (string) $ltiScore; $this->responseBodyParam = (string) $ltiScore;
} }

@ -1,18 +1,19 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
/** use SimpleXMLElement;
* Class OutcomeReadResponse.
*/
class OutcomeReadResponse extends OutcomeResponse class OutcomeReadResponse extends OutcomeResponse
{ {
/** /**
* OutcomeReadResponse constructor. * OutcomeReadResponse constructor.
* *
* @param mixed|null $bodyParam * @param null|mixed $bodyParam
*/ */
public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null) public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null)
{ {
@ -21,12 +22,13 @@ class OutcomeReadResponse extends OutcomeResponse
parent::__construct($statusInfo, $bodyParam); parent::__construct($statusInfo, $bodyParam);
} }
protected function generateBody(\SimpleXMLElement $xmlBody) protected function generateBody(SimpleXMLElement $xmlBody): void
{ {
$resultResponse = $xmlBody->addChild('readResultResponse'); $resultResponse = $xmlBody->addChild('readResultResponse');
$xmlResultScore = $resultResponse->addChild('result') $xmlResultScore = $resultResponse->addChild('result')
->addChild('resultScore'); ->addChild('resultScore')
;
$xmlResultScore->addChild('language', 'en'); $xmlResultScore->addChild('language', 'en');
$xmlResultScore->addChild('textString', $this->bodyParams); $xmlResultScore->addChild('textString', $this->bodyParams);

@ -1,21 +1,19 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
use Chamilo\CoreBundle\Entity\GradebookEvaluation; use Chamilo\CoreBundle\Entity\GradebookEvaluation;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Result;
use SimpleXMLElement;
/**
* Class OutcomeReplaceRequest.
*/
class OutcomeReplaceRequest extends OutcomeRequest class OutcomeReplaceRequest extends OutcomeRequest
{ {
/** public function __construct(SimpleXMLElement $xml)
* OutcomeReplaceRequest constructor.
*/
public function __construct(\SimpleXMLElement $xml)
{ {
parent::__construct($xml); parent::__construct($xml);
@ -23,7 +21,7 @@ class OutcomeReplaceRequest extends OutcomeRequest
$this->xmlRequest = $this->xmlRequest->replaceResultRequest; $this->xmlRequest = $this->xmlRequest->replaceResultRequest;
} }
protected function processBody() protected function processBody(): void
{ {
$resultRecord = $this->xmlRequest->resultRecord; $resultRecord = $this->xmlRequest->resultRecord;
$sourcedId = (string) $resultRecord->sourcedGUID->sourcedId; $sourcedId = (string) $resultRecord->sourcedGUID->sourcedId;
@ -33,7 +31,8 @@ class OutcomeReplaceRequest extends OutcomeRequest
if (!is_numeric($resultScore)) { if (!is_numeric($resultScore)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR) ->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
@ -43,7 +42,8 @@ class OutcomeReplaceRequest extends OutcomeRequest
if (0 > $resultScore || 1 < $resultScore) { if (0 > $resultScore || 1 < $resultScore) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_WARNING) ->setSeverity(OutcomeResponseStatus::SEVERITY_WARNING)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
@ -53,7 +53,8 @@ class OutcomeReplaceRequest extends OutcomeRequest
if (empty($sourcedParts)) { if (empty($sourcedParts)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR) ->setSeverity(OutcomeResponseStatus::SEVERITY_ERROR)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
@ -66,23 +67,24 @@ class OutcomeReplaceRequest extends OutcomeRequest
if (empty($evaluation) || empty($user)) { if (empty($evaluation) || empty($user)) {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS) ->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE); ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_FAILURE)
;
return; return;
} }
$score = $evaluation->getMax() * $resultScore; $score = $evaluation->getMax() * $resultScore;
$results = \Result::load(null, $user->getId(), $evaluation->getId()); $results = Result::load(null, $user->getId(), $evaluation->getId());
if (empty($results)) { if (empty($results)) {
$result = new \Result(); $result = new Result();
$result->set_evaluation_id($evaluation->getId()); $result->set_evaluation_id($evaluation->getId());
$result->set_user_id($user->getId()); $result->set_user_id($user->getId());
$result->set_score($score); $result->set_score($score);
$result->add(); $result->add();
} else { } else {
/** @var \Result $result */ /** @var Result $result */
$result = $results[0]; $result = $results[0];
$result->addResultLog($user->getId(), $evaluation->getId()); $result->addResultLog($user->getId(), $evaluation->getId());
$result->set_score($score); $result->set_score($score);
@ -98,6 +100,7 @@ class OutcomeReplaceRequest extends OutcomeRequest
$user->getId(), $user->getId(),
$resultScore $resultScore
) )
); )
;
} }
} }

@ -1,18 +1,19 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
/** use SimpleXMLElement;
* Class OutcomeReplaceResponse.
*/
class OutcomeReplaceResponse extends OutcomeResponse class OutcomeReplaceResponse extends OutcomeResponse
{ {
/** /**
* OutcomeReplaceResponse constructor. * OutcomeReplaceResponse constructor.
* *
* @param mixed|null $bodyParam * @param null|mixed $bodyParam
*/ */
public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null) public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null)
{ {
@ -21,7 +22,7 @@ class OutcomeReplaceResponse extends OutcomeResponse
parent::__construct($statusInfo, $bodyParam); parent::__construct($statusInfo, $bodyParam);
} }
protected function generateBody(\SimpleXMLElement $xmlBody) protected function generateBody(SimpleXMLElement $xmlBody): void
{ {
$xmlBody->addChild('replaceResultResponse'); $xmlBody->addChild('replaceResultResponse');
} }

@ -1,52 +1,31 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManager;
use SimpleXMLElement;
use Symfony\Bundle\FrameworkBundle\Translation\Translator; use Symfony\Bundle\FrameworkBundle\Translation\Translator;
/**
* Class OutcomeRequest.
*/
abstract class OutcomeRequest abstract class OutcomeRequest
{ {
/** protected string $responseType;
* @var string
*/
protected $responseType;
/** protected SimpleXMLElement $xmlHeaderInfo;
* @var \SimpleXMLElement
*/
protected $xmlHeaderInfo;
/** protected SimpleXMLElement $xmlRequest;
* @var \SimpleXMLElement
*/
protected $xmlRequest;
/** protected OutcomeResponseStatus $statusInfo;
* @var OutcomeResponseStatus
*/
protected $statusInfo;
protected $responseBodyParam; protected array $responseBodyParam;
/** protected EntityManager $entityManager;
* @var EntityManager protected Translator $translator;
*/
protected $entityManager;
/**
* @var Translator
*/
protected $translator;
/** public function __construct(SimpleXMLElement $xml)
* OutcomeRequest constructor.
*/
public function __construct(\SimpleXMLElement $xml)
{ {
$this->statusInfo = new OutcomeResponseStatus(); $this->statusInfo = new OutcomeResponseStatus();
@ -54,18 +33,18 @@ abstract class OutcomeRequest
$this->xmlRequest = $xml->imsx_POXBody->children(); $this->xmlRequest = $xml->imsx_POXBody->children();
} }
public function setEntityManager(EntityManager $entityManager) public function setEntityManager(EntityManager $entityManager): void
{ {
$this->entityManager = $entityManager; $this->entityManager = $entityManager;
} }
public function setTranslator(Translator $translator) public function setTranslator(Translator $translator): void
{ {
$this->translator = $translator; $this->translator = $translator;
} }
/** /**
* @return OutcomeResponse|null * @return null|OutcomeResponse
*/ */
public function process() public function process()
{ {
@ -84,7 +63,7 @@ abstract class OutcomeRequest
} }
} }
protected function processHeader() protected function processHeader(): void
{ {
$info = $this->xmlHeaderInfo; $info = $this->xmlHeaderInfo;

@ -1,28 +1,26 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
/** use SimpleXMLElement;
* Class OutcomeResponse.
*/
abstract class OutcomeResponse abstract class OutcomeResponse
{ {
const TYPE_REPLACE = 'replace'; const TYPE_REPLACE = 'replace';
const TYPE_READ = 'read'; const TYPE_READ = 'read';
const TYPE_DELETE = 'delete'; const TYPE_DELETE = 'delete';
protected $bodyParams; protected array $bodyParams;
/** private OutcomeResponseStatus $statusInfo;
* @var OutcomeResponseStatus
*/
private $statusInfo;
/** /**
* OutcomeResponse constructor. * OutcomeResponse constructor.
* *
* @param mixed|null $bodyParam * @param null|mixed $bodyParam
*/ */
public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null) public function __construct(OutcomeResponseStatus $statusInfo, $bodyParam = null)
{ {
@ -35,7 +33,7 @@ abstract class OutcomeResponse
*/ */
public function __toString() public function __toString()
{ {
$xml = new \SimpleXMLElement('<imsx_POXEnvelopeResponse></imsx_POXEnvelopeResponse>'); $xml = new SimpleXMLElement('<imsx_POXEnvelopeResponse></imsx_POXEnvelopeResponse>');
$xml->addAttribute('xmlns', 'http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0'); $xml->addAttribute('xmlns', 'http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0');
$headerInfo = $xml->addChild('imsx_POXHeader')->addChild('imsx_POXResponseHeaderInfo'); $headerInfo = $xml->addChild('imsx_POXHeader')->addChild('imsx_POXResponseHeaderInfo');
@ -56,5 +54,5 @@ abstract class OutcomeResponse
return $xml->asXML(); return $xml->asXML();
} }
abstract protected function generateBody(\SimpleXMLElement $xmlBody); abstract protected function generateBody(SimpleXMLElement $xmlBody);
} }

@ -1,12 +1,11 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
/**
* Class OutcomeResponseStatus.
*/
class OutcomeResponseStatus class OutcomeResponseStatus
{ {
const SEVERITY_STATUS = 'status'; const SEVERITY_STATUS = 'status';
@ -18,30 +17,15 @@ class OutcomeResponseStatus
const CODEMAJOR_FAILURE = 'failure'; const CODEMAJOR_FAILURE = 'failure';
const CODEMAJOR_UNSUPPORTED = 'unsupported'; const CODEMAJOR_UNSUPPORTED = 'unsupported';
/** private string $codeMajor = '';
* @var string
*/
private $codeMajor = '';
/** private string $severity = '';
* @var string
*/
private $severity = '';
/** private string $messageRefIdentifier = '';
* @var string
*/
private $messageRefIdentifier = '';
/** private string $operationRefIdentifier = '';
* @var string
*/
private $operationRefIdentifier = '';
/** private string $description = '';
* @var string
*/
private $description = '';
/** /**
* Get codeMajor. * Get codeMajor.

@ -1,12 +1,13 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
/** use SimpleXMLElement;
* Class OutcomeUnsupportedRequest.
*/
class OutcomeUnsupportedRequest extends OutcomeRequest class OutcomeUnsupportedRequest extends OutcomeRequest
{ {
/** /**
@ -14,20 +15,21 @@ class OutcomeUnsupportedRequest extends OutcomeRequest
* *
* @param string $name * @param string $name
*/ */
public function __construct(\SimpleXMLElement $xml, $name) public function __construct(SimpleXMLElement $xml, $name)
{ {
parent::__construct($xml); parent::__construct($xml);
$this->responseType = $name; $this->responseType = $name;
} }
protected function processBody() protected function processBody(): void
{ {
$this->statusInfo $this->statusInfo
->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS) ->setSeverity(OutcomeResponseStatus::SEVERITY_STATUS)
->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_UNSUPPORTED) ->setCodeMajor(OutcomeResponseStatus::CODEMAJOR_UNSUPPORTED)
->setDescription( ->setDescription(
$this->responseType.' is not supported' $this->responseType.' is not supported'
); )
;
} }
} }

@ -1,12 +1,13 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Component; namespace Chamilo\LtiBundle\Component;
/** use SimpleXMLElement;
* Class OutcomeUnsupportedResponse.
*/
class OutcomeUnsupportedResponse extends OutcomeResponse class OutcomeUnsupportedResponse extends OutcomeResponse
{ {
/** /**
@ -21,7 +22,7 @@ class OutcomeUnsupportedResponse extends OutcomeResponse
parent::__construct($statusInfo); parent::__construct($statusInfo);
} }
protected function generateBody(\SimpleXMLElement $xmlBody) protected function generateBody(SimpleXMLElement $xmlBody): void
{ {
} }
} }

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Controller; namespace Chamilo\LtiBundle\Controller;
@ -12,9 +14,6 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
/**
* Class AdminController.
*/
class AdminController extends BaseController class AdminController extends BaseController
{ {
/** /**
@ -27,7 +26,9 @@ class AdminController extends BaseController
$repo = $this->getDoctrine()->getRepository('ChamiloLtiBundle:ExternalTool'); $repo = $this->getDoctrine()->getRepository('ChamiloLtiBundle:ExternalTool');
$tools = $repo->findAll(); $tools = $repo->findAll();
return $this->render('@ChamiloCore/Lti/admin.html.twig', ['tools' => $tools]); return $this->render('@ChamiloCore/Lti/admin.html.twig', [
'tools' => $tools,
]);
} }
/** /**
@ -56,17 +57,23 @@ class AdminController extends BaseController
$breadcrumb = $this->get('chamilo_core.block.breadcrumb'); $breadcrumb = $this->get('chamilo_core.block.breadcrumb');
$breadcrumb->addChild( $breadcrumb->addChild(
$this->trans('Administration'), $this->trans('Administration'),
['route' => 'administration'] [
'route' => 'administration',
]
); );
$breadcrumb->addChild( $breadcrumb->addChild(
$this->trans('External tools'), $this->trans('External tools'),
['route' => 'chamilo_lti_admin'] [
'route' => 'chamilo_lti_admin',
]
); );
$breadcrumb->addChild('Add external tool'); $breadcrumb->addChild('Add external tool');
return $this->render( return $this->render(
'@ChamiloCore/Lti/admin_form.html.twig', '@ChamiloCore/Lti/admin_form.html.twig',
['form' => $form->createView()] [
'form' => $form->createView(),
]
); );
} }
@ -110,17 +117,23 @@ class AdminController extends BaseController
$breadcrumb = $this->get('chamilo_core.block.breadcrumb'); $breadcrumb = $this->get('chamilo_core.block.breadcrumb');
$breadcrumb->addChild( $breadcrumb->addChild(
$this->trans('Administration'), $this->trans('Administration'),
['route' => 'administration'] [
'route' => 'administration',
]
); );
$breadcrumb->addChild( $breadcrumb->addChild(
$this->trans('External tools'), $this->trans('External tools'),
['route' => 'chamilo_lti_admin'] [
'route' => 'chamilo_lti_admin',
]
); );
$breadcrumb->addChild('Edit external tool'); $breadcrumb->addChild('Edit external tool');
return $this->render( return $this->render(
'@ChamiloCore/Lti/admin_form.html.twig', '@ChamiloCore/Lti/admin_form.html.twig',
['form' => $form->createView()] [
'form' => $form->createView(),
]
); );
} }

@ -1,9 +1,12 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Controller; namespace Chamilo\LtiBundle\Controller;
use Category;
use Chamilo\CoreBundle\Controller\BaseController; use Chamilo\CoreBundle\Controller\BaseController;
use Chamilo\CoreBundle\Entity\Course; use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Entity\Session;
@ -12,15 +15,22 @@ use Chamilo\CourseBundle\Entity\CTool;
use Chamilo\LtiBundle\Entity\ExternalTool; use Chamilo\LtiBundle\Entity\ExternalTool;
use Chamilo\LtiBundle\Form\ExternalToolType; use Chamilo\LtiBundle\Form\ExternalToolType;
use Chamilo\LtiBundle\Util\Utils; use Chamilo\LtiBundle\Util\Utils;
use DateTime;
use Display;
use EvalForm;
use Evaluation;
use Exception;
use HTML_QuickForm_select;
use OAuthConsumer;
use OAuthRequest;
use OAuthSignatureMethod_HMAC_SHA1;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use UserManager;
/**
* Class CourseController.
*/
class CourseController extends BaseController class CourseController extends BaseController
{ {
/** /**
@ -73,10 +83,14 @@ class CourseController extends BaseController
'course' => $course, 'course' => $course,
'link' => $this->generateUrl( 'link' => $this->generateUrl(
'chamilo_lti_show', 'chamilo_lti_show',
['code' => $course->getCode(), 'id' => $tool->getId()] [
'code' => $course->getCode(),
'id' => $tool->getId(),
]
), ),
] ]
); )
;
if (empty($courseTool)) { if (empty($courseTool)) {
throw $this->createNotFoundException('Course tool not found.'); throw $this->createNotFoundException('Course tool not found.');
@ -93,7 +107,10 @@ class CourseController extends BaseController
return $this->redirectToRoute( return $this->redirectToRoute(
'chamilo_lti_edit', 'chamilo_lti_edit',
['id' => $tool->getId(), 'code' => $course->getCode()] [
'id' => $tool->getId(),
'code' => $course->getCode(),
]
); );
} }
@ -105,7 +122,7 @@ class CourseController extends BaseController
public function launchAction($id): Response public function launchAction($id): Response
{ {
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
/** @var ExternalTool|null $tool */ /** @var null|ExternalTool $tool */
$tool = $em->find('ChamiloLtiBundle:ExternalTool', $id); $tool = $em->find('ChamiloLtiBundle:ExternalTool', $id);
if (empty($tool)) { if (empty($tool)) {
@ -135,7 +152,9 @@ class CourseController extends BaseController
$params['lti_message_type'] = 'ContentItemSelectionRequest'; $params['lti_message_type'] = 'ContentItemSelectionRequest';
$params['content_item_return_url'] = $this->generateUrl( $params['content_item_return_url'] = $this->generateUrl(
'chamilo_lti_return_item', 'chamilo_lti_return_item',
['code' => $course->getCode()], [
'code' => $course->getCode(),
],
UrlGeneratorInterface::ABSOLUTE_URL UrlGeneratorInterface::ABSOLUTE_URL
); );
$params['accept_media_types'] = '*/*'; $params['accept_media_types'] = '*/*';
@ -153,7 +172,12 @@ class CourseController extends BaseController
if (!empty($toolEval)) { if (!empty($toolEval)) {
$params['lis_result_sourcedid'] = json_encode( $params['lis_result_sourcedid'] = json_encode(
['e' => $toolEval->getId(), 'u' => $user->getId(), 'l' => uniqid(), 'lt' => time()] [
'e' => $toolEval->getId(),
'u' => $user->getId(),
'l' => uniqid(),
'lt' => time(),
]
); );
$params['lis_outcome_service_url'] = api_get_path(WEB_PATH).'lti/os'; $params['lis_outcome_service_url'] = api_get_path(WEB_PATH).'lti/os';
/* $params['lis_outcome_service_url'] = $this->generateUrl( /* $params['lis_outcome_service_url'] = $this->generateUrl(
@ -161,8 +185,8 @@ class CourseController extends BaseController
[], [],
UrlGeneratorInterface::ABSOLUTE_URL UrlGeneratorInterface::ABSOLUTE_URL
); */ ); */
$params['lis_person_sourcedid'] = "$institutionDomain:$toolUserId"; $params['lis_person_sourcedid'] = "{$institutionDomain}:{$toolUserId}";
$params['lis_course_section_sourcedid'] = "$institutionDomain:".$course->getId(); $params['lis_course_section_sourcedid'] = "{$institutionDomain}:".$course->getId();
if ($session) { if ($session) {
$params['lis_course_section_sourcedid'] .= ':'.$session->getId(); $params['lis_course_section_sourcedid'] .= ':'.$session->getId();
@ -173,7 +197,7 @@ class CourseController extends BaseController
$params['user_id'] = $toolUserId; $params['user_id'] = $toolUserId;
if ($tool->isSharingPicture()) { if ($tool->isSharingPicture()) {
$params['user_image'] = \UserManager::getUserPicture($user->getId()); $params['user_image'] = UserManager::getUserPicture($user->getId());
} }
$params['roles'] = Utils::generateUserRoles($user); $params['roles'] = Utils::generateUserRoles($user);
@ -223,14 +247,14 @@ class CourseController extends BaseController
Utils::trimParams($params); Utils::trimParams($params);
if (!empty($tool->getConsumerKey()) && !empty($tool->getSharedSecret())) { if (!empty($tool->getConsumerKey()) && !empty($tool->getSharedSecret())) {
$consumer = new \OAuthConsumer( $consumer = new OAuthConsumer(
$tool->getConsumerKey(), $tool->getConsumerKey(),
$tool->getSharedSecret(), $tool->getSharedSecret(),
null null
); );
$hmacMethod = new \OAuthSignatureMethod_HMAC_SHA1(); $hmacMethod = new OAuthSignatureMethod_HMAC_SHA1();
$request = \OAuthRequest::from_consumer_and_token( $request = OAuthRequest::from_consumer_and_token(
$consumer, $consumer,
'', '',
'POST', 'POST',
@ -277,7 +301,9 @@ class CourseController extends BaseController
$course = $this->getCourse(); $course = $this->getCourse();
$url = $this->generateUrl( $url = $this->generateUrl(
'chamilo_lti_return_item', 'chamilo_lti_return_item',
['code' => $course->getCode()], [
'code' => $course->getCode(),
],
UrlGeneratorInterface::ABSOLUTE_URL UrlGeneratorInterface::ABSOLUTE_URL
); );
@ -297,7 +323,7 @@ class CourseController extends BaseController
$supportedItemTypes = ['LtiLinkItem']; $supportedItemTypes = ['LtiLinkItem'];
foreach ($contentItems as $contentItem) { foreach ($contentItems as $contentItem) {
if (!in_array($contentItem['@type'], $supportedItemTypes)) { if (!in_array($contentItem['@type'], $supportedItemTypes, true)) {
continue; continue;
} }
@ -316,7 +342,9 @@ class CourseController extends BaseController
return $this->render( return $this->render(
'@ChamiloCore/Lti/item_return.html.twig', '@ChamiloCore/Lti/item_return.html.twig',
['course' => $course] [
'course' => $course,
]
); );
} }
@ -331,7 +359,7 @@ class CourseController extends BaseController
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
/** @var ExternalTool|null $externalTool */ /** @var null|ExternalTool $externalTool */
$externalTool = $em->find('ChamiloLtiBundle:ExternalTool', $id); $externalTool = $em->find('ChamiloLtiBundle:ExternalTool', $id);
if (empty($externalTool)) { if (empty($externalTool)) {
@ -348,7 +376,9 @@ class CourseController extends BaseController
[ [
'uri' => $this->generateUrl( 'uri' => $this->generateUrl(
'chamilo_course_home_home_index', 'chamilo_course_home_home_index',
['course' => $course->getCode()] [
'course' => $course->getCode(),
]
), ),
] ]
); );
@ -358,7 +388,10 @@ class CourseController extends BaseController
return $this->render( return $this->render(
'ChamiloCoreBundle:Lti:iframe.html.twig', 'ChamiloCoreBundle:Lti:iframe.html.twig',
['tool' => $externalTool, 'course' => $course] [
'tool' => $externalTool,
'course' => $course,
]
); );
} }
@ -379,7 +412,10 @@ class CourseController extends BaseController
$parentTool = null; $parentTool = null;
if (!empty($id)) { if (!empty($id)) {
$parentTool = $repo->findOneBy(['id' => $id, 'course' => null]); $parentTool = $repo->findOneBy([
'id' => $id,
'course' => null,
]);
if (empty($parentTool)) { if (empty($parentTool)) {
throw $this->createNotFoundException('External tool not found'); throw $this->createNotFoundException('External tool not found');
@ -400,15 +436,18 @@ class CourseController extends BaseController
if (!$form->isSubmitted() || !$form->isValid()) { if (!$form->isSubmitted() || !$form->isValid()) {
$this->setConfigureBreadcrumb($course); $this->setConfigureBreadcrumb($course);
$categories = \Category::load(null, null, $course->getCode()); $categories = Category::load(null, null, $course->getCode());
$actions = ''; $actions = '';
if (!empty($categories)) { if (!empty($categories)) {
$actions .= \Display::url( $actions .= Display::url(
\Display::return_icon('gradebook.png', get_lang('Add to gradebook'), [], ICON_SIZE_MEDIUM), Display::return_icon('gradebook.png', get_lang('Add to gradebook'), [], ICON_SIZE_MEDIUM),
$this->generateUrl( $this->generateUrl(
'chamilo_lti_grade', 'chamilo_lti_grade',
['catId' => $categories[0]->get_id(), 'code' => $course->getCode()] [
'catId' => $categories[0]->get_id(),
'code' => $course->getCode(),
]
) )
//'./gradebook/add_eval.php?selectcat='.$categories[0]->get_id().'&'.api_get_cidreq() //'./gradebook/add_eval.php?selectcat='.$categories[0]->get_id().'&'.api_get_cidreq()
); );
@ -418,8 +457,13 @@ class CourseController extends BaseController
'@ChamiloCore/Lti/course_configure.twig', '@ChamiloCore/Lti/course_configure.twig',
[ [
'title' => $this->trans('Add external tool'), 'title' => $this->trans('Add external tool'),
'added_tools' => $repo->findBy(['course' => $course]), 'added_tools' => $repo->findBy([
'global_tools' => $repo->findBy(['parent' => null, 'course' => null]), 'course' => $course,
]),
'global_tools' => $repo->findBy([
'parent' => null,
'course' => null,
]),
'form' => $form->createView(), 'form' => $form->createView(),
'course' => $course, 'course' => $course,
'actions' => $actions, 'actions' => $actions,
@ -448,22 +492,30 @@ class CourseController extends BaseController
->setLink( ->setLink(
$this->generateUrl( $this->generateUrl(
'chamilo_lti_show', 'chamilo_lti_show',
['code' => $course->getCode(), 'id' => $tool->getId()] [
'code' => $course->getCode(),
'id' => $tool->getId(),
]
) )
); )
;
$em->persist($courseTool); $em->persist($courseTool);
$em->flush(); $em->flush();
return $this->redirectToRoute( return $this->redirectToRoute(
'chamilo_course_home_home_index', 'chamilo_course_home_home_index',
['course' => $course->getCode()] [
'course' => $course->getCode(),
]
); );
} }
return $this->redirectToRoute( return $this->redirectToRoute(
'chamilo_lti_configure', 'chamilo_lti_configure',
['course' => $course->getCode()] [
'course' => $course->getCode(),
]
); );
} }
@ -474,7 +526,7 @@ class CourseController extends BaseController
* *
* @param string $catId * @param string $catId
* *
* @throws \Exception * @throws Exception
*/ */
public function gradeAction($catId) public function gradeAction($catId)
{ {
@ -484,13 +536,13 @@ class CourseController extends BaseController
/** @var User $user */ /** @var User $user */
$user = $this->getUser(); $user = $this->getUser();
$categories = \Category::load(null, null, $course->getCode()); $categories = Category::load(null, null, $course->getCode());
if (empty($categories)) { if (empty($categories)) {
throw $this->createNotFoundException(); throw $this->createNotFoundException();
} }
$evaladd = new \Evaluation(); $evaladd = new Evaluation();
$evaladd->set_user_id($user->getId()); $evaladd->set_user_id($user->getId());
if (!empty($catId)) { if (!empty($catId)) {
@ -500,25 +552,31 @@ class CourseController extends BaseController
$evaladd->set_category_id(0); $evaladd->set_category_id(0);
} }
$form = new \EvalForm( $form = new EvalForm(
\EvalForm::TYPE_ADD, EvalForm::TYPE_ADD,
$evaladd, $evaladd,
null, null,
'add_eval_form', 'add_eval_form',
null, null,
$this->generateUrl( $this->generateUrl(
'chamilo_lti_grade', 'chamilo_lti_grade',
['catId' => $catId, 'code' => $course->getCode()] [
'catId' => $catId,
'code' => $course->getCode(),
]
).'?'.api_get_cidreq() ).'?'.api_get_cidreq()
); );
$form->removeElement('name'); $form->removeElement('name');
$form->removeElement('addresult'); $form->removeElement('addresult');
/** @var \HTML_QuickForm_select $slcLtiTools */ /** @var HTML_QuickForm_select $slcLtiTools */
$slcLtiTools = $form->createElement('select', 'name', $this->trans('External tool')); $slcLtiTools = $form->createElement('select', 'name', $this->trans('External tool'));
$form->insertElementBefore($slcLtiTools, 'hid_category_id'); $form->insertElementBefore($slcLtiTools, 'hid_category_id');
$form->addRule('name', get_lang('Required field'), 'required'); $form->addRule('name', get_lang('Required field'), 'required');
$tools = $toolRepo->findBy(['course' => $course, 'gradebookEval' => null]); $tools = $toolRepo->findBy([
'course' => $course,
'gradebookEval' => null,
]);
/** @var ExternalTool $tool */ /** @var ExternalTool $tool */
foreach ($tools as $tool) { foreach ($tools as $tool) {
@ -544,7 +602,7 @@ class CourseController extends BaseController
throw $this->createNotFoundException(); throw $this->createNotFoundException();
} }
$eval = new \Evaluation(); $eval = new Evaluation();
$eval->set_name($tool->getName()); $eval->set_name($tool->getName());
$eval->set_description($values['description']); $eval->set_description($values['description']);
$eval->set_user_id($values['hid_user_id']); $eval->set_user_id($values['hid_user_id']);
@ -575,7 +633,7 @@ class CourseController extends BaseController
return $this->redirect(api_get_course_url()); return $this->redirect(api_get_course_url());
} }
private function setConfigureBreadcrumb(Course $course) private function setConfigureBreadcrumb(Course $course): void
{ {
$breadcrumb = $this->get('chamilo_core.block.breadcrumb'); $breadcrumb = $this->get('chamilo_core.block.breadcrumb');
$breadcrumb->addChild( $breadcrumb->addChild(
@ -583,7 +641,9 @@ class CourseController extends BaseController
[ [
'uri' => $this->generateUrl( 'uri' => $this->generateUrl(
'chamilo_course_home_home_index', 'chamilo_course_home_home_index',
['course' => $course->getCode()] [
'course' => $course->getCode(),
]
), ),
] ]
); );
@ -598,12 +658,12 @@ class CourseController extends BaseController
User $user, User $user,
Course $course, Course $course,
Session $session = null Session $session = null
) { ): void {
$replaceable = self::getReplaceableVariables($user, $course, $session); $replaceable = self::getReplaceableVariables($user, $course, $session);
$variables = array_keys($replaceable); $variables = array_keys($replaceable);
foreach ($customParams as $customKey => $customValue) { foreach ($customParams as $customKey => $customValue) {
if (!in_array($customValue, $variables)) { if (!in_array($customValue, $variables, true)) {
continue; continue;
} }
@ -616,9 +676,8 @@ class CourseController extends BaseController
$customParams[$customKey] = $params[$val]; $customParams[$customKey] = $params[$val];
continue; continue;
} else {
$val = false;
} }
$val = false;
} }
if (false === $val) { if (false === $val) {
@ -656,14 +715,16 @@ class CourseController extends BaseController
'$Person.address.statepr' => false, '$Person.address.statepr' => false,
'$Person.address.country' => false, '$Person.address.country' => false,
'$Person.address.postcode' => false, '$Person.address.postcode' => false,
'$Person.address.timezone' => false, //$user->getTimezone(), '$Person.address.timezone' => false,
//$user->getTimezone(),
'$Person.phone.mobile' => false, '$Person.phone.mobile' => false,
'$Person.phone.primary' => $user->getPhone(), '$Person.phone.primary' => $user->getPhone(),
'$Person.phone.home' => false, '$Person.phone.home' => false,
'$Person.phone.work' => false, '$Person.phone.work' => false,
'$Person.email.primary' => $user->getEmail(), '$Person.email.primary' => $user->getEmail(),
'$Person.email.personal' => false, '$Person.email.personal' => false,
'$Person.webaddress' => false, //$user->getWebsite(), '$Person.webaddress' => false,
//$user->getWebsite(),
'$Person.sms' => false, '$Person.sms' => false,
'$CourseTemplate.sourcedId' => false, '$CourseTemplate.sourcedId' => false,
@ -696,10 +757,10 @@ class CourseController extends BaseController
'$CourseSection.numberofStudents' => false, '$CourseSection.numberofStudents' => false,
'$CourseSection.dept' => false, '$CourseSection.dept' => false,
'$CourseSection.timeFrame.begin' => $session && $session->getDisplayStartDate() '$CourseSection.timeFrame.begin' => $session && $session->getDisplayStartDate()
? $session->getDisplayStartDate()->format(\DateTime::ATOM) ? $session->getDisplayStartDate()->format(DateTime::ATOM)
: false, : false,
'$CourseSection.timeFrame.end' => $session && $session->getDisplayEndDate() '$CourseSection.timeFrame.end' => $session && $session->getDisplayEndDate()
? $session->getDisplayEndDate()->format(\DateTime::ATOM) ? $session->getDisplayEndDate()->format(DateTime::ATOM)
: false, : false,
'$CourseSection.enrollControl.accept' => false, '$CourseSection.enrollControl.accept' => false,
'$CourseSection.enrollControl.allowed' => false, '$CourseSection.enrollControl.allowed' => false,
@ -792,9 +853,13 @@ class CourseController extends BaseController
->setLink( ->setLink(
$this->generateUrl( $this->generateUrl(
'chamilo_lti_show', 'chamilo_lti_show',
['code' => $course->getCode(), 'id' => $newTool->getId()] [
'code' => $course->getCode(),
'id' => $newTool->getId(),
]
) )
); )
;
$em->persist($courseTool); $em->persist($courseTool);
$em->flush(); $em->flush();

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Controller; namespace Chamilo\LtiBundle\Controller;
@ -10,12 +12,11 @@ use Chamilo\LtiBundle\Component\OutcomeReadRequest;
use Chamilo\LtiBundle\Component\OutcomeReplaceRequest; use Chamilo\LtiBundle\Component\OutcomeReplaceRequest;
use Chamilo\LtiBundle\Component\OutcomeUnsupportedRequest; use Chamilo\LtiBundle\Component\OutcomeUnsupportedRequest;
use Chamilo\LtiBundle\Entity\ExternalTool; use Chamilo\LtiBundle\Entity\ExternalTool;
use OAuthUtil;
use SimpleXMLElement;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
/**
* Class ServicesController.
*/
class ServiceController extends BaseController class ServiceController extends BaseController
{ {
/** /**
@ -26,21 +27,25 @@ class ServiceController extends BaseController
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
$toolRepo = $em->getRepository('ChamiloLtiBundle:ExternalTool'); $toolRepo = $em->getRepository('ChamiloLtiBundle:ExternalTool');
$headers = \OAuthUtil::get_headers(); $headers = OAuthUtil::get_headers();
if (empty($headers['Authorization'])) { if (empty($headers['Authorization'])) {
throw $this->createAccessDeniedException(); throw $this->createAccessDeniedException();
} }
$authParams = \OAuthUtil::split_header($headers['Authorization']); $authParams = OAuthUtil::split_header($headers['Authorization']);
if (empty($authParams) || empty($authParams['oauth_consumer_key']) || empty($authParams['oauth_signature'])) { if (empty($authParams) || empty($authParams['oauth_consumer_key']) || empty($authParams['oauth_signature'])) {
throw $this->createAccessDeniedException(); throw $this->createAccessDeniedException();
} }
$course = $this->getCourse(); $course = $this->getCourse();
$tools = $toolRepo->findBy(['consumerKey' => $authParams['oauth_consumer_key']]); $tools = $toolRepo->findBy([
$url = $this->generateUrl('chamilo_lti_os', ['code' => $course->getCode()]); 'consumerKey' => $authParams['oauth_consumer_key'],
]);
$url = $this->generateUrl('chamilo_lti_os', [
'code' => $course->getCode(),
]);
$toolIsFound = false; $toolIsFound = false;
@ -80,7 +85,7 @@ class ServiceController extends BaseController
} }
/** /**
* @return \Chamilo\LtiBundle\Component\OutcomeResponse|null * @return null|\Chamilo\LtiBundle\Component\OutcomeResponse
*/ */
private function processServiceRequest() private function processServiceRequest()
{ {
@ -90,7 +95,7 @@ class ServiceController extends BaseController
return null; return null;
} }
$xml = new \SimpleXMLElement($requestContent); $xml = new SimpleXMLElement($requestContent);
if (empty($xml)) { if (empty($xml)) {
return null; return null;

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Entity; namespace Chamilo\LtiBundle\Entity;
@ -18,104 +20,75 @@ use Doctrine\ORM\Mapping as ORM;
class ExternalTool class ExternalTool
{ {
/** /**
* @var int
*
* @ORM\Column(name="id", type="integer") * @ORM\Column(name="id", type="integer")
* @ORM\Id * @ORM\Id
* @ORM\GeneratedValue * @ORM\GeneratedValue
*/ */
protected $id; protected int $id;
/** /**
* @var string
*
* @ORM\Column(name="name", type="string") * @ORM\Column(name="name", type="string")
*/ */
protected $name; protected string $name;
/** /**
* @var string|null
*
* @ORM\Column(name="description", type="text", nullable=true) * @ORM\Column(name="description", type="text", nullable=true)
*/ */
protected $description; protected ?string $description = null;
/** /**
* @var string
*
* @ORM\Column(name="launch_url", type="string") * @ORM\Column(name="launch_url", type="string")
*/ */
protected $launchUrl; protected string $launchUrl;
/** /**
* @var string
*
* @ORM\Column(name="consumer_key", type="string", nullable=true) * @ORM\Column(name="consumer_key", type="string", nullable=true)
*/ */
protected $consumerKey; protected string $consumerKey;
/** /**
* @var string
*
* @ORM\Column(name="shared_secret", type="string", nullable=true) * @ORM\Column(name="shared_secret", type="string", nullable=true)
*/ */
protected $sharedSecret; protected string $sharedSecret;
/** /**
* @var string|null
*
* @ORM\Column(name="custom_params", type="text", nullable=true) * @ORM\Column(name="custom_params", type="text", nullable=true)
*/ */
protected $customParams; protected ?string $customParams = null;
/** /**
* @var bool
*
* @ORM\Column(name="active_deep_linking", type="boolean", nullable=false, options={"default": false}) * @ORM\Column(name="active_deep_linking", type="boolean", nullable=false, options={"default": false})
*/ */
protected $activeDeepLinking; protected bool $activeDeepLinking;
/** /**
* @var string|null
*
* @ORM\Column(name="privacy", type="text", nullable=true, options={"default": null}) * @ORM\Column(name="privacy", type="text", nullable=true, options={"default": null})
*/ */
protected $privacy; protected ?string $privacy = null;
/** /**
* @var Course|null
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course") * @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course")
* @ORM\JoinColumn(name="c_id", referencedColumnName="id") * @ORM\JoinColumn(name="c_id", referencedColumnName="id")
*/ */
protected $course; protected ?Course $course = null;
/** /**
* @var GradebookEvaluation|null
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\GradebookEvaluation") * @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\GradebookEvaluation")
* @ORM\JoinColumn(name="gradebook_eval_id", referencedColumnName="id", onDelete="SET NULL") * @ORM\JoinColumn(name="gradebook_eval_id", referencedColumnName="id", onDelete="SET NULL")
*/ */
protected $gradebookEval = null; protected ?GradebookEvaluation $gradebookEval = null;
/** /**
* @var ExternalTool|null
*
* @ORM\ManyToOne(targetEntity="Chamilo\LtiBundle\Entity\ExternalTool", inversedBy="children") * @ORM\ManyToOne(targetEntity="Chamilo\LtiBundle\Entity\ExternalTool", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id") * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/ */
protected $parent; protected ?ExternalTool $parent = null;
/** /**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Chamilo\LtiBundle\Entity\ExternalTool", mappedBy="parent") * @ORM\OneToMany(targetEntity="Chamilo\LtiBundle\Entity\ExternalTool", mappedBy="parent")
*/ */
protected $children; protected ArrayCollection $children;
/**
* ExternalTool constructor.
*/
public function __construct() public function __construct()
{ {
$this->description = null; $this->description = null;
@ -164,7 +137,7 @@ class ExternalTool
} }
/** /**
* @return string|null * @return null|string
*/ */
public function getDescription() public function getDescription()
{ {
@ -172,7 +145,7 @@ class ExternalTool
} }
/** /**
* @param string|null $description * @param null|string $description
* *
* @return ExternalTool * @return ExternalTool
*/ */
@ -244,7 +217,7 @@ class ExternalTool
} }
/** /**
* @return string|null * @return null|string
*/ */
public function getCustomParams() public function getCustomParams()
{ {
@ -252,7 +225,7 @@ class ExternalTool
} }
/** /**
* @param string|null $customParams * @param null|string $customParams
* *
* @return ExternalTool * @return ExternalTool
*/ */
@ -263,16 +236,13 @@ class ExternalTool
return $this; return $this;
} }
/**
* @return bool
*/
public function isGlobal(): bool public function isGlobal(): bool
{ {
return null === $this->course; return null === $this->course;
} }
/** /**
* @return string|null * @return null|string
*/ */
public function encodeCustomParams(array $params) public function encodeCustomParams(array $params)
{ {
@ -281,7 +251,7 @@ class ExternalTool
} }
$pairs = []; $pairs = [];
foreach ($params as $key => $value) { foreach ($params as $key => $value) {
$pairs[] = "$key=$value"; $pairs[] = "{$key}={$value}";
} }
return implode("\n", $pairs); return implode("\n", $pairs);
@ -310,11 +280,6 @@ class ExternalTool
return $params; return $params;
} }
/**
* Get activeDeepLinking.
*
* @return bool
*/
public function isActiveDeepLinking(): bool public function isActiveDeepLinking(): bool
{ {
return $this->activeDeepLinking; return $this->activeDeepLinking;
@ -337,7 +302,7 @@ class ExternalTool
/** /**
* Get course. * Get course.
* *
* @return Course|null * @return null|Course
*/ */
public function getCourse() public function getCourse()
{ {
@ -359,7 +324,7 @@ class ExternalTool
/** /**
* Get gradebookEval. * Get gradebookEval.
* *
* @return GradebookEvaluation|null * @return null|GradebookEvaluation
*/ */
public function getGradebookEval() public function getGradebookEval()
{ {
@ -369,7 +334,7 @@ class ExternalTool
/** /**
* Set gradebookEval. * Set gradebookEval.
* *
* @param GradebookEvaluation|null $gradebookEval * @param null|GradebookEvaluation $gradebookEval
* *
* @return ExternalTool * @return ExternalTool
*/ */
@ -383,7 +348,7 @@ class ExternalTool
/** /**
* Get privacy. * Get privacy.
* *
* @return string|null * @return null|string
*/ */
public function getPrivacy() public function getPrivacy()
{ {
@ -412,9 +377,6 @@ class ExternalTool
return $this; return $this;
} }
/**
* @return bool
*/
public function isSharingName(): bool public function isSharingName(): bool
{ {
$unserialize = $this->unserializePrivacy(); $unserialize = $this->unserializePrivacy();
@ -427,9 +389,6 @@ class ExternalTool
return unserialize($this->privacy); return unserialize($this->privacy);
} }
/**
* @return bool
*/
public function isSharingEmail(): bool public function isSharingEmail(): bool
{ {
$unserialize = $this->unserializePrivacy(); $unserialize = $this->unserializePrivacy();
@ -437,9 +396,6 @@ class ExternalTool
return (bool) $unserialize['share_email']; return (bool) $unserialize['share_email'];
} }
/**
* @return bool
*/
public function isSharingPicture(): bool public function isSharingPicture(): bool
{ {
$unserialize = $this->unserializePrivacy(); $unserialize = $this->unserializePrivacy();
@ -448,7 +404,7 @@ class ExternalTool
} }
/** /**
* @return ExternalTool|null * @return null|ExternalTool
*/ */
public function getParent() public function getParent()
{ {

@ -1,10 +1,13 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Form; namespace Chamilo\LtiBundle\Form;
use Chamilo\LtiBundle\Entity\ExternalTool; use Chamilo\LtiBundle\Entity\ExternalTool;
use SimpleXMLElement;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
@ -16,12 +19,9 @@ use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* Class ExternalToolType.
*/
class ExternalToolType extends AbstractType class ExternalToolType extends AbstractType
{ {
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options): void
{ {
/** @var ExternalTool $tool */ /** @var ExternalTool $tool */
$tool = $builder->getData(); $tool = $builder->getData();
@ -29,13 +29,21 @@ class ExternalToolType extends AbstractType
$builder $builder
->add('name', TextType::class) ->add('name', TextType::class)
->add('description', TextareaType::class, ['required' => false]); ->add('description', TextareaType::class, [
'required' => false,
])
;
if (null === $parent) { if (null === $parent) {
$builder $builder
->add('launchUrl', UrlType::class) ->add('launchUrl', UrlType::class)
->add('consumerKey', TextType::class, ['required' => false]) ->add('consumerKey', TextType::class, [
->add('sharedSecret', TextType::class, ['required' => false]); 'required' => false,
])
->add('sharedSecret', TextType::class, [
'required' => false,
])
;
} }
$builder->add( $builder->add(
@ -65,23 +73,40 @@ class ExternalToolType extends AbstractType
->add( ->add(
'shareName', 'shareName',
CheckboxType::class, CheckboxType::class,
['mapped' => false, 'help' => "Share launcher's name", 'required' => false] [
'mapped' => false,
'help' => "Share launcher's name",
'required' => false,
]
) )
->add( ->add(
'shareEmail', 'shareEmail',
CheckboxType::class, CheckboxType::class,
['mapped' => false, 'help' => "Share launcher's email", 'required' => false] [
'mapped' => false,
'help' => "Share launcher's email",
'required' => false,
]
) )
->add( ->add(
'sharePicture', 'sharePicture',
CheckboxType::class, CheckboxType::class,
['mapped' => false, 'help' => "Share launcher's picture", 'required' => false] [
); 'mapped' => false,
'help' => "Share launcher's picture",
'required' => false,
]
)
;
$builder->add( $builder->add(
empty($tool->getId()) ? 'save' : 'edit', empty($tool->getId()) ? 'save' : 'edit',
SubmitType::class, SubmitType::class,
['attr' => ['class' => 'btn btn-primary']] [
'attr' => [
'class' => 'btn btn-primary',
],
]
); );
$builder->addEventListener( $builder->addEventListener(
@ -90,12 +115,12 @@ class ExternalToolType extends AbstractType
); );
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver): void
{ {
$resolver->setDefaults(['data_class', ExternalTool::class]); $resolver->setDefaults(['data_class', ExternalTool::class]);
} }
public function onPostSubmit(FormEvent $event) public function onPostSubmit(FormEvent $event): void
{ {
/** @var ExternalTool $tool */ /** @var ExternalTool $tool */
$tool = $event->getData(); $tool = $event->getData();
@ -121,7 +146,7 @@ class ExternalToolType extends AbstractType
/** /**
* @param string $launchUrl * @param string $launchUrl
* *
* @return string|null * @return null|string
*/ */
private function getLaunchUrlFromCartridge($launchUrl) private function getLaunchUrlFromCartridge($launchUrl)
{ {
@ -151,7 +176,7 @@ class ExternalToolType extends AbstractType
return null; return null;
} }
$xml = new \SimpleXMLElement($content); $xml = new SimpleXMLElement($content);
$result = $xml->xpath('blti:launch_url'); $result = $xml->xpath('blti:launch_url');
if (empty($result)) { if (empty($result)) {

@ -1,5 +1,7 @@
<?php <?php
declare(strict_types=1);
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
namespace Chamilo\LtiBundle\Util; namespace Chamilo\LtiBundle\Util;
@ -7,17 +9,16 @@ namespace Chamilo\LtiBundle\Util;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Settings\SettingsManager; use Chamilo\CoreBundle\Settings\SettingsManager;
use Chamilo\LtiBundle\Entity\ExternalTool; use Chamilo\LtiBundle\Entity\ExternalTool;
use OAuthConsumer;
use OAuthRequest;
use OAuthSignatureMethod_HMAC_SHA1;
use URLify;
use UserManager;
/**
* Class Utils.
*/
class Utils class Utils
{ {
private SettingsManager $settingsManager; private SettingsManager $settingsManager;
/**
* Utils constructor.
*/
public function __construct(SettingsManager $settingsManager) public function __construct(SettingsManager $settingsManager)
{ {
$this->settingsManager = $settingsManager; $this->settingsManager = $settingsManager;
@ -43,9 +44,9 @@ class Utils
$siteName = $this->settingsManager->getSetting('platform.site_name'); $siteName = $this->settingsManager->getSetting('platform.site_name');
$institution = $this->settingsManager->getSetting('platform.institution'); $institution = $this->settingsManager->getSetting('platform.institution');
$userString = "$siteName - $institution - $userId"; $userString = "{$siteName} - {$institution} - {$userId}";
return \URLify::filter($userString, 255, '', true, true, false, false, true); return URLify::filter($userString, 255, '', true, true, false, false, true);
} }
/** /**
@ -85,7 +86,7 @@ class Utils
return ''; return '';
} }
$followedUsers = \UserManager::get_users_followed_by_drh($currentUser->getId()); $followedUsers = UserManager::get_users_followed_by_drh($currentUser->getId());
$scope = []; $scope = [];
foreach ($followedUsers as $userInfo) { foreach ($followedUsers as $userInfo) {
@ -95,7 +96,7 @@ class Utils
return implode(',', $scope); return implode(',', $scope);
} }
public static function trimParams(array &$params) public static function trimParams(array &$params): void
{ {
foreach ($params as $key => $value) { foreach ($params as $key => $value) {
$newValue = preg_replace('/\s+/', ' ', $value); $newValue = preg_replace('/\s+/', ' ', $value);
@ -135,12 +136,12 @@ class Utils
*/ */
public static function checkRequestSignature($url, $originConsumerKey, $originSignature, ExternalTool $tool) public static function checkRequestSignature($url, $originConsumerKey, $originSignature, ExternalTool $tool)
{ {
$consumer = new \OAuthConsumer( $consumer = new OAuthConsumer(
$originConsumerKey, $originConsumerKey,
$tool->getSharedSecret() $tool->getSharedSecret()
); );
$hmacMethod = new \OAuthSignatureMethod_HMAC_SHA1(); $hmacMethod = new OAuthSignatureMethod_HMAC_SHA1();
$oAuthRequest = \OAuthRequest::from_request('POST', $url); $oAuthRequest = OAuthRequest::from_request('POST', $url);
$oAuthRequest->sign_request($hmacMethod, $consumer, ''); $oAuthRequest->sign_request($hmacMethod, $consumer, '');
$signature = $oAuthRequest->get_parameter('oauth_signature'); $signature = $oAuthRequest->get_parameter('oauth_signature');

Loading…
Cancel
Save