Symfony формирует вопрос (восстановление выбранного значения динамически заполняемого виджета sfWidgetFormSelect)

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

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

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

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

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

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

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

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


person Stick it to THE MAN    schedule 09.03.2010    source источник


Ответы (1)


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

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

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

Если вы используете этот подход, не забудьте инициализировать $ this-> posted_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-> posted_city (который также будет переменной POST, если существует).

person Tom    schedule 09.03.2010
comment
Спасибо, Том, ты на правильном пути (я проголосовал за твой вопрос). Однако то, что я делаю, немного сложнее. Это города, которые «заблудились». Выбранная ранее страна все еще там. Я хочу следующее поведение: когда форма не проходит проверку, остается ранее выбранная страна (это уже работает), но также я хочу, чтобы список городов для этой страны оставался доступным И последний выбранный город был выбрано. Другими словами, если ошибка возникла откуда-то еще в форме, пользователю не нужно снова прикасаться к полям страны / города. - person Stick it to THE MAN; 09.03.2010
comment
... (если они не хотят). Я считаю, что могу использовать для этого jQuery. Мне просто нужно подумать еще немного, так как я не думаю в jQuery. - person Stick it to THE MAN; 09.03.2010
comment
Вы всегда можете опубликовать здесь небольшой фрагмент jQuery, чтобы я начал;) - и как только я успешно имитирую поведение с использованием / построением вашего фрагмента, я приму ваш ответ как последний. - person Stick it to THE MAN; 09.03.2010
comment
Хорошо, в основном я проверяю, была ли опубликована страна. Если да, я повторно создаю список стран для этого виджета ... а затем вы можете использовать jquery, чтобы снова установить выбранный город по умолчанию, например, со страной. Я добавил код выше. - person Tom; 09.03.2010
comment
Привет, Том, я не редактировал исходный вопрос позже, потому что, объясняя, что мне нужно сделать, я понял, что у меня есть логика реализации !. Одно но, метод val: $ (# country-select) .val ('‹? Php echo $ posted_country;?›'); похоже не работает. Я буду проверять документацию jQuery, чтобы узнать, почему - person Stick it to THE MAN; 09.03.2010
comment
Хм ... должно сработать. Я бы предложил проверить, что # country-select ссылается на правильный идентификатор элемента в вашем коде, а также проверить, что правильное значение передается обратно в шаблон и соответствует значению select =, на которое он указывает. - person Tom; 09.03.2010