2

I have a table called persons with id and name fields.

I have a create.php view that loads the model called Persons and now I want to add a checkbox called hasCar to show if a person has a car (so it is a boolean condition).

Then I have the send button that send the $model array of the form to the controller so I need to add the hasCar variable to $model array.

But the checkbox is not a column of the persons table so I got some errors because it is not part of the model.

I added the checkbox in this way but it is not working, of course.

<?= $form->field($model, 'hasCar')->checkbox(); ?>

Is it possible to send the hasCar variable inside the $model array? I mean, how can I send the hasCar variable to the controller when the send button is pressed?

1

2 Answers 2

2

Create a new model extending Person that contains hasCar member, and load the model from PersonForm class, such as:

class PersonForm extends Person
{
    public $hasCar;

    public function rules()
    {
        return array_merge(parent::rules(), [
            [['hasCar'], 'safe'],
        ]);
    }   

    public function attributeLabels()
    {
        return array_merge(parent::attributeLabels(), [
            'hasCar' => 'Has car',
        ]);
    }      
}
Sign up to request clarification or add additional context in comments.

Comments

1

You can't pass the variable to the $model object orbit is affiliated with a db table, you are right about this. You need to pass the variable to the controller via a request method (GET, POST).

Try :

Yii::$app->request->post()

for POST, and :

Yii::$app->request->get()

for GET.

Also on the form add the checkbox as an HTML class component.

EXAMPLE:

CONTROLLER:

...
$hasCar = Yii::$app->request->post('hasCar');
....

VIEW:

...
// We use ActiveFormJS here
$this->registerJs(
    $('#my-form').on('beforeSubmit', function (e) {
        if (typeof $('#hasCar-checkbox').prop('value') !== 'undefined') {
            return false; // false to cancel submit
        }
    return true; // true to continue submit
});
$this::POS_READY,
'form-before-submit-handler'
);
...
<?= HTML::checkbox('hasCar', false, ['id' => 'hasCar-checkbox', 'class' => 'form-control']) ?>
...

More on ActiveFormJS: enter link description here

I hope this answer covered you.

Damian

2 Comments

The hasCar variable should be required. How can I validate it? I can do it in the model file but I would like to not use the model.
You cannot use the backend validation. Yii2 has a known bug regarding this issue and it is not yet solved. You can use frontend validation. At least that is how i do it. You first attach a handler to the activeform submit event. I will update my answer with an example.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.