Wczytywanie elementów z innych plików

0

Witam

Jestem w html zacofany o 10 lat, gdyż mniej więcej tyle lat temu zakończyłem zabawę w tym kodzie. Przez ten czas wiele się zmieniło i mam pewien problem/pytanie nt html/php.

Potrzebuje fragment kodu który by wczytywał elementy strony z innych plików np menu. Po to by, przy jakichkolwiek zmianach na stronie, zastapic tylko menu.php i na wszystkich podstronach ukazała się aktualizacja tego elementu. By nie było konieczności aktualizowania 350 podstron w celu dodania np 1 słowa. Za moich czasów uzywało sie <frame> lub kod php. Z tego co slyszałem frame odpada ponieważ google stosuje jakieś kary za to (nie wiem czy to prawdziwe)

Znalazłem gdzieś kod

<?php
$homepage = file_get_contents

('http://www.jartex.com.pl/');
echo $homepage;
?>

który w sumie spełna moje oczekiwania wstępne ale znajomy informatyk powiedział mi że to nie jest odpowiednie / profesjonalne zastosowanie

Moglibyście mi pomóc?

0

Cos mi nie wyszło z tym kodem więc jeszcze raz. sorry za podwójny post

<?php $homepage = file_get_contents ('http://www.jartex.com.pl/'); echo $homepage; ?>[
2

W PHP wszystko stratuje z pliku index.php. Do dołączania innych plików służy funkcja include() oraz require(), różnica jest taka, że pierwsza tylko dołącza coś, jak tego nie ma to wszystko inne się wyrenderuje, a require wywali błąd krytyczny. Jeżeli chcesz mieć pewność, że coś zostanie dołączone tylko raz to dodajesz _once do nazwy funkcji wyżej.

Przykładowa strona może wyglądać tak:

template.php

<?php
return "<!DOCTYPE html>
<html>
<head>
<title>$title</title>
<meta http-equiv='Content-Type' content='text/html;charset=utf-8'/>
</head>
<body>
$menu
$content
$footer
</body>
</html>";

menu.php

<?php return "Jestem wesoły Romek, kliknij mnie (?) ";

index.php

<?php
error_reporting( E_ALL );
ini_set( "display_errors", 1 );
$title = "Test title";

$menu = include_once "templates/menu.php";
$content = "<h1>Hello World</h1>";
$footer = include_once "templates/footer.php";

$page = include_once "templates/page.php";
echo $page;

Tutaj zaciagasz footer i menu z innych plików (stałe), a $content możesz dynamicznie generować np. w zależności od tego co przekazujesz w _GET

W dużym uproszczeniu:

$navigationIsClicked = isset($_GET['page']);
if ($navigationIsClicked ) {
$fileToLoad = $_GET['page'];
$content = include_once "views/$fileToLoad";
}
0

rozumiem wszystko prócz tego content

wielkie dzięki za odpowiedz!

zastanawia mnie czy nie lepiej pliki template i index polaczyc w calosc ? bo w sumie index zawsze uzywalem jako strone glowna :P

1

Możesz includować tylko content (widoczną treść strony) do swojego indexa (pomijając nagłówek i stopkę, która będzie się powtarzać).

0

Można tak zrobić, ale ja wolę jednak mieć wszystko uporządkowane, poza tym w tych frameworkach php, z których korzystałem do tej pory jest właśnie taki podział, więc pewnie też stąd przyzwyczajenie. No i możesz zrobić tak jak mówi Tumeg :)

Nie bardzo rozumiem, czego nie czaisz jeżeli chodzi o content, więc wytłumaczę tak: content (z ang. zawartość), to jest dynamiczna część strony, czyli to co ulega zmianie. Czyli np. jak masz home / about me / contact, to w index.php sprawdzasz parametr $_GET i jeżeli jest to np. http://adresstrony.dev/about_me, to przypisujesz about_me do zmiennej $fileToLoad i includujesz plik about_me.php (w tym wypadku) i przypisujesz do zmiennej content, która jest podłączana w Twojej templatce, tam gdzie tą zmienną umieściłeś. Innymi słowy zwracany kod html z pliku about_me.php jest dodawany do kodu w templatce i powstaje Ci czysty html.

Polecam książkę PHP i MySQL. Tworzenie stron WWW. Wydanie IV (na jesieni się ukaże V).

0

Musiałem napisać posta jeszcze raz bo nieogar był straszny.

  1. Dzięki za odpowiedzi, ogólnie zrozumiałem sens wszystkich, bardziej nie mogłem zrozumieć tego od części kodowanej, np. co to jest to template.php, przykładowa poddstrona np "about me" czy obojetnie jaka strona z najprostszymi zmiennymi, które moga odwalic bubel bo nie ma "include once". Jeżeli tak, to moja strona powinna po szlifie powinna wygladac tak?

content stały

<?php
error_reporting( E_ALL );
ini_set( "display_errors", 1 );
return "<!DOCTYPE html>
<html>
<head>
<title>$title</title>
<meta http-equiv='Content-Type' content='text/html;charset=utf-8'/>
</head>
<body>
$menu = include_once "templates/menu.php";
$content = "<h1>Hello World</h1>";
$footer = include_once "templates/footer.php";
</body>
</html>";
  1. Ten fragment z $page co dałeś w index.php to losowa zmienna czy coś związane z tym załączeniem contentu ? jeżeli to losowa to co daje ten fragment
echo $page;
  1. Mój plan był taki by zaciągać do każdej podstrony czyli głownej (index), działów (dział1.php) same elementy wspólne tak by, ułatwić sobię edycje np menu. Jak dobrze zrozumiałem Ty proponujesz w indexie zapisać układ strony i z indexu zaciągać również treść w postaci $content. Co lepsze?

  2. Kod strony z ruchomym contentem powinien wyglądać tak?

content ruchomy

<?php
error_reporting( E_ALL );
ini_set( "display_errors", 1 );
return "<!DOCTYPE html>
<html>
<head>
<title>$title</title>
<meta http-equiv='Content-Type' content='text/html;charset=utf-8'/>
</head>
<body>
$menu = include_once "templates/menu.php";
$navigationIsClicked = isset($_GET['content.php']);
if ($navigationIsClicked ) {
$fileToLoad = $_GET['content.php'];
$content = include_once "views/$fileToLoad";
}
$footer = include_once "templates/footer.php";
</body>
</html>";
  1. zaproponowano mi rozwiązanie tego problemu za pomocą AJAX (wczytywanie elementów za pomocą
<a class="nav" href="#page1">

W sumie juz sam nie wiem czego użyc, najwieksze znaczenie ma pozycjonowanie, chciałbym uniknac nieprzyjemnego dla gugle kodu. Co proponujecie?

dodanie znaczników <code class="php"> i <code class="html"> - @furious programming

2
cudaczny napisał(a):
  1. Mój plan był taki by zaciągać do każdej podstrony czyli głownej (index), działów (dział1.php) same elementy wspólne tak by, ułatwić sobię edycje np menu.

To co proponowali panowie wyżej to już taki bardziej "dorosły" kod. Chodzi generalnie o oddzielenie widoku strony (html) od logiki (czyli to co wyprawiasz z danymi, np. wyliczenia). Poczytaj sobie o MVC. Generalnie pisząc taki kod umożliwiasz innym napisanie własnej skórki (wyglądu) i cieszenia się z własnego indywidualnego skryptu/strony, bez ingerencji w sposób wyliczenia danych i zaprezentowania ich na stronie.

To o co pytałeś na początku, a wyjaśnił @Fi3rce, to include i require.

Może podam Ci dużo prostszy przykład, dopasowany dokładnie w to, co chciałeś.

<?php
require ('menu.php'); ?>

Taki kod umieszczasz wszędzie tam, gdzie chcesz mieć menu.
A plik menu.php ma wygląd:

<ul>
<li><a href="home.php">HOME</a></li>
<li><a href="contact.php">KONTAKT</a></li>
<li><a href="about.php">O SOBIE</a></li>
</ul>

Dodając do index.php mamy:

<html>
<head>
</head>
<body>
<?php require ('menu.php'); ?>
To strona główna.....
</body>
</html>

Oczywiście nic nie stoi na przeszkodzie, aby takich plików z require było dużo więcej. Typowe przykłady to właśnie menu, header, footer.

Skoro miałeś długą przerwę, popatrz też sobie na HTML5 - w szczególności na znaczniki odpowiedzialne za odpowiednie sekcje.
Dla przykładu, stopkę obudowywuje się w tagi

<footer></footer>

a menu w <nav></nav>

0

Dobra jeszcze raz dzięki chłopaki.

Użyłem kodu od kolegi wyżej, z tym że dodałem _once

<?php
require_once ('menu.php'); ?>

Wszystko działa tak jak powinno na kazdej przeglądarce. Ale skoro juz tyle zescie liter zdarli z klawiatury to i warto by było bym ogarnal to.

Właściwie to tylko mam pytanie związane z tą dynamiczną treścią $content, jeżeli chciałbym użyć tego to przy dużej ilości linków musiałbym kod

$navigationIsClicked = isset($_GET['page']);
if ($navigationIsClicked ) {
$fileToLoad = $_GET['page'];
$content = include_once "views/$fileToLoad";
}

dodawać wielokrotnie określając w page dany link/stronę? Czyli przy 20 linkach w menu, ten fragment musiałbym mieć 20 razy? jeżeli kliknę o nas to wyświetli się treść o nas, jezeli kliknę towar to wyświetli się treść towar?

Skoro miałeś długą przerwę, popatrz też sobie na HTML5 - w szczególności na znaczniki odpowiedzialne za odpowiednie sekcje.
Dla przykładu, stopkę obudowywuje się w tagi

jestem w trakcie nauki html5 (praktycznej), cały layout pocięty jest w html5 i również znajdują się tam znaczniki nav i footer - aczkolwiek z logicznego punktu widzenia, po guglowaniu nie widze ich zastosowania prócz estetyki, pewnie się myle, ale na kazdej stronie lakoniczna odp ze umieszcza się tam autora (rzekłoby się no co ty..)

dodanie znaczników <code class="php"> - @furious programming

0
cudaczny napisał(a):

dodawać wielokrotnie określając w page dany link/stronę? Czyli przy 20 linkach w menu, ten fragment musiałbym mieć 20 razy? jeżeli kliknę o nas to wyświetli się treść o nas, jezeli kliknę towar to wyświetli się treść towar?

$navigationIsClicked = isset($_GET['page']);
if ($navigationIsClicked ) {
$fileToLoad = $_GET['page'];
$content = include_once "views/$fileToLoad";
}

Załóżmy, że twoja nawigacja wygląda tak:

<nav>
    <a href='index.php?page=omnie'>O mnie</a>
    <a href='index.php?page=kontakt'>Kontakt</a>
</nav>

Podczas kliknięcia w któryś link do $navigationIsClicked zostaje przypisane true. Po przejściu przez if do zmiennej $fileToLoad zostaje zapisana zmienna page wyciągnięta z $_GET, np. omnie. Później do zmiennej $content przypisujesz ścieżkę do pliku widoku contentu, który ma zostać załadowany. Ta ścieżka odpowiada folderom względem indexa w tym wypadku. Załóżmy, że masz folder www, a w nim index.php i folder views. W folderze views masz plik index, omnie i kontakt. W tym wypadku do zmiennej $fileToLoad przypisalismy omnie, więc ścieżka include_once wygląda "views/omnie" (.php jeszcze wypada dodać ).

Czyli reasumując ten cały wywód, chciałem Ci powiedzieć, że nie, nie musisz tego robic 20 razy. Wystarczy, że zrobisz to raz, a content będzie dynamicznie ustawiany za pomocą zmiennej page.

0

zrozumiałem wywód, prościej sie nie dało, wróce z roboty sprawdze czy mi to zadziała, jakby cos było nie halo, to jeszcze napisze

w kazdym razie wielkie dzięki za wyczerpujace odpowiedzi, mi juz został tylko dylemat czy zaciągać content czy stałe na kazdej podstronie. Właściwie wszystko prócz doświadczenia programisty idzie na korzyść dynamicznej zmiennej

layout jeszcze nie do konca wyciety ale szkielet jest :P no i menu zssane z menu.php :) :

http://www.jartex.com.pl/img_editor/nowastrona/index2.php

0

Jak coś to pisz, chętnie pomogę :)

0

ok, to na razie mam taki mini problem ze nie widzę polskich znaków na fragmencie ściąganym z innego pliku.

index.php ma fragment

<!DOCTYPE html>
<html lang="pl">

i na stronie działają polskie znaki, jednak w menu nie - próbowałem już kilka kodów znajdujących się w internecie wrzucając do menu.php jednak nic nie dało,

<meta http-equiv="content-type" content="text/html; charset=utf-8">
<php
header('Content-Type: text/html; charset=UTF-8');
?>

co do modów i kolorowania tekstu - ja nie robie tego specjalnie, gdybym chociaż wiedział że zwracacie mi uwage, ale edytowanie czyjegoś postu raczej nie sprawi ze stanie się dla tej osoby widoczny - bezczelne teksty typu "nauczysz sie porzadku" to nie wiem czy z zazenowaniem czy smiechem patrzyć ale to juz sprawa czyjes kultury a nie tematu

0
cudaczny napisał(a):

aczkolwiek z logicznego punktu widzenia, po guglowaniu nie widze ich zastosowania prócz estetyki, pewnie się myle

Generalnie te znaczniki zostały stworzone aby w przyszłości wyszukiwarki wiedziały gdzie mają szukać. Wystarczy prosty przykład, masz stronę o tematyce związanej z komputerami, jednak w panelu bocznym pojawia się reklama związana z rasą psów. Osoba szukająca w wyszukiwarce widzi link do strony i patrzy sobie na komputery. Tak to było do teraz. Jeśli dobrze pamiętam, standard HTML5 ma wejść w 2017, choć i już teraz można zauważyć, że pozycjonowanie stron opartych o HTML5 jest dużo łatwiejsze. Ale do przykładu wracając. W przyszłości, panel boczny oznaczany <aside> będzie interpretowany przez wyszukiwarkę jako temat poboczny i często gęsto pomijany, ponieważ nie jest związany bezpośrednio z treścią strony. I temu mają służyć nowe znaczniki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1