我在_form.php中有一个表单小部件
echo $form['catcher_id']->renderLabel(); //the label
echo $form['catcher_id']->renderError(); //the validator
symfony创建了基类:
<?php
/**
* LpmService form base class.
*/
abstract class BaseLpmServiceForm extends BaseFormPropel
{
public function setup()
{
$this->setWidgets(array(
'id' => new sfWidgetFormInputHidden(),
'name' => new sfWidgetFormInputText(),
'wap_home' => new sfWidgetFormInputText(),
'call_center_number' => new sfWidgetFormInputText(),
[color=#FF4000] 'catcher_id' => new sfWidgetFormPropelChoice(array('model' => 'LpmCatcher', 'add_empty' => false)),[/color]
'price_description' => new sfWidgetFormInputText(),
'logo' => new sfWidgetFormInputText(),
'invalid_msisdn_text' => new sfWidgetFormInputText(),
'terms_and_conditions' => new sfWidgetFormInputText(),
'service_code' => new sfWidgetFormInputText(),
));
$this->setValidators(array(
'id' => new sfValidatorChoice(array('choices' => array($this->getObject()->getId()), 'empty_value' => $this->getObject()->getId(), 'required' => false)),
'name' => new sfValidatorString(array('max_length' => 64, 'required' => false)),
'wap_home' => new sfValidatorString(array('max_length' => 256, 'required' => false)),
'call_center_number' => new sfValidatorString(array('max_length' => 13, 'required' => false)),
'catcher_id' => new sfValidatorPropelChoice(array('model' => 'LpmCatcher', 'column' => 'id')),
'price_description' => new sfValidatorString(array('max_length' => 128, 'required' => false)),
'logo' => new sfValidatorString(array('max_length' => 255, 'required' => false)),
'invalid_msisdn_text' => new sfValidatorString(array('max_length' => 255, 'required' => false)),
'terms_and_conditions' => new sfValidatorString(array('max_length' => 750, 'required' => false)),
'service_code' => new sfValidatorString(array('max_length' => 3, 'required' => false)),
));
$this->widgetSchema->setNameFormat('lpm_service[%s]');
$this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
parent::setup();
}
public function getModelName()
{
return 'LpmService';
}
}
我手动重新创建了下拉列表,因此我可以合并一个“onchange”事件:
<select name="services" onchange="refreshPage(this.form.services)" id="droplist">
<?php
$catcher_names = LpmCatcherPeer::getByAllNames();
foreach($catcher_names as $row)
{
?>
<option value="<?php echo $row->getName()."/".$row->getId(); ?>" <?php
if($row->getName() == $catcher_name) echo 'selected="selected"'?>><?php echo $row->getName();?></option>
<?php
}
?>
</select>
如何为echo $form['catcher_id']
分配值,因为现在当我从下拉列表中选择一个值并单击提交时,验证器说需要catcher_id(因为我手动创建了下拉列表),所以如何设置值手动???
$form['catcher_id']->getWidget()->setAttribute('value', '11');
但它不起作用。
答案 0 :(得分:1)
我相信这应该适用于你的模板:
<?php $form->setDefault('catcher_id', 123) ?>
......或在你的行动中:
$this->form->setDefault('catcher_id', 123);
答案 1 :(得分:1)
我会使用select的ID并在Javascript中绑定事件,而不是重新编码select:
function init()
{
var el_to_bind = document.getElementById( 'lpm_service_catcher_id' );
el_to_bind.onchange = my_onchange_handler;
}
function my_onchange_handler( el )
{
// do your stuff here
}
或者,使用jQuery,
$('#lpm_service_catcher_id').change( function() {
// do your stuff here
});
答案 2 :(得分:1)
您需要使手动创建的选择名称与symfony生成的名称相匹配。
假设lpm_service是表单的getName()
调用返回的值,并且您使用的是默认名称格式,则select的名称必须为lpm_service[catcher_id]
。
答案 3 :(得分:0)
问题是您正在为验证器分配不同的值。您正在使用:
<select>
<option value='name/id' ...>
</select>
验证器仅搜索id
$this->setValidators(array(
...
'catcher_id' => new sfValidatorPropelChoice(
array('model' => 'LpmCatcher', 'column' => 'id')),
...
));
这就是为什么验证器失败并且它没有为您设置默认值。
所以我真正要做的是使用默认渲染,使用
设置值$this->form->setDefault('catcher_id', 123);
喜欢 Tom 表示并附上像 yitznewton 这样的onchangehandler。
答案 4 :(得分:0)
您不必手动执行此操作。您可以在窗口小部件上设置所需的任何属性。您应该在LpmServiceForm
$this->getWidget('catcher_id')->setAttribute('onchange', 'refreshPage(this.form.services)');
并像往常一样渲染表格。