2017-04-24 65 views
6

基於https://github.com/wbraganca/yii2-dynamicform/wiki/Dynamic-Forms-With-Yii2-relation-trait-(VERY-EASY),我試圖實現動態forms.Create工作完美,但在Update窗體中,如果我刪除任何動態窗體元素,它是沒有被刪除,但如果我在更新操作中添加,它將被保存。 這是我更新的代碼Yii2 wbraganca-dynamicform更新使用yii2-relation-trait不刪除項目

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

你需要做的這個你自己。如果loadAll和saveAll完成,則刪除需要刪除的模型。查看https://wbraganca.com/yii2extensions/dynamicform-demo1/source-code into actionUpdate()(搜索* deletedIDs *)。你會看到你必須爲自己的解決方案實施的刪除操作。考慮使用事務。 – robsch

+0

https://github.com/wbraganca/yii2-dynamicform/wiki/Dynamic-Forms-With-Yii2-relation-trait-(VERY-EASY)使用另一種方法。它使用https://github.com/mootensai/yii2-relation-trait,他們認爲它更簡單 – user7282

+0

你是對的。但我沒有使用這些庫,所以我不能幫你。你可以調試RelationTrait.php。 – robsch

回答

1

有例子,看看actionUpdate

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

先找到所有嵌套模型IDS不在電流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]); 
} 

這是例子,你必須實施自己的解決方案。

我認爲這是錯誤的關係,triat: https://github.com/mootensai/yii2-relation-trait/issues/27

所以上面是最好的解決辦法

+0

我試過你的建議。但動態元素不會保留有關驗證錯誤的數據 – user7282