Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Yii2 wbraganca-dynamicform updation using yii2-relation-trait not deleting items

Based on the https://github.com/wbraganca/yii2-dynamicform/wiki/Dynamic-Forms-With-Yii2-relation-trait-(VERY-EASY), I am trying to implement dynamic forms.Create is working perfect, but in Update form, if I delete any dynamic form element, it is not getting deleted, but If I add in the Update action, it is getting saved. This is my Update code

public function actionUpdate($id)
{
    $modelAlumni = $this->findModel($id);
    $modelsJob = $modelAlumni->jobs;


    if ($modelAlumni->loadAll(Yii::$app->request->post()) && $modelAlumni->saveAll()) {
        return $this->redirect(['view', 'id' => $modelAlumni->id]);
    } else {
        return $this->render('update', [
            'modelAlumni' => $modelAlumni,
            'modelsJob' => (empty($modelsJob)) ? [new Job] : $modelsJob
        ]);
   }
}

Why is it not deleting?

This is my Alumni model

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "alumni".
 *
 * @property integer $id
 * @property string $name
 * @property integer $gender
 * @property integer $contact_number
 * @property string $year_graduated
 * @property string $qualification
 * @property integer $department_id
 * @property integer $specialization
 * @property string $email
 *
 * @property Job[] $jobs
 */
class Alumni extends \yii\db\ActiveRecord
{
     use \mootensai\relation\RelationTrait;
     public $organization;
     public $designation;
     public $location;
     public $current_status;
     public $joining_date;


    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'alumni';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name', 'gender',   'contact_number', 'year_graduated', 'qualification', 'department_id', 'specialization', 'email'], 'required'],
            [['name', 'organization', 'designation', 'location'], 'string'],
            [['gender',   'contact_number', 'department_id', 'specialization'], 'integer'],
            [['year_graduated'], 'safe'],
            [['qualification', 'email'], 'string', 'max' => 500],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'name' => Yii::t('app', 'Name'),
            'gender' => Yii::t('app', 'Gender'),

            'contact_number' => Yii::t('app', 'Contact Number'),
            'year_graduated' => Yii::t('app', 'Year Graduated'),
            'qualification' => Yii::t('app', 'Qualification'),
            'department_id' => Yii::t('app', 'Department ID'),
            'specialization' => Yii::t('app', 'Specialization'),
            'email' => Yii::t('app', 'Email'),

        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getJobs()
    {
        return $this->hasMany(Job::className(), ['alumni_id' => 'id']);
    }
}

Here is my Job Model

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "job".
 *
 * @property integer $job_id
 * @property string $organization
 * @property string $current_status
 * @property string $designation
 * @property string $joining_date
 * @property string $location
 * @property integer $alumni_id
 *
 * @property Alumni $alumni
 */
class Job extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'job';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['organization', 'current_status', 'designation', 'joining_date', 'location', 'alumni_id'], 'required'],
            [['organization'], 'string'],
            [['joining_date'], 'safe'],
            [['alumni_id'], 'integer'],
            [['current_status', 'designation'], 'string', 'max' => 300],
            [['location'], 'string', 'max' => 255],
            [['alumni_id'], 'exist', 'skipOnError' => true, 'targetClass' => Alumni::className(), 'targetAttribute' => ['alumni_id' => 'id']],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'job_id' => Yii::t('app', 'Job ID'),
            'organization' => Yii::t('app', 'Organization'),
            'current_status' => Yii::t('app', 'Current Status'),
            'designation' => Yii::t('app', 'Designation'),
            'joining_date' => Yii::t('app', 'Joining Date'),
            'location' => Yii::t('app', 'Location'),
            'alumni_id' => Yii::t('app', 'Alumni ID'),
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getAlumni()
    {
        return $this->hasOne(Alumni::className(), ['id' => 'alumni_id']);
    }
}
like image 671
user7282 Avatar asked Apr 24 '17 10:04

user7282


1 Answers

There is example, look at actionUpdate

https://github.com/wbraganca/yii2-dynamicform

first find All nested models ids that not in cuurrent POST request

        $oldIDs = ArrayHelper::map($modelsAddress, 'id', 'id');
        $modelsAddress = Model::createMultiple(Address::classname(), $modelsAddress);
        Model::loadMultiple($modelsAddress, Yii::$app->request->post());
        $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsAddress, 'id', 'id')));

then in transaction after save mainModel delete it:

if (! empty($deletedIDs)) 
{
   Address::deleteAll(['id' => $deletedIDs]);
}

This is example, you have to implement for your own solution.

I think there is bug in relation-triat: https://github.com/mootensai/yii2-relation-trait/issues/27

So above is the best solution

like image 178
zakrzu Avatar answered Nov 10 '22 00:11

zakrzu