Ejemplo n.º 1
0
 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());
             //текущий адрес без аргументов
         }
     }
 }
Ejemplo n.º 2
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);
         }
     }
 }
Ejemplo n.º 3
0
 /**
  * Преобразование условия поиска из массива или строки в 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;
 }