2012-04-12 72 views
11

在我的應用程序中,用戶hsa僅通過在兩個下拉列表中選擇月份和年份來給出日期。我怎樣才能做到這一點?如何在Symfony2中顯示月份下拉列表

這是我到目前爲止已經試過:

在我的表格:

$builder->add('date1', 'date', array(
'widget'  => 'choice', 
'empty_value' => '', 
'format'  => 'MMMM-yyyy', 
'input'  => 'datetime', 
'years'  => range(date('Y'), date('Y') - 30, -1) 
) 

它的實際工作,準確地顯示它,因爲我想,但驗證表單的時候,我得到一個錯誤:

This value is not valid 

想要的結果的截圖:

Screenshot

+0

目前,沒有簡單的解決您的問題。順便說一句,我有幾天前相同的問題,但我的分鐘數..我已經提交[公關](https://github.com/symfony/symfony/pull/3846)(尚未合併),如果你想,你可以添加你的功能:) – egeloen 2012-04-15 21:54:50

+0

嗨,三年後,有一個簡單的解決方案,像'$ builder-> add('mydate','date',array('format'=>'ONLY YEAR ')'? – mario 2015-08-09 16:02:22

回答

8

很簡單,日期時間需要一天!

你需要輸出的日子,這樣的事情:

 ->add(
      'ccExpirationDate', 
      'date', 
      array(
       'format'   => 'MMM-yyyy', 
       'years'   => range(date('Y'), date('Y')+12), 
       'days'   => array(1), 
       'empty_value'  => array('year' => '----', 'month' => '----', 'day' => false) 
      ) 
     ) 

嫩枝:

{{ 
    form_widget(
     form.payment.ccExpirationDate.day, 
     { 
      'attr': { 'style': 'display:none' } } 
     ) 
}} 
+0

這確實是我做的,但在Javascript中。 – 2012-05-01 15:52:50

+0

但是仍然sf2需要知道'day',所以你只能做一個選項,並且不使用empty_value,就像我上面的例子 – 2012-05-02 06:31:41

+8

這個不再像Symfony 2.1那樣工作,因爲檢查格式是否存在Y,M和D符號。請參閱https://github.com/symfony/symfony/issues/8345 – Cowlby 2013-11-03 22:22:34

9

的信用卡到期日例如:

$builder->add('expirationDate', 'date', array(
'label' => 'Expiration date', 
'widget' => 'choice', 
'empty_value' => array('year' => 'Year', 'month' => 'Month', 'day' => 'Day'), 
'format' => 'dd-MM-yyyy', 
'input' => 'string', 
'data' => date('Y-m-d'), 
'years' => range(date('Y'), date('Y') + 10), 
)); 

然後,你必須使這個領域手動。

表單的樹枝模板:

{{ form_row(form.expirationDate, {'date_pattern': '<span style="display: none;">{{ day }}</span> {{ month }} <span class="delim">&#47;</span> {{ year }}'}) }} 

重寫date_pattern將隱藏一天選擇。您將獲得月/年格式。

4

@奧列格非常接近正確的答案。您必須使用視圖變換器來確保DateTime獲得一天。

/* In your formType.php */ 

$builder->add(
    $builder->create('date1', 'date', array(
     'format'  => 'MMMM-yyyyd', // you need to have 'y', 'M' and 'd' here 
     'years'  => range(date('Y'), date('Y') - 30, -1) 
    )) 
    ->addViewTransformer(new IncompleteDateTransformer())); 
) 

創建一個變壓器:

class IncompleteDateTransformer implements DataTransformerInterface 
{ 
/** 
* Do nothing when transforming from norm -> view 
*/ 
public function transform($object) 
{ 
    return $object; 
} 

/** 
* If some components of the date is missing we'll add those. 
* This reverse transform will work when month and/or day is missing 
* 
*/ 
public function reverseTransform($date) 
{ 
    if (!is_array($date)) { 
     return $date; 
    } 

    if (empty($date['year'])) { 
     return $date; 
    } 

    if (empty($date['day'])) { 
     $date['day']=1; 
    } 

    if (empty($date['month'])) { 
     $date['month']=1; 
    } 

    return $date; 
} 
} 

創建在您使用自定義窗體主題從文件本身樹枝模板:

{# example.html.twig #} 
{% form_theme form _self %} 

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

<h2>Select a date</h2> 
{{ form(form) }} 

參考文獻:

+1

+1我必須定義date_widget塊在另一個模板中,否則它聲稱「widget」變量不存在。 – FoxException 2014-09-24 13:48:46

4

我工作的一個自定義的帳票類別,這將允許解決這樣的問題。該解決方案基於@ oleg-andreyev提出的。邏輯包裝爲表單類型。

用法:

<?php 
$builder->add('exp_date', 'payum_credit_card_expiration_date'); 

形式類型代碼:

<?php 
namespace Payum\Bundle\PayumBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class CreditCardExpirationDateType extends AbstractType 
{ 
    public function finishView(FormView $view, FormInterface $form, array $options) 
    { 
     if ('choice' == $options['widget']) { 
      if (empty($view['day']->vars['value'])) { 
       $view['day']->vars['value'] = $view['day']->vars['choices'][0]->value; 
      } 

      $style = 'display:none'; 
      if (false == empty($view['day']->vars['attr']['style'])) { 
       $style = $view['day']->vars['attr']['style'].'; '.$style; 
      } 

      $view['day']->vars['attr']['style'] = $style; 
     } 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->replaceDefaults(array(
      'years' => range(date('Y'), date('Y') + 9) 
     )); 
    } 

    public function getParent() 
    { 
     return 'date'; 
    } 

    public function getName() 
    { 
     return 'payum_credit_card_expiration_date'; 
    } 
} 

您可以複製\粘貼或註冊payum束和使用這種類型的(將可那裏下一個主要版本) 。

0

我沒有使用下拉菜單,但bootstrap-datetimepickersingle_text。對於我來說,在數據庫的不同字段中保存月份和年份會很困難,因爲我在這個日期前訂購。所以我決定總是保存選定月份的第一天。我使用的是DatetimepickerBundle,我的自定義表單類型看起來像這樣:

class MonthPickerType extends AbstractType 
{ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'pickerOptions' => array(
       'autoclose' => true, 
       'format' => 'mm/yyyy', 
       'startView' => 'year', 
       'minView' => 'year', 
      ) 
     )); 
    } 

    public function getParent() 
    { 
     return 'collot_datetime'; 
    } 

    public function getName() 
    { 
     return 'month_picker'; 
    } 
} 

而結果:

enter image description here

相關問題