src/Form/ProjectType.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use Symfony\Component\Form\AbstractType;
  4. use Symfony\Component\Form\FormInterface;
  5. use Symfony\Component\Form\FormBuilderInterface;
  6. use Symfony\Component\Form\FormEvent;
  7. use Symfony\Component\Form\FormEvents;
  8. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  9. use Symfony\Component\Form\Extension\Core\Type\TextType;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Doctrine\ORM\EntityRepository;
  12. use Vich\UploaderBundle\Form\Type\VichFileType;
  13. use App\Entity\Category;
  14. use App\Entity\Property;
  15. use App\Entity\Level;
  16. use App\Entity\Batch;
  17. /**
  18.  *
  19.  * @author wendell.zheng <wxzheng@ustc.edu.cn>
  20.  */
  21. class ProjectType extends AbstractType
  22. {
  23.     protected $router;
  24.     public function __construct(UrlGeneratorInterface $router)
  25.     {
  26.         $this->router $router;
  27.     }
  28.     public function buildForm(FormBuilderInterface $builder, array $options)
  29.     {
  30.         $project $builder->getData();
  31.         $batch $project->getBatch();
  32.         $batchType $batch->getType();
  33.         $properties Property::BATCH_TYPE_PROPERTIES[$batchType];
  34.         $isNew boolval(! $project->getId());
  35.         $builder->add('batch'null, [
  36.             'label' => '批次',
  37.             'disabled' => true
  38.         ]);
  39.         $builder->add('name'TextType::class, [
  40.             'label' => '项目名称',
  41.             'help' => '填写项目名称(如非项目负责人本人提交或有多位项目负责人,须填写项目名称+项目负责人)',
  42.             'required' => true
  43.         ]);
  44.         if ($batchType !== Batch::TYPE_APPLY) {
  45.             $builder->add('number'null, [
  46.                 'label' => '项目编号',
  47.                 'required' => false
  48.             ]);
  49.         }
  50.         $docParams = [
  51.             'label' => '上传材料',
  52.             'allow_delete' => false,
  53.             'required' => $isNew
  54.         ];
  55.         if (! $isNew) {
  56.             $docParams['download_uri'] = $this->router->generate('applicant_project_download', [
  57.                 'id' => $project->getId()
  58.             ]);
  59.             $docParams['download_label'] = '下载';
  60.         }
  61.         $builder->add('doc'VichFileType::class, $docParams);
  62.         $builder->add('college'null, [
  63.             'label' => '所属单位',
  64.             'required' => false,
  65.             'query_builder' => function (EntityRepository $er) {
  66.                 return $er->createQueryBuilder('e')
  67.                     ->where('e.valid  = TRUE');
  68.             }
  69.         ]);
  70.         $builder->add('property'EntityType::class, [
  71.             'label' => '材料属性',
  72.             'required' => count($properties) == 1,
  73.             'class' => Property::class,
  74.             'query_builder' => function (EntityRepository $er) use ($properties) {
  75.                 return $er->createQueryBuilder('e')
  76.                     ->where('e.name in (:properties)')
  77.                     ->setParameter('properties'$properties);
  78.             }
  79.         ]);
  80.         if ($batchType !== Batch::TYPE_BUDGET) {
  81.             $builder->add('category'EntityType::class, [
  82.                 'label' => '类别',
  83.                 'required' => false,
  84.                 'class' => Category::class,
  85.                 'query_builder' => function (EntityRepository $er) use ($batch) {
  86.                 return $er->queryByBatch($batch);
  87.                 }
  88.                 ]);
  89.             
  90.             $formModifier = function (FormInterface $formCategory $category null) use ($batchType) {
  91.                 $levels null === $category ? [] : $category->getLevels();
  92.                 $form->add('level'EntityType::class, [
  93.                     'class' => Level::class,
  94.                     'label' => '子类别',
  95.                     'required' => false,
  96.                     'choices' => $levels
  97.                 ]);
  98.                 // $form->add(/* 'schoolProjectNumber', TextType::class, [
  99.                 // 'label' => '校级项目编号',
  100.                 // 'required' => false,
  101.                 // ]); *
  102.             };
  103.             $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier) {
  104.                 $formModifier($event->getForm(), $event->getData()
  105.                     ->getCategory());
  106.             });
  107.             $builder->get('category')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) {
  108.                 $form $event->getForm();
  109.                 $formModifier($form->getParent(), $form->getData());
  110.             });
  111.         }
  112.     }
  113. }