Tein tässä pientä sivutus-luokka systeemiä. Jostakin syystä tämän arrayn tulostus ei meinaa onnistua...
<?php $file = file("test.txt"); $cnt =count($file); $pages = new sivutus("ap.php",$cnt,5); $start = $pages->test['start']; echo $pages->test['ends']; print "<pre>"; print_r ($pages->test()); // tämä toimii... print "</pre>"; print $pages->test['ends']; // testi: Tämä ei toimi (eikä $start) for($i=$start;$i<$end;$i++){ echo $file[$i]."<br>"; } print $pages->sivu(); ?>
Testijuttu on tuolla:
http://www.pm-netti.com/koe/ap.php
Mistä vois kiikastaa?
Luokan nimet kirjoitetaan yleensä isolla. Onko sulla tuolla luokassa siis sekä julkinen metodi test() sekä julkinen taulukko $test? Koska hakasuluilla viittaat muuttujaan, suluilla metodiin.
tsuriga kirjoitti:
Onko sulla tuolla luokassa siis sekä julkinen metodi test() sekä julkinen taulukko $test? Koska hakasuluilla viittaat muuttujaan, suluilla metodiin.
Joo... test metodi. Sisältää tuon array, joka näkyy..
Mutta nyt tähän tuli jotakin uutta häikkää. Hoksasin, että siinä oli end, next ja prev nimiset metodit, jotka ovat jo php:n funktioita. Varmuuden vuoksi muutin ne muuksi, mutta nyt ei sitten toimi nuo linkit, jotka tulostuu metodista sivu(). Pitää tutkia...
Jos sulla on luokassa julkinen taulukko $test ja siellä indeksi 'ends' niin print $pages->test['ends'];
kyllä pitäis toimia. Ja ellei siellä tuota indeksiä ole niin kehitysserverin pitäis jo helistä siitä. Var_dump on echoa parempi debuggaukseen.
Varmaan siinä on tuossa taulukon muodossa vikaa. Nyt se on vain muuttujassa var $sivutus
.
edit: No nyt sain nuo linkit korjattua...
vielä tuo arrayn tulostus juttu.
PS:Tämä sujuikin ihan näin. Muutin tuon $sivutus arrayn nimeksi $test. Lisäksi piti for-silmukkaan tulostaa näin:
for($i=$pages->test['start'];$i<$pages->test['ends'];$i++){ echo $file[$i]."<br>"; }
Nyt tämä alkoi toimimaan. Kiitoksia avusta.
PS 2: On tässä vielä yksi pulma, joka varmaan selviää tuolta "koe-sivulta".
Vaikka tuossa on sivutuksessa 5 riviä sivulle, se tulostaa vain neljä riviä. Aloitusrivi on oikea, mutta lopettaa liian aikaisin, vaikka tuossa esim. alussa on tulostettavina rivit 0-4 eli viisi riviä.
for($i=$pages->test['start'];$i<$pages->test['ends']+1;$i++){ echo $file[$i]."<br>"; }
Asia tosin korjautui tuolla ($pages->test['ends']+1), mutta onko se kovin oikeaoppinen? Siinä lopetusriviksi nousee tiedoston varsinainen rivi eikä rivi php:n mukaan.
PS 3: Vanhuus taitaa iskeä ennen aikojaan. Siis näin.
$i<=$pages->test['ends'];
Skripti on halukkaille saatavilla nyt tuolta:
Pekka Mansikka kirjoitti:
Skripti on halukkaille saatavilla nyt tuolta:
Ei millään pahalla, mutta tuli mieleen Pitfallin Hello world -esimerkki tuosta :)
Hello world:
<?php $sets = SetLetters(); PrintLetters($sets); function PrintLetters($sets) { for($i = 0; $i <= count($sets)-1; $i++) { $text .= $sets[$i]; } print $text; } function SetLetters() { return array ( chr(72), chr(101), chr(108), chr(108), chr(111), chr(32), chr(87), chr(111), chr(114), chr(108), chr(100) ); } ?>
ajv kirjoitti:
Ei millään pahalla, mutta tuli mieleen Pitfallin Hello world -esimerkki tuosta :)
Kiitos kommentista. Kaikki palautteet on tietysti tervetulleita. Tuossa arayssa, mikä minulla on skriptissä, tekee erilaisen se, että arrayn sisältö muuttuu kokoa ajan riippuen siitä, paljonko on selattavia rivejä ja siirrytäänkö seuraavalle vai edelliselle sivulle.
Olen pyrkinyt tekemään siitä käyttäjän kannalta mahdollisimman yksinkertaisen. Eli sen käyttäminen ei vaadi kovin konstailuja sen suhteen, mitä tietoja luokalle syötetään vaan ne "konstailut" hoidetaan luokassa suoraan. Syötettävät tiedot on aina samat riippumatta siitä, painetaanko linkkiä "seuraava", "edellinen" tai ei mitään.
Jos joku keksii tuohon vielä lisää, miten tuon rakenteen voisi toteuttaa vieläkin paremmin, niin mielellään kommenttia.
Tollanen löytyi naftaliinista, kokeilin pikaisesti koodisi syntaksilla (aiemmin käyttänyt tietokannan kanssa) ja puukotin pari ominaisuutta, saattaa jopa toimiakin:
<?php function echoBrowselinks($total, $show = 5, $page = 1) { //offset, eli paljonko on poikettu nollapisteestä eteenpäin //page-1 koska page=0 ei kovin selkeä urlissa $offset = ($page-1) * $show; $from = (int) $show + $offset; if ($from < 0) { $from = 0; } $to = (int) $show + $offset + $offset; if ($to > $total) { $to = $total; } $totalPages = ceil(($total)/5); echo "<p>"; if ($offset > 0) { echo "<a href=\"?page=".($page-1)."\" accesskey=\"p\"><- Previous</a>"; } else { echo "<- Previous</a>"; } //debug echo "offset $offset - page $page - show $show - from $from - to $to"; echo " ({$page}/{$totalPages})"; if ($offset + $show < $total OR !$total) { echo " - <a href=\"?page=".($page+1)."\" accesskey=\"n\">Next -></a>"; } echo "</p>"; } $file = file("test.txt"); $cnt = count($file); $show = 5; $page = (int) $_GET['page']; echoBrowselinks($cnt, 5, $page); for ($i = ($page*$show) - $show; $i < ($page*$show); $i++) { echo $file[$i]."<br />"; } echoBrowselinks($cnt, 5, $page); ?>
JTS:n koodia vastaava funktio löytyy iteltäkin useammasta proggiksesta. Käytännössä tuo tekee saman kuin PM:n luokka. Ja minusta funktio hoitaa tässä tapauksessa asian paljon loogisemmin kuin luokka. Sitten jos tuohon sivutukseen alkaisi ymppäämään erilaisia moodeja ja muita hienoja toimintoja, niin sit luokaks.
JTS kirjoitti:
Tollanen löytyi naftaliinista, kokeilin pikaisesti koodisi syntaksilla (aiemmin käyttänyt tietokannan kanssa) ja puukotin pari ominaisuutta, saattaa jopa toimiakin:
Aika kätevä. Yksi muutos tuossa on varmaan tarpeen, nimittäin ekasivun asetus.
$page = (int) $_GET['page']; if(!$_GET['page']){ $page =1; }
Tämä on kyllä pikkuisen turha (makukysymys):
else { echo "<- Previous</a>"; }
Toinen tekijä. Haittaako jossakin tilanteessa mitään se, että tuo for-silmukka käy läpi useampia silmukoita, kuin on rivejä, jos viimeisen sivun rivit jää vajaaksi?
Kun asensin tuohon tiedostoon (joka sisältää 20 riviä), 8 riviä sivulle ja tulostan myös $i-muuttujan, viimeinen sivu tulostuu näin:
<- Previous (3/3) 16-testi 17 17-testi 18 18-testi 19 19-testi 20 20- 21- 22- 23- <- Previous (3/3)
Myöhästyin juuri, niin että en ehtinyt muokkaamaan.
Tein tuohon skriptiini pikku-päivityksen. Tulokset "koe-sivulla".
No joo, näemmä hutaisin tuon esimerkki-for-silmukan turhan hätäisesti... Enpä nyt jaksa alkaa säätämäänkään sitä kun en ole kotonani. Antaapa jäädä noin, enemmänkin muutenkin annoin tuon hätäisesti esimerkkinä semi-pseudona. Epäilemättä siinä on vielä jotain muutakin viilaamista, kun funktio vaati aika paljon puukotusta kun poistin siitä aika paljon muuta toiminnallisuutta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.