Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa odpowiadająca za dynamiczne linki
Forum PHP.pl > Forum > PHP > Object-oriented programming
marcinek37
Przyjazne linki można tworzyć za każdym razem ręcznie, np.
  1. <?php
  2. ...
  3. echo'<a href="strony/'.$title.'-'.$id.'/">zobacz więcej</a>';
  4. ...
  5. ?>


Jednak w przypadku, gdy sytuacja wymusza na nas zmianę struktury linka na np. materialy/tytul-10/, trzeba będzie dokonywać zmian w wielu miejscach. Im większa strona, tym więcej roboty.

Dlatego wziąłem się za pisanie klasy, która może pomóc rozwiązać ten problem. Uruchamia się ją w ten sposób:
  1. <?php
  2. ...
  3. echo'<a href="'.Seo::link('index.php?m=info&id=10&title=tytul').'">zobacz więcej</a>';
  4. ...
  5. ?>


m - nazwa kontolera
id - informuje, jaki materiał załadować
title - zmienna wyłącznie do pozycjonowania

Klasa wygląda tak:
  1. <?php
  2. class Seo{
  3.  
  4. public static function link($link_to_convert){
  5. $link = str_replace('index.php?', '', $link_to_convert);
  6. foreach(explode('&', $link) AS $var){
  7. $parts = explode('=', $var);
  8. if($parts[0] == 'm'){ $method = $parts[1]; }
  9. else{ $vars[$parts[0]] = $parts[1]; }
  10. }
  11. if(method_exists('Seo', $method)){ return self::info($vars); }
  12. else{ return $link_to_convert; }
  13. }
  14.  
  15.  
  16. public static function info($vars){
  17. if($vars['id'] && $vars['title']){ $link = '/strona/'.$vars['title'].'-'.$vars['id'].'/'; }
  18. else{ $link = '/'; }
  19. return $link;
  20. }
  21.  
  22.  
  23. }
  24. ?>


Każdy link w tworzonym przeze mnie Frameworku będzie mieć strukturę index.php?m=MODUŁ + [cała reszta zmiennych związana z modułem].
Dlatego na początku w metodzie "link" ze zmiennej $link kasowany jest ciąg "index.php?". Następnie cała reszta dzielona jest na zmienne, z czego zmienna $m jest szczególna, bo informuje, jaką metodę ma uruchomić - o ile istnieje.

Następnie metoda ta jest uruchamiana i generuje ładny link - o ile to metody trafią porządane zmienne.
Na razie jest tylko jedna metoda "info", ale w przyszłości dojdą kolejne.

Co sądzicie o takim rozwiązaniu?
skowron-line
No niestety nie ma to nic wspolnego z OOP. Poszukaj sobie lepiej gotowej klasy do Routingu.
Crozin
W porównaniu do pierwszego lepszego routera z dowolnego FW czy zewnętrznej biblioteki bardzo niewygodne i ograniczone rozwiązanie. Nie wspominam już tutaj o tym, że do parsowania fragmentów URL-a można spokojnie wykorzystać parse_url, a i z OOP nie ma to kompletnie nic wspólnego.
marcinek37
Router daje informacje, jaki kontroler ma zostać załadowany oraz z jakimi parametrami.
Ja na razie chcę się dowiedzieć, jak za pomocą OOP przekazywać do widoku poprawnie skonstruowane linki, zamiast tych typu index.php?m=info&id=10&title=tytul.
Nie za bardzo wiem, jak za pomocą parse_url() mogę z tego "index.php?m=info&id=10&title=tytul" zrobić to "/strony/tytul-10/" i to we wszystkich miejscah (szukałem tej funkcji na tym forum i znalazłem ją jedynie w dwóch tematach)
Szukałem na forum najprostszego routera, ale z reguły trafiam na "kombajny", które nie wiadomo jak uruchomić
ziolo
  1.  
  2. <?php
  3. ...
  4. echo'<a href="'.Seo::link('index.php?m=info&id=10&title=tytul').'">zobacz więcej</a>';
  5. ...
  6. ?>
  7.  


Pierwsza uwaga nie związana z samym tematem. Ale jak widzę coś takiego to przypominają mi się moję początki z php i jak ja mogłem taki kod php pisać ?
Nie wstawiaj elementów html w echo w pliku php. Tylko wstawiaj elementy php do pliku html.

  1.  
  2. <html>
  3. ...
  4. <a href="<?php echo Seo::link('index.php?m=info&id=10&title=tytul')?>">zobacz więcej</a>
  5. ...
  6. </html>


Nie prościej to wygląda ?

Druga sprawa to Ty tu jesteś architektem, Ty piszesz metodę wieć czemu narzucasz sobie taki fatalny format wejściowy tej metody

  1.  
  2. <html>
  3. ...
  4. <a href="<?php echo Seo::link('info', array('id' => 10, 'title' => 'tytul'))?>">zobacz więcej</a>
  5. ...
  6. </html>

Nie lepiej tak ? Tu już nic nie musisz parsować. Bo bez sensu wprowadzać taki dziwny format wejściowy, żeby go potem parsować.
Co do samego pomysłu użycia metody statycznej Seo::link w widoku jak najbardziej prawidłowe podejście.
slog
Klasa ma przede wszystkim złą nazwę i może wprowadzać w błąd przy rozbudowie systemu. Dlatego bardzo ważnym jest używanie trafnych nazw zmiennych, metod czy klas. Bardziej trafnym będzie użycie nazwy Route.
marcinek37
jaki macie zatem pomysł na stworzenie funkcji, która będzie odpowiadała za przechowywanie instrukcji tworzenia schematu linka?
tylko proszę mnie nie odnosić do żadnych Frameworków - chcę zrobić prostą malą stronę, której oparcie na silniku ważającym 25MB jest raczej nieporozumieniem
!*!
Nie ma na to lekarstwa. Klasy generujące linki z marszu po prostu nie istnieją. Oczywiście są wspomagacze które działają chociażby tak jak zaprezentowałeś, ale prędzej czy później się na tym wyłożysz, bo co w przypadku, gdy w linku nie ma informacji o kontrolerze i akcji?

Załóżmy, że gdzieś w aplikacji masz zbiór linków jakie będziesz wykorzystywać:
  1. 'panel' => '/dodaj/$1/$2'
  2. );

Gdzieś w widoku dajesz
  1. <a href="<?php echo Link::create('panel', 'user, stefan');?>">dodaj stefana</a>

co zwróci:
  1. <a href="/dodaj/user/stefan">dodaj stefana</a>
Crozin
Cytat
[...] chcę zrobić prostą malą stronę, której oparcie na silniku ważającym 25MB jest raczej nieporozumieniem
Pomijając to, że istnieje wiele "małych" frameworków co niby byłoby złego w wykorzystaniu dużego (rozbudowanego) do nawet bardzo prostej strony?
Pyton_000
Prosze, pierwszy lepszy link z google
https://github.com/dannyvankooten/PHP-Router
marcinek37
@!*!
Twoja rozwiązanie też wydaje mi się mniej wygodne od mojego, w którym de facto w konkretnej metodzie mogę ustalić sobie wszystko - skrypt tylko sprawdza, jakie zmienne wpadają i na tej podstawie tworzy linki; jeśli nagle do linka będę potrzebował trzy kolejne parametry, nie będzie z tym problemów

chcę użyć takiego rozwiązania, chyba że faktycznie jest coś lepszego, ale nie od razu tak mega rozbudowanego
!*!
Nikt Ci nie broni tworzenia linku w metodzie a do widoku przekazywać gotowca, to bez znaczenia gdzie użyjesz Link::create(); to ma tylko generować konkretne linki po kluczu. Chcesz zmienić lnik? Zmieniasz tylko wartość klucza głównej tablicy. Jak chcesz parametry to prędzej czy później i tak je wpiszesz/zmienisz, nikt za Ciebie z automatu tego nie zrobi.
marcinek37
@Pyton_000
Będę miał kilka pytań co do Twojego przykładu, ale dzisiaj jeszcze tego nie ogarnę - bardzo dziękuję!

Ten router
https://github.com/dannyvankooten/PHP-Router
jest zbyt skomplikowany; czy możecie polecić coś bardzo prostego?

zależy mi, aby w htaccess było tylko to:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?link=$1 [QSA,L]

a w index.php uruchamiałaby się klasa Router, do której trafiałaby zawartość zminnej $link

Tyle jestem sam w stanie zrobić, ale jak później wykorzystać router do tworzenia linków? Np. w szablonie strony będę miał stały link, np. do regulaminu strony (/regulamin/)
jak w kodzie HTML wprowadzić adres, aby w łatwy sposób można byłoby go zmienić? Bo przecież nagle może zaistnieć konieczność zmiany linka na /regulamin-strony/

Jeżeli zrobię to ręcznie, to będę musiał to zapisać w routerze oraz w kodzie HTML - szukam lepszego i mądrzejszego sposobu
Pyton_000
Ta klasa którą Ci podałem będzie dobra. Masz tam plik example.php w której pokazane jest jak z tego korzystać. Pokazany jest tam generator URL na podstawie zdefiniowanego URL
marcinek37
gdy go uruchamiam, pokazuje się jakiś dziwny komunikat
nie potrafię z tego skorzystać
Pyton_000
Ten dziwny komunikat mówi Ci o tym że nie umiesz czytać, a wróżki latają za siedmiogórogroem.
Pozdrawiam serdecznie i ciepło
Wróżka chrzestna.
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-2025 Invision Power Services, Inc.