Я знаю, что этот вопрос помечен как ответивший, но я наткнулся на ту же проблему и хотел решить ее более общим способом, вот что у меня есть.
Подкласс sfFormLanguage с вашей собственной реализацией и просто переопределите configure ():
class myFormLanguage extends sfFormLanguage {
public function configure()
{
$this->setValidators(array(
'language' => new sfValidatorI18nChoiceLanguage(array('languages' => $this->options['languages'])),
));
$this->setWidgets(array(
'language' => new myWidgetFormI18nChoiceLanguage(array('languages' => $this->options['languages'])),
));
}
}
Как видите, для фактического выбора используется другой виджет, реализация которого показана ниже.
class myWidgetFormI18nChoiceLanguage extends sfWidgetFormChoice
protected function configure($options = array(), $attributes = array())
{
parent::configure($options, $attributes);
$this->addOption('languages');
$this->addOption('add_empty', false);
// get the desired language codes
$languageCodes = isset($options['languages']) ? $options['languages'] : null;
if ($languageCodes == null) {
$languageCodes = array_keys(sfCultureInfo::getInstance()->getLanguages());
}
$languages = array();
// for each language code add the language to the choices by querying a corresponding culture info instance
foreach ($languageCodes as $lc) {
$languages = array_merge($languages, sfCultureInfo::getInstance($lc)->getLanguages(array($lc)));
}
$addEmpty = isset($options['add_empty']) ? $options['add_empty'] : false;
if (false !== $addEmpty)
{
$languages = array_merge(array('' => true === $addEmpty ? '' : $addEmpty), $languages);
}
$this->setOption('choices', $languages);
}
}
Оба фрагмента вдохновлены оригинальными классами Symfony, но я думаю, что они решают проблему намного лучше. Обратите внимание, что никакой культурный вариант не требуется (или не разрешен), так как каждый язык должен быть представлен изначально.