Aktualisieren einer Entität/Datenbank-Datensatz mit Formular-generator in Symfony 2
Ich ausgewählt habe, ein Entität-Datensatz aus der Datenbank und übergibt es an meiner form. Die form lädt richtig, aber wenn ich auf "speichern" klicken fügt einen neuen Datensatz statt zu aktualisieren die bereits vorhandenen.
PlanController.php
public function editPlanAction($id, Request $request)
{
$em = $this->getDoctrine()->getManager();
$plan = $em->getRepository('etrakOnlineOrderProcessingBundle:Plan')->find($id);
if (!$plan && !$request->isMethod('POST')) {
throw $this->createNotFoundException(
'No plan found for id ' . $id
);
}
$form = $this->createForm(new PlanType(), $plan);
if ($request->isMethod('POST')) {
$form->bind($request);
if ($form->isValid()) {
$editPlan = $form->getData();
$em->flush();
}
}
return $this->render('etrakCustomerServiceBundle:Plan:edit.html.twig', array('form' => $form->createView()));
}
routing.yml
etrak_customer_service_plan_edit:
pattern: /plan/edit/{id}
defaults: { _controller: etrakCustomerServiceBundle:Plan:editPlan }
PlanType.php
namespace etrak\CustomerServiceBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class PlanType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'etrak\OnlineOrderProcessingBundle\Entity\Plan',
'cascade_validation' => true,
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$termsConditionsArray = array("NONE" => "No Contract", "1 Year Contract" => "1 Year Contract", "2 Year Contract" => "2 Year Contract");
$billingFrequencyArray = array("1" => "Monthly", "6" => "6 Months", "12" => "Yearly");
//Create the form
$builder->add('name', 'text', array('label' => 'Plan Name: ', 'required' => false));
$builder->add('description', 'text', array('label' => 'Plan Description: ', 'required' => false));
$builder->add('termsConditions', 'choice', array('choices' => $termsConditionsArray, 'label' => 'Terms & Conditions', 'required' => false));
$builder->add('amount', 'text', array('label' => 'Plan Price: ', 'required' => false));
$builder->add('affinity', 'choice', array('choices' => array('0' => 'Yes', '1' => 'No'), 'label' => 'Affinity? ', 'expanded' => true, 'required' => false));
$builder->add('deactivationFee', 'text', array('label' => "Deactivation Fee: ", 'required' => false));
$builder->add('recurringInMonths', 'choice', array('choices' => $billingFrequencyArray, 'label' => 'Billing Frequency: ', 'required' => false));
$builder->add('pricingTier', 'entity', array(
'class' => 'etrakOnlineOrderProcessingBundle:pricingTier',
'property' => 'name',
'label' => "Select Pricing Tier: "
));
$builder->add('activeStartDate', 'datetime', array('label' => "Effective Start Date: ", 'required' => false));
$builder->add('activeEndDate', 'datetime', array('label' => "Effective End Date: ", 'required' => false));
}
public function getName()
{
return 'plan';
}
}
Jede Hilfe wäre sehr geschätzt werden!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Sie nicht buchen die id von der plan-Objekt. Damit eine neue erstellt wird, wenn Sie die getData. Hinzufügen-id als hidden-Feld oder fügen Sie es zu Ihrem post-url in der Vorlage. Tatsächlich, ich glaube nicht, dass das versteckte Feld arbeiten. Wahrscheinlich müssen Sie einfach aktualisieren Sie die post-url.
Vielleicht haben Sie vergessen zu bestehen Personen.
$editPlan = $form->getData();
ist nicht notwendig, da diebind
Funktion bindet die Daten direkt an das Unternehmen an die form übergeben.