public function afterSaveTree($event)
{
if ($this->owner->_tree_ids === null) {
return $this;
}
//Старые атрибуты
$oldIds = (array) ArrayHelper::map($this->owner->elementTrees, $this->attributeTreeName, $this->attributeTreeName);
$newIds = (array) $this->owner->treeIds;
//Новые
//Если старых не было, просто записать новые
$writeIds = [];
$deleteIds = [];
if (!$oldIds) {
$writeIds = $newIds;
} else {
foreach ($oldIds as $oldId) {
//Старый элемент есть в новом массиве, его не трогаем он остается
if (in_array($oldId, $newIds)) {
} else {
$deleteIds[] = $oldId;
//Иначе его надо удалить.
}
}
foreach ($newIds as $newId) {
//Если новый элемент уже был, то ничего не делаем
if (in_array($newId, $oldIds)) {
} else {
$writeIds[] = $newId;
//Иначе запишем
}
}
}
//Есть элементы на удаление
if ($deleteIds) {
$elementTrees = $this->owner->getElementTrees()->andWhere([$this->attributeTreeName => $deleteIds])->limit(count($deleteIds))->all();
foreach ($elementTrees as $elementTree) {
$elementTree->delete();
}
}
//Есть элементы на запись
if ($writeIds) {
$className = $this->elementTreesClassName;
foreach ($writeIds as $treeId) {
if ($treeId) {
$elementTree = new $className([$this->attributeElementName => $this->owner->id, $this->attributeTreeName => $treeId]);
$elementTree->save(false);
}
}
}
$this->owner->_tree_ids = null;
}