Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  18 1940
Har letet etter en gal etter dette. Å det begynner å hase ekstremt!

Trenger en enkel "les mer" funksjon til dette nyhetsscriptet jeg driver på med. Det er flatfile det er snakk om, har ikke anledning til å bruke mysql akkurat for øyeblikket da. Så den som klarer dette er super

Kode

<?php
$matrise = file("info.txt");
//ta bort kommentarene for å se innholdet i matrisen
/*
echo "<pre>";
var_dump($matrise);
echo "</pre>";
/**/
$perSide = 5;
$start = isset($_GET['side']) ? (intval($_GET['side']) * $perSide) : 0;
$matrise = array_reverse($matrise);
for ($i = $start; $i <= $start + $perSide; ++$i) {
   if (!isset($matrise[$i])) {
       break;
   }
   //deler opp hver bit av strengen til en ny matrise
   $neste = explode("***---***", $matrise[$i]);
   if (sizeof($neste) < 2) {
       break;
   }
list($navn,$hils) = explode("***---***", $linje);
   echo "<b>" . Neste[0] . "</b>"; //Skriver overskriften
   echo "<blackquote>" . Neste[1] . </blackquote>; //Skriver ingress

}
echo "Side: ";
$sider = ceil(sizeof($matrise) / $perSide);
for ($i = 0;$i < $sider; ++$i) {
   echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?side=" . $i . "\">" . ($i + 1) . "</a> ";
}
?>
Testet dette men det funket ikke...

Kode

if ($_GET['action']=="lesmer") {
$id = $_GET['id'];
foreach ($fil as $linje) {
$nyhet = explode('***---***', $linje);
if ($nyhet[0]==$id) {
echo $nyhet[1]; //overskrift
echo $nyhet[2]; // Ingress
echo $nyhet[3]; // resten av nyheten
}}}
Så prøvde jeg dette:

Kode

