<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Doctrine\ORM\EntityRepository;
use Vich\UploaderBundle\Form\Type\VichFileType;
use App\Entity\Category;
use App\Entity\Property;
use App\Entity\Level;
use App\Entity\Batch;
/**
*
* @author wendell.zheng <wxzheng@ustc.edu.cn>
*/
class ProjectType extends AbstractType
{
protected $router;
public function __construct(UrlGeneratorInterface $router)
{
$this->router = $router;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$project = $builder->getData();
$batch = $project->getBatch();
$batchType = $batch->getType();
$properties = Property::BATCH_TYPE_PROPERTIES[$batchType];
$isNew = boolval(! $project->getId());
$builder->add('batch', null, [
'label' => '批次',
'disabled' => true
]);
$builder->add('name', TextType::class, [
'label' => '项目名称',
'help' => '填写项目名称(如非项目负责人本人提交或有多位项目负责人,须填写项目名称+项目负责人)',
'required' => true
]);
if ($batchType !== Batch::TYPE_APPLY) {
$builder->add('number', null, [
'label' => '项目编号',
'required' => false
]);
}
$docParams = [
'label' => '上传材料',
'allow_delete' => false,
'required' => $isNew
];
if (! $isNew) {
$docParams['download_uri'] = $this->router->generate('applicant_project_download', [
'id' => $project->getId()
]);
$docParams['download_label'] = '下载';
}
$builder->add('doc', VichFileType::class, $docParams);
$builder->add('college', null, [
'label' => '所属单位',
'required' => false,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('e')
->where('e.valid = TRUE');
}
]);
$builder->add('property', EntityType::class, [
'label' => '材料属性',
'required' => count($properties) == 1,
'class' => Property::class,
'query_builder' => function (EntityRepository $er) use ($properties) {
return $er->createQueryBuilder('e')
->where('e.name in (:properties)')
->setParameter('properties', $properties);
}
]);
if ($batchType !== Batch::TYPE_BUDGET) {
$builder->add('category', EntityType::class, [
'label' => '类别',
'required' => false,
'class' => Category::class,
'query_builder' => function (EntityRepository $er) use ($batch) {
return $er->queryByBatch($batch);
}
]);
$formModifier = function (FormInterface $form, Category $category = null) use ($batchType) {
$levels = null === $category ? [] : $category->getLevels();
$form->add('level', EntityType::class, [
'class' => Level::class,
'label' => '子类别',
'required' => false,
'choices' => $levels
]);
// $form->add(/* 'schoolProjectNumber', TextType::class, [
// 'label' => '校级项目编号',
// 'required' => false,
// ]); *
};
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($formModifier) {
$formModifier($event->getForm(), $event->getData()
->getCategory());
});
$builder->get('category')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($formModifier) {
$form = $event->getForm();
$formModifier($form->getParent(), $form->getData());
});
}
}
}