我来找你解决大脑杀手的问题。
所以我有一个生成子表单的基本表单。我想将数组数据传递给子表单,但数组传递是数据失真的。
我也有一个关于我认为是链接的 CSRF 令牌的错误。 CSFR 错误
控制器 :
public function evaluatemocep($id,Request $request): Response
{
if ($this->getUser()) {
$em = $this->getDoctrine()->getManager();
$efficiency = new Efficiency();
$problem = $em->getRepository('App:Problem')->find($id);
$efficiency->setLinkProblem($problem);
$form = $this->createForm(EfficiencyForm::class,$problem,['data'=>['id' => $id]]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($efficiency);
$em->flush();
}
return $this->render('efficiency/efficiencyform.html.twig', [
'problem' => $problem,
'form' => $form->createView()]);
}
return new Response("You must be login");
}
效率形式:
class EfficiencyForm extends AbstractType {
/**
* {@inheritDoc}
*/
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$problem = $this->em->getRepository(Problem::class)->find($options['data']['id']);
$MOCrepo = $problem->getMOC();
$EOrepo = $problem->getEO();
$MOCA = array();
$EOA = array();
foreach ($EOrepo as $eo){
array_push($EOA, $eo);
}
foreach ($MOCrepo as $moc){
array_push($MOCA, $moc);
}
$builder->add('EffCollection', CollectionType::class, [
'entry_type' => EfficiencyMOCEOType::class,
'entry_options' => array('label' => false, 'EOA' => $EOA, 'MOCA' => $MOCA),
'allow_add' => true,
'prototype' => true,
'by_reference' => false,
'allow_delete' => true,
'mapped' => false,
'label' => 'Thinking about health'
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'allow_extra_fields' => true
]);
}
public function getBlockPrefix() {
return 'RateCouple';
}
}
效率MOCEO类型:
<?php
namespace App\Form;
use App\Entity\Efficiency;
use App\Entity\EO;
use App\Entity\MOC;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class EfficiencyMOCEOType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$EOA = $options['EOA'];
$MOCA = $options['MOCA'];
$builder
->add('EO', EntityType::class, [
'class' => EO::class,
'label' => 'Ethical objective',
'choices' => $EOA,
'choice_attr' => function ($choice){return ['title' => $choice->getDescription()];},
'required' => true])
->add('MOC', EntityType::class,[
'class' => MOC::class,
'label' => 'Model Of Care',
'choices' => $MOCA,
'choice_attr' => function ($choice){return ['title' => $choice->getDescription()];},
'required' => true])
->add('rateRiskCurrent', ChoiceType::class,[
'label' => 'Evaluate the risks of the selected couple : ',
'choices' => [
'High Risk' => 3,
'Medium Risk' => 2,
'Low Risk' => 1
],
'required' => true
])
->add('rateBenefitCurrent', ChoiceType::class,[
'label' => 'Evaluate the benefits of the selected couple : ',
'choices' => [
'High Benefit' => 3,
'Medium Benefit' => 2,
'Low Benefit' => 1
],
'required' => true
]);
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Efficiency::class,
'MOCA' =>[],
'EOA' => [],
'allow_extra_fields' => true
]);
}
}
树枝文件:
{% extends 'base.html.twig' %}
{% block title %}New efficiency evaluation{% endblock %}
{% block body %}
{{ form(form) }}
<div>
</div>
<fieldset>
{{ form_start(form) }}
<ul style="display: none" class="efficiencies" data-prototype="<fieldset class="form-group"><div id="RateCouple_linkEfficiency___name__"><div class="form-group"><label class="required" for="RateCouple_linkEfficiency___name___EO">Ethical objective</label><select id="RateCouple_linkEfficiency___name___EO" name="RateCouple[linkEfficiency][__name__][EO]" class="form-control"><option value="3" title="DESC EO 1">EO 1</option></select></div><div class="form-group"><label class="required" for="RateCouple_linkEfficiency___name___MOC">Model Of Care</label><select id="RateCouple_linkEfficiency___name___MOC" name="RateCouple[linkEfficiency][__name__][MOC]" class="form-control"><option value="3" title="DESC MOC 1">MOC 1</option></select></div><div class="form-group"><label class="required" for="RateCouple_linkEfficiency___name___rateRiskCurrent">Evaluate the risks of the selected couple : </label><select id="RateCouple_linkEfficiency___name___rateRiskCurrent" name="RateCouple[linkEfficiency][__name__][rateRiskCurrent]" class="form-control"><option value="3">High Risk</option><option value="2">Medium Risk</option><option value="1">Low Risk</option></select></div><div class="form-group"><label class="required" for="RateCouple_linkEfficiency___name___rateBenefitCurrent">Evaluate the benefits of the selected couple : </label><select id="RateCouple_linkEfficiency___name___rateBenefitCurrent" name="RateCouple[linkEfficiency][__name__][rateBenefitCurrent]" class="form-control"><option value="3">High Benefit</option><option value="2">Medium Benefit</option><option value="1">Low Benefit</option></select></div></div></fieldset>">
</ul>
<ul class="efficiencies">
{% for efficiency in form.EffCollection %}
<li>
{{ form_row(efficiency.EO) }}
</br>
{{ form_row(efficiency.MOC) }}
</br>
{{ form_row(efficiency.rateRiskCurrent) }}
</br>
{{ form_row(efficiency.rateBenefitCurrent) }}
</li>
{% endfor %}
</ul>
<input type="submit" value="Submit" class="btn btn-primary btn-block" />
{{ form_end(form) }}
<script>
var efficiency_template = document.getElementById("efficiencies");
function addNewEfficiency(){
var dup_efficiency_template = efficiency_template.cloneNode(true);
document.getElementById("list_of_efficiency").append(dup_efficiency_template);
}
</script>
{% endblock %}
{% block javascripts %}
<script>
var $collectionHolderEfficiency;
var $addEfficiencyButton = $('<button type="button" class="btn btn-secondary btn-success">Add an efficiency row</button>');
var $newEfficiencyLinkLi = $('<li></li>').append($addEfficiencyButton);
jQuery(document).ready(function() {
$collectionHolderEfficiency = $('ul.efficiencies');
$collectionHolderEfficiency.find('li').each(function () {
addEfficiencyFormDeleteLink($(this));
});
$collectionHolderEfficiency.append($newEfficiencyLinkLi);
$collectionHolderEfficiency.data('index', $collectionHolderEfficiency.find(':input').length);
$addEfficiencyButton.on('click', function (e) {
addEfficiencyForm($collectionHolderEfficiency, $newEfficiencyLinkLi);
});
});
function addEfficiencyForm($collectionHolderEfficiency, $newEfficiencyLinkLi) {
var prototype = $collectionHolderEfficiency.data('prototype');
var index = $collectionHolderEfficiency.data('index');
var newForm = prototype;
newForm = newForm.replace(/__name__/g, index);
$collectionHolderEfficiency.data('index', index + 1);
var $newFormLi = $('<li></li>').append(newForm);
addEfficiencyFormDeleteLink($newFormLi);
$newEfficiencyLinkLi.before($newFormLi);
}
function addEfficiencyFormDeleteLink($efficiencyFormLi) {
var $removeFormButton = $('<button type="button" class="btn btn-secondary btn-danger">Delete this efficiency row</button>');
$efficiencyFormLi.append($removeFormButton);
$removeFormButton.on('click', function(e) {
$efficiencyFormLi.remove();
});
}
</script>
</fieldset>
{% endblock %}
任何帮助将不胜感激!