Skip to content

Commit 1094b6b

Browse files
Andrey ErdikovAndrey Erdikov
authored andcommitted
[C0-3455] Добавил копирование ссылок и html, добавил кнопку перехода в медиа библиотеку для страниц
1 parent c6f05da commit 1094b6b

File tree

4 files changed

+150
-4
lines changed

4 files changed

+150
-4
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Skyeng\MarketingCmsBundle\Application\Cms\MediaFile\Service;
6+
7+
use Skyeng\MarketingCmsBundle\Domain\Entity\MediaFile;
8+
use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
9+
10+
class MediaFilePathResolver
11+
{
12+
private const IMAGE_HTML_MASK = '<img src="%s" title="%s"/>';
13+
private const VIDEO_HTML_MASK = '<video><source src="%s"></video>';
14+
private const PDF_HTML_MASK = '<embed src="%s"/>';
15+
16+
/**
17+
* @var UploaderHelper
18+
*/
19+
private $uploaderHelper;
20+
21+
public function __construct(UploaderHelper $uploaderHelper)
22+
{
23+
$this->uploaderHelper = $uploaderHelper;
24+
}
25+
26+
public function getFileUrl(MediaFile $file): ?string
27+
{
28+
return $this->uploaderHelper->asset($file, 'file');
29+
}
30+
31+
public function getFileHtml(MediaFile $file): ?string
32+
{
33+
$url = $this->getFileUrl($file);
34+
35+
if ($file->getType()->isImage()) {
36+
return sprintf(self::IMAGE_HTML_MASK, $url, $file->getTitle());
37+
}
38+
39+
if ($file->getType()->isVideo()) {
40+
return sprintf(self::VIDEO_HTML_MASK, $url);
41+
}
42+
43+
if ($file->getType()->isPdf()) {
44+
return sprintf(self::PDF_HTML_MASK, $url);
45+
}
46+
47+
return null;
48+
}
49+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
$('body').on('click', 'a.copy-action-ea', function (event) {
2+
event.preventDefault();
3+
4+
var $temp = $('<input>');
5+
$('body').append($temp);
6+
$temp.val($(this).attr('href')).select();
7+
document.execCommand('copy');
8+
$temp.remove();
9+
10+
var $childrenIcon = $(this).children('.action-icon');
11+
12+
$childrenIcon.removeClass('fa-copy').addClass('fa-check');
13+
14+
setTimeout(function () {
15+
$childrenIcon.removeClass('fa-check').addClass('fa-copy');
16+
}, 1000);
17+
});

src/UI/Controller/Admin/MediaFileCrudController.php

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44

55
namespace Skyeng\MarketingCmsBundle\UI\Controller\Admin;
66

7+
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
8+
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
9+
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
710
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
811
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
12+
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
913
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
1014
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
1115
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
1216
use EasyCorp\Bundle\EasyAdminBundle\Filter\ChoiceFilter;
13-
use EasyCorp\Bundle\EasyAdminBundle\Filter\EntityFilter;
17+
use Skyeng\MarketingCmsBundle\Application\Cms\MediaFile\Service\MediaFilePathResolver;
1418
use Skyeng\MarketingCmsBundle\Domain\Entity\MediaFile;
1519
use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\MediaFileStorage;
1620
use Skyeng\MarketingCmsBundle\Domain\Entity\ValueObject\MediaFileType;
@@ -30,12 +34,19 @@ class MediaFileCrudController extends AbstractCrudController
3034
*/
3135
private $mediaCatalogRepository;
3236

37+
/**
38+
* @var MediaFilePathResolver
39+
*/
40+
private $mediaFilePathResolver;
41+
3342
public function __construct(
3443
MediaFileRepositoryInterface $mediaFileRepository,
35-
MediaCatalogRepositoryInterface $mediaCatalogRepository
44+
MediaCatalogRepositoryInterface $mediaCatalogRepository,
45+
MediaFilePathResolver $mediaFilePathResolver
3646
) {
3747
$this->mediaFileRepository = $mediaFileRepository;
3848
$this->mediaCatalogRepository = $mediaCatalogRepository;
49+
$this->mediaFilePathResolver = $mediaFilePathResolver;
3950
}
4051

4152
public static function getEntityFqcn(): string
@@ -61,6 +72,42 @@ public function configureCrud(Crud $crud): Crud
6172
->setPageTitle(Crud::PAGE_EDIT, 'Медиа файл');
6273
}
6374

75+
public function configureAssets(Assets $assets): Assets
76+
{
77+
return $assets->addJsFile('bundles/marketingcms/ea-copy-actions.js');
78+
}
79+
80+
public function configureActions(Actions $actions): Actions
81+
{
82+
$actions->update(Crud::PAGE_INDEX, Action::NEW, function (Action $action) {
83+
return $action->setLabel('Создать медиа файл');
84+
});
85+
86+
$getFileLink = Action::new('getFileLink', 'Ссылка', 'fa fa-copy')
87+
->linkToUrl(function (MediaFile $file) {
88+
return $this->mediaFilePathResolver->getFileUrl($file);
89+
})
90+
->addCssClass('copy-action-ea');
91+
92+
$getFileHtml = Action::new('getFileHtml', 'Html', 'fa fa-copy')
93+
->linkToUrl(function (MediaFile $file) {
94+
return $this->mediaFilePathResolver->getFileHtml($file);
95+
})
96+
->addCssClass('copy-action-ea');
97+
98+
$actions->add(Crud::PAGE_INDEX, $getFileLink);
99+
$actions->add(Crud::PAGE_INDEX, $getFileHtml);
100+
101+
return $actions;
102+
}
103+
104+
public function getFileHtml(AdminContext $context)
105+
{
106+
$mediaFile = $context->getEntity()->getInstance();
107+
108+
return $mediaFile->getName();
109+
}
110+
64111
public function configureFields(string $pageName): iterable
65112
{
66113
$title = TextField::new('title', 'Заголовок файла');

src/UI/Controller/Admin/PageCrudController.php

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55
namespace Skyeng\MarketingCmsBundle\UI\Controller\Admin;
66

7+
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
8+
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
9+
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
10+
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
11+
use Skyeng\MarketingCmsBundle\Domain\Entity\MediaFile;
712
use Skyeng\MarketingCmsBundle\Domain\Entity\Page;
813
use Skyeng\MarketingCmsBundle\Domain\Entity\PageOpenGraphData;
914
use Skyeng\MarketingCmsBundle\Domain\Entity\PageSeoData;
@@ -38,10 +43,19 @@ class PageCrudController extends AbstractCrudController
3843
*/
3944
private $pageRepository;
4045

41-
public function __construct(ResourceRepositoryInterface $resourceRepository, PageRepositoryInterface $pageRepository)
42-
{
46+
/**
47+
* @var AdminUrlGenerator
48+
*/
49+
private $adminUrlGenerator;
50+
51+
public function __construct(
52+
ResourceRepositoryInterface $resourceRepository,
53+
PageRepositoryInterface $pageRepository,
54+
AdminUrlGenerator $adminUrlGenerator
55+
) {
4356
$this->resourceRepository = $resourceRepository;
4457
$this->pageRepository = $pageRepository;
58+
$this->adminUrlGenerator = $adminUrlGenerator;
4559
}
4660

4761
public static function getEntityFqcn(): string
@@ -59,6 +73,25 @@ public function configureCrud(Crud $crud): Crud
5973
->setPaginatorUseOutputWalkers(true);
6074
}
6175

76+
public function configureActions(Actions $actions): Actions
77+
{
78+
$mediaFilesAction = Action::new('mediaFiles', 'Медиа библиотека', 'fa fa-image')
79+
->linkToUrl(
80+
$this->adminUrlGenerator
81+
->setController(MediaFileCrudController::class)
82+
->setAction('index')
83+
->generateUrl()
84+
)
85+
->setHtmlAttributes(['target' => '_blank'])
86+
->addCssClass('btn')
87+
->addCssClass('btn-secondary');
88+
89+
$actions->add(Crud::PAGE_EDIT, $mediaFilesAction);
90+
$actions->add(Crud::PAGE_NEW, $mediaFilesAction);
91+
92+
return $actions;
93+
}
94+
6295
public function configureFields(string $pageName): iterable
6396
{
6497
$resource = ResourceField::new('resource.uri', 'Ссылка');

0 commit comments

Comments
 (0)