Czy można wprowadzić pole wprowadzania daty z widżetem selektora tylko w Symfony 2 FormBuilder, czy też powinienem użyć prostego pola wprowadzania tekstu?Dane wejściowe z Symfony 2 tylko z rocznym wybierakiem
Odpowiedz
Można użyć 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 %}
Takie podejście daje mi błędy walidacji:
{{ date_pattern|replace({
'{{ year }}': form_widget(form.year),
'{{ month }}': '',
'{{ day }}': '',
})|raw }}
I finallay rozwiązać ten problem poprzez dodanie atrybutów CSS, aby ukryć pola:
{{ 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 }}
Chcę zrobić dokładnie to samo. Czy mógłbyś mi wyjaśnić, jak to zrobić ?, Mam ** błąd **: 'Twig_Error_Runtime: Variable" date_widget "nie istnieje" – Sam
Uratowałeś mój dzień! Dzięki. (Dlaczego to naprawia?) ps. Najlepszą odpowiedzią jest [tutaj] (http://stackoverflow.com/questions/10125517/how-to-display-a-month-year-dropdown-in-symfony2/22612012#22612012) – mario
Lepiej używać typu pola wyboru, niż hackować datę typ pola lub po prostu używając typu pola tekstowego.
Korzystając z kilku podstawowych funkcji daty/czasu w php, otrzymasz to, czego potrzebujesz.
W 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));
}
prostszy sposób uzyskać, na przykład, zakres pięcioletniej lat, z typem wyboru:
'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,
)
Note to tworzy Zwraca ciąg wybrany rok.
Można również użyć:
'choices' => range(Date('Y') - 4, date('Y'))
pisałem mój kod w ten sposób i wstawienie w bazie danych są prawidłowe
->add('yearfield', 'datetime', array(
'widget' => 'single_text',
'format' => 'yyyy'
))
można zastąpić 'date_pattern':
{{ form_row(form.fieldName, {'date_pattern': '<span style="display: none;">{{ day }}{{ month }}</span>{{ year }}'}) }}
UWAGA! Ukryj pola za pomocą display: none
, nie usuwaj ich, aby przejść walidację.
Sprawdź tę odpowiedź tutaj: How to display a month-year dropdown in Symfony2
Wystarczy użyć innego bloku date_widget (gałązka).
Dzięki za pomoc! – szilagyif
To jest trochę hack, który rozwiązuje problem, ale nie odpowiada na pytanie - jak to zrobić z FormBuilder? – Acyra