PHP Foreach在内部创建一个新对象

问题描述

| 我对如何修改以下代码生成一个表格以使ѭ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);