Clicky

Skocz do zawartości


Zdjęcie
- - - - -

Przyjazne adresy - tytuł oferty z bazy danych

11 odpowiedzi w tym temacie
SEO htaccess

  • Zaloguj się, aby dodać odpowiedź

#1 Saibamen

Saibamen

    Początkujący

  • Użytkownik
  • Pip
  • 11 postów

Napisano 24 październik 2013 - 15:34

Witam,

 

obecnie mam taki adres:

http://domena.pl/oferta/pokaz/16

 

Chcę, by adresy ofert wyglądały tak:

http://domena.pl/oferta/[$offer->nazwa_obiektu]

 

W bazie danych nazwa_obiektu ma maksymalnie 255 znaków (nie wiem czy to ma jakieś znaczenie).

 

Kohana 3.0.8


Administrator it-maniak.pl

#2 nrm

nrm

    webmastah

  • Admin
  • 1106 postów
  • Skąd:Katowice

Napisano 24 październik 2013 - 16:25

Spoko, ale jaki jest problem? ;D



#3 Saibamen

Saibamen

    Początkujący

  • Użytkownik
  • Pip
  • 11 postów

Napisano 24 październik 2013 - 16:52

Taki, że nie wiem jak to zrobić? -.-

 

Tytuł oczywiście w bazie danych może zawierać wszystko (bo to varchar). Tutaj pojawia się drugi problem, bo w URL nie można stosować PL znaków i spacji.


Administrator it-maniak.pl

#4 kevin

kevin

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 207 postów

Napisano 24 październik 2013 - 16:54

Przerób zapytanie tak, aby zamiast wyszukiwania według id oferty szukało według nazwy (tzn. sluga). Przyda Ci się funkcja URL::title - która filtruje tekst w taki sposób, aby usunąć z niego wszelkie niewygodne znaki.

 

Domyślam się, że pole "nazwa_obiektu" to jest oryginalny string - przed przepuszczeniem przez funkcje URL::title? Jeśli tak to dodaj nową kolumnę typu "nazwa_obiektu_rewrite" i w niej trzymaj/zapisuj nazwę obiektu, ale przefiltrowaną przez URL::title wówczas wyszukiwać będziesz w ten sposób:

$slug = URL::title($this->request->param('slug')); // pobieramy przyjazny link (nie wiem czy tak można odebrać w K3.0 dane z requesta)
$result = ORM::factory('orders')->where('nazwa_obiektu_rewrite', '=', $slug)->find();
 
if ( !$result->loaded() ) {
 die('bledny slug');
}

 

PS. Przypominam, że kolumna "nazwa_obiektu_rewrite" musi być UNIKALNA (unique key)


  • Saibamen lubi to

#5 Saibamen

Saibamen

    Początkujący

  • Użytkownik
  • Pip
  • 11 postów

Napisano 24 październik 2013 - 19:43

Jest problem.

 

URL::title() nie niweluje polskich znaków!!

 

echo URL::title('Manhattan pokoje gościnne') wyświetla: manhattan-pokoje-gościnne


Administrator it-maniak.pl

#6 mck

mck

    Jestę Blogerę

  • Admin
  • 1544 postów

Napisano 24 październik 2013 - 21:27

public static function title($title, $separator = '-', $ascii_only = FALSE)

3 parametr.


  • Saibamen lubi to

#7 Saibamen

Saibamen

    Początkujący

  • Użytkownik
  • Pip
  • 11 postów

Napisano 27 październik 2013 - 15:37

Dzięki. Zrobiłem w końcu!! Męczarni z tym było, bo baza danych już gotowa jest. Dodatkowo dodałem Unique dla nazwy.


Administrator it-maniak.pl

#8 sbl

sbl

    Początkujący

  • Webmastahy
  • Pip
  • 55 postów
  • Skąd:Wrocław

Napisano 28 październik 2013 - 11:50

Dzięki. Zrobiłem w końcu!! Męczarni z tym było, bo baza danych już gotowa jest. Dodatkowo dodałem Unique dla nazwy.

 

Zawsze lepiej stosować ID w adresie, łatwiej się operuje i masz pewność, że nigdy nie trafisz na konflikt nawet jeśli będziesz miał takie same tytuły, bo 5 osób może wystawić "Sprzedam opla".

 

adres.pl/oferta/15/sprzedam-opla

 

W routingu oczywiście wszystko oddzielone:

Route::set('offer', 'oferta/<item_id>(/<slug>)', array('item_id' => '\d+', 'slug' => '[0-9a-z-]+'))
    ->defaults(array(
      'controller' => 'offers',
      'action'     => 'show',
));

 

W kodzie zwyczajnie, ładowanie obiektu przez jego primary key.

$item_id = $this->request->param('item_id');
$offer   = ORM::factory('offer', $item_id);

if(!$offer->loaded()) throw new HTTP_Exception_404('Nie ma takiej oferty');

$this->view->offer = $offer;

Slug w tym wypadku jest bez znaczenia, służy wyłącznie jako kwestia SEO i możesz go pomijać przy zapisie i generować w locie na podstawie tytułu oferty lub nazwy czegoś tam. Najlepiej w modelu ORM dodać sobie funkcję która zwróci od razu cały adres lub sam slug.

public function get_slug()
{
   return url::title($this->title,'-',true);
}

public function get_uri()
{
   return url::site('oferta/'.$this->id.'/'.$this->get_slug());
}

I w widoku odwoływać się:

<a href="<?php echo $offer->get_uri() ?>" title="<?php echo $offer->title ?>"><?php echo $offer->title ?></a>


#9 phpion

phpion

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 774 postów
  • Skąd:Sosnowiec, Dąbrowa Górnicza

Napisano 28 październik 2013 - 15:36

Slug w tym wypadku jest bez znaczenia, służy wyłącznie jako kwestia SEO i możesz go pomijać przy zapisie i generować w locie na podstawie tytułu oferty lub nazwy czegoś tam.

Przy zapisie może i faktycznie nie ma sensu go zapisywać, ale już przy wyświetlaniu danych warto go sprawdzić. Jeśli tego nie zrobisz to ktoś złośliwy może zamiast:

adres.pl/oferta/15/sprzedam-opla

używać przykładowo:

adres.pl/oferta/15/oddam-sie-za-5zl

i narobić Ci smrodu. W przypadku błędnego sluga można albo rzucić wyjątek braku strony, albo przekierować użytkownika na prawidłowy adres (tj. z prawidłowym slugiem).


Notifero - Technologie Informatyczne | Warsztat: Kohana 3.x/2.x + PostgreSQL/MySQL | Programista Kohana

#10 sbl

sbl

    Początkujący

  • Webmastahy
  • Pip
  • 55 postów
  • Skąd:Wrocław

Napisano 28 październik 2013 - 15:39

Przy zapisie może i faktycznie nie ma sensu go zapisywać, ale już przy wyświetlaniu danych warto go sprawdzić. Jeśli tego nie zrobisz to ktoś złośliwy może zamiast:

adres.pl/oferta/15/sprzedam-opla

używać przykładowo:

adres.pl/oferta/15/oddam-sie-za-5zl

i narobić Ci smrodu. W przypadku błędnego sluga można albo rzucić wyjątek braku strony, albo przekierować użytkownika na prawidłowy adres (tj. z prawidłowym slugiem).

Seriously? ;)

Jakie to ma znaczenie czy ktoś podmieni Ci SEO sluga jak i tak trafi na stronę po ID.

Zobacz, nawet na Allegro możesz sobie podmienić sluga, (teraz przekierowuje na poprawny), ale dawniej można było wstawić byle co.

 

http://allegro.pl/od...3629753904.html



#11 nrm

nrm

    webmastah

  • Admin
  • 1106 postów
  • Skąd:Katowice

Napisano 28 październik 2013 - 16:13

Ma znaczenie bo kretyńskie żarty często szybko się rozchodzą i masz więcej problemów niż jest to warte.

 

Poza tym to problem SEO i można w ten sposób narobić sobie dodatkowych kłopotów.



#12 sbl

sbl

    Początkujący

  • Webmastahy
  • Pip
  • 55 postów
  • Skąd:Wrocław

Napisano 29 październik 2013 - 10:12

Ma znaczenie bo kretyńskie żarty często szybko się rozchodzą i masz więcej problemów niż jest to warte.

 

Poza tym to problem SEO i można w ten sposób narobić sobie dodatkowych kłopotów.

 

Ale problem sobie znaleźliście :)

if(!$offer->loaded() || $offer->get_slug() != $this->request->param('slug')) throw new HTTP_Exception_404('Nie ma takiej oferty');

$this->view->offer = $offer;






Również z jednym lub większą ilością słów kluczowych: SEO, htaccess

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych