2012-08-31 38 views
13

Tôi đang cố gắng làm một biểu mẫu đơn giản để thêm hoạt động có tên và màu.symfony2 tùy chỉnh các tùy chọn chọn biểu mẫu

Vì vậy, tôi muốn tạo một danh sách với một số mảng màu, hiện tại nó đang hoạt động tôi có tên màu.
tôi có thể thêm bất kỳ thuộc tính vào thẻ chọn của tôi:

$form = $this->createFormBuilder($myclass) 
->add('Colors','choice',array('label'=>'select some colors', 
      'multiple'=>true, 
      'choices'=>array(1=>'red', 2=>'blue', 3=>'green'), 
      'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata') 
      )); 

Đầu ra sẽ là một cái gì đó như thế này:

<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata"> 
    <option value="1">red</option> 
    <option value="2">blue</option> 
    <option value="3">green</option> 
</select> 

Nhưng làm thế nào tôi có thể thêm selected="selected" và bất kỳ thuộc tính tôi muốn lựa chọn chọn của tôi? như thế này:

<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata"> 
    <option style="background-color: #F00;" value="1" selected="selected">red</option> 
    <option style="background-color: #00F;" value="2" selected="selected">blue</option> 
    <option style="background-color: #0F0;" value="3">green</option> 
</select> 

Câu hỏi của tôi là: làm thế nào tôi có thể thêm attr tùy chỉnh cho option thẻ (không phải cho select tag) symfony FormBuilder.
THÔNG BÁO: Tôi không muốn sử dụng JavaScript. Tôi muốn sử dụng symfony2 FormBuilder để tùy chỉnh các tùy chọn đã chọn của tôi.

Trả lời

10

Thông thường, dữ liệu mặc định của trường được xác định bởi giá trị được lưu trữ trong đối tượng của bạn. Ví dụ: nếu

class MyClass 
{ 
    private $Colors = array(1, 2); 
} 

thì các mục "1" và "2" (có nhãn "đỏ" và "xanh lục") sẽ được hiển thị theo mặc định. Bạn cũng có thể lưu trữ giá trị này trong đối tượng trước khi đi qua nó để có dạng:

$myObject->Colors = array(1, 2); 

$form = $this->createFormBuilder($myObject) 
    ... 

Khả năng cuối cùng là ghi đè giá trị mặc định được lưu trữ trong đối tượng bằng cách thông qua các "dữ liệu" tùy chọn:

$builder->add('Colors', 'choice', array(
    'label' => 'select some colors', 
    'multiple' => true, 
    'choices' => array(1 => 'red', 2 => 'blue', 3 => 'green'), 
    'attr' => array('style' => 'width:300px', 'customattr' => 'customdata'), 
    'data' => array(1, 2), 
)); 
1

Mỗi Field trong symfony kế thừa từ abstract field type, trong đó có tùy chọn data, trong đó bạn có thể chuyển tùy chọn mặc định.

Nhân tiện, đừng vượt qua style nội dung và đối với người quản lý tùy chỉnh, hãy sử dụng các thuộc tính data-*.

+0

làm thế nào tôi có thể sử dụng 'data-'thuộc tính? cách tôi chuyển nó cho FormBuilder. Xin giải thích thêm. –

+0

Chỉ cần đổi tên 'customattr' thành' data-customattr', để tuân thủ HTML. – moonwave99

+0

Tôi muốn sử dụng 'customattr' cho thẻ' option' của tôi, không phải cho thẻ 'select'. Làm thế nào tôi có thể làm điều này bằng FormBuilder? –

3

sử dụng tùy chọn dữ liệu như mô tả ở đây fo selected = "chọn": http://symfony.com/doc/current/reference/forms/types/field.html

trong trường hợp ur có thể là như thế này

$form = $this->createFormBuilder($myclass) 
->add('Colors','choice',array('label'=>'select some colors', 
      'multiple'=>true, 
      'choices'=>array(1=>'red', 2=>'blue', 3=>'green'), 
      'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata'), 
      'data'=> 1 
      )); 

nguyên tố mới là dữ liệu thiết lập số lượng các mảng lựa chọn như thuộc tính chọn

1

Thêm trong phương pháp lớp mẫu Symfony \ Component \ Mẫu \ AbstractType :: finishView

public function finishView(FormView $view, FormInterface $form, array $options) 
{ 
    parent::finishView($view, $form, $options); 

    $additionalAttributes = array(); 

    // myMethod - method $choice, returns a value that is to be substituted into the attribute 
    foreach ($view->children['orders']->vars['choices'] as $id => $choice) { 
     $additionalAttributes[$id] = array(
      'data-cost' => $this->propertyAccessor->getValue($choice->data, 'myMethod'), 
      'disabled' => 'disabled', 
     ); 
    } 

    foreach ($view->children['orders']->children as $id => $child) { 
     $child->vars['attr'] = array_replace(
      isset($child->vars['attr']) ? $child->vars['attr'] : array(), 
      $additionalAttributes[$id] 
     ); 
    } 
} 

Symfony2 Form – add attribute tag option in select field type

1

Để thêm của bạn thuộc tính tùy chỉnh trên lựa chọn, dựa trên giá trị của lựa chọn đó, hãy xem xét sử dụng tùy chọn choice_attr của trường ChoiceType.

Ví dụ, nếu bạn muốn vượt qua json thực thể được mã hóa để lựa chọn, bạn có thể sử dụng một cái gì đó như thế này:

'choice_attr' => function($val, $key) { 
    return ['data-object' => json_encode($val)]; 
}, 
Các vấn đề liên quan