ugrás a tartalomhoz

Saját mini cms-hez szeretnék modult, de nem boldogulok.

lillilla · 2014. Már. 11. (K), 00.38
Iskolai feladat keretein belül saját mini cms-t csinálok és jól jönne némi segítség, akár privátban is a nagyobb hatékonyság érdekében.
Hol is kezdjem. Szóval van nekem egy dinamikus weboldalam localhoston és az egyik probléma a sok közül,hogy túl sok mindent akarok $_GET-tel elküldeni.

Az ide mutató adatbázis részlet:
menu tábla:
m_id
m_szulo (egy m_id az almenü szülőjének, ha van)
m_nev (nav-ban megjelenített név)
m_sorrend (nav-ban megjelenített sorrend)
m_cim (adott oldalhoz tartozó h1)
m_tartalom (adott oldalhoz tartozó tartalom)
m_plugin (egy másik php a plugin mappából include-olva)
m_statusz (aktív/passzív =látható/nem látható)

hírek tábla:
hir_id
hir_cim
hir_tartalom
hir_datum
hir_statusz

index.php tartalma:
  1. <?php  
  2. require("mysql.php");  
  3. // Menü összeállítása  
  4. $sql = "SELECT m_id, m_nev  
  5.         FROM menu  
  6.         WHERE m_s_id = (SELECT s_id FROM statusz WHERE s_nev='aktiv')  
  7.         ORDER BY m_sorrend ASC";  
  8. $eredmeny = mysql_query($sql);  
  9.   
  10. $menu = "<ul>\n";  
  11. while ($sor = mysql_fetch_assoc($eredmeny)) {  
  12.     $menu.= "<li><a href=\"?m_id={$sor['m_id']}\">{$sor['m_nev']}</a></li>";  
  13. }  
  14. $menu.= "</ul>\n";  
  15.   
  16. // Tartalom összeállítása  
  17. $id = (isset($_GET['m_id'])) ? $_GET['m_id'] : 1;  
  18. $sql = "SELECT m_cim, m_tartalom, m_plugin  
  19.         FROM menu  
  20.         WHERE m_s_id = (SELECT s_id FROM statusz WHERE s_nev='aktiv')  
  21.         AND m_id = ".$id;  
  22. $eredmeny = mysql_query($sql);  
  23.   
  24. if (@mysql_num_rows($eredmeny) == 0) {  
  25.     $tartalom = "<h1>Hiba!</h1>  
  26.     <p><em>A keresett oldal nem található.</em></p>\n";  
  27. }  
  28. else {  
  29.     $sor = mysql_fetch_assoc($eredmeny);  
  30.     $tartalom = "<h1>{$sor['m_cim']}</h1>  
  31.     {$sor['m_tartalom']}\n";  
  32.     if(!emptyempty($sor['m_plugin'])){  
  33.         $tartalom.=include("./modul/{$sor['m_plugin']}");  
  34.     }  
  35. }  
  36. ?><!DOCTYPE html>  
  37. <html>  
  38. <head>  
  39. <meta charset="utf8" />  
  40. <title></title>  
  41. </head>  
  42.   
  43. <body>  
  44. <div id="wrapper">  
  45. <header id="header">  
  46.     <h1>Tartalomkezelő</h1>  
  47. </header>  
  48.   
  49. <nav id="menu">  
  50.     <?php print $menu; ?>  
  51. </nav>  
  52.   
  53. <section id="content">  
  54.     <?php print $tartalom; ?>  
  55. </section>  
  56.   
  57. <footer id="footer">  
  58.     <p>&copy; 2014</p>  
  59. </footer>  
  60. </div>  
  61. </body>  
  62. </html>  
Ehhez szeretnék egy blog-szerű "hírek" kezdőoldalt, mint a Weblabor blog hogy az első, főoldalon lapozható cikkek legyenek rövid szöveggel és ha a címükre, vagy a tovább gombra kattintok,akkor jelenjen meg az adott cikk,meg egy vissza a hírekhez link.
Ehhez írtunk is még régebben egy php-t,ami külön működik is(kivéve az adott cikkre mutató linkkel), de a lapozó is get-tel adja át az értéket, az index.php is get-tel kapja a menüpont id-jét és a cikk megjelenítését sem tudom, hogy hogy kellene megoldani(hacsak nem egy harmadik php-vel, de megengedhető ez egy dinamikus oldalnál?). Olvasok megállás nélkül a témában,de nagyon kezdő vagyok még és sok mindent nem értek, a határidő meg közeledik.

