Gå til innhold

Vise nyheter i "flere" colonner! (nyhetscript)


Anbefalte innlegg

Hei.

 

Nå er det ikke en evighet siden jeg laget meg et lite nyhetscript.

Jeg har fosøkt mye rart, men får ikke til å få slik "avis oppsett".

 

Så er det noen "der ute" som vet hvordan fikser jeg det slik at nyhetsoppsettet kan vises slik som i bildet under?

Jeg må nevne at jeg benytter meg av PHP + MySQL. Da flatfiler er usikre, samt fyller mine behov.

 

eks.jpg

 

Håper noen vet "trikset" :D

 

 

Mvh

Jarl H.

Lenke til kommentar
Videoannonse
Annonse

Jaha? Skjønner ikke hvordan det har seg, i og med at en skal kalle til nyhetene med MySQL.

Dette vil bare føre til at nyheten listes i rekkefølge:

$query = "SELECT * FROM `news` ORDER BY `id` DESC LIMIT 12";

 

Altså, om du ikke ser det så skal jeg ikke bare ha et nyhetssytem som viser nyhetene i 2 kolonner. (Det er ikke værre enn å sette 49% i td-ene.

 

Men, jeg ønsker å ha et oppsett som viser første nyhet som stor (100%). Deretter 2 rader nedfor der nyhetene er 49% og 2 kolonner.

Så starter det om igjen. en nyhet som er 100%. påfulgt av 4 nyheter som er 49%...

 

Jeg tviler på at HTML -alene- løyser dette. men, selvfølgelig krever dette HTML også. (Men, kansje ikke PHP blir det rette, men så ikke noe MySQL forum. Om det finnes sett tråden gjerene over dit.)

Endret av slacky
Lenke til kommentar

Dette handler om generell programmering.

 

Kjenner du til modulo funksjonen?

 

Du kan løse problemet ved å utnytte at hver femte nyhet skal være "bred" nyhet". Dette gjør du ved å bruke en teller for hver nyhet slik at nyhet 0 er bred, nyhet 5 er bred, nyhet 10 er bred også videre.

 

Videre kan du utnytte modulo 2 for å skille på venstre og høyre kolonne:

 

Pseudo-kode:

// news er et array med alle nyhetene

for (i = 0; i < sizeof(news); i++) {
 j = i % 5; // lagrer resultatet, siden vi utnytter modulo 2 av dette
 if (j == 0) { // hver 5. nyhet
 print "bred nyhet"
 } else {
 if (j % 2 == 1) { //annenhver nyhet er i venstre kolonne
   print "venstre kolonne";
 } else { // og annenhver i høyre
   print "høyre kolonne";
 }
 }
}

 

resultatet blir noe ala dette:

------------------------------------------------
| Hele kolonnen								|
------------------------------------------------
| venstre kolonne	  |  høyre kolonne		|
------------------------------------------------
| venstre kolonne	  |  høyre kolonne		|
------------------------------------------------
| Hele kolonnen								|
------------------------------------------------
| venstre kolonne	  |  høyre kolonne		|
------------------------------------------------
| venstre kolonne	  |  høyre kolonne		|
------------------------------------------------

 

Du må selvfølgelig lage kode for å ta hånd om de tilfellene der du ikke har 10 nyheter, f.eks. bare 9. Slik at layouten blir rett.

 

Hvis du bruker <table> må du ha kode for å legge inn ny rad og avslutte rad på rett plass etc. Men du kan bruke pseudokoden som utgangspunkt for dette.

Lenke til kommentar

Flotters, var noe alà dette jeg forventet :)

 

Kjenner nok ikke til denne modulo funksjonen, men det varer nok ikke lenge :-)

 

Skal se hva jeg kan få til ut i fra dette Pseudo-koden :)

 

 

Ellers mange takk for hjelpen. :-)

 

 

EDIT:

Jeg testet ut scriptet like etter at jeg så på det.. og fikk meg en error:

Parse error: syntax error, unexpected '=', expecting ';' in /home/rockngo3/public_html/pgex/include/news2k.php on line 4

for (i = 0; i < sizeof(news); i++) {

 

Samt så la jeg merke til at denne printen mangler endig?

print "bred nyhet"

Skal det være slik? :s

Endret av slacky
Lenke til kommentar

Får bare beklage, trudde kanskje du hadde litt erfaring i og med at du hadde skrevet et nyhetsskript. Driver mest med python så derfor ble pseudokoden lite PHP vennlig..

 

Hacket sammen et skript som gir deg "trikset" også prøver du å selv å lese inn fra databasen istedet for de to arrayene som jeg bruker.

 

Her er et skjermbilde som bør vise resultatet av å kjøre skriptet. Skriptet bygger opp html-koden i $text variabelen, og skriver den ut.

v7un8g.jpg

 

La skriptet her jeg:

http://www.pastie.org/670493

trykk download for å laste ned

Lenke til kommentar

nyhetscipt er så og si blandt det mest basic av PHP som er mulig, i og med at jeg er kjent med fler foldige CMS'er. Så kjenner jeg grunnleggende +/-. Jeg mangler info på mange felter, men har gjerne litt ekstra info på andre. :)

 

Jeg skjønner altså et script når det er completo, og jeg kan endre dem osv. Men, å bygge et fra bunn å grunn er det jeg lærer meg nå. Ved å lage masse script, som jeg vil benytte meg av på min hjemmeside (=

 

Jeg har tatt en liten kikk, og dette er det "vanskelige spørmålet:

 

$news = array("Nyhet 1", "Nyhet 2", "Nyhet 3", "Nyhet 4", "Nyhet 5", "Nyhet 6", "Nyhet 7");
$more = array("bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla", "bla bla bla bla bla");

Dette forsøkte jeg:

include "var.php";
$query = "SELECT * FROM `news` ORDER BY id DESC LIMIT 10";
$result = mysql_query($query);
while($r=mysql_fetch_array($result)) {

$news = array("".$r['title']."");
$more = array("".nl2br($r['content'])."");
}

Men, listen endte opp med å bare liste èn nyhet.

 

Hvordan skal jeg gå frem for å erstatte dette med informasjonen som er lagret i databasen under nanvnene; Title, og Content?

Jeg har aldri jobbet med array, så jeg vet ikke helt hva denne vil si, og hvordan en skal bruke den.

Endret av slacky
Lenke til kommentar

Du kan hente en og en rad fra databasen i for-løkken, og istedet for $news og $more bruke $['title'] direkte.

 

for ($i = 0; $i < sizeof($news); $i++) {
 $r = mysql_fetch_row(); // eller hva du nå bruker :)
 ...
 ...
 $text .= sprintf("  <tr>\n	<td class=\"broad\" colspan=\"2\"> %s <div>%s</div> </td>\n  </tr>\n", $t['title'], $t['content']);
 ...
 ...

 

F.eks. prøv det!

Endret av footnote
Lenke til kommentar

Jeg forstår ikke helt hvordan

$r = mysql_fetch_row();

skal komme in i saken.

Da i følge det jeg kan så er løsningen, i og med at jeg må vel tilkalle result snippen.

$r=mysql_fetch_row($result);

 

Såvidt jeg ikke har misforstått noe så er poenget at det skal se ut som noe alà dette:

 

include "var.php";
$query = "SELECT * FROM `news` ORDER BY id DESC LIMIT 14";
$result = mysql_query($query);
while($r=mysql_fetch_array($result)) {

$title = $r['title'];
$cont = nl2br($r['content']);

$news = array($title);
$more = array($cont);
}

$text = "<table>\n";
for ($i = 0; $i < sizeof($news); $i++) {
 $r = mysql_fetch_row($result);
 $j = $i % 5; 
 if ($j == 0) { 

 $text .= sprintf("  <tr>\n	<td class=\"broad\" colspan=\"2\"> %s <div>%s</div> </td>\n  </tr>\n", $news[$i], $more[$i]);
 } else {
 if ($j % 2 == 1) { //annenhver nyhet er i venstre kolonne
	 $text .= sprintf("  <tr>\n	<td class=\"left\" colspan=\"2\"> %s <div>%s</div> </td>\n  </tr>\n", $r['title'], $r['content']);
	// hvis det er siste nyhet, må vi avslutte raden
	if ($i+1 == sizeof($news))
		$text .= "  </tr>\n";
 } else { // og annenhver i høyre
   $text .= sprintf("	<td class=\"right\"> %s <div> %s </div> </td>\n  </tr>\n", $news[$i], $more[$i]);

 }
 }
}

 

Men, dette funket ikke slik som forventet dog :b

Any tips? ;D

Ønsker du å se hvordan dette gikk går du bare inn på testdomenet mitt :b

http://rockngo.net/pgex/asd2k.php

Endret av slacky
Lenke til kommentar

Har gått over koden din å tilpasset det slik jeg tenkte det skulle være.

 

Du hadde blandet sammen litt, og gjorde begge tingene samtidig. Nå leser den ut en rad om gangen til $r.

 

include "var.php";
$query = "SELECT * FROM `news` ORDER BY id DESC LIMIT 14";

$result = mysql_query($query);
$num_rows = mysql_num_rows($result); # antallet nyheter

$text = "<table>\n";

for ($i = 0; $i < $num_rows; $i++) {
 $r = mysql_fetch_row($result);
 $j = $i % 5; 
 if ($j == 0) { 

    $text .= sprintf("  <tr>\n    <td class=\"broad\" colspan=\"2\"> %s <div>%s</div> </td>\n  </tr>\n", $r['title'], nl2br($r['content']));
 } else {
    if ($j % 2 == 1) { //annenhver nyhet er i venstre kolonne
        $text .= sprintf("  <tr>\n    <td class=\"left\" colspan=\"2\"> %s <div>%s</div> </td>\n  </tr>\n", $r['title'], nl2br($r['content']));
       // hvis det er siste nyhet, må vi avslutte raden
       if ($i+1 == $num_rows)
           $text .= "  </tr>\n";
    } else { // og annenhver i høyre
      $text .= sprintf("    <td class=\"right\"> %s <div> %s </div> </td>\n  </tr>\n", $r['title'], nl2br($r['content']));

    }
 }
}

 

Har ikke testet koden nå så håper det ikke er noen feil her :)

Lenke til kommentar

Har testet en god del frem og tilbake etter denne posten :b (ble sittende uten internett en periode så jeg har ikke kunne takket (=

 

Klabb og babb med WiMAX nettet (Da jeg forsøkte og otimalisere det.) :p

 

Så, tusen takk for hjelpen, scriptet funker fett. Ja, iallefall etter noen mindre justeringer her og der.

F. eks:

for ($i = 0; $i < $num_rows; $i++) {
$r = mysql_fetch_row($result);
$j = $i % 5;

MÅ erstattes med:

for ($i = 0; $i < $num_rows; $i++) {
$r=mysql_fetch_array($result);
$j=$i % 5;

 

Samt, så ville du gjentatte ganger gjøre slik:

if ($j % 2 == 1) { //annenhver nyhet er i venstre kolonne
$text .= sprintf(" <tr>\n <td class=\"left\" colspan=\"2\"> %s <div>%s</div> </td>\n </tr>\n", $r['title'], nl2br($r['content']));
// hvis det er siste nyhet, må vi avslutte raden

 

Som du ser så plasserer du <tr> taggen inni der. Raden skal ikke avsluttes, siden at vi skal ha en til nyhet i samme rad :)

 

Men, mange takk :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...