Php 如何在FormType上循环通过Symfony2中的值

Php 如何在FormType上循环通过Symfony2中的值,php,symfony,Php,Symfony,我有一段代码: ->add('breedingPairSeason', 'choice', array( 'placeholder' => 'Choose a season', 'choices' => array( 'early2010' => 'Early 2010 (Jan - June)', 'late2010' => 'Late 2010 (July - December)', ), )); 我

我有一段代码:

->add('breedingPairSeason', 'choice', array(
    'placeholder' => 'Choose a season',
    'choices' => array(
        'early2010'   => 'Early 2010 (Jan - June)',
        'late2010' => 'Late 2010 (July - December)',
    ),
));
我想实现的是根据年份自动添加更多选择。因此,理想情况下,我希望它在2010年开始,然后在今年结束,如下所示:

->add('breedingPairSeason', 'choice', array(
    'placeholder' => 'Choose a season',
    'choices' => array(
        'early2010'   => 'Early 2010 (Jan - June)',
        'late2010' => 'Late 2010 (July - December)',
        'early2011'   => 'Early 2011 (Jan - June)',
        'late2011' => 'Late 2011 (July - December)',
        'early2012'   => 'Early 2012 (Jan - June)',
        'late2012' => 'Late 2012 (July - December)',
        'early2013'   => 'Early 2013 (Jan - June)',
        'late2013' => 'Late 2013 (July - December)',
        'early2014'   => 'Early 2014 (Jan - June)',
        'late2014' => 'Late 2014 (July - December)',
        'early2015'   => 'Early 2015 (Jan - June)',
        'late2015' => 'Late 2015 (July - December)',
    ),
));
# namespace SomeBundle\Form\Type
/**
 * Generate a choice array from start year to end year
 *
 * @param int $startYear The start year
 * @param int $endYear If null, current year is taken
 * @return array
 */
protected function generateChoices($startYear, $endYear=null)
{
    $endYear = $endYear ? $endYear : date('Y');
    $years   = range($startYear, $endYear);
    $choices = array();

    foreach($years as $year) {
        $choices['early' . $year] = sprintf('Early %d (Jan - June)', $year);
        $choices['late'  . $year] = sprintf('Late %d (July - December)', $year);
    }

    return $choices;
}

这可能吗?

您可以为枚举创建简单文件,或者在表单中使用私有方法来实现这一点。我将向您展示一个快速的示例,但总的来说,如果您找到更好/更干净的方法,则生成阵列取决于您

假设您在表单类型中创建了一个私有方法:

private function _getSeasonChoices() {
    $intervalStart = 2010;
    $intervalEnd = (new \DateTime('now'))->format('Y');

    $choices = array();
    for($year = $intervalStart; $year <= $intervalEnd; $year++) {

        $choices[ sprintf('early%d', $year) ] = sprintf('Early %d (January - June)', $year);
        $choices[ sprintf('late%d', $year) ] = sprintf('Late %d (July - December)', $year);

    }

    return $choices;
}
并且您的select输入应该填入正确的值


同样,如果您对这个解决方案不满意,那么生成阵列完全取决于您。希望你有这个想法。

我会这样做:

->add('breedingPairSeason', 'choice', array(
    'placeholder' => 'Choose a season',
    'choices' => array(
        'early2010'   => 'Early 2010 (Jan - June)',
        'late2010' => 'Late 2010 (July - December)',
        'early2011'   => 'Early 2011 (Jan - June)',
        'late2011' => 'Late 2011 (July - December)',
        'early2012'   => 'Early 2012 (Jan - June)',
        'late2012' => 'Late 2012 (July - December)',
        'early2013'   => 'Early 2013 (Jan - June)',
        'late2013' => 'Late 2013 (July - December)',
        'early2014'   => 'Early 2014 (Jan - June)',
        'late2014' => 'Late 2014 (July - December)',
        'early2015'   => 'Early 2015 (Jan - June)',
        'late2015' => 'Late 2015 (July - December)',
    ),
));
# namespace SomeBundle\Form\Type
/**
 * Generate a choice array from start year to end year
 *
 * @param int $startYear The start year
 * @param int $endYear If null, current year is taken
 * @return array
 */
protected function generateChoices($startYear, $endYear=null)
{
    $endYear = $endYear ? $endYear : date('Y');
    $years   = range($startYear, $endYear);
    $choices = array();

    foreach($years as $year) {
        $choices['early' . $year] = sprintf('Early %d (Jan - June)', $year);
        $choices['late'  . $year] = sprintf('Late %d (July - December)', $year);
    }

    return $choices;
}
关于建筑商:

//...
->add('breedingPairSeason', 'choice', array(
    'placeholder' => 'Choose a season',
    'choices' => $this->generateChoices(2010)
));

这个问题对我来说不清楚。@felipsmartins我不知道如何把它说清楚。嗯,所以我希望您看到的值在每年的时间里自动添加。从2010年开始,一直到今年,就像你在第二段代码中看到的那样。有可能在Symfony的FormType中运行一个循环来自动更新它吗?是的!这是可能的。看我下面的回答。哦,我记得你: