/** * Функция создания бэкапа из текущей версии записи, с возможностью удаления превысивших лимит резервных копий * * @param int $dicval_id * @param bool $delete_over_backups * @return bool */ private function create_backup($dicval_id = 0, $delete_over_backups = true) { /** * Находим запись словаря для создания ее бэкапа * Запись должна быть оригиналом, т.е. иметь version_of = NULL */ $element = DicVal::where('id', $dicval_id)->with('dic', 'metas', 'allfields', 'seos', 'versions')->first(); if (!isset($element) || !is_object($element) || $element->version_of != NULL) { return false; } #Helper::tad($element); $dic = $element->dic; $versions = Config::get('dic/' . $dic->slug . '.versions'); $element_versions = $element->versions; /** * Создадим резервную копию записи */ $version_array = $element->toArray(); unset($version_array['versions'], $version_array['id'], $version_array['created_at'], $version_array['updated_at']); $version_array['version_of'] = $element->id; $new_version = DicVal::create($version_array); #Helper::d($version_array); #Helper::tad($new_version); /** * Создадим резервные копии всех доп. полей текущей записи, * привязав их к только что созданной резервной копии записи */ $element_allfields = $element->allfields; #Helper::tad($element_allfields); if (count($element_allfields)) { foreach ($element_allfields as $a => $allfield) { $allfield = $allfield->toArray(); #Helper::dd($allfield); unset($allfield['id'], $allfield['created_at'], $allfield['updated_at']); $allfield['dicval_id'] = $new_version->id; $temp = DicFieldVal::firstOrCreate($allfield); } } /** * Создадим резервные копии всех META данных текущей записи */ $element_metas = $element->metas; #Helper::tad($element_metas); if (count($element_metas)) { foreach ($element_metas as $e => $element_meta) { if (isset($element_meta) && is_object($element_meta) && $element_meta->id) { #Helper::ta($element_meta); $meta_backup = $element_meta->toArray(); unset($meta_backup['id'], $meta_backup['created_at'], $meta_backup['updated_at']); $meta_backup['dicval_id'] = $new_version->id; $temp = DicValMeta::firstOrCreate($meta_backup); } } } /** * Создадим резервные копии SEO данных текущей записи */ $element_seos = $element->seos; #Helper::tad($element_seos); if (count($element_seos)) { foreach ($element_seos as $e => $element_seo) { #$seo_data = Seo::where('module', 'DicVal')->where('unit_id', $element->id)->where('language', $locale_sign)->first(); if (isset($element_seo) && is_object($element_seo) && $element_seo->id) { $seo_backup = $element_seo->toArray(); unset($seo_backup['id'], $seo_backup['created_at'], $seo_backup['updated_at']); $seo_backup['unit_id'] = $new_version->id; #Helper::ta($seo_backup); if (class_exists('Seo')) { $temp = Seo::firstOrCreate($seo_backup); } } } } /** * Если кол-во существующих версий > заданного в конфиге лимита - удалим все старые версии, оставив (LIMIT-1) самых свежих * В данный момент count($element_versions) уже реально на 1 больше, т.к. мы только что создали свежую резервную копию! */ #Helper::dd((int)$delete_over_backups); if (count($element_versions) >= $versions && $delete_over_backups) { $this->delete_backups($element->id); } return true; }