Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /*
- * Aktuální verzi, popis a příklady použití najdete na adrese: http://projekty.vize.name/router/
- */
- /**
- * Routa pro práci s URL složenými z parametrů
- *
- * @author Jakub Kulhan (původní verze routeru), http://bukaj.netuje.cz/blog/jednoduchy-routing-v-php
- * @author Viktorie Halasu, http://projekty.vize.name/router/
- * @package Router
- * @version 1.3
- */
- class SimpleRoute extends Route {
- /**
- * @see Route::__construct()
- * @param string $route
- * @param array $defaults
- * @param int $flags
- * @param mixed $redir
- */
- public function __construct($route, array $defaults = array(), $flags = 0, $redir = null) {
- $this->source = trim($route, '?& ');
- if (is_int($flags)) {
- $this->flags = $flags;
- }
- $this->params = array(
- 'order' => array(), /* pořadí parametrů v routě (podle toho se složí výstupní URL): název => pořadí */
- 'fromRoute' => array(), /* jen parametry z routy s doplněnými výchozími hodnotami: název => [value => null|hodnota, optional => true|false] */
- 'allValues' => array(), /* parametry z routy i výchozí par. */
- );
- $this->regex = '';
- $orderIndex = 0;
- foreach ($this->parse($this->source) as $i => $part) {
- $optional = false;
- if ($i % 2 === 0) {
- list($name, $partRegex) = explode("\037", $part);
- /* escapování oddělovače, zpětné lomítko je potřeba escapovat dvakrát */
- $partRegex = preg_replace('#(?<!\\\\)~#', '\\~', $partRegex);
- /* Je tato část routy nepovinná? */
- if ($name{0} === '?') {
- $optional = true;
- $name = substr($name, 1);
- }
- /* Pokud není definovaný regulár pro tuto část routy, použije se výchozí */
- $this->regex .= ($optional ? '(?:' : '') .
- (empty($this->regex) ? '~^\?' : '&') .
- preg_quote("$name=", '~'). '(?<' . $name . '>' .
- (!empty($partRegex) ? $partRegex : self::DEFAULT_REGEX) .
- ')' . ($optional ? ')?' : '');
- /* Uloží se jednotlivé části routy a jejich vlastnosti. */
- $this->params['order'][$name] = $orderIndex;
- $this->params['fromRoute'][$name] = array(
- 'value' => null,
- 'optional' => $optional,
- );
- $this->params['allValues'][$name] = null;
- }
- $orderIndex++;
- }
- /* PCRE modif.: Unicode vždy, case-insensitive volitelně */
- $this->regex .= '$~u' . ($this->hasFlag(self::CI) ? 'i' : '');
- /* Přidají se výchozí hodnoty nebo parametry, pokud byly zadány. */
- if (!empty($defaults)) {
- foreach ($defaults as $key => $val) {
- if (!isset($this->params['fromRoute'][$key])) {
- $this->params['fromRoute'][$key]['value'] = $val;
- $this->params['fromRoute'][$key]['optional'] = false;
- }
- $this->params['allValues'][$key] = $val;
- }
- }
- if ($this->hasFlag(self::REDIR)) {
- $this->resolveRedirection($redir);
- }
- }
- /**
- * Pokusí se zpracovat zadaný query string podle této routy. Pořadí parametrů ve vstupu je libovolné.
- * @param mixed $url Pole ($_GET) nebo řetězec ($_SERVER['QUERY_STRING'])
- * @return bool
- */
- public function matchUrl($url) {
- if (!is_array($url)) {
- $queryString = trim($url, '?&');
- parse_str($queryString, $url);
- }
- if ($this->createUrlFromParams(array_intersect_key($url, $this->params['allValues']))) {
- $this->parsedUrl = $this->kmerge($this->params['allValues'], $this->lastUrlParams);
- $this->lastUrlParams = array();
- $this->lastCreatedUrl = '';
- return true;
- }
- $this->parsedUrl = array();
- return false;
- }
- /**
- * @see Route::createUrlFromParams()
- * @param array $params
- * @return bool
- */
- public function createUrlFromParams(array $params) {
- /* Názvy a hodnoty parametrů výstupní URL */
- $names = array();
- $values = array();
- foreach ($this->params['fromRoute'] as $parName => $parProps) {
- /* Pokud je v routě víc povinných částí, než bylo zadáno parametrů, máme špatnou routu. */
- if (empty($params) && !$parProps['optional']) {
- return false;
- }
- if (isset($params[$parName])) {
- /* Výchozí parametry musí mít stejnou hodnotu. */
- if ($parProps['value'] !== null && $params[$parName] != $parProps['value']) {
- return false;
- }
- /* Pokud parametr patří do routy (= není výchozí), použije se. */
- if (isset($this->params['order'][$parName])) {
- $names[$this->params['order'][$parName]] = $parName;
- $values[$this->params['order'][$parName]] = $params[$parName];
- }
- unset($params[$parName]);
- }
- /* Parametr nebyl zadaný, ale je nepovinný - nedělá se nic */
- elseif ($parProps['optional'] === false) {
- /* continue; */
- }
- }
- /* Pokud zbyly parametry, které nejsou v routě, máme špatnou routu. */
- if (!empty($params)) {
- $this->lastUrlParams = array();
- $this->lastCreatedUrl = '';
- return false;
- }
- /* Názvy i hodnoty se seřadí, aby na výstupu byly ve stejném pořadí jako v routě. */
- ksort($names);
- ksort($values);
- $this->lastUrlParams = array_combine($names, $values);
- $this->lastCreatedUrl = '?'.urldecode(http_build_query($this->lastUrlParams, '', '&'));
- if (preg_match($this->regex, $this->lastCreatedUrl)) {
- return true;
- } else {
- $this->lastUrlParams = array();
- $this->lastCreatedUrl = '';
- return false;
- }
- }
- /**
- * @see Route::addVariableUrlParts()
- * @param array $variables
- *
- * @throws LogicException
- */
- public function addVariableUrlParts(array $variables) {
- if (empty($this->lastUrlParams)) {
- throw new LogicException("Nelze nastavit proměnné parametry routy. Nejdřív se musí vytvořit URL podle routy.");
- }
- foreach ($variables as $name => $value) {
- if (isset($this->lastUrlParams[$name])) {
- $this->lastUrlParams[$name] = $value;
- }
- }
- $this->lastCreatedUrl = '?'.urldecode(http_build_query($this->lastUrlParams, '', '&'));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement