-
-
Save daffoxdev/eff74f0606bb4889d270756fec15e4b0 to your computer and use it in GitHub Desktop.
| <?php | |
| namespace App\Controller\Admin; | |
| use App\Admin\Field\ControllerIndexField; | |
| use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Action; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore; | |
| use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; | |
| use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface; | |
| use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; | |
| use EasyCorp\Bundle\EasyAdminBundle\Dto\PaginatorDto; | |
| use EasyCorp\Bundle\EasyAdminBundle\Factory\EntityFactory; | |
| use EasyCorp\Bundle\EasyAdminBundle\Factory\FilterFactory; | |
| use EasyCorp\Bundle\EasyAdminBundle\Factory\PaginatorFactory; | |
| use EasyCorp\Bundle\EasyAdminBundle\Field\Field; | |
| use Symfony\Component\HttpFoundation\Response; | |
| use Twig\Environment; | |
| use function is_string; | |
| abstract class AbstractAdminCrudController extends AbstractCrudController | |
| { | |
| public const PAGE_LIST_HTML = 'listHtml'; | |
| public const ACTION_LIST_HTML = 'listHtml'; | |
| public static function getSubscribedServices(): array | |
| { | |
| return array_merge(parent::getSubscribedServices(), [ | |
| Environment::class => '?'.Environment::class, | |
| ]); | |
| } | |
| public function isDetailPage(string $page): bool | |
| { | |
| return $page === Crud::PAGE_DETAIL; | |
| } | |
| /** | |
| * Returns the list of records from another controller as formatted html | |
| * | |
| * @param AdminContext $context | |
| * @return Response | |
| * @throws \Twig\Error\LoaderError | |
| * @throws \Twig\Error\RuntimeError | |
| * @throws \Twig\Error\SyntaxError | |
| */ | |
| public function listHtml(AdminContext $context): Response | |
| { | |
| $context->getCrud()->setPageName(self::PAGE_LIST_HTML); | |
| $this->hackPageSizeForListHtml($context); | |
| // duplicating almost the same steps that are done in index() | |
| $fields = FieldCollection::new($this->configureFields(self::PAGE_LIST_HTML)); | |
| $filters = $this->get(FilterFactory::class)->create($context->getCrud()->getFiltersConfig(), $fields, $context->getEntity()); | |
| $queryBuilder = $this->createIndexQueryBuilder($context->getSearch(), $context->getEntity(), $fields, $filters); | |
| $paginator = $this->get(PaginatorFactory::class)->create($queryBuilder); | |
| $entities = $this->get(EntityFactory::class)->createCollection($context->getEntity(), $paginator->getResults()); | |
| $this->get(EntityFactory::class)->processFieldsForAll($entities, $fields); | |
| $templateParameters = [ | |
| // new context should be passed to twig here cause easy admin passes only globally context from container as ea variable | |
| 'admin_context' => $context, | |
| 'pageName' => self::PAGE_LIST_HTML, | |
| 'entities' => $entities, | |
| 'paginator' => $paginator, | |
| 'filters' => $filters, | |
| ]; | |
| $formatted = $this->get(Environment::class) | |
| ->render( | |
| 'admin/crud/inner_index.html.twig', | |
| $templateParameters | |
| ); | |
| return new Response($formatted); | |
| } | |
| private function hackPageSizeForListHtml(AdminContext $context): void | |
| { | |
| $request = $context->getRequest(); | |
| $pageSize = $request->query->get(ControllerIndexField::OPT_PAGE_SIZE, 10); | |
| if ($pageSize > 50) { | |
| $pageSize = 50; | |
| } | |
| // hack with paginator. Rewrite DTO to change the per page items | |
| $oldPaginatorDto = $context->getCrud()->getPaginator(); | |
| $context->getCrud()->setPaginator(new PaginatorDto( | |
| $pageSize, | |
| $oldPaginatorDto->getRangeSize(), | |
| $oldPaginatorDto->getRangeEdgeSize(), | |
| $oldPaginatorDto->fetchJoinCollection(), | |
| $oldPaginatorDto->useOutputWalkers() | |
| )); | |
| } | |
| protected function showOnlyOn(FieldInterface $field, string $page): FieldInterface | |
| { | |
| $field | |
| ->getAsDto() | |
| ->setDisplayedOn(KeyValueStore::new([ | |
| $page => $page | |
| ])); | |
| return $field; | |
| } | |
| /** | |
| * @param string|FieldInterface $field | |
| * @param string|null $label | |
| * @return Field | |
| */ | |
| protected function newField($field, ?string $label = null): FieldInterface | |
| { | |
| if (is_string($field)) { | |
| $field = Field::new($field, $label); | |
| } | |
| $this->addDisplayOn($field, self::PAGE_LIST_HTML); | |
| return $field; | |
| } | |
| protected function addDisplayOn(FieldInterface $field, string $page): FieldInterface | |
| { | |
| $field | |
| ->getAsDto() | |
| ->getDisplayedOn() | |
| ->set($page, $page); | |
| return $field; | |
| } | |
| } |
| <?php | |
| namespace App\Admin\Filter; | |
| use Doctrine\ORM\Query\Expr\Join; | |
| use Doctrine\ORM\QueryBuilder; | |
| use EasyCorp\Bundle\EasyAdminBundle\Contracts\Filter\FilterInterface; | |
| use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto; | |
| use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto; | |
| use EasyCorp\Bundle\EasyAdminBundle\Dto\FilterDataDto; | |
| use EasyCorp\Bundle\EasyAdminBundle\Filter\FilterTrait; | |
| use EasyCorp\Bundle\EasyAdminBundle\Form\Filter\Type\TextFilterType; | |
| /** | |
| * Simple filter that allows filtering by assosiated fields | |
| */ | |
| class AssociationFilter implements FilterInterface | |
| { | |
| use FilterTrait; | |
| private string $field = 'id'; | |
| private ?string $associationProperty = null; | |
| /** | |
| * @param string $propertyName name of field that will be used as key for identify filter | |
| * @param string|null $label displayed label of filter | |
| * @param string|null $associationProperty property name inside of working entity. Using $propertyName by default | |
| * @return static | |
| */ | |
| public static function new( | |
| string $propertyName, | |
| string $label = null, | |
| string $associationProperty = null | |
| ): self { | |
| if (!$associationProperty) { | |
| $associationProperty = $propertyName; | |
| } | |
| return (new self()) | |
| ->setFilterFqcn(__CLASS__) | |
| ->setProperty($propertyName) | |
| ->setAssociationProperty($associationProperty) | |
| ->setLabel($label) | |
| ->setFormType(TextFilterType::class); | |
| } | |
| public function apply( | |
| QueryBuilder $queryBuilder, | |
| FilterDataDto $filterDataDto, | |
| ?FieldDto $fieldDto, | |
| EntityDto $entityDto | |
| ): void { | |
| if (!$this->field) { | |
| return; | |
| } | |
| $property = sprintf( | |
| '%s.%s', | |
| $filterDataDto->getEntityAlias(), | |
| $this->associationProperty | |
| ); | |
| $queryBuilder->innerJoin( | |
| $property, | |
| 'association', | |
| Join::WITH, | |
| sprintf('IDENTITY(%s) = association.id', $property) | |
| ); | |
| $queryBuilder->andWhere( | |
| sprintf( | |
| 'association.%s %s :value', | |
| $this->field, | |
| $filterDataDto->getComparison() | |
| ) | |
| ) | |
| ->setParameter('value', $filterDataDto->getValue()); | |
| } | |
| public function setField(string $fieldName): self | |
| { | |
| $this->field = $fieldName; | |
| return $this; | |
| } | |
| public function setAssociationProperty(string $associationProperty): self | |
| { | |
| $this->associationProperty = $associationProperty; | |
| return $this; | |
| } | |
| public function getParent(): string | |
| { | |
| return TextFilterType::class; | |
| } | |
| } |
| <?php | |
| namespace App\Admin\Field\Configurator; | |
| use App\Admin\Field\ControllerIndexField; | |
| use App\Controller\Admin\AbstractAdminCrudController; | |
| use App\Controller\Admin\DashboardController; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA; | |
| use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; | |
| use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldConfiguratorInterface; | |
| use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto; | |
| use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto; | |
| use EasyCorp\Bundle\EasyAdminBundle\Factory\AdminContextFactory; | |
| use EasyCorp\Bundle\EasyAdminBundle\Factory\ControllerFactory; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\RequestStack; | |
| /** | |
| * Configures ControllerIndexField::class field that shows list of different controller as a simple field | |
| */ | |
| class ControllerIndexConfigurator implements FieldConfiguratorInterface | |
| { | |
| private AdminContextFactory $adminContextFactory; | |
| private ControllerFactory $controllerFactory; | |
| private RequestStack $requestStack; | |
| public function __construct( | |
| AdminContextFactory $adminContextFactory, | |
| ControllerFactory $controllerFactory, | |
| RequestStack $requestStack | |
| ) { | |
| $this->adminContextFactory = $adminContextFactory; | |
| $this->controllerFactory = $controllerFactory; | |
| $this->requestStack = $requestStack; | |
| } | |
| public function supports(FieldDto $field, EntityDto $entityDto): bool | |
| { | |
| return $field->getFieldFqcn() === ControllerIndexField::class; | |
| } | |
| public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $context): void | |
| { | |
| /** @var Request $request */ | |
| $request = $field->getCustomOption(ControllerIndexField::OPT_REQUEST); | |
| $pageSize = $field->getCustomOption(ControllerIndexField::OPT_PAGE_SIZE) ?? 5; | |
| if (!$request->query->has(ControllerIndexField::OPT_PAGE_SIZE)) { | |
| $request->query->set(ControllerIndexField::OPT_PAGE_SIZE, $pageSize); | |
| } | |
| $formatted = $this->getControllerHtml($request); | |
| $field->setLabel(null); | |
| $field->setFormattedValue($formatted); | |
| } | |
| /** | |
| * All the thing are doing here could be interpreting as hack of EasyAdmin | |
| * Cause from the box bundle not provides such functionality and it's code | |
| * is very encapsulated with final classes, arrays with options that are not | |
| * configurable from outside, services that has a state, services that uses | |
| * current request and so on. | |
| * | |
| * @param Request $request | |
| * @return string | |
| */ | |
| private function getControllerHtml(Request $request): string | |
| { | |
| $controllerFqcn = $request->query->get(EA::CRUD_CONTROLLER_FQCN); | |
| $request->query->set(EA::CRUD_ACTION, AbstractAdminCrudController::ACTION_LIST_HTML); | |
| $this->requestStack->push($request); | |
| $dashboardController = $this->controllerFactory | |
| ->getDashboardControllerInstance( | |
| DashboardController::class, | |
| $request | |
| ); | |
| /** @var AbstractAdminCrudController $crudController */ | |
| $crudController = $this->controllerFactory->getCrudControllerInstance( | |
| $controllerFqcn, | |
| AbstractAdminCrudController::ACTION_LIST_HTML, | |
| $request | |
| ); | |
| // all this we need just to create another admin context for sub controller (listHtml page) | |
| // cause current context is setting up for parent controller (detail page) | |
| $adminContext = $this->adminContextFactory->create($request, $dashboardController, $crudController); | |
| $adminContext->getCrud()->setPageName(AbstractAdminCrudController::PAGE_LIST_HTML); | |
| $request->attributes->set(EA::CONTEXT_REQUEST_ATTRIBUTE, $adminContext); | |
| $response = $crudController->listHtml($adminContext); | |
| $this->requestStack->pop(); | |
| return $response->getContent(); | |
| } | |
| } |
| <?php | |
| namespace App\Admin\Field; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA; | |
| use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface; | |
| use EasyCorp\Bundle\EasyAdminBundle\Field\FieldTrait; | |
| use EasyCorp\Bundle\EasyAdminBundle\Form\Type\ComparisonType; | |
| use Symfony\Component\HttpFoundation\Request; | |
| /** | |
| * Field that shows list of different controller as a simple field | |
| */ | |
| final class ControllerIndexField implements FieldInterface | |
| { | |
| use FieldTrait; | |
| public const OPT_REQUEST = 'request'; | |
| public const OPT_PAGE_SIZE = 'page_size'; | |
| public static function new(string $propertyName, ?string $label = null): self | |
| { | |
| return (new self()) | |
| ->setProperty($propertyName) | |
| ->setLabel($label) | |
| ->setTemplatePath('admin/field/html_field.html.twig') | |
| ->onlyOnDetail() | |
| ->setRequest(new Request()); | |
| } | |
| public function setControllerFqcn(string $controllerFqcn): self | |
| { | |
| $this->getRequest() | |
| ->query | |
| ->set(EA::CRUD_CONTROLLER_FQCN, $controllerFqcn); | |
| return $this; | |
| } | |
| public function setFilter( | |
| string $field, | |
| string $value, | |
| string $comparisonType = ComparisonType::EQ | |
| ): self { | |
| $currentFilters = $this->getRequest()->query->get(EA::FILTERS, []); | |
| $currentFilters[$field] = [ | |
| 'comparison' => $comparisonType, | |
| 'value' => $value | |
| ]; | |
| $this->getRequest()->query->set(EA::FILTERS, $currentFilters); | |
| return $this; | |
| } | |
| public function setSort( | |
| string $field, | |
| string $direction, | |
| ?bool $resetSort = true | |
| ): self { | |
| if ($resetSort) { | |
| $currentSort = []; | |
| } else { | |
| $currentSort = $this->getRequest()->query->get(EA::SORT, []); | |
| } | |
| $currentSort[$field] = $direction; | |
| $this->getRequest()->query->set(EA::SORT, $currentSort); | |
| return $this; | |
| } | |
| public function setFilters(array $filters): self | |
| { | |
| $this->getRequest()->query->set(EA::FILTERS, $filters); | |
| return $this; | |
| } | |
| public function setRequest(Request $request): self | |
| { | |
| $this->setCustomOption(self::OPT_REQUEST, $request); | |
| return $this; | |
| } | |
| public function getRequest(): Request | |
| { | |
| return $this->getAsDto()->getCustomOption(self::OPT_REQUEST); | |
| } | |
| public function setPageSize(int $pageSize): self | |
| { | |
| $this->setCustomOption(self::OPT_PAGE_SIZE, $pageSize); | |
| return $this; | |
| } | |
| } |
| <?php | |
| namespace App\Controller\Admin; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; | |
| use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController; | |
| class DashboardController extends AbstractDashboardController | |
| { | |
| public function configureCrud(): Crud | |
| { | |
| return Crud::new() | |
| ->overrideTemplate('crud/detail', 'admin/crud/detail.html.twig') | |
| ; | |
| } | |
| } |
| {# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} | |
| {# @var context \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} | |
| {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} | |
| {#{% extends ea.templatePath('crud/detail') %}#} | |
| {% extends '@!EasyAdmin/crud/detail.html.twig' %} | |
| {% block detail_field %} | |
| {% if not is_decoration_field %} | |
| {{ _self.render_field(entity, field, row_number) }} | |
| {% endif %} | |
| {% endblock %} | |
| {% macro render_field(entity, field, row_number) %} | |
| <div class="data-row {{ row_number is even ? 'with-background' }} {{ field.cssClass }}"> | |
| {% if field.label is not empty or field.help is not empty %} | |
| <dd> | |
| {{ field.label|raw }} | |
| {% if field.help is not empty %} | |
| <span class="data-help"> | |
| <i class="far fa-question-circle" data-toggle="tooltip" title="{{ field.help|e('html_attr') }}"></i> | |
| </span> | |
| {% endif %} | |
| </dd> | |
| {% endif %} | |
| <dt class="w-100"> | |
| {{ include(field.templatePath, { field: field, entity: entity }, with_context = false) }} | |
| </dt> | |
| </div> | |
| {% endmacro %} | |
| {% block body_javascript %} | |
| {{ parent() }} | |
| <script type="text/javascript"> | |
| $(function() { | |
| function pullContentAndRedraw(href, $clickedElement) | |
| { | |
| let $block = $clickedElement.closest('.content-panel').parent(); | |
| $.get(href, function (response) { | |
| $block.html(response); | |
| }); | |
| } | |
| $('.ea') | |
| .on('click', '.page-link', function(e) { | |
| e.preventDefault(); | |
| let $this = $(this); | |
| let href = $this.attr('href'); | |
| pullContentAndRedraw(href, $this); | |
| }) | |
| .on('click', '.js-sort a', function(e) { | |
| e.preventDefault(); | |
| let $this = $(this); | |
| let href = $this.attr('href'); | |
| pullContentAndRedraw(href, $this); | |
| }); | |
| }); | |
| </script> | |
| {% endblock %} |
| {# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} | |
| {# @var field \EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto #} | |
| {# @var entity \EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto #} | |
| {{ field.formattedValue|raw }} |
| {# @var ea \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} | |
| {# @var admin_context \EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext #} | |
| {# @var entities \EasyCorp\Bundle\EasyAdminBundle\Collection\EntityDtoCollection #} | |
| {# @var paginator \EasyCorp\Bundle\EasyAdminBundle\Orm\EntityPaginator #} | |
| {# @var admin_context \EasyCorp\Bundle\EasyAdminBundle\Orm\AdminContext local admin context #} | |
| {% trans_default_domain admin_context.i18n.translationDomain %} | |
| {# sort can be multiple; let's consider the sorting field the first one #} | |
| {% set sort_field_name = app.request.get('sort')|keys|first %} | |
| {% set some_results_are_hidden = false %} | |
| {% set has_footer = false %} | |
| <div class="content-panel"> | |
| <div class="content-panel-body with-rounded-top with-min-h-250 without-padding {{ not has_footer ? 'without-footer' }}"> | |
| <table class="table datagrid with-rounded-top {{ not has_footer ? 'with-rounded-bottom' }}"> | |
| <thead> | |
| {% block table_head %} | |
| <tr> | |
| {% set ea_sort_asc = constant('EasyCorp\\Bundle\\EasyAdminBundle\\Config\\Option\\SortOrder::ASC') %} | |
| {% set ea_sort_desc = constant('EasyCorp\\Bundle\\EasyAdminBundle\\Config\\Option\\SortOrder::DESC') %} | |
| {% for field in entities|first.fields ?? [] %} | |
| {% set is_sorting_field = admin_context.search.isSortingField(field.property) %} | |
| {% set next_sort_direction = is_sorting_field ? (admin_context.search.sortDirection(field.property) == ea_sort_desc ? ea_sort_asc : ea_sort_desc) : ea_sort_desc %} | |
| {% set column_icon = is_sorting_field ? (next_sort_direction == ea_sort_desc ? 'fa-arrow-up' : 'fa-arrow-down') : 'fa-sort' %} | |
| <th class="js-sort {{ is_sorting_field ? 'sorted' }} {{ field.isVirtual ? 'field-virtual' }} text-{{ field.textAlign }}" dir="{{ admin_context.i18n.textDirection }}"> | |
| {% if field.isSortable %} | |
| <a href="{{ ea_url({ page: 1, sort: { (field.property): next_sort_direction } }).includeReferrer() }}"> | |
| {{ field.label|raw }} <i class="fa fa-fw {{ column_icon }}"></i> | |
| </a> | |
| {% else %} | |
| <span>{{ field.label|raw }}</span> | |
| {% endif %} | |
| </th> | |
| {% endfor %} | |
| </tr> | |
| {% endblock table_head %} | |
| </thead> | |
| <tbody> | |
| {% block table_body %} | |
| {% for entity in entities %} | |
| {% if not entity.isAccessible %} | |
| {% set some_results_are_hidden = true %} | |
| {% else %} | |
| <tr data-id="{{ entity.primaryKeyValueAsString }}"> | |
| {% for field in entity.fields %} | |
| <td class="{{ field.property == sort_field_name ? 'sorted' }} text-{{ field.textAlign }} {{ field.cssClass }}" dir="{{ admin_context.i18n.textDirection }}"> | |
| {{ include(field.templatePath, { field: field, entity: entity, admin_context: admin_context }, with_context = false) }} | |
| </td> | |
| {% endfor %} | |
| </tr> | |
| {% endif %} | |
| {% else %} | |
| <tr> | |
| <td class="no-results" colspan="100"> | |
| {{ 'datagrid.no_results'|trans(admin_context.i18n.translationParameters, 'EasyAdminBundle') }} | |
| </td> | |
| </tr> | |
| {% endfor %} | |
| {% if some_results_are_hidden %} | |
| <tr class="datagrid-row-empty"> | |
| <td class="text-center" colspan="{{ entities|first.fields|length + 1 }}"> | |
| <span class="datagrid-row-empty-message"><i class="fa fa-lock mr-1"></i> {{ 'datagrid.hidden_results'|trans({}, 'EasyAdminBundle') }}</span> | |
| </td> | |
| </tr> | |
| {% endif %} | |
| {% endblock table_body %} | |
| </tbody> | |
| </table> | |
| </div> | |
| {% if entities|length > 0 %} | |
| <div class="content-panel-footer without-padding without-border"> | |
| {% block paginator %} | |
| {{ include(admin_context.templatePath('crud/paginator')) }} | |
| {% endblock paginator %} | |
| </div> | |
| {% endif %} | |
| </div> |
| <?php | |
| namespace App\Controller\Admin; | |
| use App\Controller\Admin\AbstractAdminCrudController; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Filters; | |
| use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; | |
| use App\Entity\UserActivity; | |
| class UserActivityController extends AbstractAdminCrudController | |
| { | |
| public static function getEntityFqcn(): string | |
| { | |
| return UserActivity::class; | |
| } | |
| public function configureFields(string $pageName): iterable | |
| { | |
| return [ | |
| $this->newField('id'), | |
| $this->newField('user'), | |
| $this->newField('message'), | |
| ]; | |
| } | |
| public function configureFilters(Filters $filters): Filters | |
| { | |
| $filters = parent::configureFilters($filters); | |
| return $filters | |
| ->add('id') | |
| ->add(AssociationFilter::new( | |
| 'user_id', | |
| 'User id', | |
| 'user' | |
| )) | |
| ; | |
| } | |
| } |
| <?php | |
| namespace App\Controller\Admin; | |
| use App\Controller\Admin\AbstractAdminCrudController; | |
| use EasyCorp\Bundle\EasyAdminBundle\Config\Filters; | |
| use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; | |
| use App\Entity\User; | |
| class UserController extends AbstractAdminCrudController | |
| { | |
| public static function getEntityFqcn(): string | |
| { | |
| return User::class; | |
| } | |
| public function configureFields(string $pageName): iterable | |
| { | |
| $adminContext = $this->adminContextProvider->getContext(); | |
| $userId = $adminContext->getEntity()->getPrimaryKeyValue(); | |
| $field = [ | |
| $this->newField('id'), | |
| $this->newField('loginName'), | |
| $this->newField('name'), | |
| ]; | |
| if ($this->isDetailPage($pageName)) { | |
| $fields[] = FormField::addPanel('User activity') | |
| ->onlyOnDetail(); | |
| $fileds[] = $this->createUserActivityListField($userId) | |
| ->onlyOnDetail(); | |
| } | |
| return $fields; | |
| } | |
| private function createUserActivityListField(int $userId): ControllerIndexField | |
| { | |
| return ControllerIndexField::new('user_activity_list') | |
| ->setControllerFqcn(UserActivityController::class) | |
| ->setFilter('user_id', $userId) | |
| ->setSort('id', 'DESC'); | |
| ; | |
| } | |
| } |
Hmh, strange. Maybe related to new version of EA. We're using 3.5.* in our project, with symfony 5.4. Not know when we will migrate to new version and I would check it. So if you will find-out the reason, write it here, please.
Some thoughts:
Take a look to this method
public static function getSubscribedServices(): array
{
return array_merge(parent::getSubscribedServices(), [
Environment::class => '?'.Environment::class,
]);
}you can autowire you own service by overload this method in your controller
public static function getSubscribedServices(): array
{
return array_merge(parent::getSubscribedServices(), [
MySomeService::class => '?'.MySomeService::class,
MySomeService2::class => '?'.MySomeService2::class,
]);
}
public function someMethod()
{
$service = $this->get(MySomeService::class);
$service2 = $this->get(MySomeService2::class);
}Don't use whole container in you services if it is possible. Best practice is to inject each service separately. I think problem is in this, not with this gist files.
Nice project but i can get it to work.
Did modify $this->get( to $this->container->get( in AbstractAdminCrudController.php but now I'm stuck to this error-message: "There is currenly no session available." (HttpKernel.php line 78) (from public/index.php line 5 autoload_runtime.)
Idea what is wrong. I use sf 6.0.16 and EA 4.2.0
private function getControllerHtml(Request $request): string
{
$controllerFqcn = $request->query->get(EA::CRUD_CONTROLLER_FQCN);
$request->query->set(EA::CRUD_ACTION, AbstractAdminCrudController::ACTION_LIST_HTML);
$request->setSession($this->requestStack->getSession()); // !!!!!!!!!!!!!!!!!!!!!!!!!
$this->requestStack->push($request);
Nice project but i can get it to work.
Did modify $this->get( to $this->container->get( in AbstractAdminCrudController.php but now I'm stuck to this error-message:
"There is currenly no session available." (HttpKernel.php line 78) (from public/index.php line 5 autoload_runtime.)
Idea what is wrong. I use sf 6.0.16 and EA 4.2.0