Courses: Add illustrationUrl property in resources

In order to get easily the illustration + add ResourceNormalizer.php
that handles those URLs (contentUrl, illustrationUrl, downloadUrl)
pull/3924/head
Julio Montoya 4 years ago
parent 4459b6cbea
commit e861e2fcf5
  1. 2
      assets/vue/components/course/CourseCard.vue
  2. 12
      assets/vue/views/course/Home.vue
  3. 3
      assets/vue/views/user/courses/List.vue
  4. 14
      src/CoreBundle/Entity/AbstractResource.php
  5. 3
      src/CoreBundle/Entity/Course.php
  6. 1
      src/CoreBundle/Entity/ResourceNode.php
  7. 7
      src/CoreBundle/EventSubscriber/ResolveResourceFileContentUrlSubscriber.php
  8. 14
      src/CoreBundle/Repository/Node/IllustrationRepository.php
  9. 112
      src/CoreBundle/Serializer/ResourceNormalizer.php

@ -15,7 +15,7 @@
elevation="4"
>
<div class="">
<img class="object-cover w-full h-44" src="/img/session_default.png" />
<img class="object-cover w-full h-44" :src="course.illustrationUrl" />
</div>
<div class="p-4">
<div class="h-10 flex flex-row justify-between">

@ -71,18 +71,18 @@
</div>
</div>
<!-- <hr />-->
<!-- <div class="flex justify-between">-->
<!-- <div class="text-h6 font-bold">-->
<!-- Tools-->
<!-- </div>-->
<hr />
<div class="flex justify-between">
<div class="text-h6 font-bold">
Tools
</div>
<!-- <div>-->
<!-- <v-icon>-->
<!-- mdi-format-paint-->
<!-- </v-icon>-->
<!-- Customize-->
<!-- </div>-->
<!-- </div>-->
</div>
<div

