1

$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;
}
4

1 に答える 1

2

の中に$form = new Form (ループ式を配置することはできません。$variableaやなどの単純な式のみをそこに入れることができますnew。しかし、より高いレベルの実行を必要とするものは何もありません。

したがって、最初にオブジェクトのリストを独自の変数 (または 1 つの配列) に生成し、次にそれを に追加し$formます。

Form コンストラクターは、フィールドを含む FieldSet オブジェクトを取得することを想定しています。新しいオブジェクトを作成してフィールドを追加し、このオブジェクトをコンストラクターに渡すことができます。次の代替アプローチを検討してください。

   $controller = $this;
   $name = 'RegistrationForm';
   $fields = new FieldSet();
   // add fields to $fields, setup $actions ...
   $form = new Form($controller, $name, $fields, $actions);
于 2011-06-14T16:04:19.963 に答える