/** * Сохранение сущности * @param Entity $entity * @throws Error */ function write($entity) { // Если объект свойство, то сохранять родительский объект?? if ($entity->is_property()) { if ($parent = $entity->parent(null, true)) { $parent->__set($entity->name(), $entity); Data::write($parent); } } else { // Текущие сведения об объекте $info = []; if ($entity->is_exists()) { // Текущие сведения об объекта $uri = $entity->is_changed('uri') ? $entity->changes('uri') : $entity->uri(); if ($uri === '') { $file = DIR . 'project.info'; } else { $file = DIR . trim($uri, '/') . '/' . File::fileName($uri) . '.info'; } if (is_file($file)) { $info = file_get_contents($file); $info = json_decode($info, true); } } // Подбор уникального имени // @todo Перенос php файлов влечет за собой фатальные ошибки!!!! так как меняется namespace и class name if ($entity->is_changed('uri') || !$entity->is_exists()) { // Проверка уникальности нового имени путём создания папки // Если подбор уникального имени, то создавать пока не создаться (попробовать постфикс) $path = dirname($entity->dir(true)) . '/'; $name = $entity->name(); if ($new_path = File::makeUniqueDir($path, $name, 1, $entity->is_auto_namig())) { $entity->name(basename($new_path)); $info['name'] = $entity->name(); } else { $entity->errors()->_attributes->name->add(new Error('Не уникальное', 'unique')); throw $entity->errors(); } // Перемещение старой папки в новую if ($entity->is_exists()) { File::rename($entity->dir(true, true), $entity->dir(true, false)); } if ($entity->is_changed('name') && $entity->is_exists()) { // @todo Переименовать .info, .php и, возможно, привязанный файл. } // Обновить URI подчиненных объектов не фиксируя изменения $entity->updateChildrenUri(); } // Новые сведения об объекте $info_new = $this->export($entity, isset($info['properties']) ? $info['properties'] : [], function (Entity $entity, $file) { return Data::save_file($entity, $file); }); // Порядковый номер // 1. Подбор максимального среди существующих // 2. Смещение порядка у последующих объектов // Сохранить объект с свлйствами JSON $uri = $entity->uri(); if ($uri === '') { $file = DIR . 'project.info'; } else { $file = DIR . trim($uri, '/') . '/' . File::fileName($uri) . '.info'; } File::create(F::toJSON($info_new, true), $file); } // Сохранить подчиненные foreach ($entity->children() as $child) { /** @var Entity $child */ if (!$child->is_property()) { Data::write($child); } } }