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:

<?php
require("mysql.php");
// Menü összeállítása
$sql = "SELECT m_id, m_nev
		FROM menu
		WHERE m_s_id = (SELECT s_id FROM statusz WHERE s_nev='aktiv')
		ORDER BY m_sorrend ASC";
$eredmeny = mysql_query($sql);

$menu = "<ul>\n";
while ($sor = mysql_fetch_assoc($eredmeny)) {
	$menu.= "<li><a href=\"?m_id={$sor['m_id']}\">{$sor['m_nev']}</a></li>";
}
$menu.= "</ul>\n";

// Tartalom összeállítása
$id = (isset($_GET['m_id'])) ? $_GET['m_id'] : 1;
$sql = "SELECT m_cim, m_tartalom, m_plugin
		FROM menu
		WHERE m_s_id = (SELECT s_id FROM statusz WHERE s_nev='aktiv')
		AND m_id = ".$id;
$eredmeny = mysql_query($sql);

if (@mysql_num_rows($eredmeny) == 0) {
	$tartalom = "<h1>Hiba!</h1>
	<p><em>A keresett oldal nem található.</em></p>\n";
}
else {
	$sor = mysql_fetch_assoc($eredmeny);
	$tartalom = "<h1>{$sor['m_cim']}</h1>
	{$sor['m_tartalom']}\n";
	if(!empty($sor['m_plugin'])){
		$tartalom.=include("./modul/{$sor['m_plugin']}");
	}
}
?><!DOCTYPE html>
<html>
<head>
<meta charset="utf8" />
<title></title>
</head>

<body>
<div id="wrapper">
<header id="header">
	<h1>Tartalomkezelő</h1>
</header>

<nav id="menu">
	<?php print $menu; ?>
</nav>

<section id="content">
	<?php print $tartalom; ?>
</section>

<footer id="footer">
	<p>&copy; 2014</p>
</footer>
</div>
</body>
</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:

<?php

// Találatok
  $kieg=mysql_query("SELECT * FROM hirek");
$mennyit  = 5;
$osszesen = mysql_num_rows($kieg); 
$oldal    = (isset($_GET['oldal'])) ? $_GET['oldal'] : 1;
$oldalak  = ceil($osszesen/$mennyit);
$honnan   = ($oldal-1)*$mennyit; 

$sql = "SELECT hir_id, hir_cim, hir_tartalom, hir_ido
		FROM hirek
		WHERE hir_s_id=(SELECT s_id FROM statusz WHERE s_nev='aktiv')
		ORDER BY hir_id DESC
		LIMIT {$honnan}, {$mennyit}";
$eredmeny = mysql_query($sql);


$kimenet = "";
while ($sor = mysql_fetch_assoc($eredmeny)) {
	$kimenet.= "<article class=\"hirek\">
	<h3><a href=\"index.php?hir_id={$sor['hir_id']}\">{$sor['hir_cim']}</a></h3>
	<span class=\"hido\">{$sor['hir_ido']}</span>
	<p class=\"htart\">".substr(strip_tags($sor['hir_tartalom']),0,200)."</p>
	<a href=\"index.php?hir_id={$sor['hir_id']}\">Tovább...</a>
</article>\n";
}

// Lapozó
$lapozo = "<p>";
$lapozo.= ($oldal <= 1) ? "Első | " : "<a href=\"?oldal=1\">Első</a> | ";
$lapozo.= ($oldal <= 1) ? "Előző | " : "<a href=\"?oldal=".($oldal-1)."\">Előző</a> | ";

for ($i=1; $i<=$oldalak; $i++) {
	$lapozo.= ($oldal == $i) ? "{$i} | " : "<a href=\"?oldal={$i}\">{$i}</a> | ";
}

$lapozo.= ($oldal >= $oldalak) ? "Következő | " : "<a href=\"?oldal=".($oldal+1)."\">Következő</a> | ";
$lapozo.= ($oldal >= $oldalak) ? "Utolsó" : "<a href=\"?oldal={$oldalak}\">Utolsó</a>";
$lapozo.= "</p>\n";

return $lapozo.$kimenet.$lapozo;

?>
 
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:

$url = $_SERVER['REQUEST_URI'];

$utvonalak = array(
	'^/?|/menu/(\d)$' => 'index.php', // a "/menu/1"-hez és a "/" -hez az index.php-t szúrja be
	'^/hirek/(\d)$' => 'hirek.php' // a "/hirek/1"-hez a hirek.php-t szúrja be
);

$url_adatok = array();
$url_kezelo = '404.php';

foreach ($utvonalak as $minta => $kezelo) {
	$regex = '%'.$minta.'%usD'; //az u flag nem kell, ha nem utf-8 a kódolás, de ajánlott abba tenni mindent
	if (preg_match($regex, $url, $url_adatok)) {
		$url_kezelo = $kezelo;
		break;
	}
}

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:


//valahol a mysql.php-ben mondjuk
define('STATUSZ_AKTIV', 'aktiv');

//index.php részlet
$stmt = $pdo->prepare('SELECT m_cim, m_tartalom, m_plugin  
	FROM menu  
	WHERE m_s_id = (SELECT s_id FROM statusz WHERE s_nev=:status)  
	AND m_id = :id'
);
$stmt->execute(array(
	':status' => STATUSZ_AKTIV,
	':id' => $id
));

if ($stmt->rowCount() > 0) {  
    $sor = $stmt->fetch(PDO::FETCH_ASSOC);  
    $tartalom = "<h1>{$sor['m_cim']}</h1>  
    {$sor['m_tartalom']}\n";  
    if(!empty($sor['m_plugin'])){  
        $tartalom.=include("./modul/{$sor['m_plugin']}");  
    }  
}  
else {  
    $tartalom = '<h1>Hiba!</h1>  
    <p><em>A keresett oldal nem található.</em></p>\n';  
}  
Annyi PHP fájlt használhatsz, amennyi jólesik, nincs megkötés ezzel kapcsolatban.

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