Symfony formları soru (dinamik olarak doldurulan sfWidgetFormSelect widget seçilen bir değeri geri)

1 Cevap php

Ben Ubuntu 9.10 Tahrik ORM ile Symfony 1.3.2 kullanıyorum.

Ben dinamik AJAX kullanarak, seçilen bir ülkede şehirler ile bir seçme Widget dolduran bir form geliştirdik.

Forma girilen veriler kaydedilir önce, formu doğrulamak. Doğrulama başarısız olursa, formu düzeltme için kullanıcıya geri sunulmaktadır. Ülke listesi dinamik olarak oluşturulur Ancak, düzeltme için sunulmaktadır formu (ülke Widget henüz değişmedi çünkü, boş) seçilen geçerli bir şehir yoktur.

Onlar başka bir ülkenin (yani değişim olayı tetiklenir) seçmek zorunda, ve daha sonra nihayet son seçilen vardı şehir seçin, onlar seçilmiş orijinal ülkeye geri dönmek anlamına gelir çünkü bu, kullanıcı için sakıncalıdır.

Başka (muhtemelen ilgisiz) alan vaildate yoktu çünkü tüm bu kullanıcı zorlanır.

Ben $ form-> hemen $ form-> bind () sonra çağrılan, ancak (form doğrulamak için başarısız olursa, IIRC, tüm değerler null sıfırlanır infact) görünüyor getValue ('widget_name'), - denedim bunu yapar çalışmadı.

) Ama ben onun çok kötü bir hack hissediyorum - Şu anda doğrudan $ _POST üzerinden (yani kusurlu) veri girişi ulasarak ve flash değişken içine onları ayar kullanımını içeren bir kötü kesmek çalışıyorum

Ne yapmaya çalışıyorum ortak kullanım senaryodur - bunu yapmak için daha iyi bir yolu $ _POST vb etrafında hack daha var mı?

1 Cevap

Ne tam olarak bu sorun için yaparım bunu oluşturulan aynı eylem formu göndermek ve olmasıdır eylem, ben POST değişkenler olarak seçilen herhangi bir ülke / bölge / şehirler kapmak ve (bağımsız doğrulama) geri şablona onları geçmek . Şablonda, o zaman onlar ne seçme değerlerini ayarlamak için JQuery kullanabilirsiniz. Doğrulamasından geçer, onlar kullanılmış olsun. , Geri şablona geçti alamadım zaman.

Eğer JQuery biraz PHP tahammül varsa, şablonda bu yapabilirdi:

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

Bu yaklaşımı kullanırsanız, ilk kez etrafında veya jQuery karıştı alacak şablonunuzda $ this-> posted_country başlatmak unutmayın.

Ben de form-> setWidget $ this-> (...) kullanabilirsiniz sanırım -> setDefault (...) ya da benzer bir şey, ama ben unsurları erişen olarak $ _POST kullanarak etrafında bir yolunu bulamadım bağlanma ihtiyacı var gibi görünüyor aksi halde oluşturur.

UPDATED CODE IN RESPONSE TO COMMENTS BELOW:

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)));
}

Yani ... Ben şehirleri olsun, bununla db sorgulamak, yazı ülkeyi almak ve zanaat şehirleri geri açılır içine. Sonra şablonunda, $ this-> posted_city gibi bir şey (eğer varsa, çok bir POST değişken olurdu) ile varsayılan seçilen şehir ayarlayabilirsiniz.