Domanda

Sono un po 'confuso su come posso modificare il seguente codice che genera un modulo per consentire il $Show->DateTimes() Per generare automaticamente una serie di nuovi campi e popolare il prezzo a seconda di quante date sono disponibili.

Non sono sicuro che questo sia nemmeno possibile. Anche se ho aggiunto il foreach all'interno dei commenti che spiegano come penso che dovrebbe funzionare, penso di avere solo il mio PHP.

Al momento ho questo codice:

Modifica: codice fisso finale:

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;
}
È stato utile?

Soluzione

Dentro il $form = new Form ( Non puoi posizionare un'espressione del loop. Puoi solo mettere semplici espressioni lì dentro, come un $variable o new. Ma nulla che abbia bisogno di un livello di esecuzione più elevato.

Quindi prima genera un elenco degli oggetti in variabili del proprio (o un array) e poi aggiungilo a $form.

Il costruttore di forme prevede di ottenere un oggetto campi da campo contenente i campi. Puoi crearne uno nuovo e aggiungere i campi ad esso e quindi passare questo oggetto nel costruttore. Considera il seguente approccio alternativo:

   $controller = $this;
   $name = 'RegistrationForm';
   $fields = new FieldSet();
   // add fields to $fields, setup $actions ...
   $form = new Form($controller, $name, $fields, $actions);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top