Pregunta

Estoy un poco confundido acerca de cómo puedo enmendar el siguiente código que genera un formulario para permitir el $Show->DateTimes() Para generar automáticamente un conjunto de nuevos campos y llenar el precio dependiendo de cuántas fechas estén disponibles.

No estoy seguro de si esto es posible. Aunque he agregado el foreach dentro de los comentarios que explican cómo creo que debería funcionar, creo que solo tengo mi PHP mezclado.

Tengo este código en este momento:

Editar: código fijo final:

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;
}
¿Fue útil?

Solución

Dentro de $form = new Form ( No puede colocar una expresión de bucle. Solo puedes poner expresiones simples allí, como un $variable o new. Pero nada que necesite un mayor nivel de ejecución.

Así que primero genere una lista de los objetos en variables propias (o una matriz) y luego agréguela a $form.

El constructor de formulario espera obtener un objeto FieldSet que contenga los campos. Puede crear uno nuevo y agregarle los campos y luego pasar este objeto al constructor. Considere lo siguiente, enfoque alternativo:

   $controller = $this;
   $name = 'RegistrationForm';
   $fields = new FieldSet();
   // add fields to $fields, setup $actions ...
   $form = new Form($controller, $name, $fields, $actions);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top