Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Tytuł strony inny na każdej stronie.
Forum PHP.pl > Forum > Przedszkole
GoldeNx3
Witam! Mam tak napisaną stronę:

  1. <html>
  2. <head>
  3. <title>Tytuł</title>
  4.  
  5. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  6. <meta name="description" content="desc" />
  7. <meta name="keywords" content="key" />
  8.  
  9. <link rel="stylesheet" href="style.css" type="text/css" />
  10. </head>
  11.  
  12. <body>
  13.  
  14. <?php
  15. define('DIR', 'pages/');
  16.  
  17. switch($_GET['mdl'])
  18. {
  19. case $_GET['mdl']:
  20. if(file_exists(DIR . $_GET['mdl'] . '.php')){
  21. include(DIR . $_GET['mdl'] . '.php');
  22. }
  23. break;
  24. }
  25. ?>
  26.  
  27. </body>
  28. </html>


Oczywiście usunąłem co nie potrzebne.
Ale tutaj mam tytuł strony tylko jeden. ("Tytuł")
A co, jak w zależności od strony chciałbym dać inny tytuł strony? To jak?
mortus
Ten Twój switch jest w ogóle bez sensu (bo podajesz mu zawsze jedną opcję wyboru, która bezwzględnie musi zostać wybrana, a switch nie do tego służy) i nie robi nic ponad to, co taki kod:
  1. define('DIR', 'pages/');
  2. $page = isset($_GET['mdl'] && $_GET['mdl'] != '') ? $_GET['mdl'] : 'index';
  3. if(file_exists(DIR . $page . '.php')){
  4. include(DIR . $page . '.php');
  5. }

Jeśli chcesz zmieniać tytuł strony, to powinieneś tę zmienną $page pobrać nieco wcześniej (jeszcze przed nagłówkami html) i np. odpowiednio ją sformatować (np. przy pomocy ucfirst()) i tą sformatowaną zmienną posłużyć się wewnątrz znacznika title:
  1. <?php
  2. $page = isset($_GET['mdl'] && $_GET['mdl'] != '') ? $_GET['mdl'] : 'index';
  3. $pageTitle = $page == 'index' ? 'Strona główna' : ucfirst($page);
  4. ?>
  5. <html>
  6. <head>
  7. <title><?php echo $pagTitle; ?></title>
  8. <!-- ... -->

Natomiast samo includo-wanie wykonujesz nadal w tym samym miejscu.
GoldeNx3
Okej, a jeżeli bym chciał w tych plikach nadać tytuł, bo np. w tytule pobierałoby coś z bazy danych?
mortus
Najpierw kod:
  1. $pageTitle = 'ZMIENNA POBRANA Z BAZY DANYCH';
  2. echo $pageTitle;
  3. include 'jakisplik.php';

W powyższym przypadku zmienna $pageTitle jest widoczna/dostępna zarówno w tym pliku, jak i w pliku, który wstawiamy (include-ujemy) i z tego trzeba skorzystac.
Damianoslawow
Jeśli ci chodzi o tytuł który się wyświetla w pasku to o ile wiem wystarczy zwykły html <title>tytuł</title> i powinno działać chyba że ci nie o to chodzi.
GoldeNx3
Tak, ale mi zależy na tym, aby w pliku zaincludowanym nadać tytuł i tam obrać te dane, a nie w głównym pliku..

@UP

O to, ale chcę ustawić inny tytuł dla każdego zaincludowanego pliku.
mortus
Chyba nie ma innego sposobu (w programowaniu strukturalnym oczywiście), jak wykorzystanie możliwości buforowania wyjścia w taki oto sposób:
  1. <?php
  2. function update_html($html, $page_title) {
  3. return str_replace('<!-- #PAGE_TITLE# -->', $page_title, $html);
  4. }
  5. ?>
  6. <html>
  7. <head>
  8. <title><!-- #PAGE_TITLE# --></title>
  9. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  10. <meta name="description" content="desc" />
  11. <meta name="keywords" content="key" />
  12. <link rel="stylesheet" href="style.css" type="text/css" />
  13. </head>
  14. <body>
  15. <?php
  16. define('DIR', 'pages/');
  17. $page = isset($_GET['mdl'] && $_GET['mdl'] != '') ? $_GET['mdl'] : 'index';
  18. if(file_exists(DIR . $page . '.php')){
  19. include(DIR . $page . '.php');
  20. // wewnątrz pliku pages/$page.php deklarujemy zmienną $page_title, której wartością jest tytuł strony pobrany z bazy danych
  21. }
  22. ?>
  23. </body>
  24. </html>
  25. <?php
  26. $html = ob_get_contents();
  27. echo update_html($html, $page_title); // zmienna $page_title została zadeklarowana w include-owanym pliku, ale w tym miejscu jest widoczna
  28. ?>

W HTML tworzymy sobie takie pseudo zmienne (tutaj <!-- #PAGE_TITLE# -->), które przed samym wyświetleniem właściwego dokumentu HTML zastępujemy zmiennymi PHP. Pokazałem to na przykładzie tytułu, ale wcale nie musimy się do tego ograniczać. Tak mniej więcej działają systemy szablonów z tą różnicą, że w systemach szablonów do szablonu przekazuje się tylko niezbędne dane i pomija się całkowicie logikę aplikacji.

Zastanowiłbym się jednak nad tym, czy to rozwiązanie jest konieczne i czy nie można całości zorganizować inaczej, tzn. tak, aby wszystkie zmienne potrzebne w include-owanym pliku przygotować wcześniej (w sumie to tak działają kontroler-widok w MVC, chociaż mogą mieć o wiele większe możliwości).
GoldeNx3
To jak proponujesz, bym zrobił ten tytuł, lub jak przebudował moją stronę?
crocodillo
Na podstawie kodu z Twojego postu to można zrobić coś takiego:
  1. <?php
  2.  
  3.  
  4. define('DIR', 'pages/');
  5.  
  6. if(file_exists(DIR . $_GET['mdl'] . '.php')){
  7. include(DIR . $_GET['mdl'] . '.php');
  8. }
  9.  
  10. $buffer = ob_get_clean();
  11.  
  12. ?>
  13.  
  14. <html>
  15. <head>
  16. <title><?php echo isset($title) ? $title : 'Tytuł strony'; ?></title>
  17.  
  18. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  19. <meta name="description" content="desc" />
  20. <meta name="keywords" content="key" />
  21.  
  22. <link rel="stylesheet" href="style.css" type="text/css" />
  23. </head>
  24.  
  25. <body>
  26.  
  27. <?php
  28. echo $buffer;
  29. ?>
  30.  
  31. </body>
  32. </html>

Tytuł zapisujesz do zmiennej $title w dołączanych plikach
GoldeNx3
SUPER! Właśnie o to mi chodziło, dziękuję!
tolomei
We wszystkich skryptach brakuje filtrowania nazwy pliku.
Brak filtrowania daje możliwość poruszania się po wszystkich katalogach na serwerze.
GoldeNx3
Możesz jaśniej? To moje początki..
tolomei
Korzystając z ostatniego listingu:

  1. <?php
  2.  
  3.  
  4. define('DIR', 'pages/');
  5.  
  6. $plik = isset($_GET['mdl']) ? preg_replace('#\W#', '', $_GET['mdl']) : null;
  7.  
  8. if(!empty($plik) && $plikfile_exists(DIR . $plik . '.php')){
  9. include(DIR . $plik . '.php');
  10. } else {
  11. include(DIR . 'home.php');
  12. }
  13.  
  14. $buffer = ob_get_clean();
  15.  
  16. ?>
  17.  
  18. <html>
  19. <head>
  20. <title><?php echo isset($title) ? $title : 'Tytuł strony'; ?></title>
  21.  
  22. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  23. <meta name="description" content="desc" />
  24. <meta name="keywords" content="key" />
  25.  
  26. <link rel="stylesheet" href="style.css" type="text/css" />
  27. </head>
  28.  
  29. <body>
  30.  
  31. <?php
  32. echo $buffer;
  33. ?>
  34.  
  35. </body>
  36. </html>


Teraz w linii 7. masz włączone filtrowanie nazwy pliku. Dokładniej, wszystkie znaki, które nie są dużą/małą literą, cyfrą lub podkreśleniem zostaną usunięte z nazwy.
Dodatkowo w linii 12. masz włączone załączanie strony domyślnej w przypadku braku nazwy lub gdy plik nie istnieje.

Pozdrawiam.
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.