Add user avatar using the IllustrationRepository.

Adding twig extension "user_illustration" to call the user image like:

<img
src="{{ app.user.resourceNode | user_illustration }}?w=300&h=300&fit=crop"
>
pull/3064/head
Julio 5 years ago
parent 3ae6eb8213
commit 7621d0251a
  1. 2
      src/CoreBundle/Controller/AccountController.php
  2. 7
      src/CoreBundle/Controller/ResourceController.php
  3. 7
      src/CoreBundle/Controller/UserController.php
  4. 38
      src/CoreBundle/Repository/IllustrationRepository.php
  5. 4
      src/CoreBundle/Repository/ResourceRepository.php
  6. 5
      src/CoreBundle/Resources/views/Account/home.html.twig
  7. 2
      src/CoreBundle/Resources/views/User/profile.html.twig
  8. 32
      src/CoreBundle/Twig/Extension/ChamiloExtension.php
  9. 2
      src/GraphQlBundle/Map/MutationMap.php
  10. 11
      src/GraphQlBundle/Resolver/UserResolver.php
  11. 2
      src/SettingsBundle/ChamiloSettingsBundle.php
  12. 16
      src/SettingsBundle/Twig/SettingsExtension.php
  13. 2
      src/ThemeBundle/Model/UserInterface.php
  14. 18
      src/ThemeBundle/Resources/views/Layout/header.html.twig
  15. 25
      src/UserBundle/Entity/User.php

