ďťż

[PHP] Menu w jednym pliku

       

Podstrony


telcocafe

cpa.php:
$cpa = $_GET['cpa']; switch ($cpa) { case "tutoriale": include("./cpa/index.php"); break; case "admin": include("./cpa/admin.php"); break; case "dodaj_tut": include("./cpa/functions.php"); // functions.php?id=3 break; case "edytuj_tut": include("./cpa/functions.php"); // functions.php?id=5 break; case "kategorie": include("./cpa/kategorie.php"); break; case "dodaj_kat": include("./cpa/functions.php"); // functions.php?id=9 break; case "edytuj_kat": include("./cpa/functions.php"); // functions.php?id=11 break; case "ustawienia": include("./cpa/functions.php"); // functions.php?id=1 break; case "szukaj": include("./cpa/szukaj.php"); break; case "pokaz": include("./cpa/pokaz.php"); break; case "wyloguj": include("./cpa/index.php"); // admin.php?id=5 break; default: echo "<p class='tekst'>Brak uprawnień ;) Wróć do <a href='./cpa.php?cpa=tutoriale'>Strony Głównej</a>.</p>"; }
Menu plików w katalogu [cpa]:
echo "<a href='./cpa.php?cpa=tutoriale'>Tutoriale</a> <a href='./cpa.php?cpa=edytuj_tut'>Edytuj tutoriale</a> <a href='./cpa.php?cpa=dodaj_tut'>Dodaj tutorial</a> <a href='./cpa.php?cpa=kategorie'>Kategorie</a> <a href='./cpa.php?cpa=edytuj_kat'>Edytuj kategorie</a> <a href='./cpa.php?cpa=dodaj_kat'>Dodaj kategorię</a> <a href='./cpa.php?cpa=ustawienia'>Ustawienia</a> <a href='./cpa.php?cpa=szukaj'>Szukaj</a> <a href='./cpa.php?cpa=admin'>Wyloguj</a>";
function.php - tylko mała część odpowiadająca za zmianę ustawień...
$mid = $_GET['id']; if ($mid == 1) { $content = "<p><form method='post' action='cpa/functions.php?id=2'> ... <input type='submit' value='Zapisz ustawienia' class='submit'></form></p> } if ($mid == 2) { $content = " <p><form method='post' action='cpa/functions.php?id=2'> ... <input type='submit' value='Zapisz ustawienia' class='submit'></form></p> } echo $content;
Problemem moim jest dołączenie pliku functions.php. W nim mam zawarte funkcje, które do tej pory wywoływałem jako functions.php?id=1. Oczywiście, nie ma takiego pliku, więc wywala błędy.
Jak przekazać te zmienne w menu?



Przecież masz zmienną $mid, więc w czym problem?

No właśnie nie umiem wywołać tej zmiennej w function.php ze switch'a w index.php. GET i POST są puste a robiłem tak:
case "ustawienia": $mid = 1; include("functions.php"); break;

No właśnie, a co masz w pliku function.php? $mid = $_GET['id']; Czyli zmienna się czyści.



Przecież już wkleiłem, co mam w pliku function.php. Do tej pory każdy formularz z tego pliku załączałem używając zmiennej w linku, czyli gdzieś w menu dałem <a href='cpa/functions.php?id=1'>Ustawienia</a>, wchodziło mi w pierwszy formularz... Teraz to nie działa, bo przecież nie mam pliku functions.php?id=2, tylko cpa/functions.php. A chcąc załączyć plik w index.php w instrukcji switch, muszę podać include("./cpa/functions.php"); a nie include("./cpa/functions.php?id=2");

Tak, ale zrozum, że taka konstrukcja z plikami jeden.php:<?php $a = 'jeden'; include 'dwa.php';oraz dwa.php:<?php echo $a;przy wywołaniu pliku jeden.php zwróci wartość "jeden".

A gdzie tak mam?
Okazuje się, że można to zrobić tak:
case "ustawienia": $_GET[id] = 1; include("./cpa/functions.php"); break;
Ale nie jestem zadowolony z wyniku, bo zamula strasznie...

XDebug i dowiesz się dlaczego.

Nie łapię tego tematu, choć wydaje się prosty.

Podstawa to dobra struktura kodu i szablonów. Dobry system szablonów + np. framework stosujący wzorzec MVC ułożyłby ci kod, a samo menu byłoby prostym blokiem w szablonie bez konieczności zabaw z include i GETami ;)


Podstawa to dobra struktura kodu i szablonów. Dobry system szablonów + np. framework stosujący wzorzec MVC ułożyłby ci kod, a samo menu byłoby prostym blokiem w szablonie bez konieczności zabaw z include i GETami ;)
Czy ja jestem jakiś Bill Gates, żeby płodzić takie coś? Chce zrobić na swój użytek małą rzecz, to nie będę przecież armat wyciągał. Po za tym, te techniki też by trzeba poznać...
Nie ma to, jak porządne forum, z wiedzącymi wszystko najlepiej, podającymi przykłady i gotowe rozwiązania... Szkoda, że nie padło hasło "szukaj w Google" albo "spójrz do manuala" - jestem najnormalniej w świecie zawiedziony... Że już nie wspomnę o jednym gościu ze strony na "a", który chciał za pomoc 70PLN, mimo, że mam tam abonament na porady.
Im więcej tego całego "internetu", tym więcej w nim syfu - przykład? Wpisz jakąś frazę w Google - 85% to sklepy, strony wypozycjonowane bez żądanej treści albo ogłoszenia porno. Olewam php, idę pobajerzyć na śledziku...

Próba stworzenia "prostego" skryptu za pomocą najprostszych metod spowoduje że ten wcale nie prosty skrypt będzie się sypał, albo będzie w pewnym momencie bardzo ciężki do wykończenia ze względu na toporne, nieelastyczne "proste" rozwiązania.
Nie licz też że każdy rzuci się wklejać gotowy przerobiony kod. Nie każdemu się chce, szczególnie widać toporne rozwiązania :D

Nie liczyłem na gotowce, liczyłem na pomoc w rozwiązaniu problemu od kogoś, kto ma więcej wiedzy na ten temat ode mnie. Jak widać, zamiast pomocy zyskałem garść nic nie znaczących frazesów.

1. Wkleiłeś switcha z pliku cpa.php, a później piszesz o takiej konstrukcji w index.php? Daj cały kod albo opisz to lepiej, bo nie do końca rozumiem.

2. Czy function.php i functions.php to dwa osobne pliki czy literówka? Jeżeli te same, to chcąc dostać się do kodu w ifach w "functions.php", powinieneś (jeżeli dobrze Cię rozumiem) wpisać w pasku adresu np.:

cpa.php?cpa=dodaj_tut&id=1 cpa.php?cpa=edytuj_tut&id=1 cpa.php?cpa=ustawienia&id=1 cpa.php?cpa=dodaj_kat&id=2 cpa.php?cpa=edytuj_kat&id=2 cpa.php?cpa=ustawienia&id=2
3. "Teraz to nie działa, bo przecież nie mam pliku functions.php?id=2" - przecież dołączany jest plik "funtions.php", a nie "funtions.php?id=2". To co jest po "?" to parametry i możesz ich tam wpisać ile chcesz.
Użytkownik Kozack edytował ten post 08 grudzień 2009, 20:02
1. functions.php - literówka.
2. Plik główny to cpa.php, tam jest switch - kolejny błąd ze zmęczenia.
3. Masz rację. Ale mając w switch np.:
case "index": include("./cpa/index.php"); break; case "szukaj": include("./cpa/szukaj.php"); break; case "strona": include("./cpa/strona.php"); break;
Wpisz teraz w link functions.php?id=2... w najlepszym przypadku załączony zastanie plik defaultowy bo w switchu nie ma zadeklarowanego pliku o nazwie functions.php?id=2.
Tu właśnie leży moja niewiedza. jak zainkludować plik, żeby przekazać mu parametry przez instrukcję switch. Jak mniemam:
case "ustawienia": $_GET[id] = 1; include("./cpa/functions.php"); break;
Wtedy odbiorę zmienną w pliku functions.php. jednakże, to rozwiązanie mnie nie zadowala, za bardzo zamula, generowanie prostego formularza trwa nawet 0,2 sekundy. Po za tym pojawiają się problemy z linkami w innych plikach...

A nie da rady zrobić linku w postaci cpa.php?cpa=ustawienia&id=1 ?

