Ładne url'e (nice url)

Dziś przedstawię Wam jak w łatwy sposób stworzyć ładne url'e we własnej aplikacji. Wielu początkujących programistów tworzy cały mechanizm ładnych url'i w całości oparty na mod-rewrite i pliku htaccess. Niestety takie podejście jest mało elastyczne i na dłuższą metę uciążliwe. Pokażę Wam inną metodę, gdzie cały mechanizm przetwarzania linków zawarty jest w kodzie php. Chcę od razu zaznaczyć, iż nie będzie tu żadnej super hiper obiektowości, rutingu i innych super hiper bajerów. Artykuł ma na celu pokazać jak prosto zrobić ładne linki i poznać podstawy tej konstrukcji.

Założenia wstępne

Na początku omówię w jaki sposób będzie kontrolowana nasza testowa aplikacja. Będzie się ona składała z modułów, zaś każdy moduł będzie miał akcje. Przykładowo możemy mieć moduł aktualności (news). Moduł ten udostępnia akcję listy aktualności (list) oraz akcję wyświetlenia konkretnej aktualności (show).

Teraz przyjmijmy, że nazwa modułu znajdować się będzie w parametrze module a akcja w parametrze action. Przykładowy standardowy link wyglądałby mniej więcej tak: index.php?module=jakismodul&action=jakasakcja

Dla naszego modułu aktualności i akcji listowania byłoby to więc tak: index.php?module=news&action=list zaś dla wyświetlenia konkretnej aktualności index.php?module=news&action=show&name=nazwanewsa&id=5 - dla konkretnej aktualności założyłem, iż potrzebna będzie jeszcze nazwa oraz id.

Mamy już linki ale jak sami widzimy są to nadal jeszcze te straszne brzydkie linki. Chcielibyśmy mieć je w ładnej postaci. Przyjmijmy więc, że nasze linki będą wyglądały tak jakismodul/jakasakcja/jakisparametr1/jakaswartosc2/jakisparametr2/jakaswartosc2. Dla naszego modułu aktualności byłoby to więc news/list oraz news/show/name/nazwanewsa/id/5

Przekierowanie adresów

Jak już mówiłem, cały mechanizm będzie oparty na php. Żeby jednak taki url jakismodul/jakasakcja/jakisparametr1/jakaswartosc2/jakisparametr2/jakaswartosc2 trafił do skryptu php, musimy go tam przekierować. W tym celu posłużę się plikiem .htaccess - wiem, mówiłem, że nie będzie potrzebny... W zasadzie to mówiłem, że nie będę tam określał reguł ładnych url'i A w tym pliku zrobimy jedynie jedno przekierowanie i nic więcej - no bez tego się nie da. Tak więc należy stworzyć plik .htaccess o następującej treści:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)         index.php/$1 [L]

Taki zapis spowoduje przekierowanie do skryptu index.php wszelkich odwołań do zasobów naszej aplikacji, których fizycznie nie ma na dysku. No a przecież czegoś takiego na dysku jakismodul/jakasakcja/jakisparametr1/jakaswartosc2/jakisparametr2/jakaswartosc2 raczej mieć nie będziemy . No i to tyle jeśli chodzi o plik .htaccess i mod-rewrite - żadnych cudnych łamańców, których do końca nigdy nie rozumiemy i przy każdej nawet drobnej modyfikacji wyrywamy sobie włosy z głowy.

Dekodowanie adresu

Ok, to mamy już przekierowanie. Teraz trzeba taki ładny adresik przetworzyć. Nasz jakismodul/jakasakcja/jakisparametr1/jakaswartosc2/jakisparametr2/jakaswartosc2 znajdować się będzie zazwyczaj w $_SERVER['PATH_INFO']. Należy go więc stamtąd wydobyć, podzielić na podstawie "/" i przypisać wszystko do $_GET. Nie będę się tu rozpisywał co i jak tylko pokażę kod:

<?php
$pathInfo = trim($_SERVER['PATH_INFO'], '/'); //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);
				
//pierwsze dwa elementy to moduł i akcja
$_GET['module'] = $arr[0];
$_GET['action'] = 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;
}?>

I już. W wyniku takiego kodu, nasz link jakismodul/jakasakcja/jakisparametr1/jakaswartosc2/jakisparametr2/jakaswartosc2 zostanie prawidłowo zapisany w tablicy $_GET skąd możemy się już standardowo odwoływać do poszczególnych elementów, np: $_GET['module'], $_GET['action']...

Kodowanie adresu

Pozostało nam jeszcze tworzyć linki w naszej aplikacji. W paczce do ściągnięcia znajduje się klasa, która posiada metodę Url(). Metoda ta tworzy nam linki. Wystarczy ją tylko wywołać, np: Url('module=jakismodul&action=jakasakcja&par=war') - taki kod zwróci nam link jakismodul/jakasakcja/par/war1. A o to kod:

<?php
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)){
	foreach ($params as $_key => $_val){
	if ($_key == 'module' || $_key == 'action')
		$_key = '';
	else
		$_key.='/';
	$strRet.="$_key$_val/";
	}	
}
return $this->baseUrl.htmlspecialchars($strRet);	
}
?>

I tu nasuwa sie pytanie A po co przepuszczać to jeszcze przez jakąś funkcję? Czy nie można od razu wpisać sobie link taki jak chcemy? Odpowiedź: oczywiście, że można. Ale lepiej tego nie robić z bardzo prostego powodu - przepuszczanie tego przez funkcję gwarantuje nam jednolity mechanizm tworzenia linków - ustawiając jakismodul/jakasakcja zawsze otrzymamy ten sam link. No bo może się okazać, że kiedyś stwierdzicie, że dla modułu X linki mają wyglądać inaczej niż dla modułu Y. I co wtedy? Musicie ręcznie zamieniać wszystkie wstawki z modułem X. A gdyby to wszystko przechodzi przez jedną funkcję to jedyne co musicie zrobić to zmienić to i owo w tej jednej funkcji.

W paczce do ściągnięcia, rozszerzyłem właśnie trochę klasę i dopisałem inne tworzenie linków dla modułu news i akcji show. Teraz link do aktualności będzie wyglądał tak: jakas-nazwa,5.html pomimo, że wywołanie nadal wygląda tak: module=news&action=show&name=jakas-nazwa&id=5 - jedyne co musiałem zrobić to zmienić to i owo w jednej funkcji.

Podsumowanie

Zalety

  • Dowolna (dynamiczna) liczba parametrów. Przy całościowym rozwiązaniu .htaccess nie można było określić dowolnej liczby parametrów
  • Nieograniczone pole do popisu w wymyślaniu różnych kombinacji linków
  • Możliwe modułowe podejście do sprawy: każdy moduł może wnieść swój własny routing i nie trzeba nic zmieniać w plikach globalnych aplikacji. Oczywiście możliwe jest to dopiero przy odpowiednio napisanym mechaniźmie. W przykładzie co Wam udostępniam oczywiście tego nie ma

Wady

  • Nie stwierdzono

Taki mechanizm stosuję od bardzo dawna. Uratował mi skórę gdy jeszcze kiedyś robiłem wszystko w htaccess i w pewnym momencie stanąłem na coraz to bardziej zagmatwanych regółkach. Podobny mechanizm stosowany jest chyba w większości popularnych frameworkach. Mówię tu oczywiście o zarządzaniu ładnymi linkami z poziomu php a nie o dokładnie takim samym kodzie co tu pokazałem.

Paczka z przykładową "aplikacją" i klasą do pobrania jak zwykle w dziale download. Polecam jej ściągnięcie, przejrzenie i odpalenie gdyż pomoże wszystkim tym, którzy nie do końca zrozumieli ten mechanizm.

Komentarze

 

2011-03-22 01:22 gość_fl4shb4ck

wada jest - przy większej ilości parametrów możliwośc zmiany ich kolejności (google i inne szukajni nie będą happy - duplicated content) przykład za artykułem:

news/show/name/nazwanewsa/id/5
jest równoważne z
news/show/id/5/name/nazwanewsa

czyli mamy to samo pod dwoma adresami, rozwiazanie jest dość proste - zarówno przy tworzeniu adresów jak i przy ich przetwarzaniu można posortować parametry (a właściwie pary - klucz=>wartość) zgodnie z jakimś schematem (np alfabetycznie, od najkrótszego do najdłuższego itp) tak żeby zawsze przy generowaniu otrzymywać to samo niezależnie od danych wejściowych jak i móc wywalić 404 albo jakiś z serii 3xx w wypadku niewłaściwej kolejności parametrów - dzięki temu mamy spójny system budowania i czytania linków i cieszymy sie z lepszego indeksowania przez google

2011-03-22 06:53 nospor

Ale ten sam problem występować będzie również w systuacji, gdy wszystko robić będziemy w htaccess. A ja mówiłem o wadach i zaletach w porównaniu właśnie do htaccess
Nie mniej jednak dobrze, że o tym wspomniałeś

2011-03-22 09:47 gość_thek

Problem duplicate content da się obejść jak napisano (schemat, kolejność), albo poprzez canonical url.

2011-03-22 13:48 korey

SUPER SUPER SUPER.. Mółbyś jakoś inaczej wyróżnić te przykładowe linki np: jakismodul/jakasakcja/jakisparametr1/jakaswartosc2/jakisparametr2/jakaswartosc2
czy jakismodul&action=jakasakcja&par=war. Ale sam artykuł rewelacja

Dzięki Nospor

2011-03-22 14:04 nospor

Mółbyś jakoś inaczej wyróżnić te przykładowe linki
Mówisz masz

2011-03-22 14:19 korey

No teram to jestem w pełni zadowolony

2011-03-22 16:11 gość_ytjui

Ale wazelina

2011-03-22 22:04 gość_Fifi209

"Ale ten sam problem występować będzie również w systuacji, gdy wszystko robić będziemy w htaccess."

Nie będzie, bo jeżeli ustalisz regułkę w postaci np. :
(news)/(show|edit)/([0-9]+) index.php?model=$1&action=$2&id=$3

To po wpisaniu show/9/news dotrzesz do 404 o ile się nie mylę ;p

Jeżeli się mylę, to mnie popraw a ja zwracam wtedy honor. ;p

2011-03-23 06:45 nospor

@Fifi209 ale tak samo mogę ustawić w php i też wtedy problem nie wystąpi. Mówimy tu o ogólnym przypadku. Każdy inny szczególny można i tu i tu ustawić

2011-04-01 20:12 gość_szil

nie widze tej paczki w download

2011-04-02 20:37 nospor

download -> kody do artykułów -> ladneurl-niceurl.zip

2011-04-08 18:45 gość_trs

witam, a jak jest na najpopularniejszych polskich serwerach hostingowych? modul rewrite jest wlaczony czy nie?

2011-04-09 19:16 gość_ktos

Opcja ta jest raczej dostępna wszędzie. Korzystałem już z wielu hostingów i wszędzie była.

2011-05-12 20:04 gość_barthek

Trafilem przez przypadek, ale jedna uwaga - gdy w URLu mamy nazwy parametrow, to niestety nie mozna tego nazwac przyjaznym linkiem. Tzn takie cos:
domena.pl/modul/akcja/param1/value1/param2/value2
nie do konca jest przyjaznym linkiem.. Przyjazne to dopiero bedzie jak link bedzie wygladal tak:
domena.pl/modul/akcja/value1/value2

Jednak zeby nam to dzialalo konieczne jest rejestrowanie zmiennych GETowych osobno dla kazdej naszej akcji (albo ogolniej - dla modulu, gdzie parametr akcji jest jedna ze zmiennych GETowych). Nieco ciezsze w implementacji, ale jakie efekty

2011-05-16 11:08 nospor

@barthek ale to o czym mówisz można bez większego problemu zaimplementować w metodzie, którą tutaj opisałem. Ja przedstawiłem tutaj jedynie dwa wariany (z parametrami oraz strony .html). Ale można tutaj włożyć całą masę innych wariantów.

2011-05-18 07:57 nospor

Dla wszystkich tych, którzy nie chcą mieć linków z modułami a tylko z parametrami, czyli zamiast jakismodul/jakasakcja/par1/war1/par2/war2 chcecie mieć par1/war1/par2/war2 podaję co należy zmienić w pliku NUrl.class.php :

W lini 54 jest
<?php
$_GET['module'] = $arr[0];
$_GET['action'] = isset($arr[1]) ? $arr[1] : ''; //tu małe zabezpieczenie, gdyby ktoś zapomniał podać akcji
?>


Trzeba to poprostu zakomentować
<?php
//$_GET['module'] = $arr[0];
//$_GET['action'] = isset($arr[1]) ? $arr[1] : ''; //tu małe zabezpieczenie, gdyby ktoś zapomniał podać akcji
?>


Linijkę niżej jest pętla:
<?php
for ($i=2; $i < $count;$i+=2){
?>


Trzeba w niej zmienić 2 na 0
<?php
for ($i=0; $i < $count;$i+=2){
?>


Oraz w linii 87 jest:
<?php
if ($_key == 'module' || $_key == 'action')
  $_key = '';
else
  $_key.='/';
?>


Trzeba zakomentować 3 pierwsze linie:
<?php
//if ($_key == 'module' || $_key == 'action')
//  $_key = '';
//else
  $_key.='/';
?>

I już

2011-05-19 06:39 gość_Artur

Witam, czy da rade przerobić taki .htaccess na ten "nice url"?
RewriteRule ^profil,potwierdz,kod,(.*).html$ konto.php?opcja=potwierdz&kod=$1 [NC]
RewriteRule ^profil,wyloguj.html$ konto.php?login=koniec [NC]
RewriteRule ^profil,([a-z]+).([a-z]+).html$ konto.php?opcja=$1-$2 [NC]
RewriteRule ^profil,([a-z]).html$ konto.php?opcja=$1 [NC]
#strony
RewriteRule ^sc.([0-9\.]+).html$ sc.php?sid=$1 [NC]
RewriteRule ^home$ index.php?s=home [NC]
RewriteRule ^strona,([a-z]+).html$ index.php?s=$1 [NC]
RewriteRule ^strona,([a-z]+).([a-z]+).html$ index.php?s=$1-$2 [NC]
#linki dla administratora
RewriteRule ^admin,([a-z]+).html$ index.php?s=admin_$1 [NC]
RewriteRule ^admin,([a-z]+).([a-z]+).html$ index.php?s=admin_$1-$2 [NC]
#inne
RewriteRule ^wiadomosci,([odebrane|archiwum]+).([0-9\.]+).html$ wiadomosci.php?folder=$1&sid=$2 [NC]
RewriteRule ^wiadomosci,([archiwizuj|banuj|usun]+).([0-9]+).html$ wiadomosci.php?akcja=$1&id=$2 [NC]
RewriteRule ^strona,komunikator.stan.([0-9]+).html$ index.php?s=komunikator&stan=$1 [NC]

2011-05-19 07:22 nospor

U Ciebie jest ten problem, że nie masz jednego głównego skryptu. Raz to jest index.php, raz wiadomości.php a innym znowu razem sc.php

Aplikacja powinna mieć jeden główny plik i to on powinien zarządzać całością. Gdybyś tak miał, to bez większego problemu można każdą z tych regułek przepisać na podobny ruter co tutaj.

2011-05-19 17:43 gość_Artur

mogę prosić o zdiagnozowanie, czemu z tym htaccess moim, działa mi link: wiadomosci.php?akcja=banuj&id=2
a nie działa wiadomosci,banuj.2.html
z podobnymi linkami z akcją archiwizuj i usun po operacji przeadresowania nie ma problemów.

2011-05-20 07:48 nospor

Nawiasy kwadratowe służą do wyznaczania zbioru znaków a nie słów.
Nie:
RewriteRule ^wiadomosci,([archiwizuj|banuj|usun]+).([0-9]+).html$ wiadomosci.php?akcja=$1&id=$2 [NC]
a:
RewriteRule ^wiadomosci,(archiwizuj|banuj|usun).([0-9]+).html$ wiadomosci.php?akcja=$1&id=$2 [NC]

2011-05-31 17:19 gość_Gidaban

Witam

Bardzo fajna klasa ale mam jedno pytanie co w przypadku jak ma się więcej modułów a chce się mieć linki .html?


pozdrawiam

2011-06-01 13:46 nospor

No linki .html pokazałem w paczce na przykładzie newsów.
Jeśli zaś chodzi ci o to, że każdy moduł może dostarczać własny ruter, to trzeba by klasę zmodyfikować o możliwość podczepiania ruterów innych modułów. Tutaj pokazałem pewien podstawowy mechanizm. Chcąc mieć więcej trzeba go poprostu rozbudować

2011-06-03 07:52 gość_Artur

dzięki działa

2011-06-04 03:03 gość_Artur

No dobrze zmieniłem swój skrypt, teraz wszystko wychodzi z index.php czy trzeba cos zmieniać aby poniższe linki zamienić na to co po "->":

index.php?page=admin&folder=main -> /admin/main
index.php?page=regulamin-strony -> /pokaz/regulamin-strony
index.php?page=wiadomosci -> /wiadomosci
index.php?page=wiadomosci&folder=odebrane&sid=323233412312 -> /wiadomosci/odebrane/323233412312

2011-06-04 13:23 nospor

Jeśli mówimy o mojej klasie co tu pokazałem i nie chcesz w niej nic zmieniać, to linki powinienieś zmienić by zawierały parametr module oraz action

2011-06-04 14:02 gość_Artur

no właśnie nie chce korzystać z module oraz action, zakomentowałem to co napisałeś w komentarzach, co i gdzie muszę zmienić w Twojej klasie aby ładnie w niej działały moje linki ?

2011-06-04 14:18 nospor

Jeśli skorzystałeś tego zmienionego kodu, co podałem w komentarzach, to wówczas taki kod:
/admin/main jest zamieniany na taki: index.php?admin=main
/pokaz/regulamin-strony na taki: index.php?pokaz=regulamin-strony
Także trochę nie pasuje do tego co masz. Albo więc bez zmieniania mojej klasy zmienisz swoje linki, albo musisz zmieniać w klasie.

2011-06-30 14:22 gość_zozol

"jakas-nazwa,5.html" - Gdzie 5 to id newsa wyciągniętego z bazy. A jak to zrobić tak jak Ty masz tu na stronie, czyli
"jakas-nazwa.html" ?

2011-07-01 08:43 nospor

Chodzi ci o stworzenie linka czy obsługę?

2011-07-03 11:05 gość_zozol

Chodzi mi o caly proces. Jak taki link jest tworzony a nastepnie jak np. klasa routerowa obsluguje takie linki w których prawie nic poza nazwa nie zostaje podane. Bardzo bym prosił o wytlumaczenie lub jakie kolwiek nakierowanie, bo tez chciał bym zaopatrzyc swoja strone w takie linkowanie

2011-07-03 11:08 gość_zozol

Pozwole sobie napisac: U mnie na stronie linkowanie wyglada w ten sposób: domena/nazwa-kontrolera/nazwa-akcji/parametr1/parametr2 i na podstawie takiego linku router rozbija mi go i przypisuje konkretne wartosci do zmiennych, na podstawie ktorych pozniej silnik wie ktore pliki i metody zaladowac.

2011-07-03 12:38 nospor

Cały proces wygląda analogicznie jak z podaniem id.
w przykładzie podałem: nazwastrony,idstrony.html
Jeśli chcesz mieć tak jak u mnie, czyli nazwastrony.html to:
1) W bazie danych musisz przechowywać tę nazwę dla strony i ta nazwa musi być unikalna. Ja nazwy stron tworzę automatycznie biorąc tytuł i wywalam z niego polskie znaki, spacje itp.
2) Dla linku strony podajesz tylko nazwe. Ruter widzi, że w adresie jest nazwastrony.html i przekierowuje na akcję "pokaż stronę" - analogicznie tak jakby tam było jeszcze id.
3) Akcja "pokaż stronę" zamiast pobierać stronę na podstawie id to pobiera stronę na podstawie nazwy.

2011-07-03 21:22 gość_zozol

Dzieki.. bardzo, Dużo mi pomogłeś!

2011-08-22 08:57 gość_laska

Dobry artykuł.
Ta metoda klejenia jest bardzo wygodna i efektywna. Troszkę trudniejszą sprawą jest tworzenie linków na wzór:

jakasmodulpoprzedni1/jakasmodulpoprzedni2/wlasciwymodul/akcja/wartosc1/wartosc2

Jeśli chcemy aby nasze linki dostarczały wyszukiwarce więcej słów kluczowych jak np:

ogloszenia/motoryzacja/osobowe/tanie/audi-A4-2005/45006

Ja mam obecnie tak zaimplementowany system ale niestety bez użycia routera sprawdzającego kolejne parametry i szukającego najbardziej pasującego ciągu chyba się nie obejdzie.
Macie jakiś inny pomysł na taką implementację ?

2011-08-22 10:44 nospor

Na podstawie tego ciągu:
audi-A4-2005/45006
wiesz że chodzi o samochód. Teraz poprostu robisz explode() po / na ogloszenia/motoryzacja/osobowe/tanie i już masz kolejne parametry opisu.

2011-08-22 22:40 gość_laska

Ale skąd masz pewność że ten ciąg to dział ogłoszeń jeśli w serwisie prowadzisz również katalog firm i forum ? Ciągi mogą się zgadzać tu i tu więc po ścieżce od lewej musisz dojść do ostatniego parametru zawierającego moduł.

według wyrażeń adres np:

ogloszenia/motoryzacja/osobowe/tanie/audi-A4-2005/45006

..będzie tym samym co temat na forum:

kobieta/kosmetyki/firmowe/tanie/zara-X6-3000/345435

...lub wpis w katalogu:

budowlane/ogrod/rosliny/poznan/franspol/3243534

Rozróżnienie tylko przedostatniego parametru jako działu będzie samobójstwem, ponieważ ryzykowne będzie założenie że treści ogłoszenia lub tematu na forum będzie w stałym schemacie. Zmienisz lekko schemat generowania tytułu ogłoszenia i klapa.
Dlatego to ścieżka poprzedzająca a dokładnie ostatni parametr MODUŁOWY powinien dać Tobie informacje na temat id działy/pliku wykonywalnego. Ja to rozwiązałem poprzez Router który porównuje od lewej każdy parametr adresu z ścieżkami zapisanymi już w routerze na przykład z bazy. Dzięki temu mogę tworzyć adresy na wzór: moduł1/moduł2/parametr lub też moduł1/moduł2/moduł3/moduł4/moduł5/parametr/parametr i każdy przypadek będzie działał ponieważ odszuka mi pasującą ścieżkę do wszystkich parametrów
Minus to czas jaki potrzebuje kompilator na znalezienie odpowiedniej ścieżki, aby to zredukować zastosowałem cache na generowaniu linków i problem zostaje rozwiązany, choć wciąż szukam jeszcze jakiegoś innego rozwiązania.

2011-08-23 07:33 nospor

No a czemu nie dasz jakiegoś przedrostka, określającego co jest co? Przecież to nie zaszkodzi

ogloszenia/motoryzacja/osobowe/tanie/audi-A4-2005/m-45006
kobieta/kosmetyki/firmowe/tanie/zara-X6-3000/f-345435
budowlane/ogrod/rosliny/poznan/franspol/k-3243534

I już. Po końcowóce będziesz widział że to jest motoryzacja, forum czy katalog.

2011-08-23 09:08 gość_laska

Nie podchodzi mi taka kombinatoryka, ponieważ z doświadczenia wiem że to rozwiązanie do czasu kiedy przyjdzie mi generować inny schemat url. Zresztą nie muszę mieć identyfikatora strony.
Przy moim założeniu mogę generować działy zarówno takie:

/ogloszenia/motoryzacja/osobowe/tanie/audi-A4-2005/m-45006

jak i :

/kontakt lub oferta/budowlane

gdzie nigdzie nie mam żadnych identyfikatorów aby url ładnie wyglądał, system i tak znajdzie odpowiednią ścieżkę do działu tekstowego budowlane.

2011-08-23 09:25 nospor

Nie podchodzi mi taka kombinatoryka, ponieważ z doświadczenia wiem że to rozwiązanie do czasu kiedy przyjdzie mi generować inny schemat url.
I dlatego właśnie tutaj w arcie przedstawiłem jedną klasę do generowania i odbierania linków. Dzięki temu, nawet jak nagle komuś zachce się zmieniać schemat linków to zmiany robi tylko w tej klasie nie ruszając w ogóle reszty kodu aplikacji.

2011-08-23 13:46 gość_laska

Celem jest nie modyfikowanie w ogóle klasy

2011-08-23 13:47 gość_laska

Poza tym przypadek który poruszyłem dotyczy tego samego serwisu wiec zmiana w klasie nie wchodzi w grę. Działy tekstowe maja adresy /oferta/costam a dział ogłoszeń /ogloszenia/motoryzacja/osobowe/tanie/audi-A4-2005/45006

2011-08-26 21:41 Michał

Witam,
Sporo myślałem nad idealną klasa routera. Stwierdziłem, ze nie może to być jedna klasa. Doszedłem również do wniosku, że nie da się zrobić bez konfiguracji linków super krótkich, po którym wiedziałbyś, że /kontakt.html to moduł page kontroler page i akcja contactForm, a strona /o-mnie.html to moduł page kontroler page i akcje show.

Musimy zrobić router, który by to wszystko pamiętał. Skoro ma pamiętać, to gdzie?
- Baza danych - Każdy link w bazie a dane o kontrolerach wyciągamy z bazy
- System plików - zapisujemy sumę kontrolną linku jako nazwę pliku a tam czeka na nas zserializowana tablica z parametrami, który moduł/kontroler/akcję odpalić.

Nie chciałbym mieszać do tego bazy danych bo po co mi przy prostej stronce jedno zapytanie więcej?
Wszystko piszę tak, aby siedziało w cache(nawet ja dodaje coś w panelu to panel odświeża cache, więc jak zdarzy mi się kilka zapytań na dzień to jest max)

Jestem ciekawy jak wy rozwiązaliście ten problem, a szczególnie Ty Nosporze.

Póki co u mnie do routera wstrzykuję różne wzorce z configu, które są porównywane z adresem i na tej podstawie wiem co odpalić(frontend). W backendzie mam linki: /moduł/kontroler/akcja/param/value/

Ostatnio próbowałem zaimplementować Uploadify do łatwiejszego wgrywania plików i oto na co napotkałem - Error 404. Po prostu pod Firefoxem flash z uploadify otwierając php tworzy nową sesję(wiedziałem o tym - akurat do obejścia, pod IE wszystko ok) i nie akceptuje linku w formacie, który wyżej podałem. Więc musiałem do routera dodać hook, żeby można było korzystać z normalnych parametrów GET. Myślałem, że będzie ok ale zdziwiłem się jak tylko pierwszy parametr z $_GET trafił do skryptu uploadującego! Nie dałem za wygraną i wstrzyknołem do routera nowy mechanizm, który pozwala tworzyć linki w tym formacie: http://localhost/admin-page-edit-lang-pl-module_id-2-mode-uploadattachment-id-2-session-vsnbjiikb11pfh3p5btojvo683.php. Wszystko działa.

Czekam na wasze rozważania dotyczące routingu. Dodam, że nawet programiści z MyBB zaimplementowali nice urls w bazie danych

Pozdrawiam

2011-08-26 21:46 Michał

A tak nawiasem mówiąc to witam po dłuższej przerwie po zdradzie PHP z C

2011-08-27 13:00 nospor

U mnie produkcyjnie to jest jedna klasa, podobna do tej tutaj.
Z jedną "małą" różnicą: klasa pozwala na dodawanie ruterów innych modułów. Czyli moduł X dodaje do klasy swój ruter, moduł Y dodaje do klasy swój ruter itd. Później klasa leci pokolei z ruterami i jeśli któryś z ruterów uzna, że dany link jest jego to go obsługuje i dalsze ruterty już danego linka nie ruszają.

Dzięki temu rozwiązaniu mogę spokojnie pisać modułowo i nie martwić się, że nagle w core będę musiał obsłużyć linki z jakiegoś modułu.

, po którym wiedziałbyś, że /kontakt.html to moduł page kontroler page i akcja contactForm, a strona /o-mnie.html to moduł page kontroler page i akcje show

Ja akurat z tym nie mam problemu. Każda strona normalna.html to akcja cms. A to czy do tej strony będzie dołączony np. formularz kontaktowy czy coś innego to ja to ustawiam na poziomie cms.

ps: zdrada wybaczona

2011-08-27 14:06 Michał

Ja akurat z tym nie mam problemu. Każda strona normalna.html to akcja cms. A to czy do tej strony będzie dołączony np. formularz kontaktowy czy coś innego to ja to ustawiam na poziomie cms.


Ale żeby wiedzieć co podpiąć do stronki kontakt.html to system leci do bazy/cache i bierze sobie z niego dane co ma odpalić(tekst/galerię/formularz kontaktowy)?

