This forum has moved to a new location and is in read-only mode. Please visit talk.octobercms.com to access the new location.

Mathilde Escher Stiftung
Mathilde Escher Stiftung

Hello! I would like to set certain fields in controller update method with data coming from a jsonable field.

This is what I got, but unfortunately it doesn't work:

public function update($recordId = null, $context = null)
    {   
        $model = RegistrationFormModel::where('id', '=', $recordId)->first();

        if (isset($model->data_fields)) {
            // set title and repeater of selected fields
            foreach($model->data_fields as $field) {
                if (isset($model['_data_fields_' . $field]['data_fields_' . $field . '_title'])) {
                    $this['_data_fields_' . $field]['data_fields_' . $field . '_title'] = $model['_data_fields_' . $field]['data_fields_' . $field . '_title'];
                }
            }
        }
        return $this;
    }

Is this even possible how I am doing it?

daftspunky
daftspunky

Hi there,

Try the formBeforeSave method

public function formBeforeSave($model)
{
    if (isset($model->data_fields)) {
        // set title and repeater of selected fields
        foreach($model->data_fields as $field) {
            if (isset($model['_data_fields_' . $field]['data_fields_' . $field . '_title'])) {
                $this['_data_fields_' . $field]['data_fields_' . $field . '_title'] = $model['_data_fields_' . $field]['data_fields_' . $field . '_title'];
            }
        }
    }
}
Mathilde Escher Stiftung
Mathilde Escher Stiftung

Hello there,

Sorry for my bad description. I wanted to fill my fields with data coming from a jsonable object on update. Anyway, I achieved it :)

Here's my setup in case it helps somebody.

This is my fields.yaml:

fields:
    title:
        label: Titel
        span: full
        type: text
    info:
        label: Informationen
        size: large
        span: full
        type: richeditor
    _data_fields:
        label: Kursdaten-Felder
        type: partial
        path: $/creationhandicap/registrationform/models/registrationform/_data_fields.htm
    _data_fields_checkbox:
        label: Checkboxen
        cssClass: data_fields_checkbox
        type: nestedform
        form:
            fields:
                data_fields_checkbox_title:
                    label: Checkboxen Titel
                data_fields_checkbox_required:
                    label: Checkboxen Pflichtfeld
                    type: checkbox
                data_fields_checkbox_repeater:
                    label: Checkboxen
                    type: repeater
                    form:
                        fields:
                            label:
                                label: Label
                                type: text
    _data_fields_radioButton:
        label: Radio Buttons
        cssClass: data_fields_radioButton
        type: nestedform
        form:
            fields:
                data_fields_radioButton_title:
                    label: Radio Buttons Titel
                data_fields_radioButton_required:
                    label: Radio Buttons Pflichtfeld
                    type: checkbox
                data_fields_radioButton_repeater:
                    label: Radio Buttons
                    type: repeater
                    form:
                        fields:
                            label:
                                label: Label
                                type: text

This is what I do beforeSave in my model:

public function beforeSave()
    {
        // get all data
        $post = post();
        // check if data fields are set
        if (isset($post['RegistrationForm']['_data_fields']) && $post['RegistrationForm']['_data_fields'] !== '0') {
            $dataFieldsArray = [];
            // set selected field checkboxes
            $dataFieldsArray['data_fields_selected'] = $post['RegistrationForm']['_data_fields'];
            // set title and repeater of selected fields
            foreach($post['RegistrationForm']['_data_fields'] as $field) {
                if (isset($post['RegistrationForm']['_data_fields_' . $field]['data_fields_' . $field . '_title'])) {
                    $dataFieldsArray['data_fields_fields'][$field]['title'] = $post['RegistrationForm']['_data_fields_' . $field]['data_fields_' . $field . '_title'];
                }
                if (isset($post['RegistrationForm']['_data_fields_' . $field]['data_fields_' . $field . '_required'])) {
                    $dataFieldsArray['data_fields_fields'][$field]['required'] = $post['RegistrationForm']['_data_fields_' . $field]['data_fields_' . $field . '_required'];
                }
                if (isset($post['RegistrationForm']['_data_fields_' . $field]['data_fields_' . $field . '_repeater'])) {
                    $dataFieldsArray['data_fields_fields'][$field]['repeater'] = $post['RegistrationForm']['_data_fields_' . $field]['data_fields_' . $field . '_repeater'];
                }
            }
            $this->data_fields = $dataFieldsArray;
        }
    }

And here I put my data back on update in my controller:

public function formExtendFields($formWidget, $fields)
    {
        if (isset($formWidget->model->data_fields["data_fields_fields"])) {
            foreach($formWidget->model->data_fields["data_fields_fields"] as $key => $field) {

                $fieldTitle = "";
                if (isset($field["title"])) {
                    $fieldTitle = $field["title"];
                }
                $fieldRequired = "";
                if (isset($field["required"])) {
                    $fieldRequired = $field["required"];
                }
                $fieldRepeater = "";
                if (isset($field["repeater"])) {
                    $fieldRepeater = $field["repeater"];
                }

                if (isset($fieldTitle) || isset($fieldRequired) || isset($fieldRepeater)) {
                    $fields["_data_fields_" . $key]->value = [
                        'data_fields_' . $key . '_title' => $fieldTitle,
                        'data_fields_' . $key . '_required' => $fieldRequired,
                        'data_fields_' . $key . '_repeater' => $fieldRepeater
                    ];
                }
            }
        }
        return $fields;
    }

I really don't know if that could be done prettier. Inputs are very welcome. But it works :)

1-3 of 3

You cannot edit posts or make replies: the forum has moved to talk.octobercms.com.