if ($_GET['action']=="lesmer") {
$id = $_GET['id'];
foreach ($matrise = file("info.txt")
$neste = explode("***---***", $matrise[$i]);
if ($neste[0]==$id) {
echo $neste[0]; //overskrift
echo $neste[1]; // Ingress
echo $neste[4]; // resten av nyheten
Men et funket heller ikke...er jeg helt på vildspor eller hva?

EDIT:Skriveleif
Nå har jeg ikke orket å sette meg inn i koden du har her, men jeg har et forslag til omstrukturering av selve filene dine.

Lag en klasse som inneholder all informasjon om en nyhet. I denne har du tre strenger, overskrivt, ingress, resten av nyheten - og i tillegg til dette har du en integer id.

Når du legger til en nyhet, så oppretter du et nytt objekt av klassen din og setter inn verdiene for variablene. Deretter serialiserer du objektet ditt og skriver det til filen. Du trenger strengt tatt ikke serialisere, men det kan være en grei praksis å gjøre på objektene dine.

Når du skal hente ut nyheten din, unserialiserer du objektet som er i filen og assigner dette til et objekt av samme klasse som du opprettet. Det du står igjen med da er et objekt som er likt det du skrev til filen.

Da kan du også enklere behandle variablene, og du kan dermed bestemme hvor mye av "restev av nyheten"-variabelen du ønsker å printe ut.
hmmm hører at du er inne på noe dær ja. Men er noen uttrykk jeg ikke har fått meg meg helt hva er, "serialiserer" og "unserialiserer"...Kan ikke tro det er så mye egentlig, det jeg trenger blir jo bare en slags link som gjør at siste veriabel kommer fra...det er allerede delt i 3 biter selve nyheten ja, slik som du sa jeg skulle gjøre...
Ok, kan skrive deg et enkelt eksempel.

Selve klassen.

Kode

class nyhet
{
         private $overskrift;
         private $ingress;
         private $innhold;

         function nyhet( $overskrift, $ingress, $innhold )
         {
                $this->overskrift = $overskrift;
                $this->ingress = $ingress;
                $this->innhold = $innhold;
         }

         public function hentInnhold()
         {
                return $this->innhold;
         }
}
Skrive til fil.

Kode

$obj = new nyhet( "test", "trest", "test" );

if( $fp =  fopen('nyheter.foo', 'w') )
{
        fwrite( $fp, serialize($obj) );
        fclose( $fp );
}
Lese ut nyhet.

Kode

if( $fp = fopen('nyheter.foo', 'r') )
{
        $obj = unserialize( fread($fp, filesize('nyheter.foo')) );
        fclose( $fp );
}

echo "innhold: " . $obj->hentInnhold();
Så dette er et eksempel på hvordan du kan skrive ett objekt til fila. Det du selvfølgelig kan gjøre er å opprette en fil for hver nyhet, eller du kan opprette et array som du bruker til å ha alle objektene i, og skriver arrayet til filen. Det er akkurat her id kommer inn i bildet, du henter ut objektet som har en gitt id.

Håper dette hjelper litt på?
Sist endret av m0b; 4. januar 2007 kl. 00:26.
hmmm fikk endel ideer om ting jeg kunne teste nå ja...usikker på om dem er bra..får se...

Jeg testet dette

Kode

if ($_GET['action']=="lesmer") {
$id = $_GET['id'];
foreach ($fil as $linje) {
$nyhet = explode('***---***', $linje);
if ($nyhet[0]==$id) {
echo $nyhet[1]; //overskrift
echo $nyhet[2]; // Ingress
echo $nyhet[3]; // resten av nyheten
}}}

echo '<a href="?action=lesmer&id=' . $neste[0] . '">Les mer</a>';
men får bare: Warning: Invalid argument supplied for foreach() in /web/www/bla/bla/bla on line 38

Linje 38:

Kode

foreach ($fil as $linje) {
Sist endret av Elliott; 4. januar 2007 kl. 00:48.
Kjør en var_dump eller print_r på $fil før du sender den inn i loopen. Du kan eventuelt bruke en vanlig for-løkke.

Men hvorfor fortsetter du med dette, og ikke prøver å skrive om systemet til serialisering og unserialisering? Jeg ville definitivt heller gjort det.
Jeg kan ingenting om serialisering og unserialisering (vist ikke jeg tror det heter noe annet da)...usikker på hvordan jeg skal putte inn var_dump eller print_r dær, har ikke brukt noen av de funksjonene. Vist du bare kunne vist meg i scriptet?
Jeg har jo skrevet nøyaktige eksempler på hvordan du bruker serialisering og unserialisering av objekter skrevet til fil. I tillegg til dette så har du www.php.net til å slå opp funksjoner som f.eks var_dump, print_r og ikke minst serialize, og unserialize.
allright will try da...
Er det konseptet bak det jeg har gjort her du ikke skjønner, jeg mener - logikken? Hvis det er det som er tilfellet så er det bare å si i fra så kan jeg prøve å forklare ytterligere i morgen.
Ok, skriver deg ytterligere et eksempel. Det jeg nå gjør er å lage et array med nyhetsobjekter, skriver disse til en fil etter at jeg har serialisert arrayet. Deretter kan jeg åpne opp filen med alle nyhetene, lese nyhetene og unserialisere de og legge disse inn i et array.

Først tar jeg for meg en klasse som jeg kaller nyhet. Denne inneholder all informasjon som en nyhet kan ha, samt et par funksjoner for å hente ut den informasjonen jeg ønsker å få tak i.

Dersom koden er vanskelig å lese i firefox kan det hjelpe å bruke internet explorer.

Kode

class nyhet
{
	private $id;
	private $overskrift;
	private $ingress;
	private $innhold;
	
	function nyhet( $id, $overskrift, $ingress, $innhold )
	{
		$this->id = (int)$id;
		$this->overskrift = (string)$overskrift;
		$this->ingress = (string)$ingress;
		$this->innhold = (string)$innhold;
	}
	
	public function hentId()
	{
		return $this->id;
	}
	
	public function hentOverskrift()
	{
		return $this->overskrift; 
	}
	
	public function hentIngress()
	{
		return $this->ingress;
	}
	
	public function hentInnhold()
	{
		return $this->innhold;
	}
}
Aktså, et objekt fra denne klassen er én nyhet. Jeg kan opprette så mange nyheter jeg vil av denne klassen, og legge alle nyhetene inn i et array. Kan dermed lage meg en klasse til som håndterer dette, som skriver et array med nyheter, skriver arrayet til en fil, og som også har muligheten til å lese ut nyhetsarrayet. Har også laget en funksjon som kan hente ut én spesifikk nyhet fra arrayet.

Kode

class nyhetsManager
{
	private $nyhetsFil = 'nyheter.txt';
	
	// Har opprettet en liten funksjon som mekker $num antall nyheter, dette bare for å vise hvordan man gjør dette.
	// Det som skjer er at den oppretter et array, går igjennom en loop og legger inn et nytt nyhetsobjekt i hver iterasjon. Returnerer deretter arrayet slik at vi kan bruke det etterpå.
	function lagNyheter( $num )
	{
		// Lag et array med nyheter og fyll det
		$nyheter = array();
		for( $i=0; $i<$num; $i++ )
		{
			$nyheter[] = new nyhet( (int)$i, "overskrift".$i, "ingress".$i, "innhold".$i );
		}
		return $nyheter;
	}


	// Tar inn nyhetsarray som argument, serialiserer det og skriver det til fil.	
	function skrivTilFil( $nyheter )
	{
		if( $fp = fopen($this->nyhetsFil, 'w') )
		{
			fwrite( $fp, serialize($nyheter) );
			fclose( $fp );
		}
	}

	// Åpner opp nyhetsfilen, henter ut all informasjon som ligger i filen, unserialiserer innholdet og legger det inn i et array.
	// Returnerer deretter det unserialiserte arrayet.	
	function hentNyheter()
	{
		$nyheter = array();
		if( $fp = fopen($this->nyhetsFil, 'r') )
		{
			$nyheter = unserialize( fread($fp, filesize($this->nyhetsFil)) );
			fclose( $fp );
		}
		return $nyheter;
	}
	
	// Tar inn en gitt nyhetsid som ønskes å hentes som argument, samt et unserialisert array av nyheter.
	// Entrer en loop med, går igjennom alle nyhetsobjekter som ligger i nyhetsarrayet og sjekker objektets id mot iden du ønsker å nå
	// Når den finner iden du ønsker, returnerer den nyhetsobjektet. Dersom den ikke finner iden du søker etter returneres -1.
	function hentNyhet( $id, $nyheter )
	{
		$nyhet = null;
		for( $i=0; $i<sizeof($nyheter); $i++ )
		{
			// Hent ut nåværende nyhet i arrayet
			$nyhetsObj = $nyheter[$i];
	
			// Hvis du husker hvordan klassen nyhet er ut, så har vi en funksjon som heter hentId, denne bruker vi til å hente
			// nåværende nyhets id. Sammenlign disse to etterpå, hvis denne iden er lik med det som vi har tatt med i parameter 
			// i funksjonen, da har vi rett objekt. Vi kan avbryte loopen og returnere objektet vi har funnet!
			$currId = $nyhetsObj->hentId();
			if( $currId === $id )
			{
				$nyhet = $nyhetsObj;
				return $nyhet;
			}			
		}		
		return -1;
	}	
}

Så ... Da har vi klartgjort en del klasser og funksjoner som vi trenger. Først skal vi skrive filen med innhold. Dette gjøres slik:

Kode

// Deklarerer nytt nyhetsmanager-objekt
$obj = new nyhetsManager();

// Generér 10 nyheter som vi skal skrive inn til en fil.
$arrNyheter = $obj->lagNyheter( 10 );

// skriv nyhetsarrayet til filen.
$obj->skrivTilFil( $arrNyheter );
Nå har du skrevet en fil som heter nyheter.txt, hvis du åpner filen så kan du se at det ligger litt informasjon i den.
Det neste vi ønsker å gjøre er å hente ut alle nyhetene som ligger i filen, og hente ut nyheten med id 4, og spytte ut Overskrift, ingress og innhold. (Fra loopen som genererer nyheter så håper vi på at dette henholdsvis er "Overskrift4", "inngress4" og "innhold4". Dette skjer gjerne i en annen fil enn den som skrev nyhetene.

Kode

// Deklarerer nytt nyhetsmanager-objekt
$obj = new nyhetsManager();

// Hent ut alle nyheter fra filen, legg disse inn i et array
$nyheterFraFil = $obj->hentNyheter();

// Vi snakket om å hente ut nyhet med id 4, dette gjør vi med funksjonen hentNyhet, den tar som kjent inn en id og array som argument.
$nyhet = $obj->hentNyhet( 4, $nyheterFraFil );

// $nyhet er nå et nyhetsobjekt. Vi kan dermed også bruke funksjonene som vi har laget i klassen nyhet. La oss prøve dette.
echo "Overskrift: " . $nyhet->hentOverskrift() . "\n";
echo "Ingress: " . $nyhet->hentIngress() . "\n";
echo "Innhold: " . $nyhet->hentInnhold() . "\n";
Og hva skjer? Jo, webbrowseren spytter ut følgende:

Kode

Overskrift: overskrift4
Ingress: ingress4
Innhold: innhold4
Slik kan du altså serialisere ting, og legge de i filer. Serialiseringen tar altså vare på datatypen som blir sendt inn, dette ser du at er veldig veldig kjekt, for da kan vi f.eks bruke funksjoner og variabler som er definert i klasser. For ikke å snakke om, hva syns du ser mest ryddig ut av de to måtene å gjøre det på?

Jeg har supplert deg med det jeg mener er gode og lærerike(?) eksempler på hvordan man kan generere 10 nyheter og skrive de til fil - så får det være opp til deg å ta dette videre og skrive nyhetene og legge de inn i fil. Du kan utvide dette til å kunne legge til nye nyheter fortløpende, men siden jeg har fortalt at den tar vare på datatypen (array) så skal det ikke være veldig vanskelig å legge til nye elementer i dette.

Lykke til, håper dette kan være til hjelp - dette er personlig skrevet til hjelp for nettop deg! Tenk, så heldig du var!

(Nå kan selvfølgelig måten jeg gjør dette på gjøres på andre måter, det er kun et løsnigsforslag på det han ønsker å oppnå.)
Sist endret av m0b; 4. januar 2007 kl. 13:21.
Det dær var fantastisk! At du virkelig tok deg tid til dette setter jeg pris på. Det var helt unaturlig oversiktlig, genialt oppsett! Jeg skal prøve så godt jeg kan å utvikle vidre på dette scriptet så skal jeg også åpne det kapittelet i boken min om array og serialisering å lese det nøye Tusen hjertelig takk
Oki, flotte greier! Si i fra hvis det er noe du lurer på, så skal jeg prøve å svare på dette etter beste evne.

Var strengt tatt mer-funksjon du spurte etter, noe jeg ikke har svart på. Men antar at det er ganske enkelt å implementere en slik funksjon når du har fått ut innhold som en streng, så da er det bare om og gjøre å kutte vekk x antall tegn på strengen.
Ja eneste jeg lurer på etter å ha sotte å bare lest over skriptet flere ganger er...Hvilken koder vill du hatt i hvilken filer? Altså de kodene du skrev hvem skal sammen i hva rett og slett Og så ser jeg at jeg må lage skjema funksjonen selv? Stemmer det det?
Tja, du kan legge begge klassene i en egen fil hvis du vil. Og inkludere filen i de sidene du ønsker å bruke de.

Hva mener du med skjema-funksjonen?
Nordmenn er født med ski på beina, men det finnes ett unntak. |d13m0b må være født med php kode fra topp til tå
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av Dark
Nordmenn er født med ski på beina, men det finnes ett unntak. |d13m0b må være født med php kode fra topp til tå
Vis hele sitatet...
Det er ikkje akkurat rocket science det han gjer da, og eg er rimelig overbevist om at du finn en del tusen i norge som kan gjere lignande ting i php uten å måtte tenke seg så alt for mykje om... Det er innafor det nivået du lærer om du leser Sams "Teach yourself PHP in 24 hours" for å sei det slik... Eg synst det er meir imponerande at han tek seg tida til å hjelpe
Sitat av |d13m0b
Tja, du kan legge begge klassene i en egen fil hvis du vil. Og inkludere filen i de sidene du ønsker å bruke de.

Hva mener du med skjema-funksjonen?
Vis hele sitatet...
Enten er det bare det at jeg ikke har brukt brillene mine på snart 2år eller er det kanskje ikke dær. Men jeg savner ett skjema som jeg kan fylle ut nyheten i vist du skjønner
Det er jo rett og slett fordi |d13m0b _ikke_ har laget noen forms for deg så dette må du vel gjøre selv.

edit: jaggu...glemte av et litt viktig ord der ...
Sist endret av liasis; 5. januar 2007 kl. 00:36.