มีตัวอย่างวิธีการทำสิ่งที่คุณต้องการบรรลุผลสำเร็จใน เอกสาร Symfony บน วิธีฝังคอลเลกชั่นแบบฟอร์ม
สำหรับกรณีการใช้งานเฉพาะของคุณ คุณจะต้องสร้าง UserCartsForm
และ CartsForm
แบบแยก
ใน UserCart
ของคุณ ให้เพิ่มฟิลด์ carts
เป็น CollectionType
จากนั้น Symfony จะประมวลผลฟิลด์เป็นชุดของแบบฟอร์ม
src/AppBundle/Form/UserCart.php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type as FormType;
class UserCartsForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('carts', FormType\CollectionType::class, [
'label' => false,
'entry_type' => CartsForm::class,
'entry_options' => array('label' => false),
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
]);
}
}
เพิ่มฟิลด์ที่คุณต้องการแก้ไขในแบบฟอร์มของคุณไปยัง CartsForm
src/AppBundle/Form/CartsForm.php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type as FormType;
class CartsForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('quantity', FormType\IntegerType::class, [
'label' => false
//...
]);
//...
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Cart::class,
]);
}
}
ในตัวควบคุมของคุณ ให้อ้างอิงเอนทิตีผู้ใช้เป็นข้อมูล UserCartsForm
ของคุณ
src/AppBundle/Controller/DefaultController.php
namespace AppBundle\Controller;
use AppBundle\Form\UserCartsForm;
class DefaultController extends Controller
{
/**
* @Route('/user/{id}/carts')
*/
public function userCartsAction(Request $request, User $user)
{
$form = $this->createForm(UserCartsForm::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//... process entity
//$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('some_route');
}
return $this->render('user_carts_form.html.twig', [
'form' => $form
]);
}
}
จากนั้นคุณควรจะสามารถดึงข้อมูลจากเทมเพลตทวิกของคุณได้อย่างง่ายดายเพื่อเรนเดอร์ตามที่คุณต้องการ
แอป/ทรัพยากร/views/user_carts_form.html.twig
{% form_start(form) %}
<table>
<thead>
<tr>
<td>Name</td>
<td>Quantity</td>
<td></td>
</tr>
</thead>
<tbody>
{% for cart in form.carts %}
{% set cartEntity = cart.vars.data %}
<tr>
<td>{{ cartEntity.product.name }}</td>
<td>{{ form_widget(cart.quantity) }}</td>
<td><a class="button" href="{{ path('remove_cart_action', { id: cartEntity.id }) }}">Delete <icon/></a></td>
<tr>
{% endfor %}
</tbody>
</table>
<button type="submit">Submit</button>
{% form_end(form) %}
การอัปเดตข้อจำกัดของเอนทิตี
ตามค่าเริ่มต้น Symfony จะใช้ข้อจำกัดทั้งหมด (Default
) ที่กำหนดให้กับเอนทิตีเมื่อตรวจสอบความถูกต้องของแบบฟอร์มของคุณ ทำให้ $form->isValid()
ส่งกลับค่าเท็จ
https://symfony.com/doc/3.4/validation/groups.html
หากไม่มีการระบุกลุ่ม ข้อจำกัดทั้งหมดที่อยู่ในกลุ่ม Default
จะถูกนำไปใช้
หากต้องการแก้ไขปัญหา ให้ใช้ กลุ่มการตรวจสอบ เพื่อแยกข้อจำกัดของเอนทิตีและประกาศ กลุ่มที่ต้องการในรูปแบบที่เกี่ยวข้อง
ตัวอย่าง:
src/AppBundle/Entity/User.php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
*/
class User
{
/**
* @Assert\NotBlank(groups={"registration"})
*/
private $username;
//...
}
จากนั้นให้ ใช้กลุ่มการตรวจสอบของคุณบนแบบฟอร์มที่ต้องการ ในสิ่งนี้ กรณี RegistrationForm
คุณประกาศกลุ่มที่ต้องการใน AbstractTye::configureOptions
เป็นหนึ่งใน OptionsResolver:$defaults
src/AppBundle/Form/RegistrationForm.php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
class RegistrationForm extends AbstractType
{
//...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'validation_groups' => ['registration']
]);
}
}
ขณะนี้ข้อจำกัด User::NotBlank
จะมีผลกับ RegistrationForm::isValid()
หรือแบบฟอร์มอื่นใดที่ประกาศกลุ่มการตรวจสอบความถูกต้องของการลงทะเบียนเท่านั้น
person
Will B.
schedule
25.04.2018