@ -66,7 +66,7 @@ class AccountController extends BaseController
if ($form->isSubmitted() && $form->isValid()) {
$illustration = $form['illustration']->getData();
if ($illustration) {
$file = $illustrationRepository->addIllustration($resource, $this->getUser(), $illustration);
$file = $illustrationRepository->addIllustrationToUser($this->getUser(), $illustration);
$em = $illustrationRepository->getEntityManager();
$em->persist($file);
$em->flush();

@ -87,7 +87,6 @@ class ResourceController extends AbstractResourceController implements CourseCon
if (empty($parentNodeId)) {
if ($this->hasCourse()) {
$parentResourceNode = $this->getCourse()->getResourceNode();
} else {
/** @var User $user */
$parentResourceNode = $this->getUser()->getResourceNode();
@ -130,8 +129,6 @@ class ResourceController extends AbstractResourceController implements CourseCon
public function getGrid(Request $request, Grid $grid, $resourceNodeId): Grid
{
$tool = $request->get('tool');
$type = $request->get('type');
$id = (int) $request->get('id');
$repository = $this->getRepositoryFromRequest($request);
@ -975,7 +972,7 @@ class ResourceController extends AbstractResourceController implements CourseCon
$resourceFile = $resourceNode->getResourceFile();
if (!$resourceFile) {
throw new NotFoundHttpException();
throw new NotFoundHttpException($this->trans('File not found for resource'));
}
//$fileName = $resourceFile->getOriginalName();
@ -1036,8 +1033,6 @@ class ResourceController extends AbstractResourceController implements CourseCon
*/
private function createResource(Request $request, $fileType = 'file')
{
$tool = $request->get('tool');
$type = $request->get('type');
$resourceNodeParentId = $request->get('id');
$repository = $this->getRepositoryFromRequest($request);

@ -3,6 +3,7 @@
namespace Chamilo\CoreBundle\Controller;
use Chamilo\CoreBundle\Repository\IllustrationRepository;
use Chamilo\ThemeBundle\Model\UserInterface;
use Chamilo\UserBundle\Repository\UserRepository;
use Symfony\Component\Routing\Annotation\Route;
@ -23,7 +24,7 @@ class UserController extends BaseController
*
* @param string $username
*/
public function profileAction($username, UserRepository $userRepository)
public function profileAction($username, UserRepository $userRepository, IllustrationRepository $illustrationRepository)
{
$user = $userRepository->findByUsername($username);
@ -31,6 +32,8 @@ class UserController extends BaseController
throw $this->createAccessDeniedException('This user does not have access to this section');
}
return $this->render('@ChamiloCore/User/profile.html.twig', ['user' => $user]);
$url = $illustrationRepository->getIllustrationUrlFromNode($user->getResourceNode());
return $this->render('@ChamiloCore/User/profile.html.twig', ['user' => $user, 'illustration_url' => $url]);
}
}

@ -49,7 +49,7 @@ final class IllustrationRepository extends ResourceRepository implements Resourc
return null;
}
$illustrationNode = $this->getIllustrationNodeFromResource($resource);
$illustrationNode = $this->getIllustrationNodeFromParent($resource->getResourceNode());
$em = $this->getEntityManager();
if ($illustrationNode === null) {
@ -64,14 +64,35 @@ final class IllustrationRepository extends ResourceRepository implements Resourc
return $this->addFile($illustration, $uploadFile);
}
public function getIllustrationNodeFromResource(AbstractResource $resource): ?ResourceNode
public function addIllustrationToUser(User $user, $uploadFile): ?ResourceFile
{
if (null === $uploadFile) {
return null;
}
$illustrationNode = $this->getIllustrationNodeFromParent($user->getResourceNode());
$em = $this->getEntityManager();
if ($illustrationNode === null) {
$illustration = new Illustration();
$em->persist($illustration);
$this->createNodeForResource($illustration, $user, $user->getResourceNode());
} else {
$illustration = $this->repository->findOneBy(['resourceNode' => $illustrationNode]);
}
//$this->addResourceToEveryone($illustrationNode);
return $this->addFile($illustration, $uploadFile);
}
public function getIllustrationNodeFromParent(ResourceNode $resourceNode): ?ResourceNode
{
$nodeRepo = $this->getResourceNodeRepository();
$resourceType = $this->getResourceType();
/** @var ResourceNode $node */
$node = $nodeRepo->findOneBy(
['parent' => $resource->getResourceNode(), 'resourceType' => $resourceType]
['parent' => $resourceNode, 'resourceType' => $resourceType]
);
return $node;
@ -79,7 +100,7 @@ final class IllustrationRepository extends ResourceRepository implements Resourc
public function deleteIllustration(AbstractResource $resource)
{
$node = $this->getIllustrationNodeFromResource($resource);
$node = $this->getIllustrationNodeFromParent($resource->getResourceNode());
if ($node !== null) {
$this->getEntityManager()->remove($node);
@ -92,9 +113,14 @@ final class IllustrationRepository extends ResourceRepository implements Resourc
*
* @return string
*/
public function getIllustrationUrl(AbstractResource $resource, $filter = '')
public function getIllustrationUrl(AbstractResource $resource, $filter = ''): string
{
return $this->getIllustrationUrlFromNode($resource->getResourceNode(), $filter);
}
public function getIllustrationUrlFromNode(ResourceNode $resourceNode, $filter = ''): string
{
$node = $this->getIllustrationNodeFromResource($resource);
$node = $this->getIllustrationNodeFromParent($resourceNode);
if ($node !== null) {
$params = [

@ -276,7 +276,7 @@ class ResourceRepository extends EntityRepository
return $resourceFile;
}
//unction createNodeForResource(AbstractResource $resource, User $creator, ResourceNode $parent = null, UploadedFile $file = null): ResourceNode
public function addResourceNode(AbstractResource $resource, User $creator, AbstractResource $parent = null): ResourceNode
{
if (null !== $parent) {
@ -596,7 +596,7 @@ class ResourceRepository extends EntityRepository
$qb->andWhere('node.creator = :creator');
$qb->setParameter('creator', $user);
//var_dump($qb->getQuery()->getSQL(), $type->getId(), $parentNode->getId());exit;
//var_dump($qb->getQuery()->getSQL(), $parentNode->getId());exit;
return $qb;
}

@ -4,6 +4,11 @@
{% autoescape false %}
<h2>{{ 'Profile' | trans }}</h2>
<h3>{{ user.username }} {{ user.firstname }} {{ user.lastname }}</h3>
<img src="{{ app.user.resourceNode | user_illustration }}?w=300&h=300&fit=crop">
<br />
<a href="{{ url('chamilo_core_account_edit') }}" class="btn btn-primary">
{{ 'Edit profile' | trans }}
</a>

@ -8,5 +8,7 @@
{{ user.openarea }}
{{ user.teach }}
{{ user.diplomas }}
<img src="{{ illustration_url }}"/>
{% endautoescape %}
{% endblock %}

@ -3,6 +3,8 @@
namespace Chamilo\CoreBundle\Twig\Extension;
use Chamilo\CoreBundle\Repository\IllustrationRepository;
use Chamilo\SettingsBundle\Templating\Helper\SettingsHelper;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
@ -11,6 +13,16 @@ use Twig\TwigFilter;
*/
class ChamiloExtension extends AbstractExtension
{
private $illustrationRepository;
/**
* @param SettingsHelper $helper
*/
public function __construct(IllustrationRepository $illustrationRepository)
{
$this->illustrationRepository = $illustrationRepository;
}
public function getFilters(): array
{
return [
@ -26,6 +38,8 @@ class ChamiloExtension extends AbstractExtension
new TwigFilter('date_to_time_ago', 'Display::dateToStringAgoAndLongDate'),
new TwigFilter('api_get_configuration_value', 'api_get_configuration_value'),
new TwigFilter('format_user_full_name', 'UserManager::formatUserFullName'),
new TwigFilter('illustration', [$this, 'getIllustration']),
new TwigFilter('user_illustration', [$this, 'getUserIllustration']),
];
}
@ -37,6 +51,24 @@ class ChamiloExtension extends AbstractExtension
return [];
}
public function getIllustration($node)
{
$url = $this->illustrationRepository->getIllustrationUrlFromNode($node);
return $url;
}
public function getUserIllustration($node)
{
$url = $this->getIllustration($node);
if (empty($url)) {
return 'img/icons/32/unknown.png';
}
return $url;
}
/**
* Returns the name of the extension.
*

@ -639,7 +639,7 @@ class MutationMap extends ResolverMap implements ContainerAwareInterface
!empty($userInput['status']) ? $userInput['status'] : $user->getStatus(),
!empty($userInput['officialCode']) ? $userInput['officialCode'] : $user->getOfficialCode(),
!empty($userInput['phone']) ? $userInput['phone'] : $user->getPhone(),
$user->getPictureUri(),
null,
!empty($userInput['expirationDate']) ? $userInput['expirationDate'] : $user->getExpirationDate(),
!empty($userInput['isActive']) ? $userInput['isActive'] : $user->isActive()
);

@ -35,17 +35,6 @@ class UserResolver implements ContainerAwareInterface
return $user->getEmail();
}
/**
* @return string
*/
public function getPicture(User $user, Argument $args)
{
$assets = $this->container->get('templating.helper.assets');
$path = $user->getAvatarOrAnonymous($args['size']);
return $assets->getUrl($path);
}
/**
* @return ArrayCollection
*/

@ -7,8 +7,6 @@ use Symfony\Component\HttpKernel\Bundle\Bundle;
/**
* Class ChamiloSettingsBundle.
*
* @package Chamilo\SettingsBundle
*/
class ChamiloSettingsBundle extends Bundle
{

@ -3,15 +3,17 @@
namespace Chamilo\SettingsBundle\Twig;
//use Sylius\Bundle\SettingsBundle\Templating\Helper\SettingsHelper;
use Chamilo\SettingsBundle\Templating\Helper\SettingsHelper;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
/**
* Sylius settings extension for Twig.
*
* @author Paweł Jędrzejewski <pawel@sylius.org>
*/
class SettingsExtension extends \Twig_Extension
class SettingsExtension extends AbstractExtension
{
/**
* @var SettingsHelper
@ -32,9 +34,9 @@ class SettingsExtension extends \Twig_Extension
public function getFunctions()
{
return [
new \Twig_SimpleFunction('chamilo_settings_all', [$this, 'getSettings']),
new \Twig_SimpleFunction('chamilo_settings_get', [$this, 'getSettingsParameter']),
new \Twig_SimpleFunction('chamilo_settings_has', [$this, 'hasSettingsParameter']),
new TwigFunction('chamilo_settings_all', [$this, 'getSettings']),
new TwigFunction('chamilo_settings_get', [$this, 'getSettingsParameter']),
new TwigFunction('chamilo_settings_has', [$this, 'hasSettingsParameter']),
];
}
@ -45,8 +47,8 @@ class SettingsExtension extends \Twig_Extension
{
return [
//new \Twig_SimpleFunction('chamilo_settings_all', array($this, 'getSettings')),
new \Twig_SimpleFilter('get_setting', [$this, 'getSettingsParameter']),
new \Twig_SimpleFilter('api_get_setting', [$this, 'getSettingsParameter']),
new TwigFilter('get_setting', [$this, 'getSettingsParameter']),
new TwigFilter('api_get_setting', [$this, 'getSettingsParameter']),
//new \Twig_SimpleFunction('chamilo_settings_has', [$this, 'hasSettingsParameter']),
];
}

@ -9,7 +9,7 @@ namespace Chamilo\ThemeBundle\Model;
interface UserInterface
{
public function getAvatar();
//public function getAvatar();
public function getUsername();

@ -140,24 +140,8 @@ $(function () {
</ul>
</li>
<li class="nav-item dropdown">
{% set avatar %}
{% if app.user.pictureUri is empty %}
<img
class="img-avatar"
src="{{ url('home') ~ app.user.avatarOrAnonymous(32) }}"
alt="{{ app.user.firstname }} {{ app.user.lastname }}"
>
{% else %}
<img
class="img-avatar"
src="{{ url('legacy_upload') ~ app.user.getPictureLegacy() }}"
alt="{{ app.user.firstname }} {{ app.user.lastname }}"
>
{% endif %}
{% endset %}
<a class="nav-link nav-link-user dropdown-toggle d-sm-inline-block mr-2" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
{{ avatar }}
<img src="{{ app.user.resourceNode | user_illustration }}?w=32&h=32&fit=crop">
<span class="d-none">{{ app.user.firstname }} {{ app.user.lastname }}</span>
</a>

@ -6,7 +6,6 @@ namespace Chamilo\UserBundle\Entity;
use Chamilo\CoreBundle\Entity\AccessUrl;
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Entity\Skill;
use Chamilo\CoreBundle\Entity\UsergroupRelUser;
@ -1400,30 +1399,6 @@ class User extends BaseUser implements ThemeUser, EquatableInterface //implement
return $this->hrDeptId;
}
/**
* @return Media
*/
public function getAvatar()
{
return $this->getPictureUri();
}
/**
* @param int $size
*
* @return string
*/
public function getAvatarOrAnonymous($size = 22)
{
$avatar = $this->getAvatar();
if (empty($avatar)) {
return "img/icons/$size/unknown.png";
}
return $avatar;
}
/**
* @return \DateTime
*/

Loading…
Cancel
Save