Я пытаюсь создать форму, которая позволила бы менеджеру утвердить список запросов на отпуск (также планирую иметь список дел и хочу иметь возможность пометить их как выполненные).
Я прочитал [Генерировать один и тот же тип формы на одной и той же странице несколько раз Symfony2 (а также несколько других), и я близок к пониманию, но я довольно новичок в Symfony и не понимаю, какие части кода должны находиться в каких файлах . Я использую тип формы и контроллер в Symfony3 с Doctrine.
У меня есть список экземпляров сущности, которые были возвращены из запроса ($ em-> createQuery) в контроллере, и я хочу создать форму для каждого экземпляра сущности или даже две формы для каждой сущности (одна для утверждения и одна для отклонения) .
В указанном вопросе говорится, что вам нужен цикл для их отображения и сохранения. Мое намерение состоит в том, чтобы работать (отправлять) только по одному за раз. Я предполагаю, что эта часть кода будет идти в контроллере?
Я использую indexAction для контроллера, но использую его больше как действие Edit, так как я буду обрабатывать формы, поэтому я передаю объект Request и объекты в качестве параметров.
>
class HRMgrController extends Controller
{
/**
* Lists all manager role requests and provide a means to approve/deny.
*
* @Route("/", name="hrmgr_index")
* @Method({"GET", "POST"})
* @Security("has_role('ROLE_APP_MANAGER')")
*/
public function indexAction(Request $request, TimeOffRequest $timeOffRequest)
{
if (!empty($timeOffRequest)) {
$form = $this->createForm('CockpitBundle\Form\TORApprovalType', $timeOffRequest);
print "TOR Id = " . $timeOffRequest->getId() . "<BR>";
$em = $this->getDoctrine()->getManager();
$form->handleRequest($request);
print "Form name = " . $form->getName() . "<BR>";
if ($form->isSubmitted() && $form->isValid()) {
if ($form->get('approve')->isClicked()) {
print "This puppy was approved";
$timeOffRequest['status'] = 4;
}
if ($form->get('reject')->isClicked()) {
print "This puppy was rejected";
$timeOffRequest['status'] = 1;
}
$this->getDoctrine()->getManager()->flush();
print "At least its there<BR>";
// return $this->redirectToRoute('hrmgr_index');
} else {
print "did not detect form submission<BR>";
}
}
$emp = new \CockpitBundle\Entity\Employee();
$date = new \DateTime();
$year = $date->format('Y');
$username = $this->getUser()->getUserName();
$user = $em->getRepository('CockpitBundle:Employee')->findByUsername($username);
$employees = $em->getRepository('CockpitBundle:Employee')->htmlContact($user);
$tors = $em->getRepository('CockpitBundle:TimeOffRequest')->findMgrUnapprovedTORs($user->getId());
$timeoff = "<h3>Unapproved Time Off Requests</h3>";
$actions = true;
$torforms = [];
foreach ($tors as $tor) {
$target = $this->generateUrl('hrmgr_index',array("tor_id" => $tor->getId()));
$torforms[] = $this->actionForm($tor,$target)->createView();
}
return $this->render('hrmgr/index.html.twig', array(
'torforms' => $torforms,
));
У меня есть формы, работающие сейчас, но когда я отправляю их, isSubmitted(), похоже, не работает. В настоящее время он выводит «не обнаружено отправку формы».
Итак, когда у меня есть несколько форм и я отправляю одну, получает ли handleRequest правильную форму? Я думаю, что здесь я тоже могу спутать два понятия. Недавно я изменил код, чтобы отправить идентификатор timeOffRequest в качестве параметра маршрута. Он правильно подбирает это, что позволяет мне потенциально обновлять форму, но эта часть кода, похоже, не работает.
Я заметил, что если я смотрю на отладчик, я получаю что-то вроде:
> approval_form_2
[▼
"reject" => ""
"_token" => "IE1rGa5c0vaJYk74_ncxgFsoDU7wWlkAAWWjLe3Jr1w"
]
если я нажму кнопку отклонения. Я получаю аналогичную форму с «одобрить», если нажимаю кнопку «одобрить», поэтому кажется, что я близок. Кроме того, правильный идентификатор отображается из маршрута, указанного в действии.
Вот генератор форм:
<?php
namespace CockpitBundle\Form;
use CockpitBundle\Entity\Employee;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class TORApprovalType extends AbstractType
{
private $nameSuffix = null;
private $name = 'time_req_approval';
public function __constructor(string $suffix = null) {
//parent::__construct();
$this->nameSuffix = $this->generateNameSuffix();
}
private function generateNameSuffix() {
if ($this->nameSuffix == null || $this->nameSuffix == '') {
$generator = new SecureRandom();
//change data to alphanumeric string
return bin2hex($generator->nextBytes(10));
}
return $this->nameSuffix;
}
public function setNameSuffix($suffix){
$this->nameSuffix = $suffix;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Build your form...
$builder->add('approve', SubmitType::class, array(
'label' => "Approve",
'attr' => array("class"=>"action-approve"),
));
$builder->add('reject', SubmitType::class, array(
'label' => "Reject",
'attr' => array("class"=>"action-reject"),
));
//$builder->add('employee');
}
public function getName() {
if ($this->nameSuffix == null || $this->nameSuffix == "" ) {
$this->nameSuffix = $this->generateNameSuffix();
}
return $this->name .'_'. $this->nameSuffix;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'CockpitBundle\Entity\TimeOffRequest'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'cockpitbundle_timeoffrequest';
}
}
Любые подсказки? (извините, я в отпуске, поэтому не очень быстро с обновлениями.
approve
, а другая —reject
. Это было бы совершенно нормально, но я думаю, что вы немного запутались в синтаксисе и использовании нескольких форм. Не могли бы вы предоставить кодTimeOffRequestType
? - person KhorneHoly   schedule 15.03.2017