use Symfony\Component\Validator\Constraints as Assert;
/**
- * @ORM\Entity
+ * @ORM\Entity(repositoryClass="ResourceRepository")
* @ORM\InheritanceType(value="JOINED")
* @ORM\DiscriminatorColumn(name="type", type="text", length=30)
* @ORM\DiscriminatorMap({
*/
protected $description;
- protected $type;
-
/**
* @ORM\Column(type="integer")
*/
public function getType()
{
- return $this->type;
- }
+ if ($this instanceof ResourceZone) {
+ return self::TYPE_ZONE;
+ } elseif ($this instanceof ResourcePlace) {
+ return self::TYPE_PLACE;
+ } elseif ($this instanceof ResourceComputer) {
+ return self::TYPE_COMPUTER;
+ }
- public function setType($type)
- {
- $this->type = $type;
+ throw new \LogicException(sprintf('Unable to guess type from "%s"', get_class($this)));
}
public function getStatus()
throw new \InvalidArgumentException(sprintf('No resource type named "%s"', $type));
}
}
+
+ public function isParentRequired()
+ {
+ return $this->getType() === self::TYPE_COMPUTER;
+ }
+
+ public function getAllowedParentTypes()
+ {
+ $type = $this->getType();
+
+ if ($type === Resource::TYPE_ZONE) {
+ return array(Resource::TYPE_ZONE);
+ } elseif ($type == Resource::TYPE_PLACE) {
+ return array(Resource::TYPE_ZONE, Resource::TYPE_PLACE);
+ } elseif ($type == Resource::TYPE_COMPUTER) {
+ return array(Resource::TYPE_PLACE);
+ }
+
+ throw new \InvalidArgumentException(sprintf('No parent types defined for "%s"', $type));
+ }
}
--- /dev/null
+<?php
+
+namespace Epnadmin\CoreBundle\Entity;
+
+use Doctrine\ORM\EntityRepository;
+
+class ResourceRepository extends EntityRepository
+{
+ public function createQueryForParent(Resource $resource)
+ {
+ $types = array_map(function ($type) {
+ return 'Epnadmin\CoreBundle\Entity\Resource'.ucfirst($type);
+ }, $resource->getAllowedParentTypes());
+
+ return $this
+ ->createQueryBuilder('r')
+ ->where('r INSTANCE OF ('.implode(', ', $types).')')
+ ;
+ }
+}
--- /dev/null
+<?php
+
+namespace Epnadmin\CoreBundle\Form\Type;
+
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+use Symfony\Component\OptionsResolver\Options;
+
+use Epnadmin\CoreBundle\Entity\Resource;
+
+class ResourceChoiceType extends AbstractType
+{
+ public function setDefaultOptions(OptionsResolverInterface $resolver)
+ {
+
+ $qb = function (Options $options) {
+ return function ($repository) use ($options) {
+
+ $resource = $options['resource'];
+ if (null === $resource) {
+ throw new \InvalidArgumentException('No resource defined in form options');
+ }
+
+ return $repository->createQueryForParent($resource);
+ };
+ };
+
+ $isParentRequired = function (Options $options) {
+ $resource = $options['resource'];
+ if (null === $resource) {
+ throw new \InvalidArgumentException('No resource defined in form options');
+ }
+
+ return $resource->isParentRequired();
+ };
+
+ $resolver->setDefaults(array(
+ 'resource' => null,
+ 'class' => 'Epnadmin\CoreBundle\Entity\Resource',
+ 'query_builder' => $qb,
+ 'required' => $isParentRequired,
+ 'allow_empty' => !$isParentRequired
+ ));
+ }
+
+ public function getParent()
+ {
+ return 'entity';
+ }
+
+ public function getName()
+ {
+ return 'epn_resource_choice';
+ }
+}
'label' => "Dépend de"
));
*/
-$builder->add('parent', null, array(
- 'required' => false,
- 'label' => "Dépend de"
+ $builder->add('parent', 'epn_resource_choice', array(
+ 'label' => 'Dépend de',
+ 'resource' => $builder->getData()
));
$builder->add('description', 'textarea', array(
<services>
<service id="epnadmincore.services.form_resource" class="Epnadmin\CoreBundle\Form\Type\ResourceType">
- <argument type="service" id="translator" />
<tag name="form.type" alias="epn_resource" />
</service>
<service id="epnadmincore.services.form_resource_zone" class="Epnadmin\CoreBundle\Form\Type\ResourceZoneType">
- <argument type="service" id="translator" />
<tag name="form.type" alias="epn_resource_zone" />
</service>
<service id="epnadmincore.services.form_resource_place" class="Epnadmin\CoreBundle\Form\Type\ResourcePlaceType">
- <argument type="service" id="translator" />
<tag name="form.type" alias="epn_resource_place" />
</service>
<service id="epnadmincore.services.form_resource_computer" class="Epnadmin\CoreBundle\Form\Type\ResourceComputerType">
- <argument type="service" id="translator" />
<tag name="form.type" alias="epn_resource_computer" />
</service>
+ <service id="epnadmincore.services.form_resource_choice" class="Epnadmin\CoreBundle\Form\Type\ResourceChoiceType">
+ <tag name="form.type" alias="epn_resource_choice" />
+ </service>
</services>
</container>
-<form action="{{ path('epnadmincore_resource_new', {type: type}) }}" method="POST" novalidate="novalidate">
- {{ form_widget(form) }}
- <p><input type="submit" /></p>
-</form>
+{% extends "::base.html.twig" %}
+
+{% block body %}
+ <form action="{{ path('epnadmincore_resource_new', {type: type}) }}" method="POST" novalidate="novalidate">
+ {{ form_widget(form) }}
+ <p><input type="submit" /></p>
+ </form>
+{% endblock %}