Example #1
0
 /**
  * Сохранение сущности
  * @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);
         }
     }
 }