2011-11-07 42 views

Trả lời

0

Bạn có thể sử dụng form customization:

{% block date_widget %} 
{% spaceless %} 
    {% if widget == 'single_text' %} 
     {{ block('field_widget') }} 
    {% else %} 
     <div {{ block('widget_container_attributes') }}> 
      {{ date_pattern|replace({ 
       '{{ year }}': form_widget(form.year), 
       '{{ month }}': '', 
       '{{ day }}': '', 
      })|raw }} 
     </div> 
    {% endif %} 
{% endspaceless %} 
{% endblock date_widget %} 
+0

Cảm ơn sự giúp đỡ của bạn! – szilagyif

+4

Đây là một chút của một hack mà giải quyết vấn đề nhưng không trả lời câu hỏi - làm thế nào để bạn làm điều này với FormBuilder? – Acyra

1

Cách tiếp cận này đã đem lại cho tôi lỗi với xác nhận:

{{ date_pattern|replace({ 
    '{{ year }}': form_widget(form.year), 
    '{{ month }}': '', 
    '{{ day }}': '', 
})|raw }} 

tôi finallay giải quyết vấn đề bằng cách thêm thuộc tính CSS để ẩn các lĩnh vực:

{{ date_pattern|replace({ 
    '{{ year }}': form_widget(form.year), 
    '{{ month }}': form_widget(form.month, { 'attr' : { 'style': 'display:none' }}), 
    '{{ day }}': form_widget(form.day, { 'attr' : { 'style': 'display:none' }}), 
})|raw }} 
+0

Tôi muốn làm chính xác điều tương tự. Bạn có thể vui lòng giải thích cho tôi cách bạn làm không ?, Tôi có lỗi ** này **: 'Twig_Error_Runtime: Biến" date_widget "không tồn tại ' – Sam

+1

Bạn đã lưu ngày của tôi! Cảm ơn. (Tại sao nó sửa chữa nó?) ps. Câu trả lời hay nhất là [ở đây] (http://stackoverflow.com/questions/10125517/how-to-display-a-month-year-dropdown-in-symfony2/22612012#22612012) – mario

3

Tốt hơn nên sử dụng loại trường lựa chọn, thay vì hack ngày loại trường hoặc chỉ sử dụng loại trường văn bản.

Sử dụng vài hàm ngày/giờ php cơ bản, bạn sẽ nhận được những gì bạn cần.

Trong FormType:

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
      ->add('yearfield', 'choice', 
        array(
         'required' => true, 'choices' => $this->buildYearChoices() 
        )); 
} 

public function buildYearChoices() { 
    $distance = 5; 
    $yearsBefore = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y") - $distance)); 
    $yearsAfter = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y") + $distance)); 
    return array_combine(range($yearsBefore, $yearsAfter), range($yearsBefore, $yearsAfter)); 
} 
0

Một phương pháp đơn giản để có được, ví dụ, một loạt năm năm năm, với một kiểu lựa chọn:

'choices' => array(
     Date('Y') => Date('Y'), 
     Date('Y') - 1 => Date('Y') - 1, 
     Date('Y') - 2 => Date('Y') - 2, 
     Date('Y') - 3 => Date('Y') - 3, 
     Date('Y') - 4 => Date('Y') - 4, 
    ) 

Lưu ý rằng là tạo ra lợi nhuận một chuỗi các năm được chọn.

15

Bạn cũng có thể sử dụng:

'choices' => range(Date('Y') - 4, date('Y')) 
-2

Tôi đã viết mã của tôi theo cách này và chèn vào cơ sở dữ liệu là đúng

->add('yearfield', 'datetime', array(
    'widget' => 'single_text', 
    'format' => 'yyyy' 
)) 
1

Bạn có thể ghi đè 'date_pattern':

{{ form_row(form.fieldName, {'date_pattern': '<span style="display: none;">{{ day }}{{ month }}</span>{{ year }}'}) }} 

LƯU Ý! Ẩn các trường có display: none, Không loại bỏ chúng để vượt qua xác thực.

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