Diskuze: Nefunkční header Location
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


Ja mam doma auto v garazi. Je na nem zarezly sroubek. Rekni mi, jaky mam koupit v obchode.
Pises neco o lacation, v kodu zadne location nemas.
Zkus vyrobit funkcni priklad, ktery bychom mohli spusti i my ostatni a hledat v
nem chyby. Takze, by oko, kdyz nevime, co hledat, znamena to projit pismenko po
pismenku a doufat, ze mala zmena situaci zlepci To je takova titerna prace naprd,
ze kterou nejspis nejsi ochotny zaplatit... Nebo, ze neco ukaze obarvovani
syntaxe kodu, v editoru...
Stalo mne to 30 minut zivota. Odstranil jsem vsechno, co jsem dokazal rozlustit, aniz bych muzel dalich 50% kodu doplnovat. Cili 50% kodu je celkem nejistych.
<?php
function escapeHtml($str) {return htmlspecialchars($str);}
class classX {
public $RouteURL = '';
//$RouteURL = '';
public function navLink(
$ButtonUrl,
$ButtonName,
$ButtonIcon = "",
$ButtonAdd = "",
$ButtonAddLink = ""
)
{
var_dump(
$ButtonUrl,
$ButtonName,
escapeHtml($ButtonName),
$ButtonIcon,
escapeHtml($ButtonIcon),
$ButtonAdd,
$ButtonAddLink,
$this->navActive($ButtonUrl),
escapeHtml($this->navActive($ButtonUrl)),
$this->navLinkAdd($ButtonAdd, $ButtonAddLink),
escapeHtml($this->navLinkAdd($ButtonAdd, $ButtonAddLink)),
);
$left = "\n".'<li class="nav-item sidebar-heading d-flex justify-content-between align-items-center">';
$right = '</li>';
$a = '<a class="nav-link '.escapeHtml($this->navActive($ButtonUrl)).'" aria-current="page" href="'.escapeHtml($ButtonUrl).'"><span data-feather="'.escapeHtml($ButtonIcon).'"></span>'.escapeHtml($ButtonName).'</a>';
$a_right = $this->navLinkAdd($ButtonAdd, $ButtonAddLink);
return "\n".$a.$a_right;
}
private function navLinkAdd($add="", $addLink=""){
if($add == true){
return "\n".'<a class="link-secondary px-3" href="'.escapeHtml($addLink).'"><span data-feather="plus-circle"></span></a>';
}
}
public function navActive($URL){
if($this->RouteURL == $URL){
return 'active';
}
}
}
$x = new classX;
echo '<pre>'.escapeHtml($x->navLink('123','honza','star','456','789')).'</pre>';
?>
Jo, zapomnel jsem tam pridat to left, right. Ikdyz, ted mi neni jasne, proc
to nemas v implode?
Vsadim se, ze i adresy mas psane bez urlencode(), vid? Katastrofa...
//return "\n".$a.$a_right; // cili, tenhle radek napsat takto:
return $left."\n".$a.$a_right.$right;
Predam te funkci seznam $items (stringy html 'A /A') a ono to vygeneruje ostatni kod navigace
private function navigationPils($items = array())
{
if (!(count($items)>0))
{
return '';
}
$li_open = "\n".' <li class="nav-item">';
$li_close = '</li>';
return '
<nav class="pt-3">
<ul class="nav nav-pills flex-column">'. $li_open . implode($li_close.$li_open, $items) . $li_close . '
</ul>
</nav>
';
}
private function navigationTabs($items = array())
{
if (!(count($items)>0))
{
return '';
}
$li_open = "\n".' <li class="nav-item">';
$li_close = '</li>';
return '
<nav class="navbar card-header">
<ul class="nav nav-tabs card-header-tabs">'. $li_open . implode($li_close.$li_open, $items) . $li_close . '
</ul>
</nav>
';
}
Po dlouhé době si pro sebe něco píšu a prvně se snažím v OOP. Jsem si
vědom, kód není optimální, postupně se učím.
V tomto případě pro mě není htmlspecialchars moc řešení, ale v budoucnu
přidám. Nechápu, co s tím společného implode, nepoužívá se náhodou na
spojení řetězců z array?
Urlencode()
v tomto případě není třeba. Data načítám ze
souborů json a na volání stránek mi stačí
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
.
Používám základní šablonu @layout.tmpl
<?php if(!empty($_SESSION['user'])): ?>
<!DOCTYPE html>
<html lang="cs" class="h-100" itemscope="" itemtype="http://schema.org/Webpage">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, maximum-scale=1.0, minimal-ui">
<meta name="author" content="Ondřej Nyklíček">
<title>HomeCloud</title>
<meta name="description" content="HTML markup generator for social networks optimizations">
<link rel="apple-touch-icon" sizes="180x180" href="./Files/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="./Files/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="./Files/favicon/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link href="../Style/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="../Style/style.css" rel="stylesheet" >
</head>
<body class="d-flex flex-column h-100">
<header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
<div class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="#">HomeCloud</div>
<button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-nav nav-dash">
<div class="nav-item text-nowrap">
<form action="<?php $this->poster(); ?>" method="post">
<ul class="nav">
<?= $this->DebugButon(); ?>
<li class="nav-item">
<button class="btn-nav nav-link logout px-topnav" type="submit" name="logout" value="logout">Odhlásit se</button>
</li>
</ul>
</form>
</div>
</div>
</header>
<div class="container-fluid">
<div class="row">
<nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
<div class="position-sticky pt-3 sidebar-sticky">
<?= $this->getAlert(); ?>
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-2 mb-1 text-muted text-uppercase">
<span>Přihlášený uživatel</span>
</h6>
<p class="align-items-center px-3 mb-1"><?= $_SESSION['user']; ?></p>
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-3 mb-1 text-muted text-uppercase">
<span>Opravnění</span>
</h6>
<p class="align-items-center px-3 mb-3"><?= self::permissionHandler($_SESSION['type_user']); ?></p>
<hr>
<ul class="nav flex-column">
<?= $this->navLink("/apps","Aplikace","home"); ?>
<?= $this->navLink("/users", "Uživatelé","users","/user-add"); ?>
</ul>
<hr>
<ul class="nav flex-column">
<?= $this->navLink("/php-info","PHP Info","info"); ?>
</ul>
</div>
</nav>
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
<?php $this->renderViewBody(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); ?>
</div>
</main>
</div>
</div>
<footer class="footer mt-auto py-3 bg-light col-md-9 ms-sm-auto col-lg-10 px-md-4">
<div class="container">
<?php if(end($_SESSION['DebugMode']) == FALSE): ?>
<span class="text-muted">Written with ❤ for PHP</span>
<?php else: $this->ModuleDebugMode(); endif;?>
</div>
</footer>
<script src="//cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/feather.min.js" integrity="sha384-uO3SXW5IuS1ZpFPKugNNWqTZRRglnUJK6UAZ/gxOX80nxEkN9NcGZTftn6RzhGWE" crossorigin="anonymous"></script>
<script>window.setTimeout(function(){$(".auto-close-alert").fadeTo(500,0).slideUp(500,function(){$(this).remove()})},2e3)</script>
<script>feather.replace()
</script>
</body>
</html>
<?php else: header("location: login"); endif; ?>
Router prozatím takto.
<?php
class Router extends ConfigLoader {
protected $View;
protected $RouteURL;
public $AppsLoader;
public function __construct(){
self::RunConfig();
$this->RouteURL = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$this->AuthMe = new Auth("/UserDB.json");
$this->AppsLoader = new AppsLoader();
$this->AppsLoader->startDb("/AppsDB.json");
if($this->RouteURL == '/login'){
$this->View = '/@login-layout';
} else{
$this->View = '/@layout';
}
}
public function poster(){
if(isset($_POST['logout'])){
if($_POST['logout'] == "logout") {
session_destroy() ;
header("Refresh:0");
}
}
if(isset($_POST['DebugMode'])) {
if($_POST['DebugMode'] == "true") {
if($_SESSION['type_user'] == 'adm'){
self::setSession('DebugMode', TRUE);
self::setMessage('DebugMod byl aktivován!');
} else {
self::setMessage('Pro tuto akce nemáte dostatečná oprávnění!');
}
}
}
if(isset($_POST['DebugMode'])){
if ($_POST['DebugMode'] == "false") {
if($_SESSION['type_user'] == 'adm'){
self::setSession('DebugMode', FALSE);
self::setMessage('DebugMod byl deaktivován!');
} else {
self::setMessage('Pro tuto akce nemáte dostatečná oprávnění!');
}
}
}
}
public function redirectPage($Url){
header("Location: /$Url");
header("Connection: Close");
exit;
}
//Render layout
public function renderView(){
if ($this->View){
require($this->ViewsFolder.$this->View.$this->ViewFileFormat);
}
}
public function renderViewBody(){
if($this->RouteURL == "/"){
require ($this->ViewsFolder."/apps".$this->ViewFileFormat);
}
elseif($this->RouteURL == "") {
require ($this->ViewsFolder."/apps".$this->ViewFileFormat);
}
elseif (file_exists($this->ViewsFolder.$this->RouteURL.$this->ViewFileFormat)) {
require ($this->ViewsFolder.$this->RouteURL.$this->ViewFileFormat);
}
else {
require ($this->ViewsFolder."/404".$this->ViewFileFormat);
}
}
//! Nastavení zpráv
//* Vložení obsahu
public function setMessage($message){
if (isset($_SESSION['Message'])){
$_SESSION['Message'][] = $message;
} else {
$_SESSION['Message'] = array($message);
}
}
//* Výpis obsahu
public function getMessage(){
if (isset($_SESSION['Message'])){
$sessMsg = $_SESSION['Message'];
unset($_SESSION['Message']);
return $sessMsg;
}
else{
return array();
}
}
public function setSession($SessionName, $SessionData){
if (isset($_SESSION[$SessionName])){
$_SESSION[$SessionName][] = $SessionData;
} else {
$_SESSION[$SessionName] = array($SessionData);
}
}
public function getSession($SessionName){
if (isset($_SESSION[$SessionName])){
$zpravy = $_SESSION[$SessionName];
unset($_SESSION[$SessionName]);
return $zpravy;
}
else{
return array();
}
}
public function permissionHandler($pex){
if($pex == 'adm'){
return("Admin");
} else {
return("Uživatel");
}
}
public function getAlert(){
$DataAlert = self::getMessage();
foreach($DataAlert as $Val){
if (isset($Val)){
return('<div class="alert auto-close-alert alert-warning alert-dismissible fade show" role="alert">
<strong>'.$Val.'</strong>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>');}
}
}
private function navLinkAdd($addLink){
if(isset($addLink)){
return('<a class="link-secondary px-3" href="'.$addLink.'"><span data-feather="plus-circle"></span></a>');
}
}
public function navActive($URL){
if($this->RouteURL == $URL){
return('active');
}
}
}
Vrací mi to tuto chybu.
PHP Warning: Cannot modify header information - headers already sent by (output started at /srv/dev-disk-by-uuid-9e97e714-a650-4b97-afe2-43de2f83d35e/Disk1/www/localhost/public_html/Views/@layout.tmpl:62) in .../dev-disk-by-uuid-9e97e714-a650-4b97-afe2-43de2f83d35e/Disk1/www/localhost/public_html/Core/Router.php:59
@layout.tmpl:62 = <?= $this->navLink("/users", "Uživatelé","users","/user-add"); ?>
/Router.php:59
public function redirectPage($Url){
header("Location: /$Url");
header("Connection: Close");
exit;
}
To zalezi, jak mas nastaveny server. Asi mas nastaveni, ze kazde echo nebo vypis html koduspusti posilani dat uzivateli, tim padem vytvori header souboru a jakykoliv pokus zmeny heder uz nebude fungovat.
Da se to resit tak, ze vypisujes data a html jedinym echo prikazem z
promene.
Nebo dat jako prvni radek ob_start().
A nebo prenastavit server, aby se tak nechoval a poslal uzivateli stranku, az
bude hotova v pameti (pak na poctu echo a html kodu nezalezi).
Muzes si tu hlasku vygooglovat.
Zobrazeno 5 zpráv z 5.