예제 #1
0
파일: format.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $format = $path->get_resource_parameter('format');
     $format = $format ? $format : 'html';
     $parameters->format = $format;
     return $format;
 }
예제 #2
0
파일: id.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $object_id = $path->get_resource_parameter('object_id');
     if ($object_id) {
         //            $parameters->object_id = $object_id;
         return $object_id;
     } else {
         return false;
     }
 }
예제 #3
0
파일: action.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $action = $path->get_resource_parameter('action');
     if ($action && $action != 'index') {
         $parameters->action = $action;
         return $action;
     } else {
         return false;
     }
 }
예제 #4
0
파일: variable.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $value = $path->get_variable($this->variable_name);
     if ($value !== null && nc_preg_match($this->regexp, $value)) {
         $parameters->used_variables[$this->variable_name] = true;
         return $value;
     } else {
         return false;
     }
 }
예제 #5
0
파일: keyword.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $keyword = $path->get_resource_parameter('object_keyword');
     if ($keyword || $keyword === '0') {
         //            $parameters->object_keyword = $object_keyword;
         return $keyword;
     } else {
         return false;
     }
 }
예제 #6
0
파일: date.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $date = $path->get_resource_parameter('date');
     if ($date) {
         list($y, $m, $d) = explode('-', $date);
         $suitable_format = $this->get_suitable_date_format($m ? 1 : 0, $d ? 1 : 0);
         if (!$suitable_format) {
             return false;
         }
         $result = strtr($suitable_format, array("Y" => $y, "m" => $m, "d" => $d));
         //            $parameters->date = $result;
         return $result;
     } else {
         return false;
     }
 }
예제 #7
0
파일: folder.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $folder = $path->get_resource_parameter('folder');
     if (!$folder) {
         $folder_id = $path->get_resource_parameter('folder_id');
         try {
             $folder = nc_core::get_object()->subdivision->get_by_id($folder_id, 'Hidden_URL');
         } catch (Exception $e) {
         }
     }
     if ($folder) {
         //            $parameters->folder = $folder;
         return trim($folder, '/');
     } else {
         return false;
     }
 }
예제 #8
0
파일: page.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     // параметр ресурса page может быть установлен в nc_browse_messages(),
     // он имеет приоритет над $nc_page:
     $page = $path->get_resource_parameter('page');
     if (!$page) {
         // также значение может быть взято из дополнительной переменной nc_page:
         $page = $path->get_variable('nc_page');
     }
     if ($page) {
         $parameters->used_variables['nc_page'] = true;
         $parameters->used_variables['curPos'] = true;
         //            $parameters->page = $page;
         return $page;
     } else {
         return false;
     }
 }
예제 #9
0
파일: keyword.php 프로젝트: Blu2z/implsk
 public function substitute_values_for(nc_routing_path $path, nc_routing_pattern_parameters $parameters)
 {
     $infoblock_keyword = $path->get_resource_parameter('infoblock_keyword');
     if (!$infoblock_keyword && $infoblock_keyword !== '0') {
         $infoblock_id = $path->get_resource_parameter('infoblock_id');
         if ($infoblock_id) {
             try {
                 $infoblock_keyword = nc_core::get_object()->sub_class->get_by_id($infoblock_id, 'EnglishName');
             } catch (Exception $e) {
             }
         }
     }
     if ($infoblock_keyword || strlen($infoblock_keyword)) {
         //            $path->set_route_resource_parameter('infoblock_keyword', $infoblock_keyword);
         //            $parameters->infoblock_keyword = $infoblock_keyword;
         return $infoblock_keyword;
     } else {
         return false;
     }
 }
예제 #10
0
파일: route.php 프로젝트: Blu2z/implsk
 /**
  * @param nc_routing_path $path
  * @return bool|string
  */
 public function get_path_string_for(nc_routing_path $path)
 {
     $requested_resource_parameters = $path->get_resource_parameters();
     // Поскольку генерирование путей, особенно при наличии большого количества маршрутов —
     // затратный процесс, для оптимизации сюда были вынесены знания о функционировании
     // некоторых типов частей шаблонов пути (в основном для генерации путей объектов —
     // их на страницах с длинными списками объектов больше всего)...
     // Оптимизация: не пытаться вычислять значение, если в пути есть {object_keyword},
     // а у объекта нет свойства для подстановки (может быть часто в списках объектов)
     if ($this->pattern_contains_object_keyword) {
         $requested_object_keyword = isset($requested_resource_parameters['object_keyword']) ? $requested_resource_parameters['object_keyword'] : false;
         if (!$requested_object_keyword && $requested_object_keyword !== '0') {
             return false;
             // --- RETURN ---
         }
     }
     // Эти свойства нам будут дальше нужны:
     $route_resource_type = $this->properties['resource_type'];
     $route_resource_type_is_object = $route_resource_type === 'object';
     $route_resource_parameters = $this->properties['resource_parameters'];
     // Оптимизация: не пытаться вычислять значение, если в пути есть {date},
     // а у ресурса дата не задана (отбрасываем почти половину стандартных путей),
     // и при противоположном раскладе (если не установлено, что дата является опциональной)
     $path_has_date = isset($requested_resource_parameters['date']) && $requested_resource_parameters['date'];
     $path_date_is_optional = $route_resource_type_is_object && isset($requested_resource_parameters['date_is_optional']) && $requested_resource_parameters['date_is_optional'];
     if ($this->pattern_contains_date && !$path_has_date || !$path_date_is_optional && $path_has_date && !$this->pattern_contains_date) {
         return false;
         // --- RETURN ---
     }
     // Оптимизация: действие = "full", а в шаблоне пути есть {object_action} — совпадения не будет
     // (подразумевается, что это должен быть путь к объекту — дополнительных проверок не проводим)
     if ($this->pattern_contains_object_action && $requested_resource_parameters['action'] === 'full') {
         return false;
         // --- RETURN ---
     }
     // Оптимизация: путь до объекта, действие ≠ "full", в пути нет {object_action}
     // и action не задан в настройках маршрута
     if (!$this->pattern_contains_object_action && $route_resource_type_is_object && $requested_resource_parameters['action'] !== 'full' && $route_resource_parameters['action'] !== $requested_resource_parameters['action']) {
         return false;
         // --- RETURN ---
     }
     // То же самое для {infoblock_action} и action = "index"
     if ($this->pattern_contains_infoblock_action && $requested_resource_parameters['action'] === 'index') {
         return false;
         // -- RETURN ---
     }
     // Если у маршрута задан один из «определяющих» параметров ресурса,
     // он должен совпадать с параметром у $path
     if ($route_resource_parameters) {
         static $parameters_to_check_before_substitution = array('folder_id', 'infoblock_id', 'object_id', 'script_path');
         foreach ($parameters_to_check_before_substitution as $p) {
             if (isset($route_resource_parameters[$p]) && $route_resource_parameters[$p] && $route_resource_parameters[$p] != $requested_resource_parameters[$p]) {
                 return false;
                 // --- RETURN ---
             }
         }
     }
     // Подготовка объекта для сбора параметров, накопленных при подстановке частей шаблона пути
     $result_parameters = new nc_routing_pattern_parameters($this);
     if (isset($route_resource_parameters['action'])) {
         $result_parameters->action = $route_resource_parameters['action'];
     }
     if (isset($route_resource_parameters['format'])) {
         $result_parameters->format = $route_resource_parameters['format'];
     }
     // Подстановка параметров пути — вычисление результата:
     $result = $this->get_pattern()->substitute_values_for($path, $result_parameters);
     // Дополнительные проверки на соответствие результата запросу
     if ($result) {
         $requested_resource_type = $path->get_resource_type();
         if ($requested_resource_type === 'infoblock') {
             $nc_core = nc_core::get_object();
             // Если для инфоблока использован путь к разделу, необходимо проверить,
             // является ли инфоблок первым включённым
             if ($route_resource_type === 'folder') {
                 $folder_infoblock_id = $nc_core->sub_class->get_first_checked_id_by_subdivision_id($requested_resource_parameters['folder_id']);
                 if ($requested_resource_parameters['infoblock_id'] != $folder_infoblock_id) {
                     return false;
                     // --- RETURN ---
                 }
                 $result_parameters->format = 'html';
             }
             // Если при генерировании пути не установлен параметр action,
             // то action = DefaultAction инфоблока
             if (!$result_parameters->action) {
                 try {
                     $default_action = $nc_core->sub_class->get_by_id($path->get_resource_parameter('infoblock_id'), 'DefaultAction');
                     $result_parameters->action = $default_action;
                 } catch (Exception $e) {
                     return false;
                 }
             }
         }
         // Сверяем параметры запроса и результата
         // Параметры format, action могут быть у путей объектов, инфоблоков
         // и путей разделов, если последние используются как путь к инфоблоку.
         // Если нужен путь к разделу, а не к инфоблоку, эти параметры
         // не являются обязательными.
         if (!($requested_resource_type === 'folder' && $route_resource_type === 'folder') && $requested_resource_type !== 'script') {
             if ($route_resource_type_is_object && !$result_parameters->action) {
                 $result_parameters->action = 'full';
             }
             if ($requested_resource_parameters['action'] != $result_parameters->action) {
                 return false;
                 // --- RETURN ---
             }
             if ($requested_resource_parameters['format'] != $result_parameters->format) {
                 return false;
                 // --- RETURN ---
             }
         }
         // Добавляем отсутствующие в созданном пути переменные
         $path_variables = $path->get_resource_parameter('variables');
         if ($path_variables) {
             $extra_variables = array_diff_key($path_variables, $result_parameters->used_variables);
             foreach ($extra_variables as $k => $v) {
                 if ($v === false || $v === null) {
                     unset($extra_variables[$k]);
                 }
             }
             if ($extra_variables) {
                 $result .= "?" . http_build_query($extra_variables, null, '&');
             }
         }
         // Добавляем $SUB_FOLDER
         $result = nc_routing::$SUB_FOLDER . $result;
     }
     return $result;
 }