Обновление Yii2 wbraganca-dynamicform с использованием черты yii2-relation-trait без удаления элементов

На основе https://github.com/wbraganca/yii2-dynamicform/wiki/Dynamic-Forms-With-Yii2-relation-trait-(VERY-EASY), я пытаюсь реализовать динамические формы. Create работает отлично, но в форме обновления, если я удаляю какой-либо элемент динамической формы, он не удаляется, но если я добавляю действие «Обновить», он сохраняется. Это мой код обновления

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
        ]);
   }
}

Почему не удаляет?

Это моя модель выпускников

<?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']);
    }
}

Вот моя модель работы

<?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']);
    }
}

person user7282    schedule 24.04.2017    source источник
comment
Вам нужно сделать это самостоятельно. Если loadAll и saveAll выполнены, удалите модели, которые необходимо удалить. Посмотрите на wbraganca.com/yii2extensions/dynamicform-demo1/source-code в actionUpdate() (ищите deletedID). Там вы видите удаление, которое вы должны реализовать для своего собственного решения. Рассмотрите возможность использования транзакций.   -  person robsch    schedule 24.04.2017
comment
github.com/ wbraganca/yii2-dynamicform/wiki/ использует другой подход. Он использует github.com/mootensai/yii2-relation-trait , что, по их словам, Полегче   -  person user7282    schedule 24.04.2017
comment
Ты прав. Но я не использовал эти библиотеки, поэтому я не могу вам помочь. Вы можете отлаживать RelationTrait.php.   -  person robsch    schedule 25.04.2017


Ответы (1)


Есть пример, посмотрите actionUpdate

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

сначала найдите идентификаторы всех вложенных моделей, которых нет в текущем запросе POST

        $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')));

затем в транзакции после сохранения mainModel удалите ее:

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

Это пример, который вы должны реализовать для своего собственного решения.

Я думаю, что в отношении-триате есть ошибка: https://github.com/mootensai/yii2-relation-trait/issues/27

Итак, выше лучшее решение

person zakrzu    schedule 28.04.2017
comment
Я попробовал ваше предложение. но динамический элемент не сохраняет данные об ошибках проверки - person user7282; 02.05.2017