0
votes

I am trying to implement the 2amigos SelectizeDropDownList widget in a form to add new values to a table directly within the dropdown.

I am using the model Book and the Model Author so basically want to be able to add a new author in the book form.

This is the book controller at the update function:

public function actionUpdate($id) {
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['index']);
    } else {
        return $this->render('update', [
                    'model' => $model,
                    'categories' => BookCategory::find()->active()->all(),
                    'publishers' => Publisher::find()->all(),
                    'copirights' => Copiright::find()->all(),
                    'authors' => Author::find()->all(),
        ]);
    }
}

This is the form:

        <?=
        $form->field($model, 'author_id')->widget(SelectizeDropDownList::className(), [
            // calls an action that returns a JSON object with matched
            // tags
            'loadUrl' => ['author/list'],
            'value' => $authors,
            'items' => \yii\helpers\ArrayHelper::map(\common\models\author::find()->orderBy('name')->asArray()->all(), 'id', 'name'),
            'options' => [
                'class' => 'form-control',
                'id' => 'id'
            ],
            'clientOptions' => [
                'valueField' => 'id',
                'labelField' => 'name',
                'searchField' => ['name'],
                'autosearch' => ['on'],
                'create' => true,
                'maxItems' => 1,
            ],
        ])
        ?>    

And this is the function author controller:

public function actionList($query) {
    $models = Author::findAllByName($query);
    $items = [];

    foreach ($models as $model) {
        $items[] = ['id' => $model->id, 'name' => $model->name];
    }

    Yii::$app->response->format = \Yii::$app->response->format = 'json';

    return $items;
}

The form works fine to load, filter, search and add new items.

But it is not inserting the new typed attribute in the author table.

Do I need to add something in the book controller?

How can I check if it is a new value or a change of an existing author?

Thanks a lot

1

1 Answers

0
votes

I made it work with the following code, not sure the most elegant because i am checking the if the author_id is a number or a string. In my case the author won't be a number anyway.

public function actionUpdate($id) {
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post())) {
        $x = Yii::$app->request->post('Book');
        $new_author = $x['author_id'];
        if (!is_numeric($new_author)) {
            $author = new Author();
            $author->name = $new_author;
            $author->save();
            $model->author_id = $author->id;
        }
        if ($model->save()) {
            return $this->redirect(['index']);
        }
    } else {
        return $this->render('update', [
                    'model' => $model,
                    'categories' => BookCategory::find()->active()->all(),
                    'publishers' => Publisher::find()->all(),
                    'copirights' => Copiright::find()->all(),
                    'authors' => Author::find()->all(),
        ]);
    }
}