Gå til innhold

Rasmus

Medlemmer
  • Innlegg

    238
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av Rasmus

  1. Når det gjelder selve HTML-koden kan du sette name atributten på input-taggen til å være et array.

     

    Eksempel

    <input name="bilder_array[]" .. />
    <input name="bilder_array[]" .. />
    osv..

     

    Da vil du kunne lese ut alle bildene i fra arrayet når du har postet skjemaet. Da kan du ha så mange input bilder du vil, selv om dette neppe er lurt. Det finnes begrensninger for filopplasting og eksekveringstid for post-requester i php.ini (og i konfigurasjonsfila til webtjeneren (f.eks. Apache)).

     

    For å unngå problemet med å spesifisere antall bilder på forhånd, kan du implementere JavaScript (klientside-scripting). Du bør da ha 1 eller flere inputbokser som default, og lage en knapp for å legge til flere input-bokser. Du bør ha en øvre begrensning på antall inputbokser, i tillegg til en submit knapp.

     

    <script type="text/javascript">
    //lag en funksjon her som skriver ut input-taggen ved en onclick event på en eller annen knapp
    document.write('<input name="bilder_array[]" .. />');
    </script>
    

     

    Dersom antall filer som postes (sjekk størrelsen på bilder_array) er lik øvre begrensning for inputbokser, så kan du (etter å ha lagret filene) spørre brukeren om han vil legge inn flere bilder.

     

    Når brukeren har postet alle bildene, kan du f.eks. kjøre ut thumbnail-visning med ekstra data som skal inn per bilde. (F.eks. beskrivelse). Dette forutsetter at programmet ditt husker hvilke bilder som ble lastet opp gjennom flere steg (hvis det var flere steg). Bruk sessions til dette.

     

    Slik kan du få et mer brukervennlig system, men det finns sikkert mange andre muligheter.

  2. Når det gjelder koden din studerte jeg den ikke så nøye, så feiltolkninger kan forekommer. Det jeg imidlertid la merke til, er måten du beregner filnavnet på. Denne teknikken vil ikke fungere for filnavn som f.eks. "dette.er.en.fil.med.mange.punktum.txt", da vil nemlig filnavnet bli "dette".

     

    Bortsett fra det er det bare et par småting i HTML-koden.

     

    Så til en løsning på problemet.

    Alternativ 1

    Legg inn i et array og bruk funksjonen array_multisort. Da kan du sortere på forskjellige nøkler(keys).

     

    Alternativ 2

    Dersom du benytter PHP5 kan det være interessant å se på scandir. Den kan gjøre nøyaktig det du ber etter. Den sorterer alfabetisk i stigende rekkefølge (som standard). Det eneste du trenger å kode er løkka for å iterere gjennom arrayet.

     

    oi, kom i fare for å kode det selv. Denne skal gjøre sånn ca. det du er ute etter.

    <?php
    //PHP5
    $mappe = "poetry";
    $filer = scandir($mappe);
    
    $this_filename = $_SERVER['PHP_SELF'];
    foreach($filer as $fil){
       if(!is_dir($fil)){
           $filetternavn=substr($fil,strrpos($fil,".")+1);
           $filnavn=substr($fil,0,(strlen($fil)-strlen($filetternavn)-1));
           echo('<a href="'.$this_filename.'?action=show_poetry&name='.$fil.'">'.$filnavn.' ('.$filetternavn.')</a><br />'."\n");
       }
    }
    ?>

    Her lister jeg ut alle filer og kataloger til et array. Deretter kjører jeg en foreach-løkke for å skrive ut filene.

    Her sjekker jeg først at det ikke er en katalog, deretter finner jeg $filetternavn og $filnavn (basert på lengden til $filetternavn). Deretter skriver jeg ut ca. det samme som du ønsket (filetternavn kan du fjerne, men det må fortsatt beregnes). Har modifisert HTML-koden slik at den er gyldig (forutsatt at den plasseres i f.eks. en paragraf <p>).

     

    Til slutt. Vær ops på at ikke alle filer har filetternavn. (Kod selv :p )

  3. 1. Før hadde en av sidene et eget stilark ( et bildegalleri, med bl.a annet verdien display:none; for menyen, for å få bedre plass). Går det an å angi et eget stilark for en av .inc filene? (uten å ha noe <head> i .inc åpenbart)

    lag en <div id="incfilene"> ...includescript... </div>

    deretter endre css-fila til å gjelde kun for div#incfilene

     

    2. Har et meget enkelt mailskjema i php. Før lå det på som en egen fil "mail.php", men nå som det er i blant de andre .inc filene (lar forøvrig endelsen .php være) hvordan skal jeg refere til scriptet i html'en til skjemaet? Før var det <form method="post" action="svar.php">...

     

    Hvis du skal poste til samme fil kan du prøve følgende

    <form method="post" action="<?php echo $_SERVER['PHP_SELF']."?".$_SERVER["QUERY_STRING"]; ?>">

    Hvis ikke må du poste til en url som inkluderer svar.php

     

     

    ÆØÅ-problemet er jeg ikke sikker på. Bruker du vanlig include()?

  4. Jepp, jeg vil tilføye at jeg liker å bruke mysql_result eller list for å unngå den ekstra kodelinjen. (små-irriterende :p)

     

    eks:

    list($antall) = mysql_fetch_row(...

    Hehe, ikke dumt :thumbup:

     

    Kort summert

    function mysql_count($tabell){
       list($antall) = mysql_fetch_row(mysql_query('SELECT COUNT(*) FROM '.$tabell.''));
       return $antall;	
    }

     

    Hvem trenger vel feilhåndtering ;)

  5. Ja, implode tar bare to parametre.

    string implode ( string glue, array pieces )

     

    prøv heller kontrollstrukturen foreach.

     

    foreach($links as $link){
     echo "<tr align=\"center\"><td >";
     echo $link;
     echo "</td></tr>";
    }

     

    Dersom dette ikke fungerer hadde det vært fint om du vise oss strukturen på $links. dette kan gjøres ved å bruke print_r funksjonen. F.eks.

     

    echo "<pre>";
    print_r($links);
    echo "</pre>";

  6. Det virker ikke som om noen kan hjelpe meg med å få tegnene til å vises korrekt. Kan noen da hjelpe meg med å integrere en kode som gjør om "æ", "ø" og "å" til ":oslash;", "aring;" osv.? Dette virker i hvert fall som eneste fornuftige utvei (bortsett fra å skrinlegge hele prosjektet, men det gjør jeg ikke ennå).

    Mulig at htmlentities vil gjøre susen.

     

    $streng =  "Ærlig, Østen og Åse...";
    
    $streng = htmlentities($streng);
    
    echo $streng; // Ærlig, Østen og Åse...

  7. Har mekket et PHP-program for å inkludere sider dynamisk. Dvs. man har en design-ramme og inkluderer innholdet på en bestemt plass i rammen. På den måten slipper man å inkludere toppen og bunnen av rammen i hver fil.

     

    Parameterne til programmet sendes gjennom en GET-request. Dvs. at man kan lage linker med parametrene. Foreløbig er det to parametre som gjelder. 'sub' og 'innhold'.

     

    sub spesifiserer mappen innholdet ligger i.

    innhold spesifiserer filen som skal inkluderes (uten filetternavn)

     

    Med <angitte filetternavn> mener jeg et array som inneholder tillatte filetternavn. Den første som matcher vil bli inkludert.

     

    Eksempel på linker

    ?innhold=test - inkluderer test.<angitte filetternavn>

    ?sub=hardware - inkluderer hardware/index.<angitte filetternavn>

    ?sub=hardware&innhold=grafikk -inkluderer hardware/grafikk.<angitte filetternavn>

     

    Dersom verken sub eller innhold er spesifisert, inkluderes hovedsiden.

     

    Dersom en fil ikke finnes inkluderes 404.html, evt. om denne ikke finnes, skrives det ut en 404 feilmelding.

     

    Når en side inkluderes finner programmet automatisk ut hvilken tittel siden har, ved å sjekke h1-taggen i html-koden. (f.eks. <h1>Grafikk</h1> = grafikk.)

     

    Denne kan hentes ved å bruke en metode print_title(), slik at man kan skrive den ut i sidens title-tag.

     

    --

    Kjente problemer:

    Dersom det er en PHP-feil (f.eks. parse error) i dokumentet, vil man få en blank side. Dette er på grunn av at jeg benytter Output Control Functions for å hente innholdet i fila som skal inkluderes.

     

    index.php

    <?php
    //innhold*.php må inkluderes
    require_once('innhold_v1.0.0.php');
    //deretter må man opprette en ny instans av klassen (før output)
    $di = new DynamiskInclude();
    
    ?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    
    <html>
    <head>
    <title>Rasmus :: <?php /*Skrive ut tittel*/ $di->print_title(); ?></title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <meta name="generator" content="jEdit - http://www.jedit.org/">
    <style type="text/css">
    div#topp { background-color: #DDDDDD; }
    div#innhold { background-color: #FFFFFF; }
    div#bunn { background-color: #DDDDDD; }
    </style>
    </head>
    
    <body>
    <div id="topp">
    <p>
    <a href="./">Hovedsiden</a> • 
    <a href="?innhold=lorem">Lorem</a> •
    <a href="?sub=vestibulum">Vestibulum</a>
    </p>
    </div>
    
    <div id="innhold">
    <?php 
    //her blir det dynamiske innnholdet skrevet ut
    $di->print_innhold();
    
    //fjerne klassen
    unset($di);
    
    ?>
    </div>
    
    
    <div id="bunn">
    <p>Bunn</p>
    </div>
    
    </body>
    </html>

     

    innhold_v1.0.0.php

    <?php
    /**
    innhold v1.0.0 - dynamisk include av filer
    @author Rasmus Toivo Nicolaysen <[email protected]>
    Dato: 23. januar 2005
    Oppdatert: 2. mars 2005, 7. mars 2005, 5.april 2005
    
    (fjernet litt kommentarer siden det er forklart i posten)
    
    */
    ini_set('implicit_flush',0);
    
    class DynamiskInclude {
    //Definer hva som er hovedsiden
    var $hovedside = "hoved.php";
    
    //Definer include path. husk forwardslash('/') på slutten. alt innholdet 
    //som ligger under denne mappa, med matchende filetternavn, vil være 
    //tilgjengelig for inkludering.
    var $include_path = "./"; 
    
    //hvilke filetternavn det skal matches på. Bruk det mest brukte 
    //filetternavnet først i arrayet (bittelitt raskere).
    var $tillatte_filetternavn = array("php","html","htm");	
    
    
    //Definer hvor i include-dokumentet tittelen skal hentes. h1 er default
    var $title_start = "<h1>"; 
    var $title_slutt = "</h1>";
    
    //Diverse 404 variabler;)
    var $notfound404 = false; //denne skal være false i utgangspunktet
    var $notfound_melding = "404 Not Found"; //benyttes i tittel
    var $notfound_melding_html ='<h1>404 Not Found</h1><p>Siden finnes ikke</p>';
    
    var $title; //filens tittel
    var $innhold; //her lagres filens innhold (ferdig parset)
    
    /**
    Konstruktør som setter igang showet. 
    @return Boolean true
    */
    function DynamiskInclude(){
     if ($_GET['sub']||$_GET['innhold']){
     	$this->do_include($_GET['sub'],$_GET['innhold']);
     }else {
     	$this->set_inc($this->hovedside);
     }
     return true;
    }
    
    /**
    Finner ut hvilken fil som skal inkluderes og sender videre til set_inc.
    Dersom ingen match finnes benyttes 404.html, og false blir returnert.
    @param String $mappe (parent)
    @param String $filnavn (uten filetternavn)
    @return Boolean true/false
    */
    function do_include($mappe,$filnavn){
     $include_path = $this->include_path;
     $tillatte_filetternavn = $this->tillatte_filetternavn;
     
     $aktuell_mappe	= basename($mappe);
     $aktuell_fil	= basename($filnavn);
     
     
     #*
     if (!$aktuell_mappe || $aktuell_mappe == "" || $aktuell_mappe == null) { 
     	$aktuell_mappe = $include_path;
     }else {
     	$aktuell_mappe = $include_path.$aktuell_mappe.'/';
     }
     
     #**
     if(!$aktuell_fil) { $aktuell_fil = "index"; }
     
     //selve include uten filetternavn
     $aktuell_include = $aktuell_mappe.$aktuell_fil; 
     
     $faktisk_include = false;
     foreach ($tillatte_filetternavn as $ext) {
     	$temp_inc = $aktuell_include.".".$ext;
     	if (file_exists($temp_inc)) {
       //her bestemmes det hvilken fil som skal inkluderes
       $faktisk_include = $temp_inc;
       break;
     	}
     }
     if ($faktisk_include) {
     	$this->set_inc($faktisk_include);
     	return true;
     }else {
     	$this->set_inc("404.html");
     	return false;
     }
     
    }
    
    /**
    Definerer hvilken fil som skal inkluderes, parser denne og legger den inn
    i variabelen $this->innhold.
    @param String filnavn
    */
    function set_inc($filnavn) {
     $this->innhold = $this->get_file_contents_parsed($filnavn);
     if (!$this->innhold) { 
     	$this->notfound404 = true; 
     	$this->innhold = $this->notfound_melding_html;
     	$this->set_title($this->notfound_melding);
     }
    }
    
    /**
    Endrer sidens tittel
    @param String $title
    */
    function set_title($title){
     $this->title=$title;
    }
    
    /**
    Skriver ut sidens tittel
    */
    function print_title(){
     echo $this->get_title();
    }
    
    /**
    Finner sidens tittel og returnerer denne.
    @return String sidens tittel
    */
    function get_title(){
     if ($this->title) {
     	return $this->title;	
     }
     else {
     	$hent_fra = $this->title_start;
     	$hent_slutt = $this->title_slutt;
     	$temp_title="";
     	eregi("$hent_fra(.*)$hent_slutt", $this->innhold, $temp_title);
     	$this->set_title(strip_tags($temp_title[1]));
     	return $this->title;
     }
    }
    
    /**
    Skriver ut include innhold
    */
    function print_innhold(){ 
     echo $this->get_innhold(); 
    }
    
    /**
    @return String include innhold
    */
    function get_innhold(){ 
     return $this->innhold; 
    }
    
    /**
    Ny utgave av get_file_contents som parser innholdet	før det blir returnert 
    som en streng
    @param String $filnavn
    @return String $contents_parsed
    */
    function get_file_contents_parsed($filnavn) {
     ob_start(); 
     $resultat = @include($filnavn);
     $contents_parsed = ob_get_contents(); 
     ob_end_clean();
     if ($resultat) { return $contents_parsed; }
     else { return false; }
    }
    }
    ?>

     

    Komplett eksempel er vedlagt som fil.

     

    Hvis noen har noen forslag til forbedringer hadde det vært fint. :yes:

    include_script.zip

×
×
  • Opprett ny...