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; }
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }
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; } }
/** * @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; }