我对如何修改生成表单的以下代码感到有点困惑,允许$Show->DateTimes()
自动生成一组新字段并根据可用日期填充价格。
我不确定这是否可行。虽然我在评论中添加了foreach,解释了我认为它应该如何工作,但我想我只是把我的PHP混淆了。
我现在有这个代码:
编辑:最终修正代码:
public function RegistrationForm() {
$date_id = (int) $this->getRequest()->requestVar('DateID');
if(!$date = DataObject::get_by_id("ShowDateTime", $date_id)) {
return $this->httpError(404);
}
$date_map = array();
if($Show = $date->Show()) {
if($all_dates = $Show->DateTimes()) {
$date_map = $all_dates->toDropdownMap('Price','DateLabel');
}
}
$fields = new Fieldset (
new TextField('Event', _t('Show.Event','Name of Event'),$Show->Title),
new EmailField('Name', _t('Show.Name','Name')),
new EmailField('Email', _t('Show.Email','Email')),
new TextField('Address', _t('Show.Address','Address')),
new TextField('Telephone', _t('Show.Telephone','Telephone')),
new DropdownField('DateID', _t('Show.CHOOSEDATE','Choose a show'), $date_map, $date_id)
);
// Loop through the time/events creating a fieldset for: class,horse,number,price
$i =0;
foreach($all_dates as $show_price){
$fields->push(new TextField('Class_'.$i, 'Class'));
$fields->push(new TextField('Horse_'.$i, 'Horse'));
$fields->push(new TextField('Number_'.$i, 'Number'));
$fields->push(new CurrencyField('Price_'.$i, 'Price',$show_price->Price));
$i++;
}
$form = new Form (
$this,
"RegistrationForm",
$fields,
new FieldSet (
new FormAction('doRegister', _t('Show.REGISTER','Register'))
),
new RequiredFields('Event','Name','DateID')
);
return $form;
}
答案 0 :(得分:2)
在$form = new Form (
内,您无法放置循环表达式。您只能在其中放置简单的表达式,例如$variable
或new
。但是没有什么需要更高级别的执行。
首先,将对象列表生成为自己(或一个数组)的变量,然后将其添加到$form
。
Form构造函数需要获取包含字段的FieldSet对象。您可以创建一个新的并向其添加字段,然后将此对象传递给构造函数。考虑以下替代方法:
$controller = $this;
$name = 'RegistrationForm';
$fields = new FieldSet();
// add fields to $fields, setup $actions ...
$form = new Form($controller, $name, $fields, $actions);