A hirek.php:
  1. <?php  
  2.   
  3. // Találatok  
  4.   $kieg=mysql_query("SELECT * FROM hirek");  
  5. $mennyit  = 5;  
  6. $osszesen = mysql_num_rows($kieg);   
  7. $oldal    = (isset($_GET['oldal'])) ? $_GET['oldal'] : 1;  
  8. $oldalak  = ceil($osszesen/$mennyit);  
  9. $honnan   = ($oldal-1)*$mennyit;   
  10.   
  11. $sql = "SELECT hir_id, hir_cim, hir_tartalom, hir_ido  
  12.         FROM hirek  
  13.         WHERE hir_s_id=(SELECT s_id FROM statusz WHERE s_nev='aktiv')  
  14.         ORDER BY hir_id DESC  
  15.         LIMIT {$honnan}, {$mennyit}";  
  16. $eredmeny = mysql_query($sql);  
  17.   
  18.   
  19. $kimenet = "";  
  20. while ($sor = mysql_fetch_assoc($eredmeny)) {  
  21.     $kimenet.= "<article class=\"hirek\">  
  22.     <h3><a href=\"index.php?hir_id={$sor['hir_id']}\">{$sor['hir_cim']}</a></h3>  
  23.     <span class=\"hido\">{$sor['hir_ido']}</span>  
  24.     <p class=\"htart\">".substr(strip_tags($sor['hir_tartalom']),0,200)."</p>  
  25.     <a href=\"index.php?hir_id={$sor['hir_id']}\">Tovább...</a>  
  26. </article>\n";  
  27. }  
  28.   
  29. // Lapozó  
  30. $lapozo = "<p>";  
  31. $lapozo.= ($oldal <= 1) ? "Első | " : "<a href=\"?oldal=1\">Első</a> | ";  
  32. $lapozo.= ($oldal <= 1) ? "Előző | " : "<a href=\"?oldal=".($oldal-1)."\">Előző</a> | ";  
  33.   
  34. for ($i=1; $i<=$oldalak$i++) {  
  35.     $lapozo.= ($oldal == $i) ? "{$i} | " : "<a href=\"?oldal={$i}\">{$i}</a> | ";  
  36. }  
  37.   
  38. $lapozo.= ($oldal >= $oldalak) ? "Következő | " : "<a href=\"?oldal=".($oldal+1)."\">Következő</a> | ";  
  39. $lapozo.= ($oldal >= $oldalak) ? "Utolsó" : "<a href=\"?oldal={$oldalak}\">Utolsó</a>";  
  40. $lapozo.= "</p>\n";  
  41.   
  42. return $lapozo.$kimenet.$lapozo;  
  43.   
  44. ?>  
 
1

Nem a legszerencsésebb az adatbázis szerkezete.

inf · 2014. Már. 11. (K), 02.28
Nem a legszerencsésebb az adatbázis szerkezete.
menu tábla:
m_id
m_szulo (egy m_id az almenü szülőjének, ha van)
m_nev (nav-ban megjelenített név)
m_sorrend (nav-ban megjelenített sorrend)
m_cim (adott oldalhoz tartozó h1)
m_tartalom (adott oldalhoz tartozó tartalom)
m_plugin (egy másik php a plugin mappából include-olva)
m_statusz (aktív/passzív =látható/nem látható)

hírek tábla:
hir_id
hir_cim
hir_tartalom
hir_datum
hir_statusz
Én kapásból szétszedném tartalomra és menüre.

menu
	id
	nev
	bal
	jobb
	plugin
	tartalom.id
	statusz

tartalom
	id
	cim
	szoveg
	datum
	statusz
A menühöz olvasd el ezt: Hierarchikus adatkezelés SQL-lel PHP-ben II.

Az adatbázishoz használd a PDO driver-t prepared statement-el. Ez nem választási lehetőség, hanem alapvető dolog. A driver, amit most használsz nagyon komoly biztonsági kockázatot jelent.

A többire nem igazán lehet válaszolni, mert nincs konkrét kérdés.

Az, hogy valamit GET-tel adsz át nem probléma. Ha egy kérés csak olvas valamit az adatbázisból, akkor annak GET-nek kell lennie. Ha ír is valamit az adatbázisba, pl beküld vagy módosít egy tartalmat, akkor már POST-nak kell lennie. Ennyi a különbség.

Az linkeknél nem muszáj GET-ben átadni pl a menüpont id-jét. Általában mindenki szép url-t használ a GET-es átadás helyett. Ennél a legjobb megoldás a front controller minta használata. Azt kb úgy kell elképzelni, hogy a webszerver minden kérésedet egyetlen php fájlhoz irányítja, az a php fájl pedig megnézi a kérés url-jét, és az alapján szétosztja a kéréseket a többi fájl között. Így az url-ben nem kell php fájl nevének szerepelnie. Ahhoz, hogy ezt megcsinálja egy apache szerver, kell egy .htaccess nevű fájlt csinálnod. Ebbe bele kell szórnod a következőt:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ frontController.php
Így minden kérés a frontController.php-ba fog menni, ami meg kb így fog kinézni:
  1. $url = $_SERVER['REQUEST_URI'];  
  2.   
  3. $utvonalak = array(  
  4.     '^/?|/menu/(\d)$' => 'index.php'// a "/menu/1"-hez és a "/" -hez az index.php-t szúrja be  
  5.     '^/hirek/(\d)$' => 'hirek.php' // a "/hirek/1"-hez a hirek.php-t szúrja be  
  6. );  
  7.   
  8. $url_adatok = array();  
  9. $url_kezelo = '404.php';  
  10.   
  11. foreach ($utvonalak as $minta => $kezelo) {  
  12.     $regex = '%'.$minta.'%usD'//az u flag nem kell, ha nem utf-8 a kódolás, de ajánlott abba tenni mindent  
  13.     if (preg_match($regex$url$url_adatok)) {  
  14.         $url_kezelo = $kezelo;  
  15.         break;  
  16.     }  
  17. }  
  18.   
  19. include($url_kezelo);  
A preg_match szövegre tud regex mintát illeszteni. Szóval a kezelő fájlokat regex mintákkal kötjük össze, és ha az aktuális url-re illik valamelyik minta, akkor az ahhoz tartozó kezelő fájlt szúrja be. Teljesen más stílusban szoktam programozni, mint te, szóval nem biztos, hogy megfelelően működik a kód, és pl a $url_adatok-ban elérhető a menü id-je az index.php-ből. Próbálgasd, ha nem megy, akkor küldj kérdést ezzel kapcsolatban.


Az sql kódodban jobb lenne, ha kitennéd az "aktiv" részt egy konstansba, mert ahogy nézem elég sokszor használod, könnyű elírni.

        WHERE m_s_id = (SELECT s_id FROM statusz WHERE s_nev='aktiv')  
A másik, hogy " helyett '-t használj, mert mást jelent a kettő. PDO-val valahogy így nézne ki ez a része a kódnak:
  1. //valahol a mysql.php-ben mondjuk  
  2. define('STATUSZ_AKTIV''aktiv');  
  3.   
  4. //index.php részlet  
  5. $stmt = $pdo->prepare('SELECT m_cim, m_tartalom, m_plugin    
  6.     FROM menu    
  7.     WHERE m_s_id = (SELECT s_id FROM statusz WHERE s_nev=:status)    
  8.     AND m_id = :id'  
  9. );  
  10. $stmt->execute(array(  
  11.     ':status' => STATUSZ_AKTIV,  
  12.     ':id' => $id  
  13. ));  
  14.   
  15. if ($stmt->rowCount() > 0) {    
  16.     $sor = $stmt->fetch(PDO::FETCH_ASSOC);    
  17.     $tartalom = "<h1>{$sor['m_cim']}</h1>    
  18.     {$sor['m_tartalom']}\n";    
  19.     if(!emptyempty($sor['m_plugin'])){    
  20.         $tartalom.=include("./modul/{$sor['m_plugin']}");    
  21.     }    
  22. }    
  23. else {    
  24.     $tartalom = '<h1>Hiba!</h1>    
  25.     <p><em>A keresett oldal nem található.</em></p>\n';    
  26. }    
Annyi PHP fájlt használhatsz, amennyi jólesik, nincs megkötés ezzel kapcsolatban.

Írj, ha további kérdéseid vannak!