@ -47,8 +47,9 @@ export default {
edges {
node {
course {
_id
_id,
title,
illustrationUrl
users(status: 1, first: 4) {
edges {
node {

@ -35,20 +35,32 @@ abstract class AbstractResource
public ?string $contentUrl = null;
/**
* Download URL of the Resource File Property set by ResourceNormalizer.php.
*
* @ApiProperty(iri="http://schema.org/contentUrl")
* @Groups({"resource_file:read", "resource_node:read", "document:read", "media_object_read"})
*/
public ?string $downloadUrl = null;
/**
* Content from ResourceFile - Property set by ResourceNormalizer.php.
*
* @Groups({"resource_file:read", "resource_node:read", "document:read", "document:write", "media_object_read"})
*/
public ?string $contentFile = null;
/**
* Resource illustration URL - Property set by ResourceNormalizer.php.
*
* @ApiProperty(iri="http://schema.org/contentUrl")
* @Groups({"resource_file:read", "resource_node:read", "document:read", "media_object_read", "course:read", "course_rel_user:read"})
*/
public ?string $illustrationUrl = null;
/**
* @Assert\Valid()
* @ApiSubresource()
* @Groups({"resource_node:read", "resource_node:write", "document:write", "ctool:read"})
* @Groups({"resource_node:read", "resource_node:write", "document:write", "ctool:read", "course:read", "illustration:read"})
* @ORM\OneToOne(
* targetEntity="Chamilo\CoreBundle\Entity\ResourceNode",
* cascade={"persist", "remove"},

@ -632,7 +632,8 @@ class Course extends AbstractResource implements ResourceInterface, ResourceWith
{
$this->title = $title;
if (empty($this->getCode())) {
// Set the code based in the title if it doesnt exists.
if (empty($this->code)) {
$this->setCode($title);
}

@ -153,6 +153,7 @@ class ResourceNode
/**
* Shortcut to access Course resource from ResourceNode.
* Groups({"resource_node:read", "course:read"}).
*
* ORM\OneToOne(targetEntity="Chamilo\CoreBundle\Entity\Illustration", mappedBy="resourceNode")
*/

@ -30,13 +30,14 @@ class ResolveResourceFileContentUrlSubscriber implements EventSubscriberInterfac
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['onPreSerialize', EventPriorities::PRE_SERIALIZE],
// KernelEvents::VIEW => ['onPreSerialize', EventPriorities::PRE_SERIALIZE],
];
}
public function onPreSerialize(ViewEvent $event): void
{
$controllerResult = $event->getControllerResult();
return;
/*$controllerResult = $event->getControllerResult();
$request = $event->getRequest();
if ($controllerResult instanceof Response || !$request->attributes->getBoolean('_api_respond', true)) {
@ -108,6 +109,6 @@ class ResolveResourceFileContentUrlSubscriber implements EventSubscriberInterfac
);
}
}
}
}*/
}
}

@ -15,16 +15,14 @@ use Chamilo\CoreBundle\Entity\ResourceNode;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Form\Resource\IllustrationType;
use Chamilo\CoreBundle\Repository\GridInterface;
use Chamilo\CoreBundle\Repository\ResourceRepository;
use Chamilo\CoreBundle\Repository\UploadInterface;
use Chamilo\CourseBundle\Entity\CGroup;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
final class IllustrationRepository extends ResourceRepository implements GridInterface, UploadInterface
final class IllustrationRepository extends ResourceRepository implements UploadInterface
{
public function __construct(ManagerRegistry $registry)
{
@ -55,16 +53,6 @@ final class IllustrationRepository extends ResourceRepository implements GridInt
return $resource;
}
public function setResourceProperties(FormInterface $form, Course $course, Session $session, string $fileType): void
{
//return $form->getData();
//->setCourse($course)
//->setSession($session)
//->setFiletype($fileType)
//->setTitle($title) // already added in $form->getData()
}
/**
* @param ResourceInterface|User $resource
*/

@ -0,0 +1,112 @@
<?php
declare(strict_types=1);
namespace Chamilo\CoreBundle\Serializer;
use ArrayObject;
use Chamilo\CoreBundle\Entity\AbstractResource;
use Chamilo\CoreBundle\Entity\ResourceIllustrationInterface;
use Chamilo\CoreBundle\Repository\Node\IllustrationRepository;
use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;
final class ResourceNormalizer implements ContextAwareNormalizerInterface, NormalizerAwareInterface
{
use NormalizerAwareTrait;
private const ALREADY_CALLED = 'MEDIA_OBJECT_NORMALIZER_ALREADY_CALLED';
private ResourceNodeRepository $resourceNodeRepository;
private IllustrationRepository $illustrationRepository;
private RequestStack $requestStack;
private UrlGeneratorInterface $generator;
public function __construct(ResourceNodeRepository $resourceNodeRepository, IllustrationRepository $illustrationRepository, RequestStack $requestStack, UrlGeneratorInterface $generator)
{
$this->resourceNodeRepository = $resourceNodeRepository;
$this->requestStack = $requestStack;
$this->generator = $generator;
$this->illustrationRepository = $illustrationRepository;
}
/**
* @param AbstractResource $object
*/
public function normalize($object, ?string $format = null, array $context = []): array | string | int | float | bool | ArrayObject | null
{
$context[self::ALREADY_CALLED] = true;
$request = $this->requestStack->getCurrentRequest();
$getFile = $request->get('getFile');
$courseId = (int) $request->get('cid');
if (empty($courseId)) {
// Try with cid from session
$courseId = (int) $request->getSession()->get('cid');
}
$sessionId = (int) $request->get('sid');
if (empty($sessionId)) {
$sessionId = (int) $request->getSession()->get('sid');
}
$groupId = (int) $request->get('gid');
if (empty($groupId)) {
$groupId = (int) $request->getSession()->get('gid');
}
if ($object->hasResourceNode()) {
$resourceNode = $object->getResourceNode();
$params = [
'id' => $resourceNode->getId(),
'cid' => $courseId,
'sid' => $sessionId,
'gid' => $groupId,
'tool' => $resourceNode->getResourceType()->getTool()->getName(),
'type' => $resourceNode->getResourceType()->getName(),
];
//if ($getFile) {
// Get all links from resource.
$object->setResourceLinkListFromEntity();
//}
$object->contentUrl = $this->generator->generate('chamilo_core_resource_view', $params);
$object->downloadUrl = $this->generator->generate('chamilo_core_resource_download', $params);
error_log($object->getResourceName());
// Get illustration of a resource, instead of looking for the node children to get the illustration.
if ($object instanceof ResourceIllustrationInterface) {
error_log('check illustration');
$object->illustrationUrl = $this->illustrationRepository->getIllustrationUrl($object);
}
// This gets the file contents, usually use to get HTML/Text data to be edited.
if ($getFile &&
$resourceNode->hasResourceFile() &&
$resourceNode->hasEditableTextContent()
) {
$object->contentFile = $this->resourceNodeRepository->getResourceNodeFileContent(
$resourceNode
);
}
}
return $this->normalizer->normalize($object, $format, $context);
}
public function supportsNormalization($data, ?string $format = null, array $context = []): bool
{
if (isset($context[self::ALREADY_CALLED])) {
return false;
}
return $data instanceof AbstractResource;
}
}
Loading…
Cancel
Save