setPage($page); $pc->print(); } /** @var IPage */ protected static $page; /** spécifier la page courante. cette opération est automatique */ static final function set_current_page(IPage $page) { self::$page = $page; } private static function _qsbu(string $url, array $params): string { if (count($params) > 0 && $params[0] === true) { $query_string = $_SERVER["QUERY_STRING"]; if ($query_string) $url .= "?$query_string"; $params = array_slice($params, 1); } return html::bu($url, ...$params); } /** * retourner le chemin de la page courante depuis la racine. * * cette méthode existe parce que l'url "" renvoie vers la page courante mais * avec tous ses paramètres. on veut parfois rediriger vers la page courante * sans aucun paramètre. * * si le premier argument de cette méthode est true, retourner le chemin de la * page courante suivie de la valeur de $_SERVER["QUERY_STRING"] * * dans tous les cas, les arguments de params sont rajoutés * * @see prefix::get_default_self() pour une information sur l'exactitude de la * valeur retournée */ static final function self(...$params): string { $self = $_SERVER["SCRIPT_NAME"]; return self::_qsbu($self, $params); } /** comme {@link self()} mais avec un chemin absolu */ static final function origself(...$params): string { $self = prefix::get_default_self(); return self::_qsbu($self, $params); } /** * construire un url avec les paramètres spécifiés. le cas échéant, corriger * l'url en fonction de self * * cette méthode sera utilisée notamment pour des liens vers des resources * statiques */ static final function resu(string $url, ...$params): string { $prefix = self::$page->getSelfRelativePrefix(); return html::bu(prefix::add($url, $prefix), ...$params); } /** * construire un url vers le composant destination avec les paramètres * spécifiés. le cas échéant, corriger l'url en fonction de self * * @param string|IPage $dest composant destination */ static final function dynu($dest, ...$params): string { $prefix = self::$page->getSelfRelativePrefix(); $url = route::get_path($dest); return html::bu(prefix::add($url, $prefix), ...$params); } const BU_STATIC_PARTS = ["scheme", "host", "port", "query", "fragment"]; /** * méthode générique pour construire une url. utiliser des heuristiques pour * déterminer si la destination est une url statique ou si c'est un composant */ static final function bu($dest, ...$params): string { $dyn = true; if (is_object($dest)) $dest = get_class($dest); if (is_string($dest)) { # heuristiques pour déterminer si c'est une url statique $parts = parse_url($dest); foreach (self::BU_STATIC_PARTS as $part) { if (A::has($parts, $part)) { # y a-t-il au moins une partie d'une url statique? $dyn = false; break; } } if ($dyn) { # s'il n'y a qu'un chemin, tester si ça ressemble à une url $path = A::get($parts, "path", ""); if ($path === "" || $path === ".") $dyn = false; elseif (strpos($path, "/") !== false) $dyn = false; elseif (preg_match('/\.(php|html)\b/', $path)) $dyn = false; } } if ($dyn) { # tenir compte du préfixe, puisque les chemins des composants sont # toujours exprimés depuis la racine $prefix = self::$page->getSelfRelativePrefix(); if ($dest !== null) { $url = route::get_path($dest); $url = prefix::add($url, $prefix); } else { $url = $prefix; } return html::bu($url, ...$params); } else { # ne pas corriger une url statique: on fait confiance à l'utilisateur pour # utiliser des chemins relatifs return html::bu($dest, ...$params); } } static final function no_cache(): void { http::no_cache(); } static final function content_type(string $content_type=null, string $charset=null): void { http::content_type($content_type, $charset); } static final function download_as($filename, string $disposition=null): void { http::download_as($filename, $disposition); } private static function _get_url($dest): string { if ($dest === null) $url = self::self(); elseif ($dest === true || is_array($dest)) $url = self::self($dest); else $url = self::bu($dest); return $url; } static final function redirect($dest=null, bool $exit_now=true): void { http::redirect(self::_get_url($dest), $exit_now); } static final function refresh($dest=null, int $delay=1, bool $exit_now=true): void { http::refresh(self::_get_url($dest), $delay, $exit_now); } static final function send_no_content(bool $exit_now=true): void { http::send_no_content($exit_now); } static final function send_file(string $file, bool $delete=false, bool $close_session=true, bool $add_content_length=true, bool $exit_now=true): bool { return http::send_file($file, $delete, $close_session, $add_content_length, $exit_now); } static function more_time(?int $time=600) { if ($time !== null) set_time_limit($time); } static function more_memory(?string $memory="256M") { if ($memory !== null) ini_set("memory_limit", $memory); } static function more_resources(?int $time=600, ?string $memory="256M") { self::more_time($time); self::more_memory($memory); } }