IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nefunkční header Location

Aktivity
Avatar
Ondřej Nyklíček:1.8.2022 0:10

Dobrý den,

nastal mi problém v šabloně, kdy při volání <?= $this->navLink("/users", "Uživatelé", "users", TRUE, "/user-add") ?> přestane fungovat přesměrování za pomoci header("Location /$proměná")

public function navLink($ButtonUrl, $ButtonName, $ButtonIcon = "", $ButtonAdd = "", $ButtonAddLink = ""){
                return ('<li class="nav-item sidebar-heading d-flex justify-content-between align-items-center"><a class="nav-link '.$this->navActive($ButtonUrl).'" aria-current="page" href="'.$ButtonUrl.'"><span data-feather="'.$ButtonIcon.'"></span>'.$ButtonName.'</a>'.$this->navLinkAdd($ButtonAdd, $ButtonAddLink).'</li>');
        }

        private function navLinkAdd($add, $addLink){
                if($add == TRUE){
                        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');
                }
        }

Zkusil jsem: Při odstranění proměnných v navLink() vše funguje jak má.

 
Odpovědět
1.8.2022 0:10
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.8.2022 9:18

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>';
?>
 
Nahoru Odpovědět
1.8.2022 9:18
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.8.2022 9:26

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>
';
        }
 
Nahoru Odpovědět
1.8.2022 9:26
Avatar
Ondřej Nyklíček:2.8.2022 14:00

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;
    }
 
Nahoru Odpovědět
2.8.2022 14:00
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:2.8.2022 21:15

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.

 
Nahoru Odpovědět
2.8.2022 21:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.