2015-11-03 18 views
8

Tôi có một thực thể có các trường này.Xuất ra một ràng buộc đối tượng trong biểu mẫu với thư trong Symfony 2

class User implements UserInterface, \Serializable 
{ 
    /** 
    * @var string 
    * 
    * @ORM\Column(name="first_name", type="string", length=64) 
    * @Assert\NotBlank(message="First name cannot be blank") 
    * @Assert\Length(max=64, maxMessage="First name cannot more than {{ limit }} characters long") 
    */ 
    private $firstName; 

    ..... 

} 

Bây giờ tôi muốn tạo ra các ràng buộc này dưới dạng như thế này.

<input type="text" required="required" data-required-msg="First name cannot be blank" name="firstname" data-max-length="64" data-max-length-msg="First name cannot be more than 64 characters long"> 

Dù sao tôi cũng có thể đạt được điều này trong Symfony 2 mà không cần tạo lại các thuộc tính dữ liệu và dữ liệu này theo cách thủ công.

+0

Có vẻ như bạn muốn làm một việc như sau: http://stackoverflow.com/questions/15573935/symfony2-get-all-validation-constraints-on-an-entity-yml-xml-annotations –

Trả lời

1

Bạn có thể đạt được điều này bằng đoạn mã sau.

Ở đây tôi đang tiêm dịch vụ trình xác thực để đọc siêu dữ liệu (chú thích) của một lớp. Trong trường hợp của chúng tôi User lớp học. Sau đó, trên prepareConstraints chức năng lặp qua từng ràng buộc thuộc tính và thêm chúng vào một mảng có key là tên thuộc tính. Sau đó, trên buildForm chức năng thêm các ràng buộc dưới dạng giá trị trường attr.

On constroller

$user = new User(); 
$form = $this->createForm(new UserType($this->get('validator'),$this->get('translator')), $user); 

của bạn OnUserType bạn lớp:

class UserType extends AbstractType 
{ 
    private $metaData; 
    private $constraintMessages; 
    private $translator; 

public function __construct(ValidatorInterface $validatorInterface,TranslatorInterface $translator) 
{ 
    $this->metaData = $validatorInterface->getMetadataFor('AppBundle\Entity\User'); 
    $this->translator = $translator; 
    $this->prepareConstraints(); 
} 

private function prepareConstraints() 
{ 

    foreach ($this->metaData->properties as $property) { 
     foreach ($property->constraints as $constraint) { 
      $class = get_class($constraint); 
      $constraintName = substr($class, strrpos($class, '\\') + 1, strlen($class)); 
$message = property_exists($class, 'message') ? $constraint->message : $constraint->maxMessage;; 
      $this->constraintMessages[$property->name]['data-'.$constraintName] = $this->translator->trans($message,array('{{limit}}'=>...)) 
     } 
    } 
} 

/** 
* {@inheritdoc} 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add(
      'name', 
      null, 
      array(
       'label' => 'label.name', 
       'attr' => $this->constraintMessages['name'], 
      ) 
     ) 
     ... 
} 

}

quả

<input type="text" id="app_user_name" name="app_user[name]" required="required" data-notblank="This value should not be blank." class="form-control" value=""> 
+0

Cảm ơn bạn rất nhiều cho câu trả lời. Nhưng giải pháp của bạn chỉ giải quyết được một nửa vấn đề. Nó không định dạng các tin nhắn và nó cũng không dịch nó. Nếu bạn xem thông điệp chặt chẽ có phần giữ chỗ {{limit}} cần được điền vào. – nicholasnet

+0

Bây giờ, bạn có thể điều chỉnh dịch vụ dịch bạn muốn, –

Các vấn đề liên quan