2011-09-26 25 views
11

Tôi cố gắng để thực hiện một cái gì đó như thế này:HTML trong Symfony2 hình thức nhãn thay vì văn bản đơn giản

<div> 
    <input type="checkbox" name="checkbox" id="checkbox_id" /> 
    <label for="checkbox_id">I agree to the <a href="/tos">Terms of Service</a></label> 
</div> 

Gần nhất tôi đã đến để thực hiện điều này là thông qua:

<div> 
    {{ form_widget(form.agreeWithTos) }} 
    <label for="{{ form.agreeWithTos.vars.id }}">I agree to the <a href="#">Terms of Service</a></label> 
</div> 

Có cách tốt hơn? Phải chỉ định {{form.agreeWithTos.vars.id}} là không phù hợp. :)

+1

Vấn đề của bạn chính xác là gì? –

Trả lời

1

Tôi nghĩ bạn đang tìm kiếm form theming. Bằng cách đó bạn có thể tạo kiểu cho từng phần của biểu mẫu, trong một tệp độc lập, dù sao bạn muốn và sau đó chỉ hiển thị nó theo cách "thanh lịch", từng hàng một với {{ form_row(form) }} hoặc đơn giản với {{ form_widget(form) }}. Nó thực sự tùy thuộc vào bạn cách bạn thiết lập nó.

9

Giải Quyết vấn đề này bằng cách sử dụng đoạn mã sau vào form-chủ đề của tôi:

{# ---- form-theme.html.twig #} 
{% block checkbox_row %} 
{% spaceless %} 
<div> 
    {{ form_errors(form) }} 

    <label class="checkbox" for="{{ form.vars.id }}"> 
     {{ form_widget(form) }} 
     {{ label|default(form_label(form)) | raw }} 
    </label> 
</div> 
{% endspaceless %} 
{% endblock %} 

trong Mẫu-Template của bạn thì bạn có thể sử dụng:

{% form_theme form '::form-theme.html.twig' %} 

{{form_row(form.termsOfServiceAccepted, { 
     'label' : 'I have read and agree to the <a href="#">Terms and conditions</a>' 
    }) 
}} 

cách này, các khối từ form- chủ đề sẽ áp dụng cho bất kỳ hộp kiểm nào trên trang. Nếu bạn cũng cần phải sử dụng mặc định-chủ đề, bạn có thể thêm một tham số để cho phép đặc biệt-rendering:

{# ---- form-theme.html.twig #} 
{% block checkbox_row %} 
{% spaceless %} 
    {% if not useTosStyle %} 
     {{ parent() }} 
    {% else %} 
     {# ... special rendering ... #} 
    {% endif %} 
{% endspaceless %} 
{% endblock %} 

mà sẽ được sử dụng như thế này:

{% form_theme form '::form-theme.html.twig' %} 

{{form_row(form.termsOfServiceAccepted, { 
     'useTosStyle' : true, 
     'label' : 'I have read and agree to the <a href="#">Terms and conditions</a>' 
    }) 
}} 
0

Vì vậy, tạo theming là khá phức tạp. Điều đơn giản nhất tôi tìm thấy là chỉ cần chặn nhãn của trường ('label'=> false trong lớp biểu mẫu Symfony) và sau đó chỉ cần thêm nhãn html vào html twig.

0

Tôi đã đánh bại đầu của tôi về điều này sau đó đã có một thời điểm eureka. Cách dễ nhất để thực hiện điều này - BY FAR – là tạo một phần mở rộng Twig.

Đây là mã cành của tôi:

{# twig example #} 
{% block form_label %} 
    {% set label = parent() %} 
    {{ label|unescape|raw }} 
{% endblock %} 

và PHP:

<?php 
new Twig_SimpleFilter('unescape', function($value) { 
    return html_entity_decode($value); 
}); 

Một vài lưu ý:

  • này unescapes tất cả trước đó đã trốn thoát mã. Bạn chắc chắn nên thoát ra sau đó khi cần thiết.
  • Điều này yêu cầu thẻ extends cho chủ đề biểu mẫu mục tiêu của bạn trong chủ đề biểu mẫu tùy chỉnh của riêng bạn mà bạn có thể sử dụng trong các biểu mẫu tiếp theo của mình. Đặt mã twig trong một chủ đề biểu mẫu tùy chỉnh và thay thế các tham chiếu đến chủ đề/chủ đề biểu mẫu khác bằng chủ đề này.

Đây là dòng mã nhỏ nhất cho kết quả lớn nhất và tốt nhất mà tôi có thể tìm thấy. Nó cũng cực kỳ di động và DRY: Bạn có thể mở rộng bất kỳ chủ đề biểu mẫu nào và nhãn sẽ thay đổi mà không thay đổi phần còn lại của mã của bạn.

0

Bạn có thể tận dụng việc tạo biểu mẫu theo cách khác: bạn có thể di chuyển thẻ <label>bên ngoài chức năng form_label().

Tạo một chủ đề hình thức tùy chỉnh, và cho các hộp kiểm chỉ di chuyển thẻ <label> ngoài form_label chức năng:

{% block checkbox_row %} 
    <label>{{ form_label(form) }}</label> 
    {{ form_errors(form) }} 
    {{ form_widget(form) }} 
{% endblock checkbox_row %} 

{% block checkbox_label %} 
    {{ label }} 
{% endblock checkbox_label %} 

Bây giờ, trong teplate của bạn, ghi đè lên label của hộp kiểm của bạn, và do đó có hiệu quả tiêm HTML vào chức năng nhãn:

{% form_theme form 'yourtheme.html.twig' _self %} 

{% block _your_TOS_checkbox_label %} 
    I agree with <a href="#" target="_blank">terms and conditions</a> 
{% endblock _your_TOS_checkbox_label %} 
Các vấn đề liên quan