Загрузите Symfony sfWidgetFormDoctrineChoice select с ограниченным набором результатов - PullRequest
0 голосов
/ 12 апреля 2011

Я разрабатываю форму в приложении Symfony, где пользователь должен указать страну, регион и необязательный остров с использованием элементов HTML select.

У меня есть три модели: Страна, Регион и Остров;и Symfony автоматически сгенерировал три виджета в форме, используя виджет sfWidgetFormDoctrineChoice:

...
'country_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Country'), 'add_empty' => false)),
'region_id'  => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Region'), 'add_empty' => false)),
'island_id'  => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Island'), 'add_empty' => true)),
...

Поскольку список стран большой, а значит и список регионов, я подумал о фильтрации доступных вариантовв Region и Island в соответствии со значением, выбранным в Country.

Сделать это после того, как HTML-документ готов, легко с помощью метода change jQuery и простого запроса AJAX.Но мне интересно, есть ли способ сделать это напрямую из Symfony, возможно, в конфигурации формы, чтобы иметь комбинированный выбор по умолчанию.

Есть предложения?

Спасибо!

1 Ответ

1 голос
/ 21 апреля 2011

После игры с sfDependentSelectPlugin я закончил тем, что назначил пользовательские запросы для инициализации элементов выбора HTML:

$countryId = $this->getObject()->getCountry()->getTable()->getDefaultCountryId();
$regionId = $this->getObject()->getRegion()->getTable()->getDefaultRegionId($countryId);
$islandId = $this->getObject()->getIsland()->getTable()->getDefaultIslandId($regionId);

$this->widgetSchema->setDefault('country_id', $countryId);

$this->setWidget('region_id', new sfWidgetFormDoctrineChoice(array(
    'model' => $this->getRelatedModelName('Region'),
    'query' => $this->getObject()->getRegion()->getTable()->getRegionsQuery($countryId),
    'default' => $regionId,
)));

$this->setWidget('island_id', new sfWidgetFormDoctrineChoice(array(
    'model' => $this->getRelatedModelName('Island'),
    'query' => $this->getObject()->getIsland()->getTable()->getIslandsQuery($regionId),
    'add_empty' => '---',
    'default' => $islandId,
)));

И затем обновление параметров, доступных для запросов AJAX, с помощью jQuery. Хорошо, что действия, которые обрабатывают запросы AJAX, используют те же методы запросов, что и выше, чтобы вернуть новый набор результатов.

...