Jeżeli tak to zapewne masz tabelę PAGES i tam trzymasz identyfikatory stron, czyli trzeba wmieszać do linków bazę danych

pzdr

2011-08-27 14:15 Michał

Odnoście: $_SERVER['PATH_INFO'] to ja la lokalnym nie mam tej zmiennej w tablicy $_SERVER.
Więc trzeba wrzucić kilka parametrów i jak któryś istnieje to z niego korzystamy.

PHP Version 5.3.6

2011-08-27 21:06 nospor

Ale żeby wiedzieć co podpiąć do stronki kontakt.html to system leci do bazy/cache i bierze sobie z niego dane co ma odpalić(tekst/galerię/formularz kontaktowy)?
Albo Ja cię nie kumam, albo na odwrót

Na podstawie linku kontakt.html wiem, że mam odpalić akcję show w module cms z parametrem name=kontakt. I tyle. Link został rozwiązany. A co zrobić akcja show w module cms to już jej sprawa.

2011-08-28 18:02 Michał

[quote]Ale żeby wiedzieć co podpiąć do stronki kontakt.html to system leci do bazy/cache i bierze sobie z niego dane co ma odpalić(tekst/galerię/formularz kontaktowy)?

Albo Ja cię nie kumam, albo na odwrót

Na podstawie linku kontakt.html wiem, że mam odpalić akcję show w module cms z parametrem name=kontakt. I tyle. Link został rozwiązany. A co zrobić akcja show w module cms to już jej sprawa.[/quote]

OK, rozumiem. Masz zrobione to "na sztywno". Chciałbym wiedzieć, czy w twoim CMS jest taka możliwość, ze inny moduł korzysta z końcówki .html czy tylko moduł cms jest do tego uprzywilejowany?

2011-08-29 07:47 nospor

Nie, końcówka .html nie jest przeznaczona dla cms.
Weź np. moduł forum:
http://forum.nospor.pl/programowanie/php-ff5.html
http://forum.nospor.pl/programowanie/php/zabezpieczenie-skryptu-ft222.html
Też mają końcówkę .html. Tylko zauważ, że dla forum końcówka wygląda tak: -ffLICZBA.html, -ftLICZBA.html
I już. Na tej właśnie podstawie rozróżniam co jest cms a co jest forum. Żadne zapiski w bazie tu nie są potrzebne.

2011-08-31 18:39 gość_bigzbig

Trochę to archaiczne, ale grunt że działa i jest sprawdzone. Ja od czasu kiedy poznałem Django zastanawiałem się dlaczego w PHP nie można zrobić podobnego routingu jak w przytoczonym frameworku. Okazało się, że można choć nie daję głowy, że z wszędzie i zawsze.

http://blog.heintze.pl/2011/08/31/nice-url-przyjazne-linki/

2011-09-01 08:17 nospor

No u siebie ja też używam wyrażeń regularnych. Tutaj jednak pisałem arta bardziej z myślą o początkujących użytkownikach i nie chciałem wyrażeń w to mieszać. Może moje założenie było błędne. Ale chodziło mi głównie o przedstawienie ogólnego mechanizmu.

2011-09-01 16:39 gość_eccocce

Hej nospor,
Ciekawe rozwiązanie, właśnie staram się wrzucić je u siebie.
$pathInfo = trim($_SERVER['PATH_INFO'], '/'); //usuwamy znak / z końca

Wyrzuca Notice, gdy jest pusty URL.

Poza tym, gdy dodam / na koniec URL-a to cuda się dzieją. Zacząłem wątek o tym na forum:
http://forum.php.pl/index.php?showtopic=183383

Jeśli masz jakąś radę, to będę wdzięczny.
Pozdrawiam

2011-09-01 17:02 nospor

Zauważ, że u mnie w kodzie jest:
<?php
//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;
		}	
?>

2011-09-01 17:04 gość_eccocce

No tak, wziąłem kod prosto ze strony zamiast z downloadu.

2011-09-01 17:09 nospor

Faktycznie... na stronie dałem wersję light
Poza tym, nie mam problemu co ty masz, że gdy na końcu będzie / to strona szaleje. Nawet w paczce w download masz działający skrypt, który zawiera własnie linki z / na końcu i wszystko działa. Sprawdź to u siebie. To jest gotowa paczka do odpalenia

2011-09-01 17:39 gość_eccocce

Wziąłem paczkę ze strony i jest ta sama sytuacja.
Wrzuć sobie do folderu z rozpakowanymi plikami np. folder img i tam plik logo.png
W 25. linijce pliku index.php dodaj:
echo '<img src="img/logo.png" alt="" />';

Jak wywołasz adres/test to obrazek pokazuje się, a jak już adres/test/ to znika...
Skrypt z plikiem graficznym i tą dodatkową linijką wrzuciłem tutaj jakbyś chciał szybko przetestować. http://szkolea.pl/nospor.zip

Tutaj na stronie wykorzystujesz tę samą wersję, czy "bogatszą"?

2011-09-01 20:47 Michał

Ajć, szkolny błąd. Poczytaj o sposobie przypisywania linków w html a dużo się dowiesz.
Słowa kluczowe: meta tag base, ścieżki bezwzględne

Pozdrawiam

2011-09-02 08:02 nospor

Mi tam Twój kod działa dobrze niezależnie od adresu.
Aczkolwiek Michał dobrze napisał - lepiej podawać pełne linki do zasobów. Spróbuj z pełnym liniem i daj znać jak teraz.

2011-09-02 20:19 gość_eccocce

Ścieżki bezwzględne zostawiłem sobie jako ostateczność Myślałem, że problem leży w czymś innym, bo sugerowałem się tym, że np. Ty nosporze w CSS tej strony używasz ścieżek względnych (używasz tagu base?). W każdym razie dziwne, że ten mój kod Ci działa niezależnie od adresu...
Wrzuciłem ścieżki bezwzględne i wszystko ładuje się bez problemu!
Dzięki jeszcze raz nospor za skrypt.

2011-09-02 20:21 nospor

Nie, nie... w css można używać ścieżek względnych - akurat w css to działa bez zarzutu. Natomiast w kodzie strony lepiej podawać pełne ścieżki. Kiedyś bawiłem się tym cudem BASE, ale w praktyce okazało się, że ma to więcej wad niż zalet i zaprzestałem używania tego.

2011-09-02 22:09 Michał

Fajne rozwiązanie to kompilator do styli/cacheowanie ich i wtedy masz fajne pole do popisu do ścieżek bezwzględnych nawet w kodzie css.

Pozdrawiam

2011-09-04 17:03 gość_eccocce

Coś nie dodałem się mój komentarz... Napiszę jeszcze raz.

W kodzie strony, przed każdą ścieżką do obrazka/pliku JS/pliku CSS dodałem zmienną, a przy generowaniu strony podmieniam zmienną na taki kod:

$var = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']).'/';


No i póki co działa. Nie chciałem na sztywno wpisywać wszędzie ścieżek, bo przy przeprowadzce byłby problem...

Mam nadzieję, że teraz uda się dodać komentarz

2011-12-06 20:12 gość_Robson

Dzięki przyda się artykuł i to bardzo, bo właśnie jestem w trakcie zmiany swoich adresów na stronce.

2012-01-24 21:19 gość_siutek

witam, probuje zaimplementować to u siebie, ale plik .htaccess spreparowany jak wyżej powoduje błąd serwera 500, w logach widzę taką oto linijkę:

.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration

czegoś mi brakuje?

pakiet XAMPP, php 5.3.5

2012-01-24 21:26 gość_siutek

eee, dobra, z tym blede sobie poradzilem, skrypt ładnie wyłapuje do zmiennych wszystkie parametry, tak jak nalezy. niestety nie wiem czemu nagle posypała mi się cała grafika - pogubił ścieżki, do css'a i nie tylko

katalog pix znajduje się wewnatrz katalogu ze stroną, jednak serwer mysli ze /pix/ ma lokalizację wewnątrz http://localhost/strona/modul/akcja/param1/wartosc1/ - tak jakby to byla sciezka katalogow :/

2012-01-24 21:40 gość_siutek

qrcze, troche za szybki jestem w pisaniu, i na powyzszy problem znalazlem rozwiazanie

<base> w sekcji head i wszystko smiga!

sorki za potok komentarzy

2012-01-25 08:50 nospor

<base> nie jest najlepszym pomysłem. Prędzej czy później się na nim przejedziesz. DLa css, js i obrazków podawaj pełne ścieżki dostępu a nie skrótowe. Wówczas nie będziesz miał z niczym problemów

2012-01-29 18:14 gość_siutek

dlaczego <base> jest zlym rozwiazaniem? w jakich okolicznościach bede mial z nim problemy?

2012-01-30 08:09 nospor

Nie podam ci teraz konkretnego przykładu. Parę lat temu sam używałem base i byłem z niego zadowolny. Potem nagle pojawił się pewien problem, naprawdę nie pamiętam jaki, ale wiem, że miałem z nim sporo kłopotu.

O wiele bezpieczniejsze i pewniejsze jest używanie pełnych ścieżek.

2012-04-19 14:48 gość_prawie działa.

Siema, wgrałem twój skrypt i elegancko chodzi, ale jest jedna mała sprawa.

Gdy podam więcej, niż jeden parametr w linku (prócz modułu podam też akcję) to gdzieś po drodze strona gubi swój styl css. I to ciekawe, że gdy mam w linku tylko moduł, np.
http://localhost/site
to normalnie się zachowuje, łącznie z zachowaniem stylu, a jak w linku podam więcej parametrów, np.
http://localhost/site/jakasakcja albo ukośnik na końcu http://localhost/site/ to styl się gdzieś chowa. Mój .htaccess nie różni się od Twojego. Obojętne, czy plik .css mam tam, gdzie index czy w innym folderze.

