-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature/referrer without query vars (#17)
* Cleaning vars from context request in AdminUrlGenerator * Remove query variables from referrer in association field value * Readme update
- Loading branch information
1 parent
880dde1
commit b1c9cc2
Showing
11 changed files
with
380 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace MarcinJozwikowski\EasyAdminPrettyUrls\Controller; | ||
|
||
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; | ||
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController; | ||
|
||
abstract class PrettyDashboardController extends AbstractDashboardController | ||
{ | ||
public function configureCrud(): Crud | ||
{ | ||
return parent::configureCrud() | ||
->overrideTemplate('crud/field/association', '@EasyAdminPrettyUrls/crud/field/association.html.twig'); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace MarcinJozwikowski\EasyAdminPrettyUrls\Provider; | ||
|
||
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA; | ||
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; | ||
use MarcinJozwikowski\EasyAdminPrettyUrls\Routing\PrettyUrlsGenerator; | ||
use Symfony\Component\HttpFoundation\Request; | ||
use Symfony\Component\HttpFoundation\RequestStack; | ||
|
||
class PrettyAdminContext extends RequestStack | ||
{ | ||
public function __construct( | ||
private RequestStack $requestStack, | ||
private bool $prettyUrlsIncludeMenuIndex, | ||
) { | ||
} | ||
|
||
public function getCurrentRequest(): ?Request | ||
{ | ||
if ($this->requestStack->getCurrentRequest()->get(EA::CONTEXT_REQUEST_ATTRIBUTE)) { | ||
$result = clone $this->requestStack->getCurrentRequest(); | ||
$result->attributes = clone $result->attributes; | ||
/** @var AdminContext $adminContext */ | ||
$adminContext = $result->get(EA::CONTEXT_REQUEST_ATTRIBUTE); | ||
$contextRequest = clone $adminContext->getRequest(); | ||
|
||
$query = clone $contextRequest->query; | ||
$query->remove(PrettyUrlsGenerator::EA_FQCN); | ||
$query->remove(PrettyUrlsGenerator::EA_ACTION); | ||
if ($this->prettyUrlsIncludeMenuIndex) { | ||
$query->remove(PrettyUrlsGenerator::EA_MENU_INDEX); | ||
$query->remove(PrettyUrlsGenerator::EA_SUBMENU_INDEX); | ||
} | ||
$contextRequest->query = $query; | ||
|
||
return $result; | ||
} | ||
|
||
return null; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} | ||
{# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} | ||
{# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} | ||
{% if 'toMany' == field.customOptions.get('associationType') %} | ||
<span class="badge badge-secondary">{{ field.formattedValue }}</span> | ||
{% else %} | ||
{% if field.customOptions.get('relatedUrl') is not null %} | ||
<a href="{{ field.customOptions.get('relatedUrl')|pretty_urls_remove_actions }}">{{ field.formattedValue }}</a> | ||
{% else %} | ||
{{ field.formattedValue }} | ||
{% endif %} | ||
{% endif %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace MarcinJozwikowski\EasyAdminPrettyUrls\Twig; | ||
|
||
use MarcinJozwikowski\EasyAdminPrettyUrls\Routing\PrettyUrlsGenerator; | ||
use Twig\Extension\AbstractExtension; | ||
use Twig\TwigFilter; | ||
|
||
class PrettyUrlsExtension extends AbstractExtension | ||
{ | ||
public function __construct( | ||
protected PrettyUrlsGenerator $prettyUrlsGenerator, | ||
) { | ||
} | ||
|
||
public function getFilters(): array | ||
{ | ||
return [ | ||
new TwigFilter('pretty_urls_remove_actions', [$this, 'prettyUrlsRemoveActions'], ['is_safe' => ['html']]), | ||
]; | ||
} | ||
|
||
public function prettyUrlsRemoveActions(string $value): string | ||
{ | ||
$mainUrlQuery = parse_url($value, PHP_URL_QUERY); // split the main url into part | ||
if (empty($mainUrlQuery)) { | ||
return $value; | ||
} | ||
$mainQueryParams = []; | ||
parse_str($mainUrlQuery, $mainQueryParams); // parse the query part into key-value array | ||
if (empty($mainQueryParams[PrettyUrlsGenerator::EA_REFERRER])) { | ||
return $value; | ||
} | ||
|
||
$matches = []; | ||
preg_match('#referrer=([\d\w/,-?%]+)[&]?#', $value, $matches); // match the original referrer | ||
if ($matches[1]) { | ||
$finalReferrer = $this->prettyUrlsGenerator->sanitizeUrl($mainQueryParams[PrettyUrlsGenerator::EA_REFERRER]); | ||
|
||
return str_replace($matches[1], $finalReferrer, $value); // replace the old referrer with the new one | ||
} | ||
|
||
return $value; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace MarcinJozwikowski\EasyAdminPrettyUrls\Tests; | ||
|
||
use MarcinJozwikowski\EasyAdminPrettyUrls\Tests\data\ExampleClassImplementingDashboard; | ||
use PHPUnit\Framework\TestCase; | ||
|
||
/** | ||
* @covers \MarcinJozwikowski\EasyAdminPrettyUrls\Controller\PrettyDashboardController | ||
*/ | ||
class PrettyDashboardControllerTest extends TestCase | ||
{ | ||
public function testConfigureCrud(): void | ||
{ | ||
$controller = new ExampleClassImplementingDashboard(); | ||
|
||
self::assertEquals( | ||
[ | ||
'crud/field/association' => '@EasyAdminPrettyUrls/crud/field/association.html.twig', | ||
], | ||
$controller->configureCrud()->getAsDto()->getOverriddenTemplates(), | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace MarcinJozwikowski\EasyAdminPrettyUrls\Tests; | ||
|
||
use MarcinJozwikowski\EasyAdminPrettyUrls\Routing\PrettyUrlsGenerator; | ||
use MarcinJozwikowski\EasyAdminPrettyUrls\Twig\PrettyUrlsExtension; | ||
use PHPUnit\Framework\MockObject\MockObject; | ||
use PHPUnit\Framework\TestCase; | ||
use Twig\TwigFilter; | ||
|
||
use function PHPUnit\Framework\assertEquals; | ||
|
||
/** | ||
* @covers \MarcinJozwikowski\EasyAdminPrettyUrls\Twig\PrettyUrlsExtension | ||
*/ | ||
class PrettyUrlsExtensionTest extends TestCase | ||
{ | ||
private PrettyUrlsGenerator|MockObject $generator; | ||
private PrettyUrlsExtension $tested; | ||
|
||
public function setUp(): void | ||
{ | ||
$this->generator = $this->createMock(PrettyUrlsGenerator::class); | ||
$this->tested = new PrettyUrlsExtension($this->generator); | ||
} | ||
|
||
public function testGetFilters(): void | ||
{ | ||
$result = $this->tested->getFilters(); | ||
self::assertIsArray($result); | ||
self::assertCount(1, $result); | ||
self::assertInstanceOf(TwigFilter::class, $result[0]); | ||
self::assertEquals('pretty_urls_remove_actions', $result[0]->getName()); | ||
self::assertIsArray($result[0]->getCallable()); | ||
self::assertEquals($this->tested, $result[0]->getCallable()[0]); | ||
self::assertEquals('prettyUrlsRemoveActions', $result[0]->getCallable()[1]); | ||
} | ||
|
||
/** | ||
* @dataProvider removeActionData | ||
*/ | ||
public function testRemoveAction(string $url, string $expected, ?array $sanitizeArguments, string $sanitizeResult): void | ||
{ | ||
if ($sanitizeArguments) { | ||
$this->generator->method('sanitizeUrl') | ||
->with(...$sanitizeArguments) | ||
->willReturn($sanitizeResult); | ||
} | ||
|
||
$result = $this->tested->prettyUrlsRemoveActions($url); | ||
|
||
assertEquals($expected, $result); | ||
} | ||
|
||
public function removeActionData(): array | ||
{ | ||
$randomPath = substr(sha1(random_bytes(8)), 1, 4).'/'.substr(sha1(random_bytes(8)), 1, 6); | ||
|
||
return [ | ||
['', '', null, ''], | ||
['https://some.url', 'https://some.url', null, ''], | ||
['/some/path', '/some/path', null, ''], | ||
['/some/path?page=12', '/some/path?page=12', null, ''], | ||
['/some/path?page=12&referrer=', '/some/path?page=12&referrer=', null, ''], | ||
['/some/path?page=12&referrer=/ref', '/some/path?page=12&referrer='.$randomPath, ['/ref'], $randomPath], | ||
['/some/path?page=12&referrer=/ref?action=index', '/some/path?page=12&referrer='.$randomPath, ['/ref?action=index'], $randomPath], | ||
['/some/path?page=12&referrer=/'.$randomPath, '/some/path?page=12&referrer='.$randomPath, ['/'.$randomPath], $randomPath], | ||
]; | ||
} | ||
} |
Oops, something went wrong.