<?php
declare(strict_types=1);
namespace App\Infraestructure\Admin;
use App\Shared\Infrastructure\Form\Type\JsonFieldType;
use App\Shared\Infrastructure\Form\Type\ScriptType;
use App\Shared\Infrastructure\Utils\ClassUtils;
use Psr\Log\LoggerInterface;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelListType;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\Form\Type\DatePickerType;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Security;
use Twig\Environment;
final class TramiteAdmin extends AbstractAdmin
{
private $repositories;
public function __construct(
?string $code = null,
?string $class = null,
?string $baseControllerName = null,
protected Security $security,
protected ContainerInterface $container,
iterable $repositoriesIterable
)
{
parent::__construct($code, $class, $baseControllerName);
foreach ($repositoriesIterable??[] as $repository){
$this->repositories[ClassUtils::shortClass($repository->getClass())] = $repository;
}
}
protected function configureDatagridFilters(DatagridMapper $filter): void
{ }
protected function configureListFields(ListMapper $list): void
{ }
protected function configureFormFields(FormMapper $form): void
{
/**@var \App\Domain\Entity\Tramite $sj*/
$sj = $this->getSubject();
$schema = json_decode(!empty($sj->getSchema()) ? $sj->getSchema(): $sj->getMetadata()?->getSchema()??'{}',true);
$form
->with('with.detalle_tramite', [
'label' => 'form.tramite.with.label.detalle_tramite'
])
->add('form',JsonFieldType::class, [
'label' => false,
'schema' => $schema,
'entity' => $sj,
'model_manager' => $this->getModelManager()
])
->end()
->add('scriptNavegacionTramite', ScriptType::class, [
'template' => 'SCRIPTS/Debug/debug.html.twig',
'object' => [
$sj?->getKey() => [
'entity' => $sj,
'form' => @json_decode((string)$sj?->getForm(), true),
'security' => $this->getPublicMethods($this->security, "\$security"),
'container' => $this->getPublicServices(),
'repositories' => $this->getPublicMethodsRepositories(),
'environment' => $_ENV,
'solicitud' => $sj?->getExpediente()?->getSolicitud(),
'solicitudForm' => $sj?->getExpediente()?->getSolicitud()?->getEntidad()
]
],
]);
}
public function getPublicServices(){
$serviceIds = $this->container->getServiceIds();
$publicServices = [];
foreach ($serviceIds as $serviceId) {
try {
$service = $this->container->get($serviceId);
$methodsInfo = $this->getPublicMethods($service, "\$container->get('$serviceId')");
} catch (\Exception $e) {
// Maneja otras posibles excepciones
}
$publicServices[$serviceId] = $methodsInfo;
}
return $publicServices;
}
protected function getPublicMethodsRepositories()
{
$repositoriesInfo = [];
foreach ($this->repositories as $repoName => $repository) {
$methodsInfo = $this->getPublicMethods($repository, "\$repositories[$repoName::class]");
$repositoriesInfo[$repoName] = $methodsInfo;
}
return $repositoriesInfo;
}
private function getPublicMethods(mixed $class, string $invokeName): array
{
$reflectionClass = new \ReflectionClass(get_class($class));
$methodsInfo = [];
foreach ($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
if ($method->class == $reflectionClass->getName()) {
$methodName = $method->getName();
$methodCall = "$invokeName->$methodName(";
$params = [];
foreach ($method->getParameters() as $param) {
$paramName = $param->getName();
$paramType = $param->hasType() ? $param->getType() . ' ' : '';
$defaultValue = $param->isDefaultValueAvailable() ? ' = ' . var_export($param->getDefaultValue(), true) : '';
$params[] = "$paramType\$$paramName$defaultValue";
}
$methodCall .= implode(", ", $params);
$methodCall .= ");";
$methodsInfo[] = $methodCall;
}
}
return $methodsInfo;
}
}