联系表指定一组家庭的日期、类型和配送中心。[家庭集被定义为该中心的最新家庭,并通过 ajax 呈现。] 类型实体是必需的,日期不得为将来。类型约束在 Contact 实体中指定;日期约束在自定义验证器中。如果违反了这些约束中的任何一个,则该表单在 Netbeans 调试中确认为无效。此外,错误消息出现在 Netbeans 中。然而,模板中都没有出现任何约束消息。将 form_errors 转储添加到模板中没有任何作用。我无法确定为什么没有消息出现。
联系实体片段:
namespace Mana\ClientBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Mana\ClientBundle\Validator\Constraints as ManaAssert;
/**
* Contact
*
* @ORM\Table(name="contact", indexes={@ORM\Index(name="idx_contact_household_idx", columns={"household_id"}), @ORM\Index(name="idx_contact_type_idx", columns={"contact_type_id"}), @ORM\Index(name="idx_contact_center_idx", columns={"center_id"})})
* @ORM\Entity(repositoryClass="Mana\ClientBundle\Entity\ContactRepository")
*
*/
class Contact
{
...
/**
* @var \Mana\ClientBundle\Entity\ContactType
*
* @ORM\ManyToOne(targetEntity="Mana\ClientBundle\Entity\ContactType", inversedBy="contacts")
* @ORM\JoinColumn(name="contact_type_id", referencedColumnName="id")
* @Assert\NotBlank(message="Type must be selected")
*/
private $contactType;
...
/**
* @var \DateTime
*
* @ORM\Column(name="contact_date", type="date", nullable=true)
* @ManaAssert\NotFutureDate
*/
private $contactDate;
ContactController 片段:
/**
* @Route("/addContacts", name="contacts_add")
* @Template("ManaClientBundle:Contact:testLatestContacts.html.twig")
*/
public function addContactsAction(Request $request) {
$form = $this->createForm(new ContactType());
$form->handleRequest($request);
$message = "";
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$households = $this->getRequest()->request->get('contact_household');
$data = $form->getData();
$contactDate = $data->getContactDate();
$contactCenter = $data->getCenter();
$contactType = $data->getContactType();
$n = count($households);
foreach ($households as $id) {
$household = $em->getRepository('ManaClientBundle:Household')->find($id);
$houseContacts = $household->getContacts();
$nContacts = count($houseContacts);
$first = ($nContacts > 0) ? 0 : 1;
$county = $contactCenter->getCounty();
$contact = new Contact();
$contact->setContactDate($contactDate);
$contact->setCenter($contactCenter);
$contact->setContactType($contactType);
$contact->setCounty($county);
$contact->setFirst($first);
$household->addContact($contact);
$em->persist($household);
}
$em->flush();
$center = $contactCenter->getCenter();
$desc = $contactType->getContactDesc();
$message = "$n $desc contacts added for $center";
}
return array(
'form' => $form->createView(),
'title' => 'Add contacts',
'message' => $message,
);
}
模板片段:
{{ form_errors(form.contactDate) }}
{{ form_errors(form.contactType) }}
<div class="width80">
<form action="{{ path("contacts_add") }}" method="post">
<div class="column1">
<table>
<tr>
<td><b>Date:</b>
<td>{{ form_widget(form.contactDate) }}
<tr>
<td><b>Type:</b>
<td>{{ form_widget(form.contactType) }}
<tr>
<td><b>Center:</b>
<td>{{ form_widget(form.center)}}
</table>
联系人类型:
namespace Mana\ClientBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;
class ContactType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('contactType', 'entity', array(
'class' => 'ManaClientBundle:ContactType',
'property' => 'contactDesc',
'empty_value' => 'Select contact type',
'error_bubbling' => true,
'attr' => array("class" => "smallform"),
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->orderBy('c.contactDesc', 'ASC');
},
))
->add('contactDate', 'date', array(
'data' => date_create(),
'format' => 'M/d/y',
'label' => '<b>Date:</b> ',
'years' => range(date('Y'), date('Y') - 5),
))
->add('center', 'entity', array(
'class' => 'ManaClientBundle:Center',
'property' => 'center',
'data' => "",
'empty_value' => 'Select distribution center',
'error_bubbling' => true,
'attr' => array("class" => "smallform"),
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('c')
->orderBy('c.center', 'ASC');
},
))
->add('household', 'choice', array(
'mapped' => false,
'expanded' => true,
'multiple' => true,
))
->add('householdId','text',array(
'mapped' => false,
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Mana\ClientBundle\Entity\Contact',
'cascade_validation' => true,
'csrf_protection' => false,
'required' => false,
'error_bubbling' => TRUE,
));
}
public function getName()
{
return 'contact';
}
}