Avatar billede jones Nybegynder
08. september 2008 - 11:40 Der er 16 kommentarer og
1 løsning

Hvordan bygger jeg bedst min side op ?

Kunne godt tænkte mig at få lidt ideér til hvordan jeg bedst bygger mit system op - lige nu har jeg en index side hvor jeg har lavet hoveddesignet på siden (en topbar - og med indhold neden under)
hvordan bygger jeg bedst min side op ?

- Ved at lave en header.php footer.php og så includere dem på de forskellige sider jeg bruger ?

- Havde en fast index.php side og så inkludere indhold under der hvor det skal passe ind ?

lige nu bruger jeg løsning to, men har lidt problemer med at jeg har nogle interne links på de sider jeg inkludere, når jeg klikker på dem bliver de jo vist "rå" uden alt designet :(

Håber i forstår spørgsmålet.

<html>
<head>
</head>
<body>
<?php

$p = $_GET["page"];
?>

<div id="content" > <?php

if ($p == admin)
{

    include 'include/admin.php';

}

if ($p == brugerinfo)
{

    include 'include/brugerinfo.php';

}
?>
</div>
</body>
</html>
Avatar billede kkrasmussen Nybegynder
08. september 2008 - 11:42 #1
Det kommer helt an på hvor dynamisk du vil have det. Der findes jo nærmest uendelige måder at bygge en side op på. Det nememste må jo næsten være at komme med eksempler.

Vil du have et eksempel, eller er det et debat oplæg?
Avatar billede jones Nybegynder
08. september 2008 - 11:50 #2
Ved godt at det kan gøres på mange måde alt efter hvor dynamisk det skal være.

hvis du kan komme med et eksempel eller 2 vil jeg blive glad.

Det er kun indholdet jeg vil have dynamisk topbaren bliver mere eller mindre statisk.
Avatar billede kkrasmussen Nybegynder
08. september 2008 - 12:34 #3
Jeg går normail hele vejen og gør følgende:

Først har jeg min layout fil eller slet og ret min html fil.
Den fylder jeg med unikke afsnit som jeg kan køre en str_replace på.

Et eksempel kunne være:

{VAR:TITLE}
eller
{VAR:NAME} (I metatagget)
{VAR:SCRIPT} (For javascript)
{VAR:CSS} (for css fil)
{VAR:BANNER}
osv.

Dette gør at jeg 100% dynamisk kan styre indholdet.
Eksempel fra en "live" fil

<?xml version="1.1" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml" name="{VAR:NAME}" />
<title>{VAR:TITLE}</title>
<link type="text/css" rel="stylesheet" href="{VAR:STYLE}.css" />
{VAR:SCRIPTS}
</head>
<body>
<div id="wrap">
    <div id="banner">{VAR:BANNER}</div>
    <div id="hold">
        <div id="menu">{VAR:MENU}</div>
        <div id="submenu">{VAR:SUB}</div>
    </div>
    <div id="main">
        <div id="text">{VAR:MAIN}</div>
    </div>
</div>
</body>
</html>

Det næste jeg gør at få hele indholdet ind i en streng fra min index.php side.

$page = file_get_contenst("layout.html");

Denne streng kan jeg så lave str_replace på.

her kommer eksempel på "live" index.php

<?php
/**
* @copyright Steria Denmark A/S
* @author Kevin Kruse Rasmussen.
* @version 1.0
*/

session_start();

include_once("classes.php");

$core = new core();

$page = file_get_contents("layout.html");

$page = str_replace("{VAR:NAME}",$core->name(),$page);

$page = str_replace("{VAR:TITLE}",$core->title(),$page);

$page = str_replace("{VAR:STYLE}",$core->style(),$page);

$page = str_replace("{VAR:SCRIPTS}",$core->scripts(),$page);

$page = str_replace("{VAR:BANNER}",$core->gen_banner(),$page);

$page = str_replace("{VAR:MENU}",$core->gen_menu(),$page);

$page = str_replace("{VAR:SUB}",$core->gen_submenu(),$page);

$page = str_replace("{VAR:MAIN}",$core->gen_contents(),$page);

print $page;
?>

Som du så nok kan gætte indeholder classes både database funktioner og alle de funktioner jeg skal bruge til at "generere" min side.

<?php
/**
* @copyright Steria Denmark A/S
* @author Kevin Kruse Rasmussen.
* @version 1.0
*/
session_start();

class database
{
    function database()
    {
        $server = '127.0.0.1'; $adminuser = ''; $adminpass = ''; $dbname = 'din database';
        mysql_connect($server,$adminuser,$adminpass);
        mysql_select_db($dbname);
    }
    function login_db($username,$password)
    {
        $result = mysql_query("SELECT * FROM users WHERE username = '$username' AND password = '$password' LIMIT 1") or die(mysql_error());
        return $result;
        mysql_close();
    }
    function get_assocc($query)
    {
        $result = mysql_query($sqlstr) or die(mysql_error());
        mysql_close();
        return $result;
    }
    function get_single($query)
    {
        $result = mysql_query($query) or die(mysql_error());
        $result_ar = mysql_fetch_array($result);
        mysql_close();
        return $result_ar;
    }
    function go($query)
    {
        $result = mysql_query($sqlstr) or die(mysql_error());
        mysql_close();
    }
    function get_time_string()
    {
        $text = time("d","m","y");
        return $text;
    }
}

class core extends database
{
    function logout()
    {
        session_destroy();
        header("location: index.php");
    }
    function new_user()
    {
        $form = 'Her skal du registrere dig som bruger for at kunne bruge dette site.<br />';
        $form .= '<form action="" method="post">Brugernavn: <input type="text" name="username" /><br />Password: <input type="password" name="password" /><br />';
        $form .= 'Mail adresse: <input type="text" name="mail" /><br /><input type="submit" value="Registrer" /></form>';
        if($_POST["username"]=="" && $_POST["password"]=="")
        {
            $text = $form;
        }
        else
        {
            $user = $_POST["username"]; $pass = sha1($_POST["password"]); $mail = $_POST["mail"];

            if($user!="" && $pass!="" && $mail!="")
            {
                $this->go("INSERT INTO `users` (`username`, `password`, `level`, `mail`, `active`) VALUES ('$user', '$pass', '', '$mail', '')");
                header("location: index.php");
            }
            else
            {
                $text = $form.'DU SKAL HUSKE AT UDFYLDE ALLE FELTER!';
            }
        }
        return $text;
    }
    function frontpage()
    {
        $text = 'Dette er forsiden.<br />';
        $text .= 'Du er logget ind som: '.$_SESSION['username'];
        return $text;
    }
    function dyn()
    {
        $text = 'Her vil hentes direkte fra databasen.';
    }
    function loginbox()
    {
        if(!isset($_POST['usrname']))
        {
            $text = 'Du skal logge ind herunder. Har du ikke allerede en bruger, kan du oprette en <a href="index.php?side=new_user">her</a>.<br />';
            $text .= '<form action="index.php?side=login" method="post">Brugernavn: <input type="text" name="usrname" /> Password: <input type="password" name="usrpass" /> <input type="submit" value="login" /></form>';
        }
        else
        {
            $user = $_POST["usrname"];
            $pass = sha1($_POST["usrpass"]);
            $result_ar = $this->login_db($user,$pass);
            if(mysql_num_rows($result_ar)>0)
            {
                $res = mysql_fetch_array($result_ar);
                $_SESSION['lvl'] = $res["level"];
                $_SESSION['username'] = $res["username"];
                $_SESSION['mail'] = $res["mail"];
                header("location: index.php");
                exit;
            }
            else
            {
                header("location: index.php?side=logout");
                exit;
            }
        }
        return $text;
    }
    function name()
    {

    }
    function title()
    {

    }
    function style()
    {

    }
    function scripts()
    {

    }
    function gen_banner()
    {

    }
    function gen_menu()
    {
        if(!isset($_SESSION['username']))
        {
            $login = '<a href="index.php?side=login">Login</a> <a href="index.php?side=new_user">Tilmeld dig</a>';
        }
        else
        {
            $login = '<a href="index.php?side=logout">Logud</a>';
        }
        if($_GET['id']!="")
        {
           
        }
        else
        {
            $id = $_GET["side"];
            switch($id)
            {
                   

                case login :
                    $text = '<a href="index.php">Forside</a> '.$login;
                    return $text;
                    break;

                case new_user :
                    $text = '<a href="index.php">Forside</a> '.$login;
                    return $text;
                    break;

                case logout :
                    $this->logout();
                    break;
                   
                case dyn :
                    $text = $this->dyn();
                    return $text;
                    break;

                default :
                    $text = $login;
                    return $text;
                    break;
            }
        }
    }
    function gen_submenu()
    {

    }
    function gen_contents()
    {
        $id = $_GET["side"];
        switch($id)
        {
            case login :
                $text = $this->loginbox();
                return $text;
                break;

            case new_user :
                $text = $this->new_user();
                return $text;
                break;

            case logout :
                $this->logout();
                break;               

            default :
                $text = $this->frontpage();
                return $text;
                break;
        }
    }
}

?>

Dette mulliggør også opbygning af siden i moduler.
Det er eden ene måde jeg gør det på.
Skal det være en hurtigt side, er det meget enekelt. Det følger i næste post.
Avatar billede kkrasmussen Nybegynder
08. september 2008 - 12:43 #4
Jeg bygger "moduller" ligesom legoklodser.

forestil dig 5 klodser ovenpå hinanden. de tre øverst er hvide, den næste blå og den sidste er hvid.
Den blå skal vi bytte ud med en rød, det er det der er vores dynamiske inhold.

index.php kunne se sådan ud:

<?php
session_start();

include_once("top.php");
include_once("banner.php");
include_once("menu.php");
if($_GET['side']=="forside")
{
  include_once("forside.php");
}
elseif($_GET['side']=="side2")
{
  include_once("side2.php");
}
else
{
  header("location: index.php?side=forside");
}
include_once("bottom.php");
?>

Viola! Din side er dynamisk.
Avatar billede kkrasmussen Nybegynder
08. september 2008 - 12:45 #5
Den allernemmeste måde jeg kan gøre sider dynamiske på er slet og ret den gamle "en php fil for hver side" metode.

Lidt som før:

index.php:

<?php
session_start();

include_once("top.php");
include_once("banner.php");
include_once("menu.php");

echo 'Dette er forsiden. velkommen til den.';

include_once("bottom.php");
?>

side2.php:
<?php
session_start();

include_once("top.php");
include_once("banner.php");
include_once("menu.php");

echo 'Dette er Side2. velkommen til den.';

include_once("bottom.php");
?>

Osv.
Avatar billede kkrasmussen Nybegynder
08. september 2008 - 12:55 #6
Forvirret?
Avatar billede jones Nybegynder
08. september 2008 - 13:40 #7
Nej. Det ser super godt ud !
Kan godt være jeg lige kommer med et spørgsmål eller 2, men ellers må du godt ligge et svar.

Tak for hjælpen.
Avatar billede palito Nybegynder
08. september 2008 - 14:08 #8
Efter mit hovede er et MVC-system HELT klart at foretrække!

http://en.wikipedia.org/wiki/Model-view-controller
Avatar billede jones Nybegynder
08. september 2008 - 14:16 #9
palito - Ser meget spændende ud, men kan ikke helt finde ud af hvordan det skal gribes an helt kodemæssigt.

Kan du give et simpelt eksempel ??
Avatar billede jones Nybegynder
08. september 2008 - 17:21 #10
kkrasmussen - Er ved at lave min side om efter din løsning nr 1. kan se at der kommer til at være rigtig mange funktioner, er der en gylden reget for hvor stor man laver sine php filer før man splitter dem op ?? mht til performence
Avatar billede kkrasmussen Nybegynder
09. september 2008 - 15:21 #11
Kommer helt an på hvor mange besøgende du kommer til at have.

En ide kan være at du smider hvert modul ind i en PHP fil.

jeg har gjort det at jeg kører adresselinje variabler og så ud fra dem loader det ønskede modul.
Eksempel:

    function gen_contents()
    {
        $id = $_GET["side"];
        switch($id)
        {
            case login :
                $text = $this->loginbox();
                return $text;
                break;
       
            // Et administrations modul til for eksempel brugeradministration
            case admin :           
                include_once("admin.php");
                $admin = new admin();      // Main class fra admin.php
                $text = $admin->contents();
                return $text;
                break;

            case forum :           
                include_once("forum.php");
                $forum = new forum();      // Main class fra forum.php
                $text = $forum->contents();
                return $text;
                break;

            case logout :
                $this->logout();
                break;               

            default :
                $text = $this->frontpage();
                return $text;
                break;
        }
    }

I de forskellige modul filer har du så blot NÆSTEN en tro kopi af denne classes.php.
jeg gør bare det at jeg i toppen har dette så jeg ikke skal til at lave classe kald på tværs(og jeg skal jo alligevel tilføje min db):

include_once("classes.php");

class admin extends database
{

.......

}

Nu kan du blot i menu functionen lave en switch på samme måde som i contents og så har du modul styret indhold 100%.

men altså, som hovedregel, tror jeg ikke du kommer til at mærke den STORE hastigheds forskel på hvis du smider det hele i den samme, men hvis du udvikler mange moduller til eller har mange funktions sites, så er det nok en god ide at smide dem ud i hver deres fil.

Nyhedssider eller helt almindelige artikel sider henter jeg så direkte fra db, og derfor kan du også 100% dynamisk styre din menu eller dit content på denne måde.
Avatar billede kkrasmussen Nybegynder
09. september 2008 - 15:26 #12
BTW. MVC lugter en hel del af database styret INDHOLD eller AJAX.

Med ovenstående kan du faktisk hente al indhold fra database på nær PHP kode.

Du holder ligeså dit layout/grafik totalt adskilt fra dit indhold ved at have en ren html uden indhold(text på siden), og derved lader PHP udfylde det. Derudover kan du jo via function style() have forskellig GUI basseret på bruger eller andet, uden at det har den mindste indflydelse på dit egentlige indhold.
Men ren MVC er det ikke.
Avatar billede kkrasmussen Nybegynder
09. september 2008 - 15:34 #13
PHP læser jo filer fra toppen og til bunden og først DEREFTER eksekveres koden. Derofr er det jo (næsten) ligegyldigt om du har én stor PHP fil eller flere.

Når jeg siger næsten, så er det fordi der er nogle små fif man kan have med i sine overvejelser.

Når PHP interpretteren kommer til en include linje, læser den den inkluderede fil fra toppen og til bunden før den fortsætter med den fil den var igang med.
Men md break, header() og nogle få flere små tricks, kan man tvinge PHP interpretteren til at stoppe med at læse mere(ikke helt, men nok til at man ikke får alt det unødvendige med), og derved kan det dog godt betale sig i visse tilfælde at dele sine PHP sider op i flere.
Avatar billede jones Nybegynder
19. september 2008 - 10:05 #14
Tak for dine svar.
Har lige et spørgsmål til,
function database()
    {
        $server = '127.0.0.1'; $adminuser = ''; $adminpass = ''; $dbname = 'din database';
        mysql_connect($server,$adminuser,$adminpass);
        mysql_select_db($dbname);
    }
Det hele fungere fint og jeg har fået lavet mit system lavet om, men vil gerne lige forstå hvornår database() bliver kaldt ??
Avatar billede kkrasmussen Nybegynder
19. september 2008 - 10:11 #15
function database() er en constructor, den bliver derfor kaldt hver gang der laves en ny instance af klassen. Skal du på et tidspunkt blot kalde en funktion i en klasse uden at lave en ny instance, skal du bruge: database::database(); og derefter database::<den funktion du gerne vil kalde>();

Så function database bliver kaldt hver gang koden eksekveres og der oprettes en ny instans af klassen database. Det vil faktisk sige mere eller mindre hver eneste gang siden loades. KAN være uhensigtsmæssigt, men vil være det samme som at kalde $this->database(); i hver funktion hvor man skal foretage et database kald. At det er en constructor, sparer derfor en linje for hver enese funktion der skal benytte sig af db adgang.
Avatar billede jones Nybegynder
19. september 2008 - 10:16 #16
Mange tak for det.
Avatar billede jones Nybegynder
10. januar 2009 - 11:59 #17
hej kkrasmussen / eller andre
Ved godt det er lang tid siden at du hjalp mig med dette spm. Jeg har brugt dit eksempel et par gange og vil nu gerne prøve at videreudvikle det her switch / case så det bliver lidt mere dynamisk en enkelt af de sider jeg har brugt det på har haft rigtig mange funktioner og derfor er det blevet lidt uoverskueligt.

kunne evt også godt tænke mig et hint til hvordan jeg kan kan have flere layouts.

Håber du ser dette, og du skal selvfølgelig nok få points for hjælpen

på forhånd tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester