Nice URL

2012-02-21 09:57:41 Post #1 barcelona

 
Witam, ostatnimi czasy nakierowałeś mnie na swój art dotyczący ładnych linków. Myślałem że przejdę przez ten proces bezboleśnie, ale jednak wyszły mi błędy.
Otóż w swoim projekcie użyłeś module i action, ja z kolei w swoim mam strona oraz podstrona, z tym nie ma problemu, spokojnie można pozamieniać jednak w tym przypadku:
1
2
3
4
if ($count == && substr($pathInfo, -5) == '.html'){//mamy moduł news. pathinfo jest więc postaci nazwa-newsa,id.html
            
$_GET['module'] = 'news';
            
$_GET['action'] = 'show';


Deklarujesz parametry jakie przyjmuje GET, u mnie tych parametrów jest trochę więcej i nie jestem w stanie operować tylko na tych dwóch.

W ramach testów zrobiłem takie coś
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public function Decode(){
        
$_pi '';
        
//w zależności od serwera nasza scieżka może się znajdować pod innym indeksem
        
if (!empty($_SERVER['PATH_INFO']))
            
$_pi $_SERVER['PATH_INFO'];
        if (empty(
$_pi) && !empty($_SERVER['ORIG_PATH_INFO']))
            
$_pi $_SERVER['ORIG_PATH_INFO'];
            
        
$pathInfo trim($_pi'/'); //usuwamy znak / z końca
        
if (empty($pathInfo)) { //pusta ścieżka
            
return true;
        }    
        
$arr explode('/',$pathInfo); //rozbijamy naszą ścieżkę na podstawie /
        
$count count($arr);
        
        if (
$count == && substr($pathInfo, -5) == '.html'){//mamy moduł news. pathinfo jest więc postaci nazwa-newsa,id.html
            
$_GET['strona'] = 'raporty';
            
$_GET['podstrona'] = 'tygodniowy';
            
            
//pobieramy nazwę oraz id czyli pobieramy nazwa-newsa,id
            
$nname substr($pathInfo,0strlen($pathInfo)-5);
            
//dzielimy na nazwę i id
            
$na explode(','$nname); 
            
$_GET['week'] = $na[0];
            
$_GET['id'] = $na[1];
            return 
true;    
        }
        
        
        
        
//pierwsze dwa elementy to moduł i akcja
        
$_GET['strona'] = $arr[0];
        
$_GET['podstrona'] = isset($arr[1]) ? $arr[1] : ''//tu małe zabezpieczenie, gdyby ktoś zapomniał podać akcji
        
        //następne elementy to nazwy parametru i parametr i tak co dwa
        
for ($i=2$i $count;$i+=2){
            
$_n $arr[$i]; //nazwa parametru
            
$_v = isset($arr[$i+1]) ? $arr[$i+1] : ''//wartość parametru
            
$_GET[$_n] = $_v;
        }
        return 
true;
    }
    
    
/**
     * 
     * Ścieżka w postaci module=moduł&action=akcja&par1=war1&par2=war2....
     * @param string $path
     */
    
public function Url($path null){
        if (empty(
$path)) //pusta ścieżka
            
$pars = array();
        else    
            
$pars explode('&'$path);
        
$params = array();
        foreach (
$pars as $_param){
            
$_arP explode('=',$_param,2); //par=war dzielimy na par i war
            
$params[$_arP[0]] = isset($_arP[1]) ? $_arP[1] : '';
        }
        
$strRet '';
        if (!empty(
$params)){
            if (
$params['strona'] == 'raport' && $params['podstrona'] == 'tygodniowy'){ //moduł news akcja show zamienimy na link .html
                
return $this->baseUrl.$params['week'].','.$params['id'].'.html';
            } else { 
//każdy inny moduł leci standardowo modul/akcja/parametr/wartosc
                
foreach ($params as $_key => $_val){
                    if (
$_key == 'strona' || $_key == 'podstrona')
                        
$_key '';
                    else
                        
$_key.='/';
                    
$strRet.="$_key$_val/";
                }    
            }
        }
        return 
$this->baseUrl.htmlspecialchars($strRet);    
    }


Jednak po wejściu na adres /raport/tygodniowy strona się rozjechała (brak css) oraz nie wczytało oczekiwanej strony.

Co robię źle?
Pozdrawiam

2012-02-21 11:29:15 Post #2 nospor

 
1) Wpisałem Twoje decode i dla linku /raport/tygodniowy wyświetliło mi poprawnie tablice get:
Array
(
[strona] => raport
[podstrona] => tygodniowy
)

2) Co do braku css to masz to wyjaśnione w komentarzach do arta. Chodzi o to, że należy podawać pełne ścieżki do plików css.
Nie: plik.css
a: http://twojastrona.pl/plik.css

2012-02-21 12:32:12 Post #3 barcelona

 
Dobra, problem z css rozwiązany.
Faktycznie jak wyprintowałem GET to również mam takie wartości

1
2
Array ( [strona] => raporty [podstrona] => tygodniowy )


Tylko pytanie, czemu pokazuje mi główną stronę a nie raport tygodniowy?

Wrzucam mój index

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?
session_start();
ob_start();
include(
'baza.php');
include(
'kolorowanie.php'); //kolorowanie skladni w zaleznosci od wartosci
$strona $_GET['strona'];
$podstrona $_GET['podstrona'];
require_once(
'NUrl.class.php');


//bazowy url. Może to być np. http://mojastrona.pl/
//tutaj dla testów będę brał ścieżkę, którą określacie w linku
$baseUrl $_SERVER['REQUEST_URI'];
if (!empty(
$_SERVER['PATH_INFO'])) //jeszcze trzeba z tego automatycznego $baseUrl wyciąć path_info. Gdy sami określać będziecie $baseUrl to ta wycinka będzie zbędna
    
$baseUrl substr($baseUrl,0strpos($baseUrl,$_SERVER['PATH_INFO'])).'/';
//i jeszcze wywalę index.php jeśli się nam tu wstawił
if (substr($baseUrl,-9) == 'index.php')
    
$baseUrl substr($baseUrl,0,-9);
    
//stworzenie obiektu do generacji linków
$nurl = new NUrl($baseUrl);

//przetworzenie ścieżki na parametry $_GET
$nurl->Decode();


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="favicon.ico" />
<link rel="stylesheet" type="text/css" href="http://www.try-this.type.pl/widok.css" media="screen,projection" />
<link rel="stylesheet" type="text/css" href="http://www.try-this.type.pl/ie6.css" media="screen,projection" />
<link rel="stylesheet" type="text/css" href="http://www.try-this.type.pl/google.css" media="screen,projection" />
<link rel="stylesheet" type="text/css" href="http://www.try-this.type.pl/drukuj.css" media="print" />
<script type="text/javascript" src="yetii-min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
 <!--
   function popup(url) 
   {
     window.open(url,'','width=400,height=400');
   }
 //-->
 
</script>
<?
include('title.php');

</head>

<body>
<div id="naglowek">
Wywalam zbędne rzeczy
</div>

<div id="pojemnik">
<div id="logo">
</div>
<div id="main">
<?
    
switch($strona)
        {
            case 
"": include("glowna.php"); break;
            case 
"check": include("check.php"); break;
            case 
"pracownicy": include("pracownicy.php"); break;
            case 
"send": include("send.php"); break;
            case 
"rejestracja": include("rejestracja.php"); break;
            case 
"logowanie": include("logowanie.php"); break;
            case 
"zmiana": include("zmiana.php"); break;
            case 
"kontakt": include("kontakt.php"); break;
            case 
"admin":
            switch(
$podstrona){
                case 
'pojemniki': include("pojemniki.php"); break;
            }; break;
            case 
"raporty": include("raporty.php"); break;
            case 
"raport":
            switch(
$podstrona){
            case 
'dzienny': include("zestawienie-dzienny.php"); break;
            case 
'tygodniowy': include("zestawienie-tygodniowy.php"); break;
            case 
'miesieczny': include("zestawienie-miesieczny.php"); break;
            case 
'dodaj-raport-dzienny': include("dodaj-raport-dzienny.php"); break;
            case 
'dodaj-raport-dzienny-suma': include("dodaj-raport-dzienny-suma.php"); break;
            case 
'pytanie': include("pytanie.php"); break;
            }; break;
        }

            

</div>

<div id="sidebar">
</div>
    
<div id="footer">
<p>Copyright &copy; 2012 <a href="index.html">-</a> &middot; <a href="#">kontakt</a></p>
</div>

</div>
</body>
</html>


Moim głównym błedem było to że nie robiłem ładnych linków od początku tworzenia serwisu

P.S. Popraw sobie footer na rok 2007-2012

2012-02-21 12:37:30 Post #4 nospor

 
To:
$strona = $_GET['strona'];
$podstrona = $_GET['podstrona'];
masz wykonać po Decode() a nie przed

2012-02-21 12:49:48 Post #5 barcelona

 
Faktycznie podziałało

Dobra teraz kolejny krok.

Otóż mam teraz link raport/tygodniowy/
W oryginalnej wersji w linku znajduje się również warunek week z numerem tygodnia, czyli
strona=raport&podstrona=tygodniowy&week=08

Analogicznie powinienem zrobić taki link raport/tygodniowy/08, jednak formularz nie pobiera wartości GET

2012-02-21 13:04:53 Post #6 nospor

 
Nie, wg. kodu co jest u mnie masz zrobić:
raport/tygodniowy/week/08
wówczas w $_GET pojawi sie parametr week.

2012-02-21 13:44:44 Post #7 barcelona

 
Świetnie, działa Teraz tylko muszę uporać się z przerobieniem linków na te nowe.

2012-02-21 16:36:01 Post #8 barcelona

 
Mam kolejne pytanie.
Chciałbym korzystać z funkcji $nurl->URL, jednak uzyskuje połowiczny efekt.

Przykładowo znajduję się na stronie raport/tygodniowy/week/07
Na górze strony mam zakładki
[img src="http://iv.pl/images/33522175140691407776.png"]

Jedna z tych zakładek ma taki kod:
1
echo '<a class="nag-tab" href="'.$nurl->Url('strona=admin&podstrona=pojemniki').'">Pojemniki</a><span class="hide"> | </span>';

Niby poprawnie, jednak po kliknięciu w tą zakładkę odsyła mnie na taki adres:
raport/tygodniowy/week/07/strona/admin/pojemniki/

2012-02-21 16:50:06 Post #9 nospor

 
Przy założeniu, że nic nie zepsułeś w kodzie metody URL, to masz źle ustawiony baseURL.

O ten kod:
//bazowy url. Może to być np. http://mojastrona.pl/
//tutaj dla testów będę brał ścieżkę, którą określacie w linku
$baseUrl = $_SERVER['REQUEST_URI'];
if (!empty($_SERVER['PATH_INFO']) //jeszcze trzeba z tego automatycznego $baseUrl wyciąć path_info. Gdy sami określać będziecie $baseUrl to ta wycinka będzie zbędna
$baseUrl = substr($baseUrl,0, strpos($baseUrl,$_SERVER['PATH_INFO']).'/';
//i jeszcze wywalę index.php jeśli się nam tu wstawił
if (substr($baseUrl,-9) == 'index.php')
$baseUrl = substr($baseUrl,0,-9);

zamien poprostu na stały baseurl czyli:
$baseUrl = 'http://twojastrona.pl';

a jeśli to localhost to:
$baseUrl = 'http://localhost/katalogprojektu';

ps: zaraz spadam, bede dopiero jutro.

2012-02-21 17:12:09 Post #10 barcelona

 
Zmiana na stały baseurl poskutkowało.
Jednak coś jest nie tak z kodowaniem linków.
Przykład:
1
echo '<a class="nag-tab-aktywny" href="'.$nurl->Url('/strona=raporty').'">Raporty</a><span class="hide"> | </span>';


koduje na taki link strona/raporty/

A i muszę do kodowania dodawać /strona bo inaczej daje link adres.plstrona/raporty/

Daje plik NUrl.class.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
/**
 * Przykładowa klasa do obsługi ładnych urli 
 *
 * @author Robert (nospor) Nodzewski (email: nospor at gmail dot com)
 **/
class NUrl {
    
    
/**
     * 
     * Bazowy url
     * @var string
     */
    
private $baseUrl;
    
    public function 
__construct($baseUrl ''){
        
$this->baseUrl $baseUrl;
    }
    
    
/**
     * Dekoduje adres na zmienne GET
     */
    
public function Decode(){
        
$_pi '';
        
//w zależności od serwera nasza scieżka może się znajdować pod innym indeksem
        
if (!empty($_SERVER['PATH_INFO']))
            
$_pi $_SERVER['PATH_INFO'];
        if (empty(
$_pi) && !empty($_SERVER['ORIG_PATH_INFO']))
            
$_pi $_SERVER['ORIG_PATH_INFO'];
            
        
$pathInfo trim($_pi'/'); //usuwamy znak / z końca
        
if (empty($pathInfo)) { //pusta ścieżka
            
return true;
        }    
        
$arr explode('/',$pathInfo); //rozbijamy naszą ścieżkę na podstawie /
        
$count count($arr);
        
        if (
$count == && substr($pathInfo, -5) == '.html'){//mamy moduł news. pathinfo jest więc postaci nazwa-newsa,id.html
            
$_GET['strona'] = 'raporty';
            
$_GET['podstrona'] = 'tygodniowy';
            
            
//pobieramy nazwę oraz id czyli pobieramy nazwa-newsa,id
            
$nname substr($pathInfo,0strlen($pathInfo)-5);
            
//dzielimy na nazwę i id
            
$na explode(','$nname); 
            
$_GET['week'] = $na[0];
            
$_GET['id'] = $na[1];
            return 
true;    
        }
        
        
        
        
//pierwsze dwa elementy to moduł i akcja
        
$_GET['strona'] = $arr[0];
        
$_GET['podstrona'] = isset($arr[1]) ? $arr[1] : ''//tu małe zabezpieczenie, gdyby ktoś zapomniał podać akcji
        
        //następne elementy to nazwy parametru i parametr i tak co dwa
        
for ($i=2$i $count;$i+=2){
            
$_n $arr[$i]; //nazwa parametru
            
$_v = isset($arr[$i+1]) ? $arr[$i+1] : ''//wartość parametru
            
$_GET[$_n] = $_v;
        }
        return 
true;
    }
    
    
/**
     * 
     * Ścieżka w postaci module=moduł&action=akcja&par1=war1&par2=war2....
     * @param string $path
     */
    
public function Url($path null){
        if (empty(
$path)) //pusta ścieżka
            
$pars = array();
        else    
            
$pars explode('&'$path);
        
$params = array();
        foreach (
$pars as $_param){
            
$_arP explode('=',$_param,2); //par=war dzielimy na par i war
            
$params[$_arP[0]] = isset($_arP[1]) ? $_arP[1] : '';
        }
        
$strRet '';
        if (!empty(
$params)){
            if (
$params['strona'] == 'raport' && $params['podstrona'] == 'tygodniowy'){ //moduł news akcja show zamienimy na link .html
                
return $this->baseUrl.$params['week'].','.$params['id'].'.html';
            } else { 
//każdy inny moduł leci standardowo modul/akcja/parametr/wartosc
                
foreach ($params as $_key => $_val){
                    if (
$_key == 'strona' || $_key == 'podstrona')
                        
$_key '';
                    else
                        
$_key.='/';
                    
$strRet.="$_key$_val/";
                }    
            }
        }
        return 
$this->baseUrl.htmlspecialchars($strRet);    
    }
}


?>

2012-02-22 07:51:00 Post #11 nospor

 
koduje na taki link strona/raporty/
No to chyba dobrze, nie?

A i muszę do kodowania dodawać /strona bo inaczej daje link adres.plstrona/raporty/
No bo $baseUrl nie zakończyłeś /. Dodaj / na końcu $baseUrl i już

2012-02-22 15:39:52 Post #12 barcelona

 
No to chyba dobrze, nie?

No właśnie nie za bardzo, ponieważ poprawny link wygląda u mnie tak:
adres.pl/raport/tygodniowy/week/07
a nie tak:
adres.pl/strona/raport/tygodniowy/week/07

a tablica wygląda w taki sposób:
1
Array ( [strona] => strona [podstrona] => raport.... ) // Nie wiem jak dalej bo mi serwer padł  

2012-02-22 15:48:52 Post #13 nospor

 
Nie kumam problemu....

Skoro link ma wyglądać tak:
adres.pl/raport/tygodniowy/week/07

To nie:
$nurl->Url('/strona=raporty')

a:
$nurl->Url('strona=raport&podstrona=tygodniowy&week=07')

Zauważ jednak, że w swojej zmianie dałeś:
if ($params['strona'] == 'raport' && $params['podstrona'] == 'tygodniowy'){ //moduł news akcja show zamienimy na link .html
return $this->baseUrl.$params['week'].','.$params['id'].'.html';
Czyli dla takich parametrów będziesz próbował tworzyć link z koncowką .html

2012-02-22 16:24:31 Post #14 barcelona

 
Sorki, nie miałem dostępu do hosta i z głowy jechałem.

Już tłumacze:
Mam "brzydki" link: ?strona=raport&podstrona=dzienny&data=2012-02-20
Po operacji $nurl mam efekt:/strona/raport/dzienny/data/2012-02-20/
Tablica wygląda wtedy tak:
1
Array ( [strona] => strona [podstrona] => raport [dzienny] => data [2012-02-20] => )


Dopiero link /raport/dzienny/data/2012-02-20/ daje właściwy efekt a tablica wygląda:

1
Array ( [strona] => raport [podstrona] => dzienny [data] => 2012-02-18 )


Faktycznie $nurl dla parametrów raport i tygodniowy tworzy linki z końcówką .html, dlatego podałem przykład z raportem dziennym

2012-02-22 16:32:23 Post #15 nospor

 
No to analogicznie:
$nurl->Url('strona=raport&podstrona=dzienny&data=blabla')

2012-02-22 16:38:09 Post #16 barcelona

 
Właśnie taka operacja daje link
/strona/raport/dzienny/data/blabla/, który jest niepoprawny, ponieważ na początku jest /strona, dopiero jak zrobię "ręcznie" /raport/dzienny/data/blabla/ to jest prawidłowo. Nie wiem jak zrobić żeby $nurl nie dawał mi /strona na początku adresu.

Podejrzewam że irytuje Cie ten temat, ale mam rozgrzebaną stronę i chciałbym ją poskładać do kupy.

2012-02-22 16:43:25 Post #17 nospor

 
Coś kręcisz panie kolego albo juz pozmieniałeś kody.
Skopiowałem Twoje Decode, skopiowałem twoje URL i dla
$nurl->Url('strona=raport&podstrona=dzienny&data=blabla')
Jest wszystko generowane tak jak być powinno czyli:
raport/dzienny/data/blabla/

Jeśli Tobie generuje coś innego, to musiałeś już coś znowu pozmieniać w metodzie URL.

ps: nie, nie irytuje. Dałem w którymś momencie odczuć, że irytuje?

2012-02-22 16:55:04 Post #18 barcelona

 
Nie, nie dałeś znać

Wgrałem ponownie Twoją klasę iiiii pomogło, za dużo tam "napoprawiałem" i dlatego mi krzaki wyskakiwały.
Mam nadzieję, że teraz już będzie szło z górki

2012-02-22 17:03:54 Post #19 nospor

 
W razie pytań wal śmiało.
Irytują mnie tematy, w których ludzie nie myślą i walą bez zastanowienia posty jeden za drugim. Ty póki co widać, że się starasz, więc takie posty jak Twoje mnie nie irytują

2012-03-05 21:02:16 Post #20 barcelona

 
Witam ponownie

mam problem z linkami z końcówką .html
Odpowiada za to ten kawałek kodu
1
2
3
4
5
6
7
8
9
10
11
12
13
if ($count == && substr($pathInfo, -5) == '.html'){//mamy moduł news. pathinfo jest więc postaci nazwa-newsa,id.html
            
$_GET['strona'] = 'pracownik';
            
$_GET['podstrona'] = 'pokaz';
            
            
//pobieramy nazwę oraz id czyli pobieramy nazwa-newsa,id
            
$nname substr($pathInfo,0strlen($pathInfo)-5);
            
//dzielimy na nazwę i id
            
$na explode(','$nname); 
            
$_GET['nazwisko'] = $na[0];
            
$_GET['id'] = $na[1];
            return 
true;    
        }


Według tego co pozmieniałem powyżej link powinien stworzyć się z tego

1
$nurl->Url('strona=pracownik&podstrona=pokaz&nazwisko='.$pracownik_nazwisko.'&id='.$pracownik_id.'')

Generuje link pracownik/pokaz/nazwisko/Nazwisko/id/1/
Jednak tak się nie robi
Gdzie robię błąd ?
Pozdro
1 2 >

Odpowiedz