src/Infraestructure/Admin/TramiteAdmin.php line 26

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Infraestructure\Admin;
  4. use App\Shared\Infrastructure\Form\Type\JsonFieldType;
  5. use App\Shared\Infrastructure\Form\Type\ScriptType;
  6. use App\Shared\Infrastructure\Utils\ClassUtils;
  7. use Psr\Log\LoggerInterface;
  8. use Sonata\AdminBundle\Admin\AbstractAdmin;
  9. use Sonata\AdminBundle\Datagrid\DatagridMapper;
  10. use Sonata\AdminBundle\Datagrid\ListMapper;
  11. use Sonata\AdminBundle\Form\FormMapper;
  12. use Sonata\AdminBundle\Form\Type\ModelListType;
  13. use Sonata\AdminBundle\Show\ShowMapper;
  14. use Sonata\Form\Type\DatePickerType;
  15. use Symfony\Component\DependencyInjection\ContainerInterface;
  16. use Symfony\Component\Security\Core\Security;
  17. use Twig\Environment;
  18. final class TramiteAdmin extends AbstractAdmin
  19. {
  20.     private $repositories;
  21.     public function __construct(
  22.         ?string $code = null,
  23.         ?string $class = null,
  24.         ?string $baseControllerName = null,
  25.         protected Security $security,
  26.         protected ContainerInterface $container,
  27.         iterable $repositoriesIterable
  28.     )
  29.     {
  30.         parent::__construct($code, $class, $baseControllerName);
  31.         foreach ($repositoriesIterable??[] as $repository){
  32.             $this->repositories[ClassUtils::shortClass($repository->getClass())] = $repository;
  33.         }
  34.     }
  35.     protected function configureDatagridFilters(DatagridMapper $filter): void
  36.     {  }
  37.     protected function configureListFields(ListMapper $list): void
  38.     {  }
  39.     protected function configureFormFields(FormMapper $form): void
  40.     {
  41.         /**@var \App\Domain\Entity\Tramite $sj*/
  42.         $sj = $this->getSubject();
  43.         $schema = json_decode(!empty($sj->getSchema()) ? $sj->getSchema(): $sj->getMetadata()?->getSchema()??'{}',true);
  44.         $form
  45.             ->with('with.detalle_tramite', [
  46.                 'label' => 'form.tramite.with.label.detalle_tramite'
  47.             ])
  48.                 ->add('form',JsonFieldType::class, [
  49.                         'label' => false,
  50.                         'schema' => $schema,
  51.                         'entity' => $sj,
  52.                         'model_manager' => $this->getModelManager()
  53.                     ])
  54.             ->end()
  55.         ->add('scriptNavegacionTramite', ScriptType::class, [
  56.             'template' => 'SCRIPTS/Debug/debug.html.twig',
  57.             'object' => [
  58.                 $sj?->getKey() => [
  59.                     'entity' => $sj,
  60.                     'form' => @json_decode((string)$sj?->getForm(), true),
  61.                     'security' =>  $this->getPublicMethods($this->security, "\$security"),
  62.                     'container' => $this->getPublicServices(),
  63.                     'repositories' => $this->getPublicMethodsRepositories(),
  64.                     'environment' => $_ENV,
  65.                     'solicitud' => $sj?->getExpediente()?->getSolicitud(),
  66.                     'solicitudForm' => $sj?->getExpediente()?->getSolicitud()?->getEntidad()
  67.                 ]
  68.             ],
  69.         ]);
  70.     }
  71.     public function getPublicServices(){
  72.         $serviceIds = $this->container->getServiceIds();
  73.         $publicServices = [];
  74.         foreach ($serviceIds as $serviceId) {
  75.             try {
  76.                 $service = $this->container->get($serviceId);
  77.                 $methodsInfo = $this->getPublicMethods($service, "\$container->get('$serviceId')");
  78.             } catch (\Exception $e) {
  79.                 // Maneja otras posibles excepciones
  80.             }
  81.             $publicServices[$serviceId] = $methodsInfo;
  82.         }
  83.         return $publicServices;
  84.     }
  85.     protected function getPublicMethodsRepositories()
  86.     {
  87.         $repositoriesInfo = [];
  88.         foreach ($this->repositories as $repoName => $repository) {
  89.             $methodsInfo = $this->getPublicMethods($repository, "\$repositories[$repoName::class]");
  90.             $repositoriesInfo[$repoName] = $methodsInfo;
  91.         }
  92.         return $repositoriesInfo;
  93.     }
  94.     private function getPublicMethods(mixed $class, string $invokeName): array
  95.     {
  96.         $reflectionClass = new \ReflectionClass(get_class($class));
  97.         $methodsInfo = [];
  98.         foreach ($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
  99.             if ($method->class == $reflectionClass->getName()) {
  100.                 $methodName = $method->getName();
  101.                 $methodCall = "$invokeName->$methodName(";
  102.                 $params = [];
  103.                 foreach ($method->getParameters() as $param) {
  104.                     $paramName = $param->getName();
  105.                     $paramType = $param->hasType() ? $param->getType() . ' ' : '';
  106.                     $defaultValue = $param->isDefaultValueAvailable() ? ' = ' . var_export($param->getDefaultValue(), true) : '';
  107.                     $params[] = "$paramType\$$paramName$defaultValue";
  108.                 }
  109.                 $methodCall .= implode(", ", $params);
  110.                 $methodCall .= ");";
  111.                 $methodsInfo[] = $methodCall;
  112.             }
  113.         }
  114.         return $methodsInfo;
  115.     }
  116. }