Skip to content

Commit 0c94210

Browse files
committed
Add AccessUrlListener to manage unique login-only url and save the access url hierarchy - refs BT#22639
1 parent db7a487 commit 0c94210

File tree

5 files changed

+80
-4
lines changed

5 files changed

+80
-4
lines changed

public/main/admin/access_url_edit.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
$form->addFile('url_image_1', get_lang('Image'));
3232
//$form->addElement('file', 'url_image_2', 'URL Image 2 (PNG)');
3333
//$form->addElement('file', 'url_image_3', 'URL Image 3 (PNG)');
34-
$form->addCheckBox('login_only', get_lang('Login only'), get_lang('Yes'));
3534

3635
$defaults['url'] = 'http://';
3736
$form->setDefaults($defaults);
@@ -66,13 +65,18 @@
6665
'parentResourceNodeId',
6766
Container::getAccessUrlUtil()->getFirstAccessUrl()->resourceNode->getId()
6867
);
69-
$form->addButtonCreate(get_lang('Save'));
7068

7169
//the first url with id = 1 will be always active
72-
if ($httpRequest->query->has('url_id') && 1 !== $httpRequest->query->getInt('url_id')) {
73-
$form->addElement('checkbox', 'active', null, get_lang('active'));
70+
if ($httpRequest->query->has('url_id')) {
71+
if (1 !== $httpRequest->query->getInt('url_id')) {
72+
$form->addElement('checkbox', 'active', null, get_lang('active'));
73+
}
74+
} else {
75+
$form->addCheckBox('login_only', get_lang('Login only'), get_lang('Yes'));
7476
}
7577

78+
$form->addButtonCreate(get_lang('Save'));
79+
7680
if ($form->validate()) {
7781
$check = Security::check_token('post');
7882
if ($check) {

src/CoreBundle/Entity/AccessUrl.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use ApiPlatform\Metadata\GetCollection;
1111
use ApiPlatform\Metadata\Link;
1212
use Chamilo\CoreBundle\Controller\Api\UserAccessUrlsController;
13+
use Chamilo\CoreBundle\Entity\Listener\AccessUrlListener;
14+
use Chamilo\CoreBundle\Entity\Listener\ResourceListener;
1315
use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository;
1416
use DateTime;
1517
use Doctrine\Common\Collections\ArrayCollection;
@@ -34,6 +36,7 @@
3436
#[ORM\Table(name: 'access_url')]
3537
#[Gedmo\Tree(type: 'nested')]
3638
#[ORM\Entity(repositoryClass: AccessUrlRepository::class)]
39+
#[ORM\EntityListeners([AccessUrlListener::class, ResourceListener::class])]
3740
#[ApiResource(
3841
uriTemplate: '/users/{id}/access_urls',
3942
operations: [new GetCollection(controller: UserAccessUrlsController::class)],
@@ -612,4 +615,16 @@ public function setIsLoginOnly(bool $isLoginOnly): static
612615

613616
return $this;
614617
}
618+
619+
public function setSuperior(?AccessUrl $accessUrl): static
620+
{
621+
$this->parent = $accessUrl;
622+
623+
return $this;
624+
}
625+
626+
public function getSuperior(): ?AccessUrl
627+
{
628+
return $this->parent;
629+
}
615630
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
/* For licensing terms, see /license.txt */
4+
5+
declare(strict_types=1);
6+
7+
namespace Chamilo\CoreBundle\Entity\Listener;
8+
9+
use Chamilo\CoreBundle\Entity\AccessUrl;
10+
use Chamilo\CoreBundle\Helpers\AccessUrlHelper;
11+
use Doctrine\ORM\Event\PrePersistEventArgs;
12+
13+
class AccessUrlListener
14+
{
15+
public function __construct(
16+
private readonly AccessUrlHelper $accessUrlHelper,
17+
) {}
18+
19+
public function prePersist(AccessUrl $accessUrl, PrePersistEventArgs $args): void
20+
{
21+
$firstAccessUrl = $this->accessUrlHelper->getFirstAccessUrl();
22+
23+
if (!$firstAccessUrl) {
24+
$accessUrl->setIsLoginOnly(false);
25+
26+
return;
27+
}
28+
29+
if ($loginOnlyAccessUrl = $this->accessUrlHelper->getOnlyLoginAccessUrl()) {
30+
$accessUrl
31+
->setIsLoginOnly(false)
32+
->setSuperior($loginOnlyAccessUrl)
33+
->setParentResourceNode($loginOnlyAccessUrl->resourceNode->getId())
34+
;
35+
36+
return;
37+
}
38+
39+
if ($accessUrl->isLoginOnly()) {
40+
$accessUrl->setActive(1);
41+
}
42+
43+
$accessUrl
44+
->setSuperior($firstAccessUrl)
45+
->setParentResourceNode($firstAccessUrl->resourceNode->getId())
46+
;
47+
}
48+
}

src/CoreBundle/Helpers/AccessUrlHelper.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public function getFirstAccessUrl(): ?AccessUrl
3737
return $this->accessUrlRepository->find($urlId) ?: null;
3838
}
3939

40+
public function getOnlyLoginAccessUrl(): ?AccessUrl
41+
{
42+
return $this->accessUrlRepository->findOneBy(['isLoginOnly' => true]);
43+
}
44+
4045
public function getCurrent(): ?AccessUrl
4146
{
4247
static $accessUrl;

src/CoreBundle/Resources/config/listeners.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ services:
106106
tags:
107107
- { name: doctrine.orm.entity_listener, entity_manager: default, lazy: true }
108108

109+
Chamilo\CoreBundle\Entity\Listener\AccessUrlListener:
110+
tags:
111+
- { name: doctrine.orm.entity_listener, entity_manager: default, lazy: true }
112+
109113
Chamilo\CoreBundle\EventListener\MessageStatusListener: ~
110114

111115
Chamilo\CoreBundle\Entity\Listener\ResourceLinkListener:

0 commit comments

Comments
 (0)