<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace TheatreCore\Form\Type;
use Doctrine\ORM\Query\Parameter;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ObjectManager;
use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class RelationsType extends DoctrineType
{
public function configureOptions(OptionsResolver $resolver)
{
parent::configureOptions($resolver);
// Invoke the query builder closure so that we can cache choice lists
// for equal query builders
$queryBuilderNormalizer = function (Options $options, $queryBuilder) {
if (\is_callable($queryBuilder)) {
$queryBuilder = $queryBuilder($options['em']->getRepository($options['type_dbdo']));
if (null !== $queryBuilder && !$queryBuilder instanceof QueryBuilder) {
throw new UnexpectedTypeException($queryBuilder, 'Doctrine\ORM\QueryBuilder');
}
} else {
$repository = $options['em']->getRepository('TheatreCore\Entity\\' . ucfirst($options['type_dbdo']));
$queryBuilder = $repository->getListSearchRelation();
}
return $queryBuilder;
};
$resolver->setNormalizer('query_builder', $queryBuilderNormalizer);
$resolver->setAllowedTypes('query_builder', ['null', 'callable', 'Doctrine\ORM\QueryBuilder']);
$resolver->setDefaults([
'ids' => null,
'type_dbdo' => null,
'query_builder' => null,
'type_object' => null,
'noalpha' => null,
'dbdo' => null,
'type' => null,
'editset' => null,
'relat' => null
]);
}
/**
* Return the default loader object.
*
* @param QueryBuilder $queryBuilder
* @param string $class
*
* @return ORMQueryBuilderLoader
*/
public function getLoader(ObjectManager $manager, $queryBuilder, $class)
{
return new ORMQueryBuilderLoader($queryBuilder);
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'ajaxrelation';
}
/**
* We consider two query builders with an equal SQL string and
* equal parameters to be equal.
*
* @param QueryBuilder $queryBuilder
*
* @return array
*
* @internal This method is public to be usable as callback. It should not
* be used in user code.
*/
public function getQueryBuilderPartsForCachingHash($queryBuilder)
{
return [
$queryBuilder->getQuery()->getSQL(),
array_map([$this, 'parameterToArray'], $queryBuilder->getParameters()->toArray()),
];
}
/**
* Converts a query parameter to an array.
*
* @return array The array representation of the parameter
*/
private function parameterToArray(Parameter $parameter)
{
return [$parameter->getName(), $parameter->getType(), $parameter->getValue()];
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
if (!empty($GLOBALS['from_id'])) {
$view->vars['id_data'] = $GLOBALS['from_id'];
} elseif (!empty($GLOBALS['id'])) {
$view->vars['id_data'] = $GLOBALS['id'];
} else {
$view->vars['id_data'] = null;
}
$view->vars = array_replace($view->vars, [
'type_dbdo' => $options['type_dbdo'],
'ids' => $options['ids'],
'editset' => $options['editset']
]);
//// veux t'on un decoupage alphabetique ?
if (!array_key_exists('noalpha', $options)) {
$view->vars['alpha'] = true;
} else {
$view->vars['alpha'] = false;
}
if (array_key_exists('type_dbdo', $options)) {
$view->vars['type_dbdo'] = $options['type_dbdo'];
} else {
$view->vars['type_dbdo'] = null;
}
// version étdentue
if (!empty($options['extended'])) {
$view->vars['extended'] = true;
} else {
$view->vars['extended'] = 'false';
}
// type objet concerné
if (array_key_exists('type_object', $options)) {
$view->vars['type_object'] = $options['type_object'];
} else {
$view->vars['type_object'] = null;
}
if (array_key_exists('dbdo', $options)) {
$view->vars['dbdo'] = $options['dbdo'];
} else if (array_key_exists('type_object', $options)) {
$view->vars['dbdo'] = $options['type_object'];
} else {
$view->vars['dbdo'] = null;
}
if (array_key_exists('type', $options)) {
$view->vars['type'] = $options['type'];
} else {
$view->vars['type'] = null;
}
// relation simple ou complexe
if (!empty($options['relat']) && array_key_exists('relat', $options)) {
$view->vars['relat'] = 'simple';
} else {
$view->vars['relat'] = 'multiple';
}
if (array_key_exists('editset', $options)) {
$view->vars['editset'] = $options['editset'];
} else if (array_key_exists('type_object', $options)) {
$view->vars['editset'] = $options['type_object'];
} else {
$view->vars['editset'] = null;
}
if (isset($_REQUEST[$view->vars['type_object']]) && isset($_REQUEST[$view->vars['type_object']][$view->vars['name']])) {
$view->vars['datas'] = serialize($_REQUEST[$view->vars['type_object']][$view->vars['name']]);
} else if (!empty($_REQUEST[$view->vars['name']])) {
$view->vars['datas'] = serialize($_REQUEST[$view->vars['name']]);
}
// make a database query to find possible notifications related to postal addresses (e.g. to
// display dynamic messages such as 'Delivery to XX and YY states will be added next week!')
// $view->vars['notification'] = $this->entityManager->find('...');
}
}