. */ declare(strict_types=1); namespace App\DataTables\Column; use App\Entity\Base\AbstractNamedDBElement; use App\Services\EntityURLGenerator; use Omines\DataTablesBundle\Column\AbstractColumn; use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; class EntityColumn extends AbstractColumn { public function __construct(protected EntityURLGenerator $urlGenerator, protected PropertyAccessorInterface $accessor) { } /** * The normalize function is responsible for converting parsed and processed data to a datatables-appropriate type. * * @param mixed $value The single value of the column * @return mixed */ public function normalize($value) { /** @var AbstractNamedDBElement $value */ return $value; } public function configureOptions(OptionsResolver $resolver): self { parent::configureOptions($resolver); $resolver->setRequired('property'); $resolver->setDefault('field', static fn(Options $option): string => $option['property'].'.name'); $resolver->setDefault('render', fn(Options $options) => function ($value, $context) use ($options): string { if ($this->accessor->isReadable($context, $options['property'])) { $entity = $this->accessor->getValue($context, $options['property']); } else { $entity = null; } /** @var AbstractNamedDBElement|null $entity */ if ($entity instanceof AbstractNamedDBElement) { if (null !== $entity->getID()) { return sprintf( '%s', $this->urlGenerator->listPartsURL($entity), htmlspecialchars($entity->getName()) ); } return sprintf('%s', $value); } return ''; }); return $this; } }