2012-07-02 25 views
5

Tôi có một không gian cứng ( ) bên trong một số tùy chọn lựa chọn của mình. Bằng cách nào đó, một nơi nào đó, họ đang được trốn thoát. Tôi đã thử:Symfony2 Formbuilder tự động thoát?

{% autoescape false %} 
    {{ form_widget(foobar) }} 
{% endautoescape %}  

Cũng như

{{ form_widget(foobar)|raw }} 

Và sau đây theo cành trong config.yml

autoescape: false 

Tuy nhiên, các lĩnh vực lựa chọn vẫn đang render như  Choice Text Here thay vì Choice Text Here, và trong nguồn họ đang được mã hóa là  Choice Text Here

Trong bộ điều khiển tôi có:

$form ->add('foo', 'choice', array(
      'label' => 'Foo Label', 
      'choices' => $fooChoices, 
      'required' => true)); 
$form = $form->getForm(); 
$foobar = $form->createView(); 

Nếu tôi print_r$fooChoices tôi nhận được:

Array ([1] => 60# FooBar [5] => 60# BatBar [11] => 60# DooWop) 

nào cho thấy tôi thích hợp   (lưu ý không gian đôi ở phía trước của thập niên 60). Một nơi nào đó giữa FormBuilder và rendering, nó đang được thoát.

Có tích hợp thoát trong Trình tạo biểu mẫu không?

Điều tôi đã suy ra là thông qua quan điểm xem biểu mẫu được hiển thị qua $form->createView() dữ liệu vẫn chưa được thoát. Nhưng, vào thời điểm nó đạt đến Twig thông qua form_widget, nó đã được thoát. Làm form_widget(foobar)|raw hiển thị điều này.

Chỉnh sửa: Tôi đã thêm giải pháp thay thế làm câu trả lời nhưng tôi vẫn muốn chấp nhận câu trả lời giải thích cách ngăn chặn việc thoát hoàn toàn ban đầu xảy ra hoàn toàn.

+0

Tôi có thể xem mã của tiện ích biểu mẫu của bạn không? Không có tính năng như vậy. – Lusitanian

+0

@David Tôi không chắc chắn tôi theo dõi. Tôi đang sử dụng cách đơn giản nhất để hiển thị biểu mẫu theo tài liệu: http://symfony.com/doc/current/book/forms.html#rendering-the-form – Nick

+0

Ý tôi là trong lớp mà bạn tạo ra hình thức, xin lỗi vì sự mơ hồ. – Lusitanian

Trả lời

8

Tôi đã gặp sự cố tương tự với nhãn radio. Điều này giải quyết nó.

{% for child in form %} 

    {% autoescape false %} 
    {{ child.vars.label }} 
    {% endautoescape %} 

    {{ form_widget(child) }} 

{% endfor %} 
1

Có lẽ không phải là giải pháp tốt nhất, nhưng những gì về làm điều đó trong constructor mẫu của bạn (Chúng tôi buộc   là một char không gian):

public function __construct() { 

    foreach ($this->fooChoices as $key => $fooChoice) { 

     $this->fooChoices[$key] = html_entity_decode($fooChoice, ENT_NOQUOTES, 'UTF-8'); 
    } 
} 
+0

Và nếu bạn cần giải mã dấu ngoặc kép (ví dụ: '), bạn có thể sử dụng 'htmlspecialchars_decode ($ string, ENT_QUOTES)' – geoB

3

Tôi đã kết thúc việc tạo một phần mở rộng cành mà giải mã được mã hóa HTML và thêm nó như là một dịch vụ:

Phần mở rộng trong Vendor/Bundle/Extensions/cành

namespace Vendor\Bundle\Extensions\Twig; 

class HTMLDecodeTwigExtension extends \Twig_Extension 
{ 

    public function getFilters() 
    { 
     return array(
      'htmldecode' => new \Twig_Filter_Method($this, 'htmldecode', array(
       'is_safe' => array('html')) 
      ), 
     ); 
    } 

    // your custom function 
    public function htmldecode($string) 
    { 
     return html_entity_decode($string); 
    } 

    // Name for Service 
    public function getName() 
    { 
     return 'html_decode_twig_extension'; 
    } 
} 

Đăng ký dịch vụ tại nhà cung cấp/Bundle/Resources/config/services.yml

vendor_bundle.htmldecode: 
    class: Vendor\Bundle\Extensions\Twig\HTMLDecodeTwigExtension 
    tags: 
     - { name: twig.extension } 

Việc sử dụng:

{{ form_widget(foobar)|htmldecode }} 

tôi vẫn không biết nơi thoát đang được thực hiện , vì nó chỉ được thực hiện trên chính dữ liệu (và tôi đã thử tạo một sự kiện dữ liệu để sửa đổi dữ liệu của biểu mẫu), nhưng điều này ít nhất cũng cho tôi kết quả cuối cùng mà tôi đang tìm kiếm.

+0

Tôi đã thử mã này và đăng ký phần mở rộng, nhưng không giải quyết được vấn đề khi chỉ áp dụng cho ' form_label'. Bạn phải áp dụng nó vào 'form_widget' – Dean

3

gì bạn thực sự cần phải làm là quá cưỡi các form_label mẫu

{% block form_label %} 
{% spaceless %} 
    {% if label is not sameas(false) %} 
     {% if not compound %} 
      {% set label_attr = label_attr|merge({'for': id}) %} 
     {% endif %} 
     {% if required %} 
      {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %} 
     {% endif %} 
     {% if label is empty %} 
      {% set label = name|humanize %} 
     {% endif %} 
     {% autoescape false %}<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}</label>{% endautoescape %} 
    {% endif %} 
{% endspaceless %} 
{% endblock form_label %} 

Lưu ý việc bổ sung các phần autoescape.

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