Вопрос формы Symfony (восстановление выбранного значения динамически заполненного виджета sfWidgetFormSelect) - PullRequest
0 голосов
/ 09 марта 2010

Я использую Symfony 1.3.2 с Propel ORM в Ubuntu 9.10.

Я разработал форму, которая динамически заполняет выбранный виджет городами в выбранной стране, используя AJAX.

Перед сохранением данных, введенных в форму, я проверяю форму. Если проверка не пройдена, форма представляется пользователю для исправления. Однако, поскольку список стран генерируется динамически, в форме, представленной для исправления, не выбран правильный город (он пуст, поскольку виджет страны еще не изменился).

Это неудобно для пользователя, потому что это означает, что он должен выбрать ДРУГУЮ страну (чтобы сработало событие изменения), а затем вернуться обратно к исходной стране, которую он выбрал, и, наконец, выбрать город, который он выбрал последним.

Все это навязывается пользователю, поскольку другое (возможно, не связанное) поле не прошло проверку.

Я пытался $ form-> getValue ('widget_name'), вызываемый сразу после $ form-> bind (), но, похоже, (на самом деле, IIRC, если форма не проходит проверку, все значения сбрасываются на ноль) - так что не работает.

В настоящее время я пытаюсь выполнить неприятный хак, который включает использование прямого доступа к входным (т.е. испорченным) данным через $ _POST и установку их во флэш-переменную - но я чувствую, что это очень неприятный хак)

То, что я пытаюсь сделать, - это сценарий общего использования - есть ли лучший способ сделать это, чем взламывать $ _POST и т. Д.?

1 Ответ

1 голос
/ 09 марта 2010

Что я делаю для решения этой конкретной проблемы, так это чтобы я отправлял форму тому же действию, которое ее сгенерировало, и в этом действии я выбираю любые выбранные страны / регионы / города в качестве переменных POST и передаю их обратно в шаблон (независимо от того, проверки). В шаблоне я затем использую JQuery, чтобы установить выбранные значения на то, чем они были. Когда проверка проходит, они привыкают. Когда нет, они возвращаются обратно в шаблон.

Если вы можете терпеть немного PHP в вашем JQuery, вы можете сделать это в шаблоне:

$(document).ready(function()
{
   $("#country-select").val('<?php echo $posted_country; ?>');
});

Если вы используете этот подход, не забудьте инициализировать $ this-> posts_country в своем шаблоне в первый раз, иначе Jquery будет сбит с толку.

Полагаю, вы также можете использовать $ this-> form-> setWidget (...) -> setDefault (...) или что-то подобное, но я не нашел способа использовать $ _POST, поскольку доступ к элементам кажется в противном случае необходимо связать форму.

ОБНОВЛЕНИЕ КОДА ОТВЕТА НА КОММЕНТАРИИ НИЖЕ:

if($_POST['profile']['country_id'] != '') 
{
    $this->posted_country = $_POST['profile']['country_id'];
    $q = Doctrine_Query::create()
        ->select('c.city_id, c.city_name')
        ->from('City c')
        ->where('c.country_id = ?', $this->posted_country);     
    $cities = $q->execute(array(), Doctrine_Core::HYDRATE_NONE);
    foreach($cities as $city) $list[$city[0]] = $city[1];
    $this->form->setWidget('city_id', new sfWidgetFormChoice(array('choices' => array('' => 'Please select') + $list)));
}

Итак ... Я получаю страну по почте, я запрашиваю db с этим, получаю города и создаю города обратно в выпадающий список. Затем в шаблоне вы можете установить выбранный по умолчанию город с чем-то вроде $ this-> posts_city (который также был бы переменной POST, если она существует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...