I did this feature on a car site :
http://www.groupe-lempereur.com
On the upper right, you can find 4 select fields, with the model
(modèle) field depending from the mark (marque) field through ajax.
*The code :*
In action.class.php :
public function executeSearch()
{
$user = $this-getUser();
$this-form = new searchForm();
$this-form-bind($this-getRequestParameter('search'));
}
public function executeAjaxModel($request)
{
$this-form = new searchForm();
$this-form-bind();
}
in searchSuccess.php :
form action=?=url_for('@search_result')? method=post
table cellpadding=0 cellspacing=0
trtd?=$form['mark_id']-renderLabel()
??=$form['mark_id']-render() ?/td/tr
trtd?=$form['model_id']-renderLabel()
??=$form['model_id']-render() ?/td/tr
trtd?=$form['price']-renderLabel()
??=$form['price']-render() ?/td/tr
trtd?=$form['fuel_id']-renderLabel()
??=$form['fuel_id']-render() ?/td/tr
? if($extended): ?
trtd?=$form['bodywork_id']-renderLabel()
??=$form['bodywork_id']-render() ?/td/tr
? else: ?
tr
tdinput type=submit class=button value=/td
/tr
? endif ?
/table
/form
script type=text/javascript
jQuery('#search_mark_id').change(function(e) {
jQuery.post
(
'?=url_for('@search_ajax_model') ?',
{mark_id: jQuery('#search_mark_id').val()},
function(html){jQuery('#search_model_id').replaceWith(html);},
'html'
);
});
/script
In ajaxModelSuccess.php :
?=$form['model_id']-render()?
In searchForm.class.php :
class searchForm extends BaseFormDoctrine
{
public function setup()
{
parent::setup();
$q = Doctrine::getTable('model')-queryAllUsed()-orderBy('m2.name
ASC, m.name ASC');
$request = sfContext::getInstance()-getRequest();
$mark_id = $request-getParameter('search[mark_id]'
,$request-getParameter('mark_id'));
if($mark_id) $q-addWhere('m.mark_id = ?', $mark_id);
$select_empty = '-- Indifférent --';
$select_prices = array(
'' = $select_empty,
'0:5000' = 'Moins de 5.000EUR',
'5000:1' = 'de 5.000EUR à 10.000EUR',
'1:15000' = 'de 10.000EUR à 15.000EUR',
'15000:2' = 'de 15.000EUR à 20.000EUR',
'2:+' = 'Plus de 20.000EUR',
);
$this-setWidgets(array(
'price'= new sfWidgetFormChoice(array('choices' =
$select_prices)),
'mark_id' = new sfWidgetFormDoctrineSelect(array('model' =
'mark', 'add_empty' = $select_empty, 'query' =
Doctrine::getTable('mark')-queryAllUsed())),
'bodywork_id' = new sfWidgetFormDoctrineSelect(array('model' =
'bodywork', 'add_empty' = $select_empty, 'order_by' =
array('name','asc'))),
'fuel_id' = new sfWidgetFormDoctrineSelect(array('model' =
'fuel', 'add_empty' = $select_empty, 'order_by' = array('name','asc'))),
'model_id' = new sfWidgetFormDoctrineChoice(array('model' =
'model', 'add_empty' = $select_empty, 'query' = $q)),
));
$this-setValidators(array(
'price' = new sfValidatorChoice(array('choices' =
array_keys($select_prices), 'required' = false)),
'mark_id' = new sfValidatorDoctrineChoice(array('model' =
'mark', 'required' = false)),
'bodywork_id' = new sfValidatorDoctrineChoice(array('model' =
'bodywork', 'required' = false)),
'fuel_id' = new sfValidatorDoctrineChoice(array('model' =
'fuel', 'required' = false)),
'model_id' = new sfValidatorDoctrineChoice(array('model' =
'model', 'required' = false)),
));
$this-widgetSchema-setLabel('price', 'Prix');
$this-widgetSchema-setLabel('mark_id', 'Marque');
$this-widgetSchema-setLabel('bodywork_id', 'Carrosserie');
$this-widgetSchema-setLabel('fuel_id', 'Carburation');
$this-widgetSchema-setLabel('model_id', 'Modèle');
$this-widgetSchema-setPositions(array('bodywork_id', 'mark_id',
'price', 'fuel_id', 'model_id'));
$this-widgetSchema-setNameFormat('search[%s]');
$this-errorSchema = new sfValidatorErrorSchema($this-validatorSchema);
}
public function getModelName()
{
return 'vehicle';
}
}
Note that theses lines are very bads :
$request = sfContext::getInstance()-getRequest();
$mark_id = $request-getParameter('search[mark_id]'
,$request-getParameter('mark_id'));
You should use form option feature instead with getOption() and
setOption() methods.
bretth wrote:
Hi all,
I need to make a form which has a number of select fields; changing
one field causes the second select field to reload with a number of
sub items based on what was selected in the first. Ie Selecting a
Category from the first select field updates the Subcategories select
field