Liczę na szybką odpowiedź. Z fartem.

2012-04-19 15:06 nospor

Przeczytaj komentarze, bo jest to tutaj wyjaśniane już 50 razy.... np. parę ostatni komentarzy

2012-04-19 15:30 gość_prawie działa.

hehe dobra, nie przeczytałem wszystkie, działa dzięki.

Dla tych co będą szukać tego samego polecam to:
http://eriz.pcinside.pl/weblog/mod_rewrite-pozornie-beznadziejne-problemy-ktore-mozna-rozwiazac-208.html#t83

2012-09-13 00:24 gość_siutek

Witam Cię nosporze poraz kolejny
znow chcialem użyć Twojej klasy na swojej stronie, i na localhoscie smiga to jak trzeba! (XAMPP z oryginalnym php.ini)

natomiast gdy przerzuciłem strone na serwer, zaczely sie problemy, podejrzewam ze problem rozwiarze odpowiednia konfiguracja pliku htaccess, ale nie moge znalezc tej wlasciwej.

serwer docelowy: Dreamhost
przy pierwszej konfiguracji hatacces:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)         index.php/$1 [L] [QSA]


pojawil sie komunikat "No input file specified."

zatem dopisałem do pliku linijkę "Options Indexes, Symlinks, Multiviews"
teraz mam internal server error 500

zmienilem linijkę z Options.. na następującą: "Options Indexes Includes MultiViews"
teraz otrzymuje Forbidden 403

wiem, że troche bezmyslnie wklejam to co znajde, ale plik htacces to dla mnie czarna magia, wiec poruszam sie o omacku :/

2012-09-13 07:58 nospor

Zostaw mój oryginalny htaccess i po wejściu na jakąś stronę z niceUrl zrób
print_r($_SERVER);
i pokaż co wyświetla

2012-09-13 11:41 nospor

Ok, problem siutka omówiliśmy mailowo. Okazało się, że jego hosting nie radzi sobie z banalną sprawą, więc trzeba było to obejść. O to rozwiązanie

W .htaccess zamiast
index.php/$1
należy dać
index.php?pathinfo=$1


A następnie w moim kodzie php każde wystąpienie
$_SERVER['PATH_INFO']
zamienić należy na
$_GET['pathinfo']

I już

2012-09-13 13:33 gość_siutek

jeszcze raz dzieki nospor

a tak z innej beczki, zasłyszałem gdzieś opinię, że linki w formie np www.domena.pl/35,nazwa-dzialu.html, gdzie przed przecinkiem jest id wyswietlanej strony, są lepiej ocenianie przez google niż w formie jaką przedstawiles powyzej.

mysle ze z przerobieniem Twojej klasy nikt jakby co nie bedzie mial problemu, ale jestem ogolnie ciekaw jak to w koncu jest. czy rzeczywiscie jest jakas roznica w postrzeganiu przez wyszukiwarkę różnych rodzajów nice url's.

2012-09-13 15:19 nospor

No przecież w paczce do tej klasy jest również przykład, gdzie masz strony .html Tak więc no problem.

Co do google to nie wiem. Ktoś tam kiedyś gadał że lepiej, jak jest html, dlatego u mnie na stronie arty są właśnie jako .html . Ale ile w tym prawdy to nie mam bladego pojęcia. Średnio interesuje mnie google.

2012-09-13 21:46 gość_siutek

no dobra, to teraz mam inny problem,
po wprowadzeniu zmian niestety przestaly mi dzialac formularze, tablica $_POST wogole nie jest przekazywana :-/ oczywiscie na localhoscie wszystko dziala jak nalezy, nawet z Twoim ostatnim obejsciem mojego problemu.

2012-09-14 07:43 nospor

No to po wysłaniu forma zrób:
print_r($_SERVER);
print_r($_POST);

2012-09-15 13:08 gość_zamp

Czy twoją klasę można wykorzystywać w komercyjnych projektach?

2012-09-15 19:10 nospor

Można

2012-11-28 09:47 gość_acidm

Czy $_SERVER['ORIG_PATH_INFO'] powinna być ustawiona nawet gdy odnosimy bezpośrednio do index.php ?
Czy $_SERVER['ORIG_PATH_INFO'] powinna wskazywać na ścieżkę w postaci 'index.php/module/action/' ?


Na serwerze testowym $_SERVER['ORIG_PATH_INFO'] jest dostępne nawet gdy odwołuje się do istniejacego index.php w dodatku w ścieżce z $_SERVER['ORIG_PATH_INFO'] znajduje "index.php"...

Jeśli $_SERVER['ORIG_PATH_INFO'] ma być zamiennikiem $_SERVER['PATH_INFO'] to sobie wytne ten index.php w razie wykrycia, pytanie tylko czy to tak jest normalne ponieważ z $_SERVER['ORIG_PATH_INFO'] spotykam się poraz pierwszy.

2012-11-28 12:36 nospor

Użyłem ORIG_PATH_INFO ponieważ na niektórych serwerach nie ma PATH_INFO.

2012-11-28 12:56 gość_acidm

To dobrze , a te różnice które wystąpiły u mnie to raczej rzadkie zjawisko czy tak poprostu jest ?

2012-11-28 13:40 nospor

Mi PATH_INFO wskazuje bez index.php

2012-11-28 15:10 gość_acidm

mi path_info tez ale orig_path_info wskazuje juz z index.php..
no ale dobra wiem jak sobie z tym poradzic...
dzieki

2012-12-12 16:58 gość_bdamian

Ze względów bezpieczeństwa, lepiej byłoby nie używać tablicy $_GET, tym bardziej, że nie ma takiej potrzeby. Lepiej stworzyć tablicę o dowolnej innej nazwie, obsługiwaną lokalnie. Jeśli będzie ona w głównym pliku, to podstrony zaincludowane do niej też ją zobaczą.

2012-12-13 08:15 nospor

Możesz napisać o jakich względach bezpieczeństwa mówisz? Bo osobiście nie widzę żadnego.

Owszem, super hiper profesjonalnie należałoby to zrobić na oddzielnej tablicy, ale nie chciałem tu już nikomu mieszać. Poza tym jak pisałem problemów z bezpieczeństwem nie widzę żadnego.

2013-06-17 15:55 gość_kony

Mam pytanie czy ten skrypt można zastosować w phpbb3pl bo nie chce stosować rozwiązania seo z prostej przyczyny by klient czegoś potem nie poprzestawiał

2013-06-17 20:55 nospor

Można to stosować wszędzie, no ale jeśli to jest phpbb to najlepiej mieć to w postaci pluginy czy modułu czy co tam ma te phpbb3, by się jak najmniej narobić.

2013-07-18 18:30 gość_bacok

Witam, skorzystałem z tego skryptu aby stworzyć ładne url'e, u mnie na kompie i na darmowym hostingu wszystko działało bez zarzutów. Po wykupieniu hostingu na domena.pl niestety nie jest już tak pięknie.
Przekierowania ogólnie działają np. www.adresstrony.pl/kontakt/, lecz wyświetla samą zawartość pliku kontakt.php a nie działa na zasadzie index.php?module=kontakt. Oto zawartość pliku .htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1 [L]

Uprzedzając pytanie: serwer obsługuje .htaccess.
Proszę o pomoc.

2013-07-19 08:51 nospor

NIe za bardzo zrozumiałęm Twój problem.

1) Robiles jakies zmiany w stosunku do mojego kodu?
2) Pokaz co wyswietla
print_r($_SERVER);
dla adresu
. www.adresstrony.pl/kontakt/

2013-07-19 11:05 gość_bacok

Dzięki za odpowiedź, już sobie z tym poradziłem.
Na tym hostingu wpisanie www.adresstrony.pl/kontakt/ powodowało otwarcie pliku kontakt.php i co by się nie wpisało to ...pl/cokolwiek/ wyszukiwało pliku cokolwiek.php i go otwierało.
W switchu miałem case 'kontakt': include('kontakt.php'). Gryzły się nazwy.
Po zmianie nazwy pliku na contact.php i zmianie include('contact'.php) przy www.adresstrony.pl/kontakt/ wszystko działa jak powinno.
Problem niby prosty, na pierwszy rzut oka myślałem że to wina .htaccess

2013-07-19 12:01 nospor

Hm.... bardzo dziwne zachowanie hostingu ze sam odpala pliki wg. wlasnego widzimisie...
Grunt, ze problem już rozwiązany. Warto by jednak poszukac czy jest mozliwosc wyłączenia tego cuda na hostingu bo IMHO jest to złe zachowanie.

2013-09-26 14:48 randall

http://jokes.nospor.pl/asd/asd/asd

witam, nospor jak zrobiłeś że wyświetla że strona nie istnieje? nie mogę tego znaleźć w twoim kodzie?

2013-09-26 15:04 nospor

Poprostu jak ktos odpala akcje, ktorej nie ma, to wywalam blad. Mam zdefiniowaną liste modułów i akcji i wiem czy dana akcja jest czy jej nie ma

2013-10-13 19:23 gość_PerfectM

Witam,
mam problem. Otoz probuje przepisac prosty url echo '<a href="'.$nurl->Url('account').'">Modul testowy z jakas akcja</a><br />';
zeby po odpaleniu dalo wynik index.php?page=account
zmienilem module na page w twoim kodzie gety wsywietla
Array ( [pathinfo] => account [page] => account [action] => ) czyli ze page jest account ale strona sie nie wyswietla.

Array ( [REDIRECT_STATUS] => 200 [HTTP_HOST] => localhost [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [HTTP_ACCEPT_LANGUAGE] => pl,en-us;q=0.7,en;q=0.3 [HTTP_ACCEPT_ENCODING] => gzip, deflate [HTTP_COOKIE] => PHPSESSID=9gkq8f4u6bnq9m5964gvt56dp1 [HTTP_CONNECTION] => keep-alive [PATH] => C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\; [SystemRoot] => C:\Windows [COMSPEC] => C:\Windows\system32\cmd.exe [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC [WINDIR] => C:\Windows [SERVER_SIGNATURE] => [SERVER_SOFTWARE] => Apache/2.4.4 (Win64) PHP/5.4.12 [SERVER_NAME] => localhost [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => C:/wamp/www [REQUEST_SCHEME] => http [CONTEXT_PREFIX] => [CONTEXT_DOCUMENT_ROOT] => C:/wamp/www [SERVER_ADMIN] => admin@example.com [SCRIPT_FILENAME] => C:/wamp/www/FORUM/index.php [REMOTE_PORT] => 51261 [REDIRECT_QUERY_STRING] => pathinfo=account [REDIRECT_URL] => /FORUM/account [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => pathinfo=account [REQUEST_URI] => /FORUM/account [SCRIPT_NAME] => /FORUM/index.php [PHP_SELF] => /FORUM/index.php [REQUEST_TIME_FLOAT] => 1381684567.027 [REQUEST_TIME] => 1381684567 )
Mozesz na to cos poradzic?
Dodam ze zmienilem w .htaccess z index.php/$1 na index.php?pathinfo=$1

P.S.Jak dodam / na koncu to nie wyswietlaja mi sie niektore obrazki(to akurat styl) ale rowniez nie wyswietlaja sie strony(zmienilem wczesnie w htaccess index.php?page=$1)

2013-10-14 08:26 nospor

Dodam ze zmienilem w .htaccess z index.php/$1 na index.php?pathinfo=$1
Czemu?

Array ( [pathinfo] => account [page] => account [action] => )

Skoro wyswietla w get page=account, znaczy ze wszystko jest ok. Blad masz gdzies w aplikacji, ze nie zle odbierasz te dane.

P.S.Jak dodam / na koncu to nie wyswietlaja mi sie niektore obrazki(to akurat styl)
Sciezki do obrazkow, plikow js czy css maja byc pelne.
Czyli nie: obrazek.jpg
a: http://strona.pl/images/obrazek.jpg

Analogicznie dla styli i plikow js

2013-11-04 11:55 gość_Jankes

Co zrobić aby debugger facebooka (https://developers.facebook.com/tools/debug) 'widział' stronę? Bo teraz gdy wkleję np http://pwtr.pl/pobierz/ na fb jako post, nie widzi żadnego zdjęcie a gdy wpiszę to w debuggerze wywala w odpowiedzi błąd 404

2013-11-04 12:31 nospor

Jak odpalisz to na Firefox to tez widac, ze strona zwraca 404. Cos nie tak masz wiec ze stroną, pomimo ze poprawnie wyswietla tresc

2013-11-13 09:36 gość_Jankes

Witam ponownie.
Piszę odnośnie poprzedniego problemu. Gdy odpalam stronę z nurl'em na localhoscie nie wywala żadnych błędów, natomiast na serwerze wyskakuje 404. Czym może to być spowodowane (hosting ovh)

2013-11-13 11:53 nospor

Nie wiem czym to moze byc spowodowane

2014-02-28 14:24 gość_Piotr

Witaj,

Mam problem z użyciem modułu.
Wgrałem .htaccess oraz index.php

Teraz jak wywołuję np.
http://localhost/test/parametr/

skrypt poprawnie kieruje do pliku test.php


Nie wiem natomiast jak w pliku test.php odebrać z adresu paramter.
Próbuję tak:
echo $_GET['action'];
echo $_GET['module'];

ale nie działa.
Co robię źle?

2014-02-28 15:08 nospor

Miales chyba na mysli index.php a nie test.php?

Zas dane w $_GET pojawią się dopiero po wykaniu $nurl->Decode();

2014-03-21 09:14 gość_jaro

a jak użyć tej klasy do przesłania formularza przez <form action="" method="get"> ??

2014-03-21 09:20 nospor

Chodzi ci o to, ze formularz idzie GETem i parametry się wywylają standardowo? No tego nie przeskoczysz.
A po co forma wysylasz GETem?

2014-06-09 09:34 gość_Forti

Mam taki kod, który obsługuje wszelkie linki na stronie, poprzez include:

<?php
$pages = array(
	'dia'=>'artykuly/diablo.php',
	'log'=>'log/{log}.php',
	'inc'=>'artykuly/{inc}.php',
);

$errorPage = 'artykuly/error.php';
$page = 'artykuly/news.php';

foreach($pages as $k=>$v){
	if(isset($_GET[$k])){
		$page = realpath(str_replace('{'.$k.'}',$_GET[$k],$v));
		if(!file_exists($page)){
			$page = $errorPage;
		}
		break;
	}
}
include($page);


?>



Jak mogę to najłatwiej przerobić pod twoją klase? Nie mogę sobie z tym poradzić.

2014-06-09 10:07 nospor

Nie bardzo rozumiem co tu chcesz przerabiac pod klase? To co masz, to includowanie odpowiedniego skryptu w zaleznosci od parametru w GET. Zas moja klasa sluzy do generowania ładnych linkow i odbierania parametrow z ładnych linkow do postaci standardowej tablicy GET.

2014-06-09 10:13 gość_Forti

Po prostu mam problem ze wstawieniem tego u siebie. Widać muszę więcej nad tym pomyśleć. Kod który pokazałem wyżej może zostać, z tym że tablice $pages potrzebuje przerobić, prawda?

Wyżej w komentarzach ktoś podał link do czegoś takiego:

<?php

$urls = array(
    '/pl/news/list/1/',
    '/news/list/1/',
    '/news/list/',
);
// Ścieżka która pasuje do powyższych urli - parametry lang i page są opcjonalne
$route = '%^/((?P<lang>\w{2})/)?(?P<controler>\w+)/(?P<method>\w+)/((?P<page>\d+)/)?$%';
 
// Definicja wartości domyślnych parametrów opcjonalnych
$defaults = array('lang' => 'pl', 'page' => 1);
 
// Odczytanie ze ścieżki nazw parametrów
preg_match_all('/P\<(\w+)\>/', $route, $matches, PREG_PATTERN_ORDER);
$params = $matches[1];
 
foreach ($urls as $url) {
    // Założyłem w przykładzie, że wszystkie urle pasują do ścieżki 
    // więc nie sprawdzam czy tak jest
    preg_match($route, $url, $matches);
    $vars = array();
    foreach ($params as $param) {
        // Oczytanie z urla wartości parametrów lub nadanie wartości domyślnych
        $vars[$param] = (isset($matches[$param]) && !empty($matches[$param])) 
            ? $matches[$param] : $defaults[$param];
    }
    print $url."<br />"; print_r($vars);
}
?>

2014-06-09 10:42 nospor

Moze napisz po prostu jakie chcesz miec docelowe linki

2014-06-09 10:58 gość_Forti

require twoja klasa

dalej twój kod z pliku index (bez controler)

następnie mam taki link:

<?php echo'<a href="'.$nurl->Url('inc=news').'">'?>Aktualne</a>

<?php
$pages = array(
	'dia'=>'artykuly/diablo.php',
	'log'=>'log/{log}.php',
	'inc'=>'artykuly/{inc}.php',
);

$errorPage = 'artykuly/error.php';
$page = 'artykuly/news.php';

foreach($pages as $k=>$v){
	if(isset($_GET[$k])){
		$page = realpath(str_replace('{'.$k.'}',$_GET[$k],$v));
		if(!file_exists($page)){
			$page = $errorPage;
		}
		break;
	}
}
include($page);


?>



Niby działa, jednak nie ładuje plików css (lokalizacja/style.css) oraz po kliknięciu w link adres to:

http://twojstrona.pl/inc/news/

a na tej stronie kolejny to już:

http://twojstrona.pl/inc/news/inc/news itp.

2014-06-09 11:07 nospor

Zeby dzialaly css, js czy inne takie, to masz do nich podawac pelne sciezki. Bylo o tym tu to pisane.
Nie plik.css
a: http://pelnyadres_do_plki.css

Jesli zaś tworzy ci takie zawijance
http://twojstrona.pl/inc/news/inc/news
znaczy ze zle przekazales basePath do klasy

2014-06-09 11:10 gość_Forti

z tymi zawijcami po prostu wyłączyłem module (opisałeś co zrobić gdzieś w komentarzach, zmiany w klasie)
Już testuje pełne ścieżki, jak nie odpisze to problem rozwiązany, dzięki za pomoc.

2014-06-09 11:15 gość_Forti

ehhm, pomęczę Cie troche. Teraz ładuje mi "strona.pl/inc/archiwalne/" i nie czyta wogóle linków. Czyli moje rozwiązanie okazało się błędne, nie wiem jak inaczej przekazać basePath do klasy.

2014-06-09 11:24 nospor

Zamien poprostu ten kod:
<?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,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);
	
//stworzenie obiektu do generacji linków
$nurl = new NUrl($baseUrl);

?>


na:
<?php

$baseUrl = 'http://twojastrona.pl/';
$nurl = new NUrl($baseUrl);

?>

2014-06-09 11:57 gość_Forti

Działa i to z "normalnym" baseURL (tym dłuższym).

Mam problem z metodą post (action="") w input... jakieś rozwiązania? Jak zostawie jak było to robi się sieczka (www.strona.pl/index.php?inc=score" i linki wyglądają: www.strona.pl/index.php?inc=score/inc/news). wrzucanie kodu php w to nie działa ;]

np tak:

<form id="score" action="<?php $nurl->Url('inc=score')?>" method="POST">

2014-06-09 12:20 nospor

No bo by cos wywalic do przegladarki to trzeba uzyc ECHO.....
<?php echo $nurl->Url('inc=score'); ?>
Moze zamiast brac sie za jakies powazniejsze klasy, powtorz podstawy?

2014-06-09 14:40 gość_Forti

czasami popełniam takie głupie błędy, wiem ;]

mam coś takiego:

...

echo'
<h4><a class="comment" href="'.$nurl->Url('klan=komentarzart&newsid='.$myrow[newsid].'').'">'.$myrow['title'].'</a></h4>
';


i na stronie znak & mi gnie. Link wygląda: http://www.strona.pl/klan=komentarzartnewsid=xxx. Jakie mogą być potencjalne przyczyny?

2014-06-10 08:46 nospor

A ktorej wersji klasy uzywasz? Jedna była z wyrzuceniem modulow i akcji. Pokaz kod metody Url()

2014-07-04 10:16 gość_użyszkodnik

@nospor jak zrobić takie coś, aby identyfikatora tablicy $_GET nie przypisywać do linku? Czyli jeśli mamy taki GET: $_GET['test'] = 'wartosc' i z tego link: test/wartosc - chciałbym mieć w linku samo /wartosc, ale nie wiem jak potem odnaleźć która wartość jest która, jeśli będę mieć kilka takich getów w linku? Tutaj: http://www.php.pl/Wortal/Artykuly/Pomysly-porady-sugestie-dobre-nawyki/Przyjazne-URLe
twierdzą, że się da:

(...) Wada ta jednak dla dobrego programisty jest praktycznie niewidoczna.

2014-07-04 12:00 nospor

No musisz poczyms odrozniac, ze dana wartosc dotyczy danego indeksu. Jesli bedziesz mial tylko jeden rodzaj wartosci przypisanej do danego indeksu, to nie ma problemu, mozesz tak zrobic. Ale jesli bedziesz przekazywal kilka rodzajow wartosci do roznych indeksow, to musisz w jakis sposob je rozrozniac. W jaki? To juz od Ciebie zalezy jak ci bedzie wygodniej. Czy to przez szczegolną wartosc, czy to przez modul w ktorym jest ta wartosc czy moze jeszcze cos innego

2014-07-22 01:29 gość_artcol

Hej a co zrobić aby z linka module=foto&id=2&name=tytuł fotki osiągnąć url /foto/2/tytul-fotki, albo /foto,2,tytul-fotki albo z linka module=foto&id=2 osiągnąć/foto/2

2014-07-23 08:34 nospor

W moim przykładzie miales /moduł/akcja. U ciebie jest tylko /moduł wiec przerob ciutke kod i wywal akcje

2014-09-11 12:00 gość_gości22

Mam malutki problem ;]

na serwerze wamp 2.0, z php 5.5 pojawia mi się coś takiego:

Notice: Undefined index: module in C:\wamp\www\test1\classes\NUrl.class.php on line 83
Call Stack

podczas gdy całość jak wrzucę na hosting to wszystko działa..
wamp niby ma 5.5 php, na hostingu ustawiłem 5.5 i także działą
Próbowałem ustawienia zmieniać, porównywałem itp.. nie bardzo już wiem gdzie jest problem ;'] jakiś pomysł?

2014-09-11 12:13 nospor

Wywolujac metode URL masz do niej podac tekst z podanym modulem (module=blabla). Ty tego nie robisz wiec dostajesz blad, gdy funkcja ta oczekuje nazwy modulu. Jesli zas zmieniles kod klasy, by omijal moduly, to musisz tez porawic funkcje URL

2014-09-11 12:20 gość_gości22

zmieniłem by omijał, jednak wydaje mi się to nie istotne.

Na wamp nie działa, na hostingu wykupionym działa. Dlaczego tak się dzieje? kod ten sam itp.

2014-09-11 12:33 nospor

Co znaczy nie dziala? Mowiac nie dziala masz na mysli ze sie wyswietla blad ale robi co marobic? Blad ci sie wyswietla, bo masz wlaczone wyswietlanie bledow. Na innym ci sie nie wyswietla, bo na innym masz wylaczone wyswietlanie bledow

2014-09-11 12:41 gość_gości22

Niestety, ale wyświetlanie błędów jest i ty i tu. Działa prawidłowo ale na wamp wyświetla:

Notice: Undefined index: module in C:\wamp\www\test1\classes\NUrl.class.php on line 83
Call Stack

Kasuje cały kod i robie od nowa ;] mam problem po prostu z obsługą routingu, linków, klasą view itp.. dopiero się ucze ;]

2014-09-11 12:53 nospor

To pokaz moze, co zawiera u CIebie linijka 83, bo moze zawiera co innnego niż u mnie.

ps: ale ja mowie o wyswietlaniu wszystkich bledow. A u ciebie na obu serwerach moze byc wlaczone wyswietlanie bledow, ale na jednym jest włączone wysweitlanie tylko tych bardziej "waznych" stad nie widzisz tego "mniej waznego"

2014-09-11 13:09 gość_gości22

if ($params['module'] == 'news' && $params['action'] == 'show'){ //moduł news akcja show zamienimy na link .html

Testowałem różne ustawienia:
display_errors
display_startup_errors

i jakieś tam jeszcze inne..


Generalnie cały czas od kilku dni próbuje nauczyć się obiektowo zrobić prostą strone, gdzie ładujemy szablony (proste pliki php) i zależnie od linki ładujemy zawartość, Jednak co bym nie zrobił to albo mi nie działają linki, albo i tak wychodzi to strukturalnie ;]

2014-09-11 13:27 nospor

Nom, czyli to jest ta linijka co myslalem. Jesli wiec na jednym ci pokazuje blad a na innym nie, znaczy ze na jednym wyswietlasz wszystkie bledy, a na innym tylo te "bardziej wazne". Ustaw
error_reporting = E_ALL
a zobaczysz bledy na obu

2014-09-11 13:36 gość_gości22

no ok, a jak tego uniknąć? gdzie może być problem? Ewentualnie jak ukryć ten błąd na wamp.. To już drugi serwis jaki robie z użyciem twojej klasy - pierwszy strukturalnie, bardzo rozbudowany z jednym wielkim bałaganem w kodzie i tylko na serwerze hostingowym, więc błędów nie widziałem. A użycie dokładnie w ten sam sposób - include i $nurl-url()

2014-09-11 13:47 nospor

No juz ci pisalem, albo w URL podawaj nazwy modulow, a jesli ze swojego systemu wywaliles moduly, to i z metody url wywal te pare znakow sprawdzajacych modul.

Zamiast
if ($params['module'] == 'news' && $params['action'] == 'show'){
ma byc
if ($params['action'] == 'show'){

Ale tylko i wyłacznie pod warunkiem, ze w calym systemie pozbyles sie modulow. Pozbyles?

2014-09-11 13:59 gość_gości22

ha.. czuli muszę pisać tak:

<a href="<?= $nurl->Url('module=start') ?>">start</a>

zobacz.. kilka miesięcu używania skryptu i taki bubel z mojej strony ;] wybacz za zawracanie głowy i dziękuje za łopatologiczne wręcz wyjaśnienie problemu.

2014-09-11 14:02 nospor

Hm... no ale przecież w arcie masz wyraźnie podane, nawet na przykładach, jak to ma poprawnie wyglądać.

2014-10-22 20:45 gość_Marek

Hej,

Pobrałem testowy skrypt ze strony download ale widze ze robi sie petla tzn zamiast resetowac to dodają i dodają się parametry:

test/jakasakcja/par1/war1/par2/war2/test/jakasakcja/par1/war1/par2/war2/news/list/nospor-strajkuje,5.htmlkwiatki-sa-zolte,2.htmlkwiatki-sa-zolte,2.htmlkwiatki-sa-zolte,2.htmlnews/list/test/jakasakcja/par1/war1/par2/war2/test/jakasakcja/par1/war1/par2/war2/test/jakasakcja/par1/war1/par2/war2/news/list/news/list/news/list/news/list/news/list/

Rewrite oczywiscie wlaczone.

2014-10-23 06:46 artur

gość_Marek

W oryginalnym pliku index.php ze skryptu masz zmienną
$baseUrl = $_SERVER['REQUEST_URI'];


jak to zmienisz na np
$baseUrl = 'http://adrestwojejdomeny.pl/';
powinno działać i resetować linki

2014-10-23 07:25 artur

hej a co i gdzie powinienem zmienić żeby wybrane moduły zachowywały się tak jak news?

pewnie muszę coś zmienić tu:
if ($count == 1 && substr($pathInfo, -5) == '.html'){//mamy moduł news. pathinfo jest więc postaci nazwa-newsa,id.html
$_GET['module'] = 'news';
$_GET['action'] = 'show';

i tu:
if ($params['module'] == 'news' && $params['action'] == 'show'){ //moduł news akcja show zamienimy na link .html
return $this->baseUrl.$params['name'].','.$params['id'].'.html';


tylko nie wiem jak wstawić listę modułów i akcji

2014-10-23 08:49 nospor

@Marek tak jak Artur ci napisał powinno byc ok.

@Artur no ale link musi się czyms rozrozniac, by bylo wiadomo, ze taki link to news, a taki to innny modul. W jaki sposob zamierzasz to rozrozniac?

2014-10-23 09:13 artur

faktycznie nie pomyślałem, to może takie linki
news,tytul-newsa,id.html
albo inny schemat żeby była nazwa modułu w linku, i wtedy po tym rozpoznawać?

2014-10-23 09:49 nospor

Dokładnie

2014-10-30 12:37 gość_maniek

Witam podłączając się do tematu chciałbym sie dowiedzieć jak dodać kolejne akcje lub moduły żeby można było generować nowe linki i je później dekodować wraz z odniesieniem się do innego pliku
klikając w link.
Chodzi mi o to, że mam teraz kilka linków wyglądających mniej wiecej tak:
<?php
echo '<a href="'.$nurl->Url('module=karta&action=zobacz&nazwa='.$row['nazwa'].'&id='.$row['id'].'').'">'.$row['nazwa'].'</a>';
echo '<a href="'.$nurl->Url('module=karta&action=zobacz2&nazwa='.$row['nazwa'].'&id='.$row['id'].'').'">'.$row['nazwa'].'</a>';
?>
I teraz. Jak klikam w pierwszy link to ładnie działa i podpina się pod plik zobacz.php
Drugi link również jak w niego kliknę to wykonuje akcje czyli otwiera się plik zobacz2.php ale mam brzydki link. A wygląda on tak: karta/zobacz2/nazwa/itd.
Jak zrobić, żeby ten drugi link również był w stylu http://strona/buty,34.html i oczywiście po kliknięciu otwierał plik zobacz2.php.
Jeśli chodzi o linki rejestracja,dodaj to linki generują się prawidłowo, tzn http://strona.pl/rejestracja/ i tak dalej.
Prośba admina bądź forumowiczów co i gdzie dodać do klasy żeby generowało mi prawidłowo te dwa linki co powyżej.
Plik strony głównej wygląda mniej więcej tak:

<?php
require_once('nurl.class.php');
$baseUrl = 'http://strona.pl/';
$nurl = new NUrl($baseUrl);
$nurl->Decode();
controller();
function controller(){
$module = isset($_GET['module']) ? $_GET['module'] : '';
switch ($module){
case 'karta':
if ($_GET['action'] == 'zobacz'){
include ('zobacz.php');
}
elseif ($_GET['action'] == 'zobacz2'){
include ('zobacz2.php');
}
break;

case 'rejestracja':
include ('rejestracja.php');
break;

case 'dodaj':
include ('dodaj.php');
break;

case '':
include('glowna.php');
break;

?>
W klasie nic nie zmieniałem oprócz zmiany show na zobacz i news na karta. Acha i jak wywołać na stronie bbcode , chodzi o php ?). Na razie nie mam strony www, robię wszystko na localhost

2014-10-30 13:05 nospor

Hej @peklo, aktualnie zwany @maniek, szkoda ze czasu, ktory poswiecasz na zakladanie tematow nie poswiecasz na pomysleniem nad tym odrobine...

2014-10-30 13:14 gość_maniek

Jesem Maniek

2014-10-30 13:56 gość_maniek

to ma tylko takie małe pytanie żebym już nie błądził wokół tego.
Czy oprócz zmian w if ($count == 1 && substr($pathInfo, -5) == '.html'){ }
dokonujemy również w tym co poniżej czyli:
$_GET['module'] = $arr[0];
$_GET['action'] = isset($arr[1]) ? $arr[1] : '';
Czy to już zostawiamy.
Jak to mowią tonący brzytwy się chwyta

2014-10-30 20:06 nospor

Zadanie masz naprawdę banalne:

zmienna $zm może przyjmować tekst w takiej postaci
blabla.html
lub w takiej postaci
blabla,23.html

Jedyne co masz zrobic, to napisac kod, ktory sprawdzi czy zmienna $zm przyjela drugą czy pierwszą postać.

$zm  = 'olamakota,46.html';
if (.....) echo 'Druga postac';
if (.....) echo 'pierwsza postac';

Mozesz do tego uzyc albo wyrazenia regularnego, albo explode, albo strpos albo co ci tylko przyjdzie do głowy.

2014-10-30 22:30 gość_maniek

no dzięki wreszzcie jakiś konkret albo w końcu Cię zrozumiałem.
Zrobiłem na początku cuś takiego i zadziałało:

if ($count == 1 && preg_match('/^[ a-zA-ZąćęłńóśżźĄĆĘŁŃÓŚŻŹ0-9]{3,50},[0-9]{1,}.html$/', $_pi) && substr($pathInfo, -5) == '.html')

i
if ($count == 1 && preg_match('/^[ a-zA-ZąćęłńóśżźĄĆĘŁŃÓŚŻŹ0-9]{3,50},[0-9]{1,},[1-9]{1,9}.html$/', $_pi)

2014-11-06 21:45 gość_maniek

witam. mam takie pytanie. Mam problem z ustaleniem błędu tego rodzaju.
Jak mam link tego typu w oryginale nazwa,1.html tj wszystko OK. Problem pojawia się jak pomiędzy nazwe dam przecinek tzn nazwa1,nazwa2,1.html - wtedy mnie wywala. Wgralem twoją klase w oryginale bez żadnych zmian i jest to samo. Gdzie mam szukać rozwiązania?

2014-11-06 22:18 nospor

Siedzisz w tym kodzie juz troche i naprawde ten kawalek:
//dzielimy na nazwę i id
$na = explode(',', $nname);
$_GET['name'] = $na[0];
$_GET['id'] = $na[1];
nic ci nie mowi?

2014-11-07 11:29 gość_maniek

tak myślałem, że to chodzi o explode. Tylko nie wiem jak to rozbić jak np w nazwie będzie nie jeden , a np 10 przecinków

2014-11-07 14:55 gość_maniek

tzn że przed tym
$na = explode(',', $nname);
$_GET['name'] = $na[0];
$_GET['id'] = $na[1];
mam jeszcze odzielić szmą nazwe?

2014-11-07 14:56 gość_maniek

tzn podzielic samą nazwe?

2014-11-07 15:55 nospor

Ja w przykładzie zalozylem, ze bedzie tylko jeden przecinek i na te okolicznosc zrobilem proste rozbicie. Jesli u ciebie tych przecinkow jest petryliard, to ID bedzie na ostatniej pozycji tablicy powstalej z explode. Naprawde nie wiesz jak się dobrać do ostatniej pozycji tablicy?

2014-11-10 06:07 artur

no dobrze funkcje Url() już przerobiłem aby tworzyło inne adresy dla wybranych modułów
if (!empty($params)){
  $modulesArr = array('news', 'users');
  if (in_array($params['module'], $modulesArr) && $params['action'] == 'show'){ //moduły z tablicy modulesArr akcja show zamienimy na link .html
  return $this->baseUrl.$params['module'].','.$params['name'].','.$params['id'].'.html';
} else { //każdy inny moduł leci standardowo modul/akcja/parametr/wartosc

a jak go zdekodować, co zmienić tu w funkcji Decode?
if ($count == 1 && substr($pathInfo, -5) == '.html'){//mamy moduł news. pathinfo jest więc postaci nazwa-newsa,id.html
  $_GET['module'] = 'news';
  $_GET['action'] = 'show';
  //pobieramy nazwę oraz id czyli pobieramy nazwa-newsa,id
  $nname = substr($pathInfo,0, strlen($pathInfo)-5);
  //dzielimy na nazwę i id
  $na = explode(',', $nname); 
  $_GET['name'] = $na[0];
  $_GET['id'] = $na[1];
  return true;	
}

chyba głównie chodzi o to że nie wiem co dać zamiast tego:
$_GET['module'] = 'news';
$_GET['action'] = 'show';

ps. mógłbyś dodać przyciski dla bbcode w edytorze wpisu?

2014-11-11 20:34 gość_maniek

witam
Ale przecież teraz id jest na końcu tablicy
$_GET['id'] = $na[1];
Ja naprawde nie wiem jak w twoim skrypcie dodać, żeby w nazwie można było wpisywac przecinki

2014-11-12 08:21 nospor

@maniek zgadza się, ID jest na koncu tablicy. Dokladnie to ci napisałem ostatnio.
@artur przejrzyj ostatnie moje komentarze kierowane do manka. Tam pisałem, jak należy zmodyfikować decode

2014-11-13 19:25 gość_maniek

cześć
Z tymi przecinkami poradziłem sobie w taki sposób. W linku poprostu pozamieniałem znaki

$usuwane = array(" ", ",");
$zamieniane = array("-", "-");
echo '<a href="'.$nurl->Url('module=karta&action=zobacz&name='.str_replace($usuwane, $zamieniane, $ogloszenia['nazwa']).'&id='.$ogloszenia['id'].'').'">'.$ogloszenia['nazwa'].'</a>';

2015-04-18 21:02 gość_Olek

cześć, w Twoim kodzie przykładowym jest coś takiego
//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);
	
//stworzenie obiektu do generacji linków
$nurl = new NUrl($baseUrl);

rozumiem że jeśli mam swój adres bazowy np. http://mojastrona.pl/ to zamiast tego wszystkiego wystarczy krótko, bez obcinania czegokolwiek?
$baseUrl = 'http://mojastrona.pl/';
$nurl = new NUrl($baseUrl);

2015-04-18 21:14 nospor

Tak

2015-11-10 13:58 gość_Mariusz

A jak podejść do tematu aby z adresu postaci /kwiatki-sa-zolte,2.html pozbyć się przecinka i zrobić url w postaci /kwiatki-sa-zolte-2.html
Albo jak podejść do tematu aby kawałek adresu (ale bez przecinków i ukośników) był elementem paginacji?
mam na myśli adresy postaci /moj-zarobisty-content-strona-5 gdzie ciąg znaków "moj-zarobisty-content" jest oznaczeniem modułu.

2015-11-10 22:26 nospor

No to zamiast
$na = explode(',', $nname);
albo zrob preg_match
albo explode po '-' i bierz ostatni element jako id.

Dodaj komentarz

 

Dostępne bbcode: b, u, i, url, code, php, css, html, sql, js

Ostatnio komentowane

  1. Docker - podstawowy ... nospor
  2. Docker - podstawowy ... Leelum
  3. Pager nospor
  4. Pager Adrian
  5. Pager Chris
  6. Pager Chris
  7. Docker - zaprzęgamy ... nekih82

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer