function work(Request $request) { $out = $request['REQUEST']['handler']->start($request); if ($redirect = $request->getCommands('redirect')) { header("HTTP/1.1 303 See Other"); header('Location: ' . $redirect[0][0]); } else { if ($out != false) { if (is_array($out)) { header('Content-Type: application/json'); echo F::toJSON($out, false); } else { echo $out; } } else { header('Location: ' . Request::url()); //текущий адрес без аргументов } } }
/** * Сохранение сущности * @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); } } }
/** * Преобразование условия поиска из массива или строки в url формат * @param string|array $cond Исходное условие поиска * @return string Преобразованное в URL условие */ static function condToUrl($cond) { $cond = self::normalizeCond($cond, [], true); if (is_array($cond['from'])) { $info = parse_url(reset($cond['from'])); $base_url = ''; if (isset($info['scheme'])) { $base_url .= $info['scheme'] . '://'; } if (isset($info['host'])) { $base_url .= $info['host']; } if ($base_url_length = mb_strlen($base_url)) { foreach ($cond['from'] as $i => $from) { if (mb_substr($from, 0, $base_url_length) == $base_url) { $cond['from'][$i] = mb_substr($from, $base_url_length); } } } } //if (sizeof($cond['select']) == 1) $cond['select'] = $cond['select'][0]; if ($cond['select'] == 'self') { unset($cond['select'], $cond['depth']); } unset($cond['correct']); foreach ($cond as $key => $c) { if (empty($c)) { unset($cond[$key]); } } $url = F::toJSON($cond, false); $url = mb_substr($url, 1, mb_strlen($url) - 2, 'UTF-8'); $url = strtr($url, ['[' => '(', ']' => ')', ',""]' => ',)', '"="' => '"eq"', '"!="' => '"ne"', '">"' => '"gt"', '">="' => '"gte"', '"<"' => '"lt"', '"<="' => '"lte"']); $url = preg_replace_callback('/"([^"]*)"/ui', function ($m) { $replacements = array("\\", "/", "\"", "\n", "\r", "\t", "", "\f"); $escapers = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b"); return urlencode(str_replace($escapers, $replacements, $m[1])); }, $url); $url = preg_replace('/,([a-z_]+):/ui', '&$1=', $url); $url = preg_replace('/\\(([a-z_]+),/ui', '$1(', $url); $url = preg_replace('/\\),/ui', ')$1', $url); $url = mb_substr($url, 5, mb_strlen($url) - 5); if (isset($base_url)) { $url = $base_url . '?from=' . $url; } else { $info = explode('&', $url, 2); if (!empty($info)) { $url = urldecode($info[0]) . '?' . $info[1]; } } return $url; }