Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mod_rewrite + menu z aktualną pozycja
Forum PHP.pl > Forum > Gotowe rozwiązania
japolak
Witam
.
wczoraj wziołem sie za poprawę nawigacji na mojej stronie ; od strony wizualnej jak i technicznej:
chciałbym zadać kilka pytań oraz prosić o surową fachową ocenęwink.gif i ewentualnie podanie swoich uwag:
Narazie zmiany mam na localhoscie - > i przymierzam sie do aktualizacji na serwerze (tylko jeszcze walcze z ccs)
_dodam tylko ze php to jeszcze do końca nie jest moj chleb powszedni

a więc tak:

na poczatku przyjazne url:
plik .hataccess
  1. Options FollowSymLinks
  2. RewriteEngine on
  3. #przekierowanie bez www na www
  4. RewriteCond %{HTTP_HOST} ^kosmosnews.pl
  5. RewriteRule (.*) <a href="http://www.kosmosnews.pl/$1" target="_blank">http://www.kosmosnews.pl/$1</a> [R=301,L]
  6.  
  7. #przekierowanie ze stron home na pl
  8.  
  9. RewriteCond %{REQUEST_FILENAME} -d
  10. RewriteRule .* index.php
  11.  
  12. RewriteCond %{REQUEST_FILENAME} !-s [NC]
  13. RewriteCond %{REQUEST_FILENAME} !-d [NC]
  14. RewriteBase /
  15. RewriteRule ^kategoria/(.+)/(.+)/(.+)/(.+)/$ showcat.php?id_cat=$1&id_parent=$2&type=$3&name_cat=$4 [L]
  16. RewriteRule ^artykul/(.+)/(.+)/(.+)/(.+)/(.+)/$ showobject.php?id_cat=$1&id_parent=$2&id_ob=$3&type=$4&title=$5 [L]
  17.  
  18.  


następnie modyfikacja url tak aby wysyłał je jako "przyjazne"


  1.  
  2. $url1="kategoria/".($row['id_cat'])."/".$row['id_parent']."/2/".($row['name_cat'])."/";
  3. $url=$this->prepareURL($url1);
  4. ?><li><?php
  5. $menu=1;
  6. $this->display_buttons($menu, $row['name_cat'], $url,
  7. !$this->actual_url($url));
  8.  
  9.  


funkcje: prepareURL (nie mojego autorstwa):

  1.  
  2. function prepareURL($sText)
  3. {
  4. // pozbywamy się polskich znaków diakrytycznych
  5. $sText = $this-> clearDiacritics($sText);
  6.  
  7. // dla przejrzystości wszystko z małych liter
  8. $sText = strtolower($sText);
  9.  
  10. // wszystkie spacje zamieniamy na myślniki
  11. $sText = str_replace(' ', '-', $sText);
  12.  
  13. // usuń wszytko co jest niedozwolonym znakiem
  14. $sText = preg_replace('/[^0-9a-z\-\/]+/', '', $sText);
  15.  
  16. // zredukuj liczbę myślników do jednego obok siebie
  17. $sText = preg_replace('/[\-]+/', '-', $sText);
  18.  
  19. // usuwamy możliwe myślniki na początku i końcu
  20. $sText = trim($sText, '-');
  21.  
  22. return $sText;
  23. }


zmiana polskich znaków :

  1. function clearDiacritics($sText)
  2. {
  3. $aReplacePL = array(
  4. 'ą' => 'a', 'ę' => 'e', 'ś' => 's', 'ć' => 'c',
  5. 'ó' => 'o', 'ń' => 'n', 'ż' => 'z', 'ź' => 'z', 'ł' => 'l',
  6. 'Ą' => 'A', 'Ę' => 'E', 'Ś' => 'S', 'Ć' => 'C',
  7. 'Ó' => 'O', 'Ń' => 'N', 'Ż' => 'Z', 'Ź' => 'Z', 'Ł' => 'L'
  8. );
  9.  
  10. return str_replace(array_keys($aReplacePL), array_values($aReplacePL), $sText);
  11. }


I teraz mam ta:
zamias takich urli: localhost/showcat.php?id_cat=".($row1['id_cat'])."&id_parent=".$row['id_cat']."&type=2

mam takie: localhost/artykul/3/1/12/2/test-nowy-artykul-z-e-zdjeciami/

co mi w miare odpowiada:

lecz przy tym wszystkim nasuwają mi sie pytania:

1. czy muszę każdy url który mam na swoim portalu zmieniać tak aby był zgodny ze standartem ( który pozniej sie wyświelta)
czyli na np: /artykul/3/1/12/2/test-nowy-artykul-z-e-zdjeciami/ i dopiero taki wysyłac - czy jest jakas metoda która przerobi mi aktualnie zrobione url na te które będą wysyłane do mod_rewrite

2. aktualnie dostep do strony z artykułami mam na 2 sposoby przez przyjazne url i po staremu z parametrami .. czy można zrobic tak aby był tylko dostęp przez przyjazne url - jak tak to jak wink.gif


i to chyba wszystko co do przyjaznych urli
-------------------------------------------------------------------------------------

a teraz nawigacja : ( aktualna pozycja w serwisie)

moja baza categori:: (2 poziomy)
  1. id_cat id_parent name_cat
  2. 1 0 Wszechświat
  3. 2 1 Teoria wielkiego wybuchu
  4. 3 1 Gwiazdy i galaktyki
  5. itd

no i dalej funkcja -> actual_position()
  1.  
  2.  
  3. public function actual_position (){
  4.  
  5.  
  6. //zapytanie wybierz wszystkie kategorie
  7. $sql="select * from category";
  8. $get=new data();
  9. $connect=$get->connect_bd();
  10. $result=$connect->query($sql);
  11. if (!$result){
  12. echo " fatal error";
  13. }
  14. $how=$result->num_rows ;
  15. if ($how >0 ){
  16.  
  17. for ($i=0; $i<=$how; $i++){
  18.  
  19. //zapisanie kategorii do tablicy
  20. $res1[$i]=$result->fetch_assoc();
  21.  
  22.  
  23.  
  24. }
  25.  
  26. //zapisanie do zmiennych wartosci z geta
  27.  
  28. $id_cat=$_GET['id_cat'];
  29. $id_parent=$_GET['id_parent'];
  30.  
  31.  
  32.  
  33.  
  34. //funkcja sprawdza wartosc nadrzednej kategorii
  35. switch ($id_parent){
  36.  
  37.  
  38. //dla kategorii nadrzednej wyswietla to - tylko w przypadku jak jest w nadrzędnej kategorii
  39. case "0":
  40. {
  41. for ($i=0 ; $i <= 48 ; $i++)
  42. {
  43.  
  44. if (($res1[$i]['id_parent']==0)and ($res1[$i]['id_cat']==$_GET['id_cat']))
  45. {
  46. $url1="kategoria/".$res1[$i]['id_cat']."/0/2/".$res1[$i]['name_cat']."/";
  47. $url=$this->prepareURL($url1);
  48. $menu=4;
  49. ?><li><a href="../index.php">Home</a></li><li><?php
  50. $this->display_buttons($menu, $res1[$i]['name_cat'], $url,
  51. !$this->actual_url($url));?></li><?php }
  52.  
  53.  
  54. }
  55. break;
  56. }
  57.  
  58. //jeśli nie jest przekazany parametr id_parent - przerywa dzialanie - nie wyswietla nic
  59. case NULL:
  60. break;
  61.  
  62.  
  63. //opcja dla pozostałych mozliwosci - kiedy jest minimum na drugim poziomie kategorii
  64. default :
  65. {
  66. // robi link do nadrzednej kategorii
  67. $url1="kategoria/".$res1[$id_parent-1]['id_cat']."/0/2/".$res1[$id_parent-1]['name_cat']."/";
  68. $url=$this->prepareURL($url1);
  69. $menu=4;
  70. ?><li><a href="../index.php">Home</a></li><li><?php
  71. $this->display_buttons($menu, $res1[$id_parent-1]['name_cat'], $url,
  72. !$this->actual_url($url));?></li><?php
  73.  
  74. $p=$_GET['id_parent'];
  75. $a=$p;
  76.  
  77. //$i=48 - bo tyle mam wszystkich kategorii
  78.  
  79. for ($i=0; $i<=48; $i++)
  80. {
  81.  
  82. // szuka pozostałych kategorii nadrzednych
  83. if (($res1[$i]['id_parent']==$a)and ( $res1[$i]['id_cat']==$_GET['id_cat']))
  84. {
  85.  
  86. //tworzy url do znalezionej kategorii podrzenaj z kategorii nadrzednej
  87.  
  88. $url1="kategoria/".($_GET['id_cat'])."/".$_GET['id_parent']."/2/".$res1[$i]['name_cat']."/";
  89. $url=$this->prepareURL($url1);
  90. $menu=4;
  91. ?><li><?php
  92. $this->display_buttons($menu, $res1[$i]['name_cat'], $url,
  93. !$this->actual_url($url));
  94. ?></li><?php
  95.  
  96.  
  97. // jesli wyswietlany jest artykul - generuje jego nazwe w adresie -w lini nawigacji
  98. if (isset($_GET['title'])){
  99.  
  100.  
  101. $url1="artykul/".($_GET['id_cat'])."/".$_GET['id_parent']."/".$_GET['id_ob']."/2/".$_GET['title']."/";
  102. $url=$this->prepareURL($url1);
  103. $menu=4;
  104. ?><li><?php
  105. $this->display_buttons($menu,$_GET['title'], $url,
  106. !$this->actual_url($url));
  107. ?></li><?php
  108.  
  109.  
  110. }
  111. }
  112. }
  113.  
  114.  
  115.  
  116. break;
  117. }
  118.  
  119. }
  120.  
  121.  
  122. }
  123. else {
  124. echo "brak wyników ";
  125. }
  126. }
  127.  
  128.  
  129.  
  130.  
- sory ze jescze nie poukładana


no i oczywiście 2 funkcje od aktualnej pozycji:

  1. protected function display_buttons($menu, $nazwa, $url, $active = true){
  2. if($active)
  3. {
  4.  
  5. echo "<a href = '".htmlentities($url)."' >
  6. $nazwa</a>";
  7. }
  8. else
  9. {
  10. if ($menu==1){
  11. echo "<div class='activ'>$nazwa</div>";
  12.  
  13. }
  14. else if ($menu==2){
  15.  
  16. echo "<div class='activ2'>$nazwa</div>";
  17. }
  18. else {echo "<li id='active'>";
  19.  
  20. $nazwa
  21. echo"</li>";
  22. }
  23. }
  24. }
  25.  
  26.  
  1.  
  2. protected function actual_url($url){
  3. if(strpos($_SERVER['REQUEST_URI'], $url)===false)
  4. {
  5. return false;
  6. }
  7. else
  8. {
  9. return true;
  10. }
  11.  
  12. if(strpos($_SERVER['REQUEST_URI'], $url)===false)
  13. {
  14. return false;
  15. }
  16. else
  17. {
  18. return true;
  19. }
  20.  
  21. }



wynikiem jest to ze gdzybym na stronie nie byl to pokazuje mi dokładnie gdzie jestem - z uwzględnieniem podpoziomu kategorii


- czy takie rozwiązenie jest poprawne??

Hekko
Linia 5 pliku .htaccess do poprawki.
Musisz wszystkie urle w skrypcie przerobić, jeśli chcesz aby się takie wyświetlały.
arcziustka
Wiem że odświeżam bardzo stary temat, ale robię to dla tych którzy tutaj trafią jak będą szukać odpowiedzi na ten temat, a powyższa odpowiedź jest nie do końca prawidłowa. Najlepszy sposób to tak jak powyżej, pozamieniać wszystkie url-e, ale można też w htaccessie zastosować przekierowanie dla danego linku [L,R=301] i wtedy automatycznie będą przepisywane adresy na SEO linki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.