Dokładnie. Możesz napisać tak:
<form method="post" action="cpa/functions.php?cpa=" . $_GET['cpa'] . "&id=" . $_GET['id'] . "> <form method='post' action='cpa/functions.php?cpa=dodaj_kat&id=2'>
Nie rozumiem dlaczego dlaczego masz dwa parametry (cpa i id)? Z kodu wynika, że jeżeli cpa=dodaj_tut, to uruchamiasz funkcję id=3 itd.. Dlaczego w pliku functions.php nie zrobisz po prostu tak:
if ($_GET['cpa'] == 'dodaj_tut') { $content = "<p><form method='post' action='cpa.php?cpa=dodaj_tut'> ... <input type='submit' value='Zapisz ustawienia' class='submit'></form></p> }
Użytkownik Kozack edytował ten post 09 grudzień 2009, 18:20
Jak z moich wywodów wynika, po stronie pliku functions.php wszystko działa ok. Dla lepszego rozeznania zmieniłem nazwy. On wyłapuje zmienną ($fu = $_GET['fu'];), potrzebną do załączenia odpowiedniego formularza. I potem już leci...
Wszytko pięknie mi działało, do momentu przerobienia tego na podstrony. Czyli $_GET['cpa'] to zmienna, która przełącza podstrony a $_GET['id'], to zmienna, która przełącza formularze i ona biegała zawsze dobrze.

Okej. Skoro za wolno, to może trochę o optymalizacji. Na początek $_GET[id] = 1. Dobre dla PHP w wersji 3. Teraz się pisze $_GET['id'] = 1. Jeśli nie potrzebujesz, to nie stosuj cudzysłowów. Używaj apostrofów. Dlaczego? Tekst w cudzysłowach jest sprawdzany przez parser, a w apostrofach nie. Przykłady:<?php $test = 'przykład'; echo "To jest $test"; // To jest przykład echo 'To jest $test'; // To jest $testJeśli chcesz wyłapać wszystkie błędy, to możesz dopisać deklarację error_reporting(E_ALL) na początku pliku głównego (index.php czy u Ciebie pewnie cpa.php).
P.S. Nie trzeba być Billem Gatesem, by coś osiągnąć :lol:

Używam $_GET['id'] = 1, przy pisaniu ominąłem. Stosuję apostrofy, gdzie tylko mogę, choć to bardziej komplikuje kod. Cudzysłowy się wykonują a apostrofy się drukują - upraszczając. Zresztą to są podstawy optymalizacji i o tym pamiętam. Niestety, z php jest jak z seksem - teoria nie wystarczy, żeby być w tym dobrym...
I nadal nie wiem, jak sobie poradzić z problemem. Jak przekazać zmienną z case w pliku cpa.php do pliku cpa/functions.php, żeby uruchomić odpowiedni formularz zakładając, że cpa.php jest plikiem głównym a reszta plików z katalogu cpa jest inkludowana.

To może takie pytanie. Napisałeś, że aby wyświetlić formularz wpisujesz adres functions.php?id=3. Czy teraz, jeśli zmieniłeś sposób pracy i uruchamiasz swój skrypt przez plik cpa.php, to wciąż wykorzystujesz sposób wchodzenia na stronę przez functions.php?id=3? Bo jeśli nie, to możesz przecież usunąć $mid = $_GET['id']; z pliku functions.php i korzystać tylko ze zmiennej $mid. Możesz też pójść jeszcze dalej i zrobić to w ten sposób:switch ($cpa) { case 'edytuj_tut': $content = '<form method="post" action="cpa.php?cpa=edytuj_tut''> ... <input type="submit" value="Zapisz ustawienia" class="submit"></form>'; break; case 'dodaj_tut': $content = '<form method="post" action="cpa.php?cpa=dodaj_tut"> ... <input type="submit" value="Zapisz ustawienia" class="submit"></form>'; break; } echo $content;Tutaj raczej nie jest potrzebna tona ifów. Wystarczy jeden switch.
W dodatku wysyłasz formularz do, np., cpa/functions.php?id=2. Przecież to jest formularz. Domyślam się, że nie pojawia się tam formularz z wprowadzonymi danymi, gdy wystąpił błąd tylko jest tam lista błędów i przycisk powrotu. To raczej nie jest za ciekawe rozwiązanie (chyba że się mylę). Wystarczy, że dołączasz plik functions.php i w akcji formularza może być umieszczony, np., cpa.php?cpa=edytuj_tut. Później błędy wyświetlasz, np., nad formularzem lub przy każdym z pól, lub obie wersje, jak kto woli :)
P.S. W akapicie nie może się znaleźć żaden inny element blokowy. Znacznik formularza sam w sobie robi marginesy, więc akapit nie jest potrzebny.

No tak. Ale problemów narasta, głównie sprawa linków. Bo (zmieniłem nazwy zmiennych, dla lepszego rozeznania):
cpa.php
$cpa = $_GET['go']; switch ($go) { case 'tutoriale': include('./cpa/index.php'); break; case 'admin': include('./cpa/admin.php'); break; case 'kategorie': include('./cpa/kategorie.php'); break; case 'szukaj': include('./cpa/szukaj.php'); break; case 'pokaz': include('./cpa/pokaz.php'); break; default: echo "<p class='tekst'>Brak uprawnień ;) Wróć do <a href='./cpa.php?go=tutoriale'>Strony Głównej</a>.</p>"; }
szukaj.php
$zapytanie = "SELECT * FROM ustawienia WHERE id=1"; $wynik = mysql_query($zapytanie); $dane = mysql_fetch_array( $wynik ); $strona = $dane['strona']; $s = $_GET['s']; if ($s == 1) { $q = $_GET['q']; $found = 'FALSE'; $content = "<form method='get' action='szukaj.php'> <input type='hidden' name='s' value='1' class='edit'> <input type='text' size='40' name='q' class='edit'> <input type='submit' name='' value='Szukaj' class='submit'> </form><br /> <font class='pl'>Brak wyników wyszukiwania dla frazy \"<b>".$q."</b>\"!</font>"; $zapytanie = "SELECT * FROM tutoriale"; $wynik = mysql_query($zapytanie); while ($dane = mysql_fetch_array($wynik)) { $id = $dane['id']; $kat = $dane['kat']; $kat_id = $dane['kat_id']; $tytul = $dane['tytul']; $autor = $dane['autor']; $obraz = $dane['obraz']; $bgl = ($kl++%2 == 0)?"t_tdjl":"t_tdcl"; $bgc = ($kc++%2 == 0)?"t_tdjc":"t_tdcc"; if ((preg_match('/'.$q.'/i', $tytul)) || (preg_match('/'.$q.'/i', $autor))) { if ($found == 'FALSE') { $found = 'TRUE'; $content = "<br /><form method='get' action='szukaj.php'> <input type='hidden' name='s' value='1' class='edit'> <input type='text' size='40' name='q' class='edit'> <input type='submit' name='' value='Szukaj' class='submit'> </form><br /> <font class='pl'>Wyniki wyszukiwania dla frazy \"<b>".$q."</b>\"!</font> </div> <div class='tabele'> <table class='t_table'> <tr> <td class='t_th' width='75px'>Obraz</td> <td class='t_th'>Tytuł tutoriala</td> <td class='t_th' width='100px'>Kategoria</td> </tr> </tr> <tr> <td class='$bgc'><img src='.".$obraz."' alt='obraz' width='70' height='70' /></td> <td class='$bgl'><a href='../cpa.php?go=pokaz&id=".$id."'class='key'>" .$tytul."</a></td> <td class='$bgc'><a href='../cpa.php?go=tutoriale&p=2&c=".$kat_id."'class='key' >".$kat."</a></td> </tr></div>"; } else { $content .= " <tr> <td class='$bgc'><img src='.".$obraz."' alt='obraz' width='70' height='70' /></td> <td class='$bgl'><a href='../cpa.php?go=pokaz&id=".$id."'class='key'>" .$tytul."</a></td> <td class='$bgc'><a href='../cpa.php?go=tutoriale&p=2&c=".$kat_id."'class='key' >".$kat."</a></td> </tr>"; } } } if ($found == 'TRUE') $content .= "</table>"; } else { $content = "<br /><form method='get' action='szukaj.php'> <input type='hidden' name='s' value='1' class='edit'> <input type='text' size='40' name='q' class='edit'> <input type='submit' name='' value='Szukaj' class='submit'> </form>"; } echo "$content"; mysql_close();

1. Jaką ścieżkę podać w <form method='get' action='szukaj.php'> ?
2. Jak rozwiązać nawigację w plikach?
$menu = array( 'cpa.php?go=tutoriale' => 'Tutoriale', 'cpa.php?go=admin' => 'Edytuj tutoriale', 'cpa.php?go=kategorie' => 'Kategorie', 'cpa.php?go=szukaj' => 'Szukaj', ); $p = strrpos($_SERVER['PHP_SELF'],'/'); $aktualna_strona = substr($_SERVER['PHP_SELF'], $p+1 ); $tytul_strony = $menu[$aktualna_strona];

Dodaj ukryte pole formularza<input type="hidden" name="go" value="search" />I taka rzecz... :surprise: Pobierasz wszystkie tutoriale i je przeszukujesz pod kątem zapytania. To jest... Dobra, oszczędzę słów :lol: Używaj wyszukiwania pełnotekstowego:
http://dev.mysql.com...l-language.html
http://dev.mysql.com...xt-boolean.html
Albo chociaż wykorzystuj operator LIKE:
http://dev.mysql.com...l#operator_like
Inaczej nie powinno Ciebie dziwić powolne szukanie (to w przyszłości, bo teraz pewnie działa dosyć szybko).
Użytkownik andrzej_aa edytował ten post 11 grudzień 2009, 15:39
Sztuczkę z ukrytym imputem już poznałem, skorzystałem.
Tak naprawdę, przeszukiwanie trwa szybko (może dlatego, że na razie mało materiału w bazie). Z założenia, miało przeszukiwać tylko pole "słowa kluczowe", a nie całą bazę. Ale dzięki za linki - szczerze powiedziawszy, nie za bardzo kumam pogańskie języki.
Mój formularz w obecnej formie:
$content = "<form method='get' action='cpa.php'> <input type='hidden' name='go' value='szukaj' class='edit'> <input type='hidden' name='s' value='1' class='edit'> <input type='text' size='40' name='q' class='edit'> <input type='submit' name='' value='Szukaj' class='submit'> </form>";

O jakich pogańskich językach mówisz? :lol: Nie ma czegoś takiego (http://www.google.pl...a...-8&oe=utf-8).
Co do wyszukiwania... Ty pobierasz wszystkie dane z bazy i przeszukujesz je, ale to jest śmiertelne rozwiązanie. Serwer jest mocno obciążony. Najprościej jest wykorzystać operator LIKE, czyliSELECT `id`, `tytul`, `opis` FROM `tutoriale` WHERE `tytul` LIKE "%windows%" OR `opis` LIKE "%windows%"No i jeszcze taka rzecz. Pobieranie wszystkich kolumn z bazy też trwa dłużej. Gdy masz tabelę z kolumnami id, tytul, opis i chcesz wyświetlić tytuły, które będą prowadziły do pełnej wersji artykułu, to nie ma potrzeby pobierać jeszcze opisu. ZamiastSELECT * FROM tutorialeużywajSELECT `id`, `tytul` FROM tutorialeTutaj możesz poczytać podstawy o bazach danych MySQL i PHP.

Pisząc "pogańskie języki" mam na myśli wszystkie inne niż polski ;p
1. Jak mam wtedy wyświetlić listę tutoriali, łącznie z obrazkami, jeżeli tego nie było w zapytaniu? Po wyszukaniu wyświetlam listę, łącznie z grafiką wyróżniającą tutorial - jedynie nie wykorzystuję daty. Ma to wyglądać tak?:
SELECT `id`, `kat`, kat_id`, `tytul`, `obraz` FROM `tutoriale` WHERE `tytul` LIKE "%$string%" OR `tresc` LIKE "%$string%"
2. Jak mam:
WHERE `tytul` LIKE "%$string%"
czy mam użyć coś takiego?:
<input type='$string' size='40' name='q' class='edit'>
Bo w jakiś sposób muszę przecież przekazać tę zmienną...
3. Może lepiej zrobić pola kombi i przełączać wyszukiwanie między "autor", "tytuł", "treść", "tagi"...?
Użytkownik Kshyhoo edytował ten post 11 grudzień 2009, 19:27
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.