ugrás a tartalomhoz

URL paramétertől függő oldal szelet betöltése

Anonymous · 2007. Jan. 5. (P), 01.20
sziasztok,

minden szép és jó a php-vel, de valamit nem értek, hogy lehet megcsinálni azt, hogy a php oldalon a linkekre klikkelve úgy jelenjen meg a tartalom, mint html ben a frame-eknél. pl ezen az oldalon . Biztosan valami egyszerű dolog, de mi. Smarty? Köszönöm, ha segítetek mert ez nagy lépést jelentene nekem!

üdvözlet
 
1

anonymous???? he?

krey · 2007. Jan. 5. (P), 01.38
Ez az oldal, amit mutattál valami borzalom, talán jobb példával is előállhattál volna, a fél internet ilyen :) (ha nem az egész). Na mindegy.

Ha tényleg minden olyan szép php-val, ahogy mondtad, akkor valahogy így:

<html>
 <head>
  <title>(F)rémszet</title>
 </head>
 <body>
  <p>1. Itt egy kis szöveg </p>
  <p><?=readfile("2.txt");?> </p>
  <p>3. Itt még egy kis szöveg </p>
 </body>
</html>
Ennek a példaprogramnak az a lényege, hogy megcsinálja, hogy van 3 bekezdés (<p>aragrafus) és a 2 bekezdés szövegét egy 2.txt nevű fájlból tölti be. Ha mondjuk egy táblázat cellákkal, vagy CSS-sel csinálod, akkor is hasonlóan kell eljárni. A megoldás nem szemantikus és ha nincs 2.txt, akkor hibát dob.

Remélem ebből rájössz!

üdv. krey

ps. Smarty sux, túl nagy a felhajtás körülötte, az emberek mindenre ezt akarják használni :( Pedig ugyanannyit tud mint a PHP, csak meg kell tanulni egy új nyelvet! Amúgy biztos vannak projectek amikor nagyon jó, de nem kell mindenhez!!!
2

már nem anonym :)

erika913 · 2007. Jan. 5. (P), 01.49
Szia,

értem amit írtál, csak mégsem világos még a dolog. Az érdekelne, hogy hogyan lehet php-vel megycsinálni azt, hogy a link pl
http://www.gantse.extra.hu/index.php?tartalom=fooldal, hogy kerül ez a végére és hogyan lehet betölteni egy divbe a tartalmat, én azt hittem csak a frame szolgálja ezt a funkciót. Kicsit lehet zagyvaság amiket írok, de tényleg szeretném megtanulni. ha valami linket kaphatnék amin esetleg előbbre juthatok. De ha tudsz segíteni azt is megköszönöm!
10

Szívemből szóltál ...

Max Logan · 2007. Jan. 5. (P), 10.07
Smarty sux, túl nagy a felhajtás körülötte, az emberek mindenre ezt akarják használni :( Pedig ugyanannyit tud mint a PHP, csak meg kell tanulni egy új nyelvet! Amúgy biztos vannak projectek amikor nagyon jó, de nem kell mindenhez!!!

Amikor template megoldást kerestem előbb-utóbb rátaláltam a Smarty-ra. Hát mit ne mondjak nem voltam elragadtatva attól, hogy ha template-eket akarok használni, tanuljak meg még egy nyelvet (habár php alapú a Smarty). Aztán rátaláltam Methos megoldására a tutorial.hu-n, amin kis változtatást eszközöltem és tökéletesen tudok template-eket használni 1 db függvény segítségével:

<?php

 function load_template_file($fajlnev,$tomb) 
 {
    if (file_exists($fajlnev) > 0) 
    {
       # Templatefile beolvasása
       $temp = fopen($fajlnev,"r");
       $tartalom = fread($temp, filesize($fajlnev));
       fclose($temp);

       # Kicseréljük a megfelelő részeket a templateben
       foreach ($tomb as $mit => $mire )
       {
          $tartalom = preg_replace("/{".$mit."}/",$mire,$tartalom);   
       }

       return $tartalom;
    }
    else { return false; }
 }

?>
Nemrég volt egy topic, hogy a srác 2 template-et akart használni és nekiállt a Smarty-nak. Volt egy rész ahol egy listát jelenített meg. Itt a lista megjelenítését a Smarty-ra bizza amit én hót feleslegesnek tartok, ha ezt meg tudom oldani php szinten is. Ezért nem látom értelmét a Smarty-nak. Bár hallottam vmit, hogy tud cache-elni is, ami nagyobb terhelés esetén (talán) jól jöhet, bár nemtom, hogy itt pontosan mit is cache-el.
11

Azért ennél már jobb a smarty

pp · 2007. Jan. 5. (P), 11.16
Sablont (templétet, sminket, bőrt) azért használ az ember, hogy a kinézetet és a működési logikát szétszaggassa.

Sajnos evvel a megoldással ezt igen nehéz megtenni. Már a legegyszerűbb feladatba is beletörik a bicskád. Van három oldalad, és az aktuális menü linkje legyen mondjuk félkövér. Ilyenkor képtelenség szétválasztani a megjelenést a kódtól. Még egy egyszerű iterációt vagy egy elágazást sem tudsz beletenni a sminkbe.

Szóval ez nagyszerű akkor, ha mondjuk egyszerű minta dokumentumokat(akár doc, xls is.) kell előállítani programozottan.

A Smarty egy igen hatékony eszköz főleg akkor, ha nem egy egyszemélyes projektről van szó. Természetesen nem kell minden feladatra Smarty-t használni sőt.

Persze nem kell új dolgokat megtanulni, mert egyszercsak kipukkad a fejetek ;), aki nem fél ettől a veszélytől, és képes felülemelkedni az "akarmi sux" világnézeten az nyugodtan nézze, hallgassa meg Szabó Dénest aki 2003-ban már beszélt nektek erről.

http://www.phpconf.hu/2003/program.php/Smarty

(volt egy cikk itt a weblaboron is a témáról, de a nagy egyesülés, költözés, megújulás közben valahogy elveszett. Majd megpróbálom előkotorni és feltenni valahova, csak meg lesz valahol a bittenger mélyén valahol)
pp
12

Lehet, hogy nagyobb projectnél ...

Max Logan · 2007. Jan. 5. (P), 12.21
... van értelme a Smarty-nak, de eddig számomra felesleges (főleg kényelmetlen) használni. Amit kell ezzel az egy db függvénnyel meg tudom oldani.

Az említett aktuális menü kiemelése problémát pedig úgy oldanám meg, hogy az URL-től függően a template-ben az aktuális menüpontnál megváltoztatom a class-t. Innetől kezdve ha több template van (márpedig van, ha már van template rendszer) logikusan követ az ember egy konvenciót (tehát minden template-ben mondjuk van menu_item és act_menu_item class) és nincsen gond.
21

Pedig ez éppen nem megoldás

pp · 2007. Jan. 5. (P), 17.07
Már hogy ne lenne gond, hogy neked a kódba kellett elhelyezned azt az információt(aktuális link formázása) amit a smink-be kéne raknod.
Hogyan oldol meg evvel a módszerrel, hogy minden oldalon ugyan az a menü legyen, csak kis különbséggel? Hogyan lesz megoldva a dinamikus menü? Mi van ha két helyre is be akarod rakni?

Mégegyszer evvel nem oldod meg a kód és a megjelenés szétválasztását, tehát ez nem sablon vagy template, hanem egy kis ügyeskedés csupán.

pp
25

Kód vs formázás

Max Logan · 2007. Jan. 5. (P), 19.54
Itt annyi van a php-ban, hogy mi a kiemelt menüpont. Az aktuális menüponthoz beilleszt egy "act_" előtagot a class nevéhez, mivel URL ellenőrzésen alapul (legalábbis az én általam írt megoldásban) sztem ez a kód és nem a template feladata. Tehát engem az zavar a legjobban a Smarty-ban, hogy miért van pl. foreach a skin-ben. Ha pedig van, akkor meg minek bevezetni + 1 nyelvet a template-ezéshez, ha ezt meg tudom oldani php-ban is. Szóval számomra még mindig túlbonyolítás a Smarty használata.

Nem értek egyet azzal, hogy ügyeskedés lenne. Ha egy projectnél van egy kidolgozott kovenció a dolgokra (márpedig jó esetben van), akkor sztem semmi negatív hatása nincs, hogy a php illeszti be a class-hoz az előtagot. Ha pedig kitesszük egy ini file-ba az előtag beállítását, akkor a kódhoz sem kell hozzányúlni, ha esetleg változtatni kell a megnevezésen.
26

Akkor nézzük konkrétan

pp · 2007. Jan. 6. (Szo), 11.55
Az, hogy melyik az aktuális menüpont az tényleg a vezérlés feladata, de az, hogy ezt hogyan jelölöd ('act_' előtag) az már a megjelenésé.

Én nem azt mondtam, hogy Smarty-t kellene minden ilyen megoldásra használni, hanem azt mondtam, hogy az általatok template/sablon függvénynek hívot valami nem az.

Itt van egy phps megvalósítása annak amiről beszélek:
<?php
//supermini template engine by pp
// használat:
// $vars['vars1']='value1';
// $vars['vars2']='value2';
// $vars['vars3']='value3';
//
// echo tpl('index.tpl',$vars);
//

function tpl($tpl,$vars = array()){
  extract($vars);
  
  if(defined('TEMPLATE_DIR')){
   $tpl=TEMPLATE_DIR.'/'.$tpl;
  }
  if(@file_exists($tpl)){
    include($tpl);
  }else{
    if(defined('TEMPLATE_DIR') && !is_dir(TEMPLATE_DIR)){
      trigger_error("<strong>Template error</strong>: A template könyvtár(".TEMPLATE_DIR.") nem található",E_USER_ERROR);
    }else{
      trigger_error("<strong>Template error</strong>: A fájl $tpl nem található",E_USER_ERROR);
    }
  }
}
?>
Ezzel szét tudod választani a template fájlokat a php fájloktól. (külön könyvtár vagy/és külön kiterjesztés)
Azért mert az include egy függvény belsejében van véletlenül nem tudsz kinyulni a globális névtérbe, tehát nem tudsz belepiszkálni a template-t használó alkalmazás változóiba. (csak global kulcsszó, vagy $GLOBALS tömb segítségével)

Tehát szétválasztottuk a megjelenést a működésünktől.
Nem kell még egy nyelvet megtanulnunk, hisz a template programozása simán PHP-ben mehet. Amennyiben van olyan megjelenés ami gyakran előfordul, pl egy rendezhető fejléces táblázat, akkor ezt ki kell tenni egy template fájlba és simán használni a tpl() függvényt.

Ezt a függvényt még egy dologgal biztosan bővíteném, egy hívási veremmel. Ebben tárolnám a meghívott template fájlok nevét, és ha kétszer előfordul akkor dobok egy hibát, hisz rekurziv template hívások vannak ami nem biztos, hogy egészséges. Természetesen x mélységű rekurziót is lehet engedélyezni. ;)

Ez a megoldás ugyan sokkal rugalmasabb mint a smarty, de mint látható nem helyes használat esetén komoly problémák léphetnek fel. A smarty, mivel egy másik nyelv (és értelmező) ezért rákényszeríti a programozót a helyes használatra. Tehát nem nyúlhat ki a globális névtérbe pl.
Mindenkinek azt javaslom nézze meg a Smartyt, mert előbb utóbb úgy is egy olyan széles funkciókészletű megoldás csomagot fog összeállítani mint a smarty. Lehet ötleteket gyűjteni, nem kell feltétlenül használni.

Tudom, hogy ritka fárasztó valaki másnak a gondolkodását, eszköz logikáját megérteni még is úgy gondolom, hogy nem elvesztegetett idő.(tanulás szempontjából)

pp
27

igen, igen

krey · 2007. Jan. 6. (Szo), 12.34
Én is írkáltam már ilyen, és ennél jóval bonyolultabb template engine-eket. De sajnos kevés esetben sikerült teljes működésre bírnom :) A legfőbb problémám mindig a ciklusokkal volt, főleg ha 2+ van egymásban. A smarty-s megoldás a ciklus problémára:

<?php
$smarty->assign('tomb', array( 100,200,300););
?>

{foreach from=$custid item=curr_id}
 {$curr_id}
{/foreach}
{* Kiírja, h 100200300 *}
Amikor eddig jutottam a smarty tanulásában, akkor mondtam azt, hogy ez már majdnem tök PHP, sőt ilyen formában lassabb (persze a cache-elésről most ne beszéljünk), úgyhogy nem biztos, hogy megéri.

Amúgy, ha tényleg annyira jó, akkor kedvenced, a drupal miért nem aktív smarty támogató/használó? (tehát lehet vele smary-zni, de csak ha nagyon akarsz :) )

üdv. krey
29

Erre gondoltam én is ...

Max Logan · 2007. Jan. 6. (Szo), 18.55
Amikor eddig jutottam a smarty tanulásában, akkor mondtam azt, hogy ez már majdnem tök PHP ...

Erre gondoltam én is, ezért nem szimpatikus a Smarty.
31

én nem vagyok smarty hívő

pp · 2007. Jan. 6. (Szo), 22.10
Több template engine-t használtam már, többek között a smarty-t. Mindig igyekeztem a feladatnak megfelelő/vagy adott;) template engine-t választani.

A Drupal már a kezdet kezdetén igyekezett szétválasztani a megjelenést a működéstől. Drupal egy nagyon rugalmas rendszer, így lehetővé teszi, hogy különböző template engine-eket (sablon motorokat, smineklő gépet) használja. Kezdetben az xtemplae motort használták az alapértelmezett sminkekhez, de a 4.6-os verziótól kezdve a phptemplate az alapértelmezett smink motor. Hogy miért ez és miért nem a smarty, xtemplate, vagy akármi más azt a fejlesztőktől kell megkérdezni, de gyanítom azért, mert a smarty által nyújtott hatalmas funkcionalitásra nincs szükség. Nyílván aki azt szokta meg azt zavarta, hogy nincs ezért is készítették el a megfelelő smarty motort.

Nekem semmi bajom nincs azzal, ha valaki nem szereti a smarty-t és helyette saját fejlesztést használ, vagy nem használ semmit hisz a php semmi más mint egy template értelmező ;) A problémám a következőkkel volt:

- a funkcionalitás és a megjelenés szétválasztásának feleslegességéről szóló postokkal
- a "ne tanuld meg nem érdemes" véleményekkel.
- akármi(pl.: smarty) suxx

pp
28

Elv

Max Logan · 2007. Jan. 6. (Szo), 18.51
Ezzel szét tudod választani a template fájlokat a php fájloktól. (külön könyvtár vagy/és külön kiterjesztés)

Nekem is szét van választva. Van egy template könyvtár, amiben vannak az egyes template-ek könyvtárai. Minden template könyvtárában van egy images és css könyvtár valamint a .tpl kiterjesztésű file-ok.

Tehát szétválasztottuk a megjelenést a működésünktől. Nem kell még egy nyelvet megtanulnunk, hisz a template programozása simán PHP-ben mehet.

Tehát ha jól értem, akkor az egyes .tpl file-okban lehet php kód? Nekem pontosan ez a lényeg, hogy a .tpl file-ok semmilyen kódot nem tartalmaznak, csak a {valami} formában elhelyezett cserélendő stringeket. Ezáltal megakadályhozható, hogy a template-eket előállító emberke ne tudjon belenyúlni a működési logikába. Ha pedig megengedjük, hogy php kód legyen a template file-okban akkor már nem elég HTML + CSS tudás, mert akarva-akaratlanul is belerondíhat a sitebuilder a php kódba, ergó hazavágja a működést.
30

Egy példát légyszíves mutass már!

pp · 2007. Jan. 6. (Szo), 21.47
ha csak {valami} formák vannak a kódban, akkor hogyan oldod meg a szétválasztást?

gondolom ezt csinálnád:

menuitem.tpl

<li><a href="{link}" class="{class}">{title}</a></li>
menu.tpl
<ul>{menuitems}</ul>
a kód meg valahogyan így nézne ki:
( a $menu változóban vannak a menüpontok, benne melyik aktív meg minden.)
<?php
 foreach($menu as $menuitem){
  $menuitems .= load_template_file('menulink.tpl',$menuitem);  
}
  $menu = load_template_file('menu.tpl',array('menuitems' => $menuitems));
?>
Ez eddig tök "frankó", de már itt sem válik szét a megjelenítés és a működés, mert itten kérem hol érdekel engem, hogy hogyan kell előállítani a menüt, miért menuitemekből jön össze stb. Szóval már itt sérül a szétválasztás elve, de nézzük meg hogyan oldod meg, hogy a menü elemek ne így, hanem úgy jelenjenek meg, hogy közöttük | karakter van.

pp
32

Szétválasztás

Max Logan · 2007. Jan. 7. (V), 01.56
Jelenleg már fáradt vagyok, hogy kigondoljam a műveletet :-) Honlap (akarom mondani ma) összedobok egy megoldást a felvetett dologra. De ha már itt tartunk akkor én is kérnék egy Smarty-s megoldást a |-as szeparálásra.

Egyébként lehet, hogy mást értünk szétválasztás alatt. Nekem a lényeg, hogy a tpl file-okban csak html és css legyen semmi kód. Ahogy kivettem a gondolataidból amit én php szinten oldok meg azt te Smarty-val.
51

hehehe

amonrpg · 2007. Jan. 12. (P), 11.34
<ul id="menu">
   {foreach from=$menu item=menuitem}
      <li>{$menuitem.title}</li>
   {/foreach}
</ul>
:D
Ennél több nem kell, már persze a megfelelő CSS-en kívül. ;)

Amúgy meg nézzétek meg a php_template nevű csodát. C-ben írt template rendszer, az általam eddig látott leggyorsabb. Két hátránya van: php modul, másrészt meg jelen formájában nem képes cache-elni. Igazából nincs is rá szüksége.
Ja, meg van egy bugja, de az kikerülhető.
A feldolgozás egy fgv. végzi, és nem ad visszatérési értéket, ha a template-ben egyetlen feldolgozandó tag sincs.
Amúgy nekem kedvencem.

Ha meg vkinek túl nagy a smarty, elég overhead, az próbálja ki a template_lite nevű smarty-klónt. Kicsi, gyors, igaz néhány dolgot nem tud (pl. object-et behúzni assign-el).
49

Feltételes megjelenítés

Max Logan · 2007. Jan. 10. (Sze), 16.59
Sajnos nincs időm a felvetett problémára megoldást alkotni, mert elég rendesen el vagyok havazva határidős munkákkal.

Szóval még mindig érdekelne, hogy az általad felvetett dolog, hogyan is nézne ki Smarty-ban.

És közben nekem is szmbe jutott egy feladat. Hogyan oldod meg azt smarty-val, hogy adott esetben a user jogosultságaitól függően jelenjenek meg menüpontok? Tehát alapon mondjuk megjelenik 4 menüpont és ha admin joggal lép be vki, akkor 3.-nak szúrjon be még egy menüpontot.
52

na ez az ami nem a template feladata

pp · 2007. Jan. 12. (P), 14.12
jogosultságtól függő menüpont megjelenítés -> tipikusan olyan feladat ami vezérlés, tehát régen rossz, ha azt a template-ben kell megjeleníteni/eltüntetni.

pp
(ha lesz időm akkor válaszolok hosszabban is ;))
53

Igen-igen

Max Logan · 2007. Jan. 12. (P), 14.42
Erről van szó. Ezért kérdeztem, hogy ezt hogyan oldod meg Smarty-t használva a menü template-jéhez, hogy elkülönüljön a vezérlés és megjelenítés ...
55

if

attlad · 2007. Jan. 12. (P), 20.34
{if $currentUser.group === $smarty.const.USER_GROUP_ADMIN}
<li><a href="admin">admin</a>
{/if}

vagy $currentUser lehetne objektum is.
67

ez az amit kerülni kéne.

pp · 2007. Jan. 29. (H), 07.33
Volt egy kis időm. Megpróbáltam összeszedni és leírni azt, hogy hogyan és miért használjunk template-t.
68

Jah

attlad · 2007. Jan. 29. (H), 09.58
kerülni kéne

Valóban hülyeség. #55 flagged as lame.
3

Mit is?

vbence · 2007. Jan. 5. (P), 01.50
Ha jól értem arra gondolsz, hogy állandó elemek vannak a weboldalon amik minden egyes lapon megjelennek (menü, fejléc, lábléc).

Ette több megoldás is van. A legalapabb, ami nem nagyon ajánlok, de át kel lesni rajta: készítesz egy html-t az oldalról, majd szétvágof egy elotte.html és egy utana.html formában. Az egyes oldalaid pedig így fognak kinézni:

<?php include ("elotte.html"); ?>

... itt az aktuális lap tartalma ...

<?php include ("utana.html"); ?>
Persze ezek a fájlok maguk is lehetnek PHP állományok, amik további include-okat tartalmaznak.

Van szebb megoldás, de az már programozás. Ha meg szeretnéd tanulni a PHP-t a net tele van leírásokkal. Ha ez az első programozási nyelv, amit meg fogsz tanulni, akkor elég rosszul választottál, de úgy sem lehetetlen.. ;)
4

:)

erika913 · 2007. Jan. 5. (P), 01.59
Én a menüben a menüpontokra gondolok és azokra klikkelve a tartalom megjelenésének a helyére. Mint ahogy html-ben a link a target="frame_neve" frame-ben jelenik meg. Ilyet szeretnék php-ben frame nélkül. Szóval ha jól értem akkor azon az oldalon minden egyes menüpontot kézzel linkeltek be. De lehet azt függvénynel adatbázisból stb is gondolom, ez elegánsabnak tűnik nekem. De akkor minek oda php? Miért nem elég a html és abban a frame?
Már vettem könyvet :D PHP5
5

a frame nem elegáns

vbence · 2007. Jan. 5. (P), 02.17
A frame egy idejétmúlt csökevény. Az elgondolás nagyon jó volt mögötte, de többet árt, mint használ. Az említett oldal úgy működik, ahogy krey írta (picit elnagyontan). A lényeg, hogy:

<html>
    <head>
        <title>Cím</title>
    </head>
    <body>
        <div class="fejlec"> ... itt a fejléc ...</div>
        <div class="menu"> ... itt a menü ...</div>
        <div class="tartalom">
        <?php
            $files = array ("akarmi" => "akarmi.php", "masik" => "masik.php", "xy" => "zizi.php");
            include ($files[$_GET["tartalom"]]);
        ?>
        </div>
        <div class="lablec"> ... a lábléc ...</div>
    </body>
</html>
Itt egy tömbben felsorolod az egyes modulok neveit, és a hozzá tartozó fájlt, és már is változik, mit hív be a szkripted. Az előbb írt megoldás azért szebb.

A lényeg, hogy itt szerveroldalon történik az egész dolog. Nem csak a div tartalma töltődik, hanem az egész oldal újra és újra.
6

kapisgálom

erika913 · 2007. Jan. 5. (P), 02.35
Valami tömbös megoldásra gondoltam én is, és akkor a linket ami a tömbben jeleníti meg a tartalmát az úgy adod meg, hogy
<html>
    <head>
        <title>Cím</title>
    </head>
    <body>
        <div class="fejlec"> ... itt a fejléc ...</div>
        <div class="menu"><a href='index.php?tartalom=bemutatkozas'>bemutatkozás</a></div>
        <div class="tartalom">
        <?php
            $files = array ("bemutatkozas" => "bemutatkozas.php");
            include ($files[$_GET["tartalom"]]);
        ?>
        </div>
        <div class="lablec"> ... a lábléc ...</div>
    </body>
</html>
7

:D

erika913 · 2007. Jan. 5. (P), 02.40
Működik, de jó. Ha valami kérdésem lenne kereshetlek? Nagyon köszönöm az eddigi segítséget!
8

nem találom a hiba okát

erika913 · 2007. Jan. 5. (P), 03.44
Valamiért reklamál a php. Ha meghívom az oldalt ami az index.php

http://localhost/simple/

akkor a következő hibát kapom:

Warning: include() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/simple/index.php on line 13

itt van hozzá a forrás is:

<html>
    <head>
        <title></title>
    </head>
    <body>
        <table><td><div class="fejlec"></div>
        <div class="menu"> <a href='index.php?tartalom=valami'>valami</a><br>
		<a href='index.php?tartalom=nami'>nami</a><br>
		<a href='index.php?tartalom=index'>index</a></div></td><td>
        <div class="tartalom">
        <?php
            $files = array ("valami" => "valami.php" , "nami" => "nami.php" , "index" => "1.php");
            include ($files[$_GET["tartalom"]]);
        ?>
        </div>
        <div class="lablec"> </div></td>
    </body>
</html>
Azt tudom, hogy az elérési úttal van valami, de nem tudom, hogy az includ() -nak hogyan lehet beállítani a pontos elérést, pedig minden egy könyvtárban van. Ha ráklikkelek bármelyik menüre akkor minden megy rendesen, csak akkor van ez amikor http://localhost/simple címen vagy http://localhost/simple/index.php címen hívom meg.
9

Felhasználótól jövő adatokat mindig ellenőrizni kell!

pp · 2007. Jan. 5. (P), 08.02
Jelen esetben a probléma, hogy nem jött semmilyen adat.
a php rész kb:
<?php
 $files = array ("valami" => "valami.php" , "nami" => "nami.php" , "index" => "1.php");
$file=$files['index'];
//megnézzük, hogy jött-e egyáltalán valami
if(isset($_GET['tartalom'])){
  //megnézzük, hogy jó-e a link, mert számtalan oka lehet, hogy nem létező oldalt kértek:
  // * régen volt ilyen most már nincsen, pl.: akció
  // * a linket kézzel írták be és elírtak valamit
  // * stb. ;)
  if(array_key_exists($_GET['tartalom'],$files)){
    $file=$files[$_GET['tartalom']];
  }else{
    $file=$files['404']; // nincs ilyen oldal
  }
}
include($file);
?>
pp
14

ez kellett

erika913 · 2007. Jan. 5. (P), 14.03
Szia,

a te megoldásoddal működik rendesen a dolog. Azzal, hogy adjak meg egy "default" értéket "" => "index.php" egy végtelen dolgot generálok. Hasonló dolgokat, mint ezek a megoldások (rutinok) hol lehet találni a neten? Köszönöm a segítséget!
15

végtelen...

vbence · 2007. Jan. 5. (P), 15.36
Ha "" => "index.php" -t használsz, akkor természetes, hogy rekurzió lesz belőle. Ezért írtam fooldal.php-t a példában.

Amúgy az include helyett a readfile funkciót is használhatod. A különbség annyi, hogy a readfile csak beolvassa a megadott fájlt (nem futtatja az esetleg benne levő php kódot), az include pedig igen.
16

ok

erika913 · 2007. Jan. 5. (P), 15.44
Oké. De egy kérdésem lenne még, hogy pp által írt forrás ugye 404 es hibát dob ki ha nem találja az oldalt. De csak akkor ha nem találja, arra tudtok valami megoldást javasolni, hogy ha már bent van a tömbben és ott van elgépelve azért nem találja akkor is 404es hibát adjon és ne azt, hogy nem tudja includolni az oldalt mert nincs.
22

a feltételt kell egy kicsit megbolondítani

pp · 2007. Jan. 5. (P), 17.14
<?php
if(array_key_exists($_GET['tartalom'],$files) && @file_exists($files[$_GET['tartalom']])){
...
}
?>
pp
ja és nem 404-es oldalt ad, mert a megfelelő header-t nem küldi ki, de ez most részletkérdés ;)
23

super

erika913 · 2007. Jan. 5. (P), 17.29
Köszönö így már jó, de nem értem váááááááá honnan tudjátok ezek csak így hip hop?? Lehet nekem kevés hozzá a kapacitásom.
De a lenti kódomhoz mit szólsz, szerintem ennél elegánsabban nem lehet megoldani. Szerintem.
üdv
24

lehet régebben kezdtük

pp · 2007. Jan. 5. (P), 17.47
én spec 98 óta foglalkozom php-val, úgyhogy még van időd. Ráadásul még egy tanfolyami tematikát is kidolgoztam ami pont ezen a témakörön megy végig. (én tudom, kb mi lesz a következő hiba amibe belefutsz és hogyan tudod azt kikerülni, és hogyan lesz olyan, hogy azt később is felhasználd ;))

A lenti kód nagyszerű de tartalmaz pár elvi hibát. Ilyen, hogy "mindig ellenőrizd a felhasználótól kapott adatokat". Főleg ha adatbázisba is be akarod írni. (mysql_real_escape_string())

Ha ilyen lelkes vagy, akkor két hét múlva már mosolyogni fogsz azon, hogy ezt a kódot a lehető leg elegánsabbnak nevezted.

Hajrá

pp
17

form

erika913 · 2007. Jan. 5. (P), 16.11
Alakul a dolog, de egy újabb akadályba ütköztem. Ami a következő. Ha formal elküldök adatbázisba dolgokat akkor nem a $_GET[$megjelenés_helye] helyen jelenik meg hanem egy új oldalban adja vissza az eredményt. Pedig az action-höz is ugy adta meg az url-t ahogy a többi linknek is. Át kell adi neki valamit? Vagy egyszerűen egy fájlba sűrítsem be az egészet. Amit nem szeretnék mert követem az elvet, egy fájl = egy program. :)
18

no nem úgy megy az...

vbence · 2007. Jan. 5. (P), 16.41
Az hogy <div class="tartalom"> és index.php?tartalom=valami csak "véletlen" egybeesés. Ez a dolog nem úgy működik, mint a frame-ek. Itt minden alkalommal letöltődik az egész oldal, nem csak az adott div tartalma.

Az include-os cuccot azért használjuk, hogy ne kellessen minden fájlba egyenként beírogatni a fejlécet meg a menüt, csak egy helyen (index.php) szerepeljen. Ez nekünk könnyebb (csak egy helyen kell módosítani ha pl kell egy új menüpont), de a böngésző mindig az egész dokumentumot úja és újra megkapja.

Az nem megy, hogy van egy kész kód (pl vendégkönyv), és ott megjelenik a te oldalad közepén (mint a frame-eknél).
Ha elküldöd a formot, akkor <form action="index.php?tartalom=aform"> kéne legyen, hogy úgy működjön ahogy szeretnéd.

Viszont! Ha olyan formot küldesz ami ír az adatbázisba (szóval nem keresés vagy ilyesmi), akkor a form-ot feldogozó PHP (legyen mondjuk hozzaszol.php) nem tartalmaz semmi outputot (kiírás). Csak elmenti az adatokat, és ha sikerült, akkor a végén átirányítja az illetőt a megfelelő oldalra: header ("Location: index.php?target=siker") (amiben benne van, hogy sikerült a küldés). Ha nem így csinálod, akkor a RELOAD gombbal ezerszer elküldheti ugynazt a formot.

Böngészd a könyvet.. :)
19

én így próbálkozok

erika913 · 2007. Jan. 5. (P), 16.57
Én így próbáltam megoldani a dolgot, formon belüli feldolgozással, de az adatok nem kerülnek a táblába és mindig az index oldalra dob. Ehhez mit szólsz?
<?php

include('db.inc');

   $cim = $_GET["cim"];

   $tartalom = $_GET["torzs"];



   if( isset( $cim ) || isset( $tartalom ) ){

     $sql = "INSERT INTO tartalom(cim, torzs)" . " VALUES( '$cim' , '$torzs' )";

     $eredmeny = mysql_query( $sql );

     if( !$eredmeny ){

       print( "Nem sikerült felvinni az adatokat: " .

         mysql_error() . "<br>\n" );

     }else{

       print( "Adatok sikeresen rögzítve<br>\n" );

     }

   }

?>
<html>
  <head>
  </head>
  <body>
<FORM action="<?php print($PHP_SELF); ?>" method="GET">
      Cím: 
      <br>
      <INPUT type="text" name="cim">
      <br>
      Tartalom törzse: 
      <br>
<textarea cols="70" rows="15" name="torzs"></textarea>
      <br>
      Ha szeretnéd, hogy menüpontként megjelenjen akkor adj meg neki egy menüpont nevet! 
      <br>
<INPUT type="text" name="menu"><br>
      <br>
      Válaszd ki melyik kategóriába kerüljön a menü, a kategóriák előre definiált poziciókon vannak elhelyezve az oldalon!
      <br>
      <SELECT name="kategoria">
  <option></option>
  <option>ez lesz az adatbázis lekérdezése</option>
</SELECT>
      <br>
      <INPUT type="submit" name="save" value="mentés"><INPUT type="reset" name="reset" value="törlés"><br>
   </FORM>
  </body>
</html>
20

I'm happy

erika913 · 2007. Jan. 5. (P), 17.06
Kicseréltem a GET - et POST -ra és megy minden! :) tuti nagyon. Köszönöm a segítségedet, rendes voltál és főleg türelmes. De elképzelhető, hogy még el fogok akadni akkor is számíthatok rád? Üdv Erika

Pici BUG a fenti kódban a $tartalom az $torzs az értékadásnál.
69

oldalak tárolása adatbázisban

juhasztibi · 2007. Aug. 2. (Cs), 15.44
Sziasztok,

próbálkozok azzal, hogy az oldalakat adatbázisban tároljam el és majd onnan töltsem fel a tömböt a megfelelő index-érték párrokkal, de nem találtam eddig hatékony megoldásra. Lenne esetleg valami javaslatotok?

T.
70

igen

zila · 2007. Aug. 2. (Cs), 23.15
Nyiss új témát a kérdésednek.
13

alapértelmezett include

vbence · 2007. Jan. 5. (P), 12.21
A legegyszerübb, ha megadsz egy fájlt arra az esetre, ha nincs paraméter:

$files = array ("" => "fooldal.php", "valami" => "valami.php" , "nami" => "nami.php" , "index" => "1.php");
A "index" => "1.php" akkor futna le, ha index.php?tartalom=index lenne cím.
33

más megoldás?

erika913 · 2007. Jan. 7. (V), 15.12
Sziasztok!

Újra itt! De most még nem ütköztem problémába, csak krey első hozzászólásában írta, hogy tele van a net ilyen megoldásokkal mint amit a segítségetekkel sikerült összehoznom. A kíváncsiság hajt és csak azt szeretném megkérdezni, hogy milyen módszerekkel lehetne még hasonló megoldást megvalósítani. Templatet nem szeretnék egyenlőre használni. Én valami osztályok használatára gondolok, hogy azzal milyen módon valósítható meg ez a feladat? Köszönettel Erika
34

OOP?

krey · 2007. Jan. 7. (V), 16.04
Osztályok? Szerintem sikerült (majdnem) a legegyszerűbben megvalósítanod, nem hiszem, hogy egy kis OOP jót tenne ennek a programnak. Persze minden problémát meg lehet oldani osztályokkal, de nem mindig érdemes, legalábbis PHP-ban. Javában pl. nincs túl sok választásod.
Ha esetleg érdekelne a PHP oldala a dolgoknak, akkor itt és itt olvashatsz róla.

üdv. krey

ps. Újraolvastam a témát és nem vagyok biztos benne, hogy mit hívsz feladatnak, a témaindító hozzászólásodat, vagy ami a végén lett belőle
35

ami lett belőle

erika913 · 2007. Jan. 7. (V), 16.25
A téma indításánál még nem voltam képben ezekkel a dolgokkal azért is indítottam el. De arra gondoltam ami lett belőle. Szóval akkor ez a fajta megvalósítás teljes méftékben megállja a helyét? Vagy esetleg van valami más irány amely felé érdemes kezdeményezni mert esetleg a fenti megoldás már "elavult" lenne. Köszönöm
36

objektumok

vbence · 2007. Jan. 8. (H), 01.53
Én nem értek egyet a kollégával. A boldogsághoz csakis objektumokon keresztül vezet az út. Ahhoz viszont, hogy érdemes legyen ojjektumosítani az oldaladat át kell látnod a problémát, és kialakítani a modeleldet.

Én úgy csinálom, hogy van egy page osztály, aminek a metódusai pl menu, copyright stb (az állandó elemek). Persze nem kell minden elemet különválasztani, csak annyira kell lebontani, amit később kezelni is fogsz. Ha pl minden oldaladon ugynaazok a keyword meta elemek vannak, akkor arra nem kell külön függvényt (metódust) írni. Aztán van egy teljesen üres content metódusa az osztálynak (absztrakt metódus).

Az egyes oldalak a page-ből származnak (extends Page), úgyhogy mindent örökölnek. Ezekben az osztályokban csak a content van kifejtve, ez lesz a weboldal valódi tartalma. Ezek kb így néznek ki:
<?
class ThisPage extends Page {

    function content () {
        echo (' ... Itt pedig a tartalom mindenféle adatbázisból meg függvényhívásokból ... ');
    }

}

$page = new ThisPage ();
$page->render ();
?>
A render metódus is a Page osztályban van. Abban van az oldal html váza, és ő hívogatja meg az osztály metódusait (title, fejléc, menü, lábléc) a megfelelő helyeken.

A lényeg, hogy ha megismered a HTTP kiszolgálási modelljét (szerveroldal, kliensoldal), meg készítesz egykét saját weblapot magától kialakul egy saját szemlélet amit aztán objektumokra lehet váltani.
37

értem

erika913 · 2007. Jan. 8. (H), 13.41
Köszönöm, alami hasonló megoldásra gondoltam, persze egyenlőre teljes mértékben megfelel a fenti megoldás hiszen először még azt kell teljesen megismernem. De mindenképpen szeretném majd az objektumos megoldásokat is megismerni. Köszönöm az eddigi hozzászólásaidat!
38

akad egy kis hiba

erika913 · 2007. Jan. 8. (H), 14.44
Felmerült egy hiba, már sok helyen utánanéztem de nem találtam megoldást, vagyis lehet csak nem értettem :S . A hiba a következő, a fenti források alapján csináltam meg az oldalt, csináltam bele egy menüpontot ami az admin lesz. Ez az admin.php -t tölti be ami a következő:
<?php
function fejlec( $title )
{
?>
<html>
<head>
  <title><?php $title ?></title>
</head>
<body>
<?php
}
session_start();

$allapot = $_POST['allapot'];
if( !isset($allapot) ) $allapot = "bejelentkezik";

switch( $allapot )
{
  case 'bejelentkezik':
    fejlec( 'Bejelentkezés' );
    login();
    break;
  case 'hitelesit':
    switch( $sid=hitelesit() )
    {
      case 0:
        fejlec( 'Ismeretlen felhasználó' );
        elutasit( 0 );
        break;
      case -1:
        fejlec( 'Hibás jelszó' );
        elutasit( -1 );
        break;
      default:
        $_SESSION['sid'] = $sid;
        vedett();
        break;
    }
    break;
  case 'regisztrál':
    fejlec('Regisztráció');
    registration();
    break;
  case 'rögzit':
    fejlec('Új felhasználó felvitele');
    newuser();
    break;
}

function db_open()
{
   $db_server = 'localhost';
   $db_database = '*******;
   $db_user = '******';
   $db_password = '*********';

   if( !mysql_connect( $b_server, $db_user, $db_password ) )
     die( "Nem sikerült kapcsolódni: " . mysql_error() );
   if( !mysql_select_db( $db_database ) )
     die( "Nem sikerült megnyitni az adatbázist: "
     . mysql_error() );
}

function hitelesit()
{
   $user = $_POST['username'];
   $pwd = $_POST['password'];

   db_open();
   $sql = "SELECT sid, password FROM felhasznalok" .
     " WHERE name = '$user'";
   $eredmeny = mysql_query( $sql );
   if( mysql_num_rows( $eredmeny ) == 0 )
     return 0; 
   $userdata = mysql_fetch_array( $eredmeny );
   if( $userdata['password'] != md5($pwd) )
     return -1;
   return $userdata['sid'];
}

function login()
{
?>
  <h1>Bejelentkezés</h1>
  <form action="" method="post">
    <table>
      <tr>
        <td>Felhasználó neve:</td>
        <td><input type="text" name="username"></td>
      </tr>
      <tr>
        <td>Jelszó:</td>
        <td><input type="password" name="password"></td>
      </tr>
      <tr>
        <td colspan="2">
          <input type="submit" value="Bejelentkezés">
          <input type="hidden" name="allapot"
                 value="hitelesit">
          </form>
          <form action="" method="post">
          <input type="submit" value="Regisztráció">
          <input type="hidden" name="allapot"
                 value="regisztrál">
        </td>
      </tr>
    </table>
  </form>
 <?php
}

function registration()
{
?>
<h1>Új felhasználó regisztrálása</h1>
<form action="" method="post">
  <table>
    <tr>
       <td>Felhasználó neve:</td>
       <td><input type="text" name="name"></td>
    </tr>
    <tr>
       <td>Jelszó:</td>
       <td><input type="password" name="password"></td>
    </tr>
    <tr>
       <td>E-mail cím:</td>
       <td><input type="text" name="email"></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="Regisztráció">
        <input type="hidden" name="allapot" value="rögzit">
      </td>
    </tr>
  </table>
</form>
<?
}

function newuser()
{
  db_open();
  $username = $_POST['name'];
  $password = $_POST['password'];
  $email = $_POST['email'];
  $password = md5( $password );

  $sql =
"INSERT INTO felhasznalok "
. "( name, password, email )"
. "VALUES"
. "( '$username', '$password', '$email');"
;
   if( mysql_query( $sql ) ){
     print( "Sikeres regisztrásció!" );
     login();
   }else{
     print( "Sikertelen regisztráció: " . mysql_error() );
   }
}

function vedett()
{
   header( 'Location: admin_content.php' );
}

function elutasit( $ok )
{
?>
  <h1>Sikertelen bejelentkezés</h1>
<?php
   switch( $ok )
   {
     case 0:
        print( "Nincs ilyen felhasználó" );
        break;
     case -1:
        print( "Hibás jelszó" );
        break;
   }
}
?>
</body>

</html>
Minden jó eddig, regelni is lehet. Csak amikor be akarok lépni akkor egy header hibaüzenetet kapok:

Warning: Cannot modify header information - headers already sent by (output started at /var/www/simple/index.php:14) in /var/www/simple/admin.php on line 165

Olvasgattam és amiket találtam egyik sem hasonlítható az én hibámhoz szerintem, mert ez a bejelentkező és regisztráló kód tökéletesen megy ha szimplán az admin.php-t hívom meg. Ha az oldalon keresztűl a menüből akkor csinálja ezt a hibát! Miért lehet ez, hogyan tudnám ezt a hibát kiküszöbölni? Üdvözlettel Erika
39

headers already sent

vbence · 2007. Jan. 8. (H), 17.24
Ez pediel az inluce-os megoldás hátránya. Ha már volt bármilyen output elküldve a kliensnek (output started at ...), akkor már nem módosíthatsz a fejlécen (például nem küldhetsz cookie-t vagy státus kódot: 404, 302 stb). A session indítása egy cookie beállításával jár, úgyhogy ha már volt akár egy üres sor is küldve ezelőtt, akkor ez nem fog menni. Párhuzamos topicokban van erről a jelenségről.

A legfájdalommentesebb megoldás, ha bekapcsolod az output_buffering-et a php.ini-ben vagy egy htaccess fájlban. Vagy meghívod az ob_start függvényt a legelső php legelején. Bővebben keress rá a itt fórumban.
40

ob_start();

juhasztibi · 2007. Jan. 8. (H), 20.19
szia,

az index.php elejére teszel egy:

<?php
ob_start();
?>

a végére egy:

<?php
ob_end_flush();
?>

Ahogy vbence is említette. Ezzel a PHP saját belső kimenetpufferelését kapcsolhatod be. Jó munkát!
41

újra itt :)

erika913 · 2007. Jan. 9. (K), 05.32
Sziasztok ismét,

sikeresen megcsináltam a beléptetős dolgot és megy is rendesen. juhasztibi javaslatát használva. De most van egy újab probléma. Mégpedig az, hogy van egy olyan menüpont hogy admin, ezen beül az admin oldalon egy olyan, hogy tartalmak. Ha ráklikkelek akkor belőlti az összes felvitt tartalmat a megfelelő helyre. Az ősszes tartalom szerkeszthető lesz vagy legalábbais egyenlőre ráklikkelve oldaható az admin oldalon keresztűl is. Itt jön a hiba. Amikor klikkelek akkor nem történik semmi, vagyis csak annyi, hogy az index oldalra dob. Nem tudom milyen urlt kellene megadni neki, hogy menjen rendesen, csatolom a forrást, hátha többre mentek:

<?php
   session_start();
   if( ! isset($_SESSION['sid']) ){
     header( 'Location: index.php?tartalom=admin_content' );
   } 
?>
<?php
include 'db.inc';
if(!isset($_GET['id']))
{
   $self = $_SERVER['PHP_SELF'];
   $query = "SELECT id, cim FROM tartalom ORDER BY id";
   $result = mysql_query($query) or die('Error : ' . mysql_error());
   $content = '<ol>';
   while($row = mysql_fetch_array($result, MYSQL_NUM))
   {
      list($id, $title) = $row;
      $content .= "<li><a href=\"index.php?=$id\">$title</a></li>\r\n";
   }
   $content .= '</ol>';
   $title = 'Tartalmak';
} else {
   $query = "SELECT cim, torzs FROM tartalom WHERE id=".$_GET['id'];
   $result = mysql_query($query) or die('Error : ' . mysql_error());
   $row = mysql_fetch_array($result, MYSQL_ASSOC);

   $title = $row['cim'];
   $content = $row['torzs'];
}
?>
<html>
<head>
<title>
<?php echo $title; ?>
</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<table border="0" align="center">
<tr>
<td bgcolor="#FFFFFF">
<h1 align="center"><?php echo $title; ?></h1>
<?php
echo $content;
if(isset($_GET['id']))
{
?>
<p>&nbsp;</p>
<p align="center"><a href="<?php echo $_SERVER['PHP_SELF']; ?>">tartalom lista</a></p>
<?php
}
?>
</td>
</tr>
</table>
</body>
</html>

Ismét csak megköszönni tudom a segítséget :)
42

ok

erika913 · 2007. Jan. 9. (K), 12.41
sziasztok,

megoldottam a dolgot, már csak az lenne a kérdésem, hogy hogyan tudom betölteni ezt az oldalt az index oldali tömbömbe. Mert ez is itt egy tömböt jelenít meg, vagy rosszúl látom? Mert ha itt klikkelek akkor az eredmény külön oldalon jelenik meg, azt szeretném ha az is ott jelenne meg mint minden más tartalom. Ha valaki tudna tanácsot adni, megköszönném. Üdv
43

nem igazán értem...

vbence · 2007. Jan. 9. (K), 19.05
... mi lenne a kérdés. Mindenesetre azt tudom tanácsolni, hogy az admin felületnek, és az oldal nyilvános részének minél kevesebb közös eleme legyen. Ez nem azt jelenti, hogy az adatbáziskezelő függvényt is külön kell megírni, de a mindenféle menük meg fejlécek, amik amúgy az oldal állandó elemei csak hibalehetőséget jelentenek egy admin felületen. Bitzonságilag is igen komoly kockázat.
44

szia

erika913 · 2007. Jan. 10. (Sze), 13.06
Az érdekelne, hogy ha egy url így néz ki

http://www.zene.net/pop/index.php?type=3&id=11112

vagy így

http://www.sportforum.hu/?page=cikkek&katid=39

vagy így

http://www.dvsckezilabda.hu/php/index.php?inc=tabella&osztaly=NB-I%20n%F5i%20feln%F5tt

http://www.dvsckezilabda.hu/php/index.php?inc=csapat_merkozes&osztaly=NB-I%20n%F5i%20feln%F5tt&csapat=DVSC

Elmondhatná valaki, hogy ez hogyan van megvalósítva, hogyan képzeljem el. Tömb a tömbben? Vagy hogyan? Nem akarok butaságokat kérdezni, de megköszönném ha valaki elmagyarázná egy ilyen url milyen módon jön létre és, hogy a tartalom, hogyan kapcsolódik hozzá. Addig rendben van a dolog, hogy

index.php?valami=valami_id , de a következőt nem tudom hogy kell index.php?valami=valami_id&valamiy=valamix_id....

Köszönettel Erika
45

több paraméter

vbence · 2007. Jan. 10. (Sze), 13.24
Ha az oldal legyártásához több paraméterre van szükséged, pl az id, katid vagy type amit elsősorban egy SQL lekérdezés paramétereként fogsz használni, azokat (mysql esetén) a mysql_real_escape_string segítségével biztosítod.

<?
    $katid = mysql_real_escape_string ($_GET["katid"]);
    $id = mysql_real_escape_string ($_GET["id"]);
?>
A tömböt csak akkor használtuk, amikor kizárólag az előre megadott lehetőségek közül lhetett választani (az include-nál kizárjunk mindenféle turpisságot).
46

ajaj

erika913 · 2007. Jan. 10. (Sze), 14.02
Nem vagyok benne biztos, hogy teljesen értem a dolgokat. Akkor ezeket a változókat helyezem el az urlben amit itt deklarálok. A tartalom betőltése változatlan marad, vagy hogy érted azt, hogy az includnál kizárunk minden túrpisságot?


ps.: egy ilyen oldal struktúrát (php) szeretnék kialakítani

itt a link

Ez megállja a helyét?
47

.. ha ez volt a kérdés

vbence · 2007. Jan. 10. (Sze), 14.57
A példát arra írtam, hogy kapod meg ezeket a paraméteret. Például ha listázol:
http://ifiportal.sakkszovetseg.hu/index.php?mode=readid&regioid=4
Itt mode paraméter dönti el, milyen php include-ot vagy függvényt kell használni az oldal megjelenítéséhez, a regioid pedig egy paraméter, amit a feldolgoz (a readid hatására lefuttatott kód). Például

<?
    $regioid = mysql_real_escape_string ($_GET["regioid"]);
    $sql = "SELECT * FROM tablanev WHERE regioid='" . $regioid . "' AND valami=megvalami";
?>
Ha "küldeni" szeretnél ilyen paramétert, akkor egyszerűen kézzel előállíthatod ezeket az url-eket. pl:

<?
    $feltetel = 12;
    echo ('<a href="/index.php?modul=lista&feltetel=' . $feltetel . '">A tizenkettes</a>');
?>
48

:|

erika913 · 2007. Jan. 10. (Sze), 15.27
Húha ez kezd bonyolódni nekem, vagy csak rossz oldalról közelítem meg a dolgot. Valami toturial neten nincs erről a dologról? Mert nem akarlak már ezzel traktálni. Az addigiekért is köszönettel tartozom!

ps.: nekem egy includom van az index oldalon és abban jelenítek meg mindent. Ezt most lehet félreértettem, az includ alatt azokat az oldalakat érted amiket a $_GET ből megjelenítek?
50

:)

erika913 · 2007. Jan. 12. (P), 00.03
Akkor tudtok valami segítséget, hogy hol tudnék az ilyen gyakorlati dolgoknak utánajárni és nem és magam egy 1000 oldaldalas könyv végigolvasásával eljütni szinte sehova. Olyan oldalt keresek igazából ahol látom, hogy programozás szinten milyen módon valósítanak meg egy ilyen oldalszerkezetet. Vagy ahol leírják, hogy mikre kell figyelni mik amik fontosak amikre szükség van hozzá. Instrukciókat keresek, szeretném átlátni ezeket a dolgokat. Köszönettel Erika
54

Én nem tudok róla

vbence · 2007. Jan. 12. (P), 18.22
Nem nagyon ismerem a neten fellelhető tutoriálokat, de attól félek, ehhez a témához nem is nagyon fogsz találni. A "php pattern" kulcsszavakra kereve a gugli ad majd néhány fejlesztési mintát ezek viszont már komolyabb szinten kezdik a dolgokat.

Ami segíthet, hogy letöltesz pár alap nyílt forráskódú php dolgot, pl vendégkönyv meg hasonlók, ezekben kinyomozhatod, hogy egy-egy dolgot hogyan csinálnak. Ezek között viszont nagyon sok rossz példa is van, úgyhogy ha találsz valami szimpatikus kódot, akkor írd meg itt a címet, és megmondjuk, hogy frankó-e.
56

rendben

erika913 · 2007. Jan. 13. (Szo), 13.42
Oké, körülnézek és majd írok ide egy linket ha találok valami számomra megfelelő forrást! Addig ia köszi mindent!
57

re

erika913 · 2007. Jan. 18. (Cs), 18.28
Sziasztok,

újra itt, keresgéltem és olvasgattam sokfelé, de mindenhol bonyolúlt forrásokba ütköztem. Annyit le tudtam szűrni, hogy ez a megoldás igen általános és ezek szerint közkedvelt is. Észrevételeim alapján egy olyan kérdésem lenne, hogy ugye ha sok oldal van az weblapon akkor nincs kedve az embernek mindet beirogatni a tömbbe. Érdekelne, a dolog mikéntje adatbázissal, hogy minden felvitt tartalom egy oldal legyen. Lenne kis millió kérdésem, de egyenlőre megköszönöm azt is ha rávezettek az adatbázisos megoldásra. (mysql)

üdvözlettel,
Erika
58

Adatb

janoszen · 2007. Jan. 18. (Cs), 19.33
Az egyik megoldás, hogy minden egyéni URL-t eltárolsz és hozzá a tartalmat.

A kicsit bonyolultabb megoldás, hogy minden URL rész hivatkozik a szülő-elemére:

/kt1/kt2/ elemzése:

SELECT id FROM urlek WHERE szuloelem=null AND urlresz="kt1";
SELECT id FROM urlek WHERE szuloelem=1 AND urlresz="kt2";
En ez utóbbit szeretem, mert InnoDB-t használva távoli kulcsokkal nem lehet valaminek a szülőelemét kitörölni, aminek még van gyereke.

De egyébként határtalan a lehetőségek száma. Használhatsz reguláris kifejezést éppúgy mint statikus tárolást.
59

erika913 · 2007. Jan. 18. (Cs), 19.48
Hú ez jó kis dolognak tűnik. Erről bővebben olvashatok valahol? Kerestem de sajnos nem igen találtam. Gondolom azért mert ugye ezek inkább egyedi saját kútfőből megvalósított dolgok. Nekem sajnos még nem alakúlt ki olyan programozói fantáziám mint amivel te és még itt egy jó páran rendelkeznek. Közhelyként említem, hogy alig egy éve foglalkozok php-vel c-vel. :D Na, szóval a lényeg, hogy mindenképpen szeretném ezt így megcsinálni és inkább adatbázissal (de majd a statikus tárolás is érdekelne:)), Mert mindig kézzel szerkeszteni a php fájlt az egy idő után nehezen kivitelezhető. Meg már most akkora tömböm van hogy pfff. Meg mindig új fájlt létrehozni hozzá. Hasonlóan működik a drupal is ha jó gondolom.

ps.:ha esetleg valami jó tutorialt ismersz azt megköszönném

Az egyik megoldás, hogy minden egyéni URL-t eltárolsz és hozzá a tartalmat.

ez érdekelne eslősorban, de a második, a szülő-gyermek megoldás is.
60

Tutorial

janoszen · 2007. Jan. 18. (Cs), 20.33
Nem nagyon fogsz találni semmit. Mindenki a saját kis módszerét hegeszti.

Az egyéni URLek eltárolása nagyon egyszerű:

CREATE TABLE urlek
(
 id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
 url VARCHAR(255) NOT NULL,

 UNIQUE (url)
) TYPE=InnoDB;

CREATE TABLE szovegek
(
 id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
 url INT NOT NULL,
 value LONGTEXT,

 INDEX (url),
 FOREIGN KEY (url) REFERENCES urlek(id) ON UPDATE CASCADE ON DELETE CASCADE
) TYPE=InnoDB;
Tehát gyakorlatilag egy join-nal le tudod kérni a hozzá tartozó szöveget. Ehhez aztán tetszőleges tartalom modul hozzárendelhető. Egy komoly problémája van: ha pl. vagy egy /kt1/ és egy /kt1/kt2/ akkor, ha kitörlöd a kt1-et, a kt2 nem törlődik, ami egy kicsit fura viselkedéshez vezet. Sőt, ha átnevezed a kt1-et, akkor még hülyébben fogja kivenni magát.

Én személy szerint a mindenféle a piacon levő tartalomkezelők paraméterezett, mindenféle trükkökkel megfűszerezett URL kezelését nem szerettem, azért csináltam meg a szülő-gyermek-es fájlkezelésemet.

CREATE TABLE files
(
 id INT PRIMARY KEY AUTO_INCREMENT
) TYPE=InnoDB;

CREATE TABLE nodes
(
 id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
 parentid INT DEFAULT NULL,

 nodetype ENUM('directory', 'file') NOT NULL,
 filename VARCHAR(255) NOT NULL,

 file INT DEFAULT NULL,

 UNIQUE(parentid, nodetype, filename),

 INDEX (parentid),
 FOREIGN KEY (parentid) REFERENCES nodes(id) ON UPDATE CASCADE ON DELETE RESTRICT,

 INDEX (file),
 FOREIGN KEY (file) REFERENCES files(id) ON UPDATE CASCADE ON DELETE RESTRICT
) TYPE=InnoDB;
Ez egy kicsit bonyolultabb. Ha valamilyen tartalommal hivatkozol, akkor a files táblára hivatkozol. A nodes táblán hajtod végre az URL elemzését. Ezzel több URLhez is rendelhetsz azonos tartalmat. Gyk. olyan, mint a linuxban a hardlinking, ha mondvalamit.

PHP-ban a $_SERVER['REQUEST_URI']-ból építesz egy tömböt explode("/", $_SERVER['REQUEST_URI'])-al, amit aztán szép sorjában (az előző hozzászólásomban leírt módon) beadagolsz az SQL-nek.

Gyakorlatilag egy fát jársz be (fa mint gráf).

Remélem, ez elég részletes magyarázat volt. Egy figyelmeztetés még. Ez utóbbi lassú. Tényleg lassú, a másikhoz képest. És nem is egyszerű jól a valóságba átültetni, a példa ellenére. Én tárolt eljárásokkal oldottam meg, de azok csak MySQL 5 alatt vannak.
61

megpróbálom

erika913 · 2007. Jan. 18. (Cs), 21.26
Köszönöm a részletes leírást, azt hiszem az url tárolásáva oldaom majd meg, vagyis próbálom megoldani majd. Most úgy van, hogy ha akarok egy új menüpontot akkor csinálok egy új oldalt és aannak a nevét és értékét teszem a tömbbe, ahogy ezt már írtam is. Úgy képzelem el a dolgot amit meg akarok csinálni, hogy amikor létrehozom a tartalmat az a tartalom mentésével egy időben létrehoz az adatbázis megfelelő táblájában egy hivatkozást. Kb így képzelem el:

id cim tartalom csoport url

ezek lennének a tábláim, és így szeretném integrálni az url tárolásos dolgot. De akkor az array-ben kettő sql lekérdezést helyezek el és az adja az oldal nevét(hivatkozóját) és az tartalomra mutató urlt ami valójában egy sql lekérdezést takar? Kicsit összezavarodtam. :S Hálás vagyok a gyors válaszodért és értem is így "konyhanyelven" a dolgokat de kódként nem tudom elképzelni egyenlőre. :(
62

Konyhanyelven

janoszen · 2007. Jan. 18. (Cs), 21.40
Hujjaj, de nagy kavarok vannak. Naszóval, megpróbálom megérteni, amit írtál.

Szóval, az URL felépítése hasonló, mint a könyvtárak a gépeden. Pontosabban, egy URL egy könyvtárat vagy fájlt jelent. Ha Te pl azt mondod, hogy c:\windows\ az egy könyvtár. Avagy, amit ott leírtam, az egy URL.

Az oprendszer ezt úgy kezeli, hogy először kikeresi a C-t, aztán a windowst.

Az első megoldásom nem ezt csinálja, hanem eltárolja az EGÉSZ címet (c:\windows\) és ahhoz rendel tartalmat.

A második megoldás alkalmaz egymásra mutató, faszerkezetbe leképzett tárolást. Ezáltal picit lassabb, de jobban alkalmazható.

Konyhanyelven: a fazék tárolási helye az első módszerrel:

konyhaszekrénymásodikfiók

A második módszerrel:

konyha -> szekrény -> második fiók

Nem tudom, nálad a csoport mit jelent, azt meg kellene magyaráznod...
63

:)

erika913 · 2007. Jan. 18. (Cs), 22.14
a csoport nálam azt jelenti, hogy kategória amihez a tartalom tartozik, mondjuk a második megoldásod alapján a második fiók egy csoport a szekrény is és a konyha is. És a tartalmat ezekhez a csoprtokhoz lehet majd hozzárendelni. Tehát úgy működik majd mitha könyvtárakat kezelnék? Dúrva megközelítéssel. CSoprtokat peid külön formon keresztűl tudok létrehozni. Az URL pedig ezekből áll össze. Pl. hozzáadok egy tartalmat ott kiválasztom, hogy melyik csoportba kerüljön és az url végére csak a tartalom id-je kerülne majd.

http://index.php?oldal=[csop_1]&[csop_2]&[csop_3]....&id=1

Ezeket a csoprtokat pedig adatbázisból kapnám.
De lehet, hogy rosszúl képzelem el a dolgokat az URL-el kapcsolatban, olvasgattam de nem tisztúlt le teljesen.
64

:|

erika913 · 2007. Jan. 18. (Cs), 22.44
Azt hiszem joggal teszed most fel a kérdést, hogy igazából miről is beszélek. Át kell gondolnom ezt a dolgot le kell tisztáznom magamban egy pár kérdést.
De azért megpróbálom elmondani, hogy mit is szeretnék valójában megvalósítani.

Van egy oldal (magamnak csinálom, hogy megértsem ezeket a dolgokat) hol tartalmat és felhasználókat kezelek. Most olyan szinten van, hogy egyszerűen lehet felvinni tartalmakat és egy sima lekérdezéseel a főoldalon formázva megjelennek. Lehet regisztrálni és ki be lépni, védett oldalak stb. Amit szeretnék megcsinálni hozzá az a következő: tartalom csoprtok, user csoportok, na és persze egy kiforrot tartalomkezelő programot. Úgy nézne ki az általam elképzelt tartalom bevitel, hogy van a tartalom maga amit felveszek a címmel és van még mellett a választható csoprot. Én azt hiszem itt az URL-nek nem sok köze van a csoprtokhoz, mert az előbbi hozzászólaásban azt írtam. Télrejön a tartalom paraméterekkel, ezek a paraméterek a tartalommal egy táblában tárolódnak. Ez eddig rendben is van. Itt lép képbe amit kérdeztem és te próbálsz megértetni velem. Az, hogy a taratlom egyben egy oldal is legyen egy egyedi url-el. Egyenlőre ennyit szeretnék "csak".
65

Csoport,stb

janoszen · 2007. Jan. 19. (P), 07.41
Hajjaj, nagy célokat tűztél ki magad elé. Én egy hasonló (bár bonyolultabb) rendszeren dolgozom 5 éve kissebb-nagyobb megszakításokkal.

Én azért (is) választottam a 2. megoldást, mert ott a könyvtárak egyben meghatározzák a kategóriákat, nem kell külön még azt is kezelni. A másik ok pedig az volt, hogy így megszokott a Windowsos/Linuxos világból, tehát ez tűnik természetesnek.

Ha tényleg érdekel a megoldás, keress meg magánban, adott esetben megbeszélhetjük, hogy ránézel a koncepciós tervrajzra, de per pillanat nem nyilvános.

Persze, ha fejlesztgetsz tovább, akkor szívesen segítek, bár lehet, hogy kimeríti a fórum lehetőségeinek a keretét.

Egyébként szívből gratulálok az elhatározásodhoz és üdv a klubban. :)
66

:)

erika913 · 2007. Jan. 19. (P), 14.29
Köszönöm! :) Az eddigi segítségedet is! Valóban nagy célok de a felét elérem már az is nagy siker! :)