2011-12-07 28 views
21

Tôi hiện đang cố gắng sử dụng Thành phần biểu mẫu Symfony2 mặc dù microframework Silex.Thành phần biểu mẫu Symfony2 - tạo trường mà không có tên biểu mẫu trong thuộc tính name

mẫu đăng nhập của tôi được tạo ra như sau:

$app = $this->app; 

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(), 
    'password' => new Assert\NotBlank(), 
)); 

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint)); 

$form = $builder 
    ->add('username', 'text', array('label' => 'Username')) 
    ->add('password', 'password', array('label' => 'Password')) 
    ->getForm() 
; 

return $form; 

Vấn đề được rằng hình thức kết quả đã được tạo ra như sau:

<fieldset> 
    <input type="hidden" value="******" name="form[_token]" id="form__token"> 
    <section class=""> 
     <label class=" required" for="form_username">Username</label> 
     <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div> 
    </section> 
    <section class=""> 
     <label class=" required" for="form_password">Password</label> 
     <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div> 
    </section> 
    <section> 
     <div><button class="fr submit">Login</button></div> 
    </section> 
</fieldset> 

Trong khi tôi muốn tên và thuộc tính id là như sau:

<div><input type="text" value="" name="username" id="username" class="text"></div> 
... 
<div><input type="password" value="" name="password" id="password" class="password"></div> 

Tôi đã xóa trang web và tìm ra lời khuyên về 'property_path' opti nhưng tôi tin rằng điều này là để làm với lớp được sử dụng để xử lý dữ liệu khi được sử dụng trong khung công tác Symfony2 thực.

Tôi đã trải qua các tập tin Mẫu Hợp phần và điểm như mà điều này đang được thiết lập là:

Symfony/Component/Form/mở rộng/Core/Loại/FieldType.php - dòng 71

public function buildView(FormView $view, FormInterface $form) 
{ 
    $name = $form->getName(); 

    if ($view->hasParent()) { 
     $parentId = $view->getParent()->get('id'); 
     $parentFullName = $view->getParent()->get('full_name'); 
     $id = sprintf('%s_%s', $parentId, $name); 
     $fullName = sprintf('%s[%s]', $parentFullName, $name); 
    } else { 
     $id = $name; 
     $fullName = $name; 
    } 
    ... 

May mắn thay FormFactory sử dụng FormBuilder mà sau đó làm việc với lớp Form và tôi không có đủ thời gian để phân tích toàn bộ hoạt động bên trong của Component.

Tôi biết rằng các trường được thêm vào mảng 'trẻ em' trong FormBuilder với danh sách tùy chọn tương ứng. Khi hàm getForm được gọi, một Biểu mẫu mới được khởi tạo và mỗi Trường con được nhập vào Biểu mẫu bằng cách sử dụng phương thức add(). Form- này> add() phương pháp tự động cài đặt mẫu như phụ huynh của mỗi đứa trẻ:

public function add(FormInterface $child) 
{ 
    $this->children[$child->getName()] = $child; 

    $child->setParent($this); 

    if ($this->dataMapper) { 
     $this->dataMapper->mapDataToForm($this->getClientData(), $child); 
    } 

    return $this; 
} 

Nếu không có bắt đầu để ghi đè lên các lớp này chỉ để loại bỏ điều này không ai biết khác của phương pháp tốt nhất của chỉ hiển thị tên các lĩnh vực ?

Có thể chỉ cần kéo 'tên' thay vì 'full_name' trong khối form_div_layout.html.twig widget_attributes nhưng tôi không chắc liệu đây có phải là lý tưởng hay không (vì id vẫn không thay đổi) hoặc nếu có phương pháp khác hoặc các tùy chọn có thể tiêm được sẽ thực hiện thủ thuật.

Trả lời

24

Thay vì việc sử dụng chức năng createBuilder:

$builder = $app['form.factory']->createNamedBuilder(null, 'form', $data, array('validation_constraint' => $constraint)); 

tham số đầu tiên là tên form.

Ví dụ bởi Bernhard Schussek mình tại https://stackoverflow.com/a/13474522/520114

+0

Ahhh, bây giờ tại sao tôi không nhìn vào github, điều đó sẽ có ý nghĩa. Cảm ơn :) – thingygeoff

+0

@thingygeoff để bạn có thể chấp nhận câu trả lời này :) – j0k

+0

Ah ha! bạn đã cập nhật câu trả lời - một giải pháp lý tưởng! Cảm ơn – thingygeoff

7

Nếu bạn không sử dụng hình thức con bạn có thể đặt getName phương pháp hình thức của bạn là chuỗi rỗng:

class FormType extend AbstractType { 
    // ... 

    public function getName() { 
     return ''; 
    } 
} 
25

Trong Symfony3, ghi đè AbstractType :: getBlockPrefix trong lớp con để trả về null.

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