问题描述
|
我对如何修改以下代码(生成一个表格以使ѭ0generates自动生成一组新字段并根据可用的日期填充价格)感到有些困惑。
我不确定这是否可能。尽管我在注释中添加了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;
}
解决方法
在
$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);