Paginanummering Klasse

Door Jesper Diovo, 13 jaar geleden, 4.167x bekeken

-- Helemaal gewijzigd!

Na geluisterd te hebben naar de kritiek die ik kreeg, heb ik de vorige hele klasse opgedeeld in 3 kleinere klassen, waarbij alles wat bij elkaar hoort bij elkaar zit. Alles spreekt nog voor zich.

setCurrentStringRegex($regex, $replace)
Zet de regex waarin het huidige paginanummer moet komen te staan. Geef als tweede parameter op wat gereplaced moet worden met iCurrent (het huidige paginanummer).

setToStringRegex($regex, $replaceArray)
Zet de regex waarin de paginanummers moeten komen te staan. Het huidige paginanummer zit in getNumbers(), dus daar hoef je je hier niet druk om te maken. De rest spreekt denk ik wel voor zich.

setWord($engels, $nederlands)
Zet de woorden eerste, vorige, volgende en laatste. De Engelse woorden moeten altijd zo zijn als ze in het voorbeeld staan! Als je die veranderd wordt jouw tekst niet gebruikt. Die zijn alleen om aan te geven welk woord je wil vervangen.

NavigationDatabase::getQueryResult($query)
Hoef je niet per sé te gebruiken. Je kunt hier ook gewoon je eigen query en query behandeling zetten. Het is alleen een voorbeeld dat dit ook mogelijk is. Echo'en van $oPagination, in dit geval de beginvariabele van de klasse, weergeeft de paginanummering al. Dus geen toString() functie meer.

Let wel even op de volgorde dat hij hieronder in het voorbeeld staat. De CurrentRegex moet namelijk altijd vóór de StringRegex gedefinieerd worden. De QueryTable, WhereStatement of de hele query moeten altijd vóór doExecute() gedefinieerd zijn. En voordat je $oPagination gaat echo'en moeten alle behandelingen die je wilt doen gedaan zijn.

Ik hoop dat hij iets toevoegt!

- Jezpur
Overzichtelijker voorbeeld (met code).

Voorbeeld: http://www.dzjemo.nl/phphulp/test-classnavigation.php

Gesponsorde koppelingen

PHP script bestanden

  1. paginanummering-klasse

 

Er zijn 19 reacties op 'Paginanummering klasse'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
GaMer B
GaMer B
13 jaar geleden
 
0 +1 -0 -1
Zorg dat de invoer wordt gecontroleerd.
?pag=-1 levert een "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-10,10' at line 1 in query: SELECT * FROM alfabet LIMIT -10,10" error op.
Jesper Diovo
Jesper Diovo
13 jaar geleden
 
0 +1 -0 -1
Oh ja, thanks. Nog verder iets?
GaMer B
GaMer B
13 jaar geleden
 
0 +1 -0 -1
Customizen? Dus dat je alles kunt instellen zoals de tekst "Volgende" en "Vorige" en "Laatste" en "Eerste", maar ook de tekens zoals "|" en "<" en ">".
Klaasjan Boven
Klaasjan Boven
13 jaar geleden
 
0 +1 -0 -1
Jammer dat je hem voor mysql en niet voor PDO geschreven hebt. Voor de rest ziet het er goed uit
Bas Kreleger
Bas Kreleger
13 jaar geleden
 
0 +1 -0 -1
Wat is dat nou weer voor gezeur.. PDO versus MySQL qua aantal gebruikers, hoor graag wat je bevindingen zijn.. Bouw hem om voor PDO als je dat graag wilt gebruiken en voeg verder relevante reacties toe want zeuren kan iedereen (lees mijn post ;))
Pieter van Linschoten
Pieter van Linschoten
13 jaar geleden
 
0 +1 -0 -1
Handig! Kan ik mooi combineren met die DBsearch klasse :)
Roland F
Roland F
13 jaar geleden
 
0 +1 -0 -1
Wat als ik nu een hardcoded array wil opsplitsen in pagina's?

M.a.w. waarom heb je de klasse database afhankelijk gemaakt.. en ben je niet uitgegaan van een array als bron?

Waarom een method toString? PHP5 heeft daarvoor de magic method __toString.. je zegt zelf immers dat je klasse PHP5 is ;)

Voor MySQL gebruik zou je ook eens kunnen kijken naar 'SQL_CALC_FOUND_ROWS'.
Jesper Diovo
Jesper Diovo
13 jaar geleden
 
0 +1 -0 -1
@GaMer13: Da's mogelijk. Kijk maar eens goed. Behalve die tekst dan, maar dat is simpel in te bouwen.

@Roland: Een hardcoded array? Volgens mij komt die niet voor in mijn klasse...
Waarom zou ik uitgaan van een array als bron? Dan komt heel de voorafgaande logica alsnog neer op de gebruiker van de klasse en het moet het juist allemaal vermakkelijken. Gewoon een query opgeven en daarmee simpel de paginanummering laten maken.
Overigens is in mijn geval toString() iets anders dan __toString(). Ik weet dat die methode bestaat, maar ik vond het beter om hier een apart aan te roepen methode voor te maken. Het moet vooral simpel blijven. Niet iedereen snapt meteen dat je met __toString() de klasse variabele gewoon kan echo'en e.d.
Roland F
Roland F
13 jaar geleden
 
0 +1 -0 -1
@Jezpur:
Of de array nu een simpele range is (lees:php.net/range) of samengesteld is uit een database resultaat, uiteindelijk zijn het beide arrays en zou ik ze vanuit een OO opzicht met dezelfde klasse moeten kunnen opsplitsen. Je zou dan eventueel de klasse kunnen extenden met een helper voor database gebruik (met bv methods die je nu hebt geïmplementeerd)
Jesper Diovo
Jesper Diovo
13 jaar geleden
 
0 +1 -0 -1
@Roland: Kan allemaal, maar dan nog blijft er veel logica op de gebruiker van de klasse zelf afkomen. Wat is er moeilijk aan een query opgeven, laat staan een tabel en een WHERE-statement? Ik zie dat liever dan dat ik moeilijk moet gaan doen met een array. Niet iedereen heeft direct in de gaten dat wanneer je een database resultaat fetcht dat je er dan eigenlijk een array van maakt. De meesten doen wat er verteld wordt dat ze met het resultaat moeten doen en denken verder niet na...

Ik hou het dus lekker simpel en veel logica aan de kant van de klasse. Maar een alternatief van jouw kant, op jouw manier, kan natuurlijk altijd. Laten we niet vergeten dat ik ook pas een beginner ben in het werken met OOP, en dus de gemakkelijkste logica bij OOP nog lang niet onder de knie heb :-).
Iltar van der berg
iltar van der berg
13 jaar geleden
 
0 +1 -0 -1
Je gooit nu alles in 1 klasse, dit is geen OOP meer.

Je kan beter voor bijvoorbeeld het 1 | 2 | 3 | 4 | etc een apart object hebben, wat je doorgeeft naar je view en dan vervolgens daar defineren of wat je scheidings tekens worden en of je die Überhaupt wel wilt, omdat je het misschien met css wilt opmaken.

Je moet je queries etc niet in het de huidige classe hebben! Deze classe zou helemaal geen toegang tot je database moeten hebben. Wat je wel wilt, is een array (of ArrayObject achtig iets) erin kunnen gooien.

In je toString (waarom niet __toString?) gebruik je:
1) statische link opbouw
2) Nederlands, beetje statisch ;)

Je gebruikt ook geen throw/catch voor fout afhandeling.

Opzich mooie class, maar geen OOP te noemen, niemand kan dit in zijn of haar systeem gooien, en altijd hergebruiken. Er zal telkens weer wat aan veranderd moeten worden. Beetje vreemd dat er al best wat reacties zijn, maar dit nog niet aan bot is gekomen...
Jesper Diovo
Jesper Diovo
13 jaar geleden
 
0 +1 -0 -1
@Iltar: Waarom zou ik voor 8 regels code een geheel nieuwe klasse/object aan moeten maken? Dat vind ik echt onzin, zeker als het gewoon in het geheel past.

Als ik niets met de database ga doen, komen we op precies hetzelfde punt als ik met Roland al over gediscussieerd heb. Dan komt een groot deel van de logica die nodig is alsnog terecht op de gebruiker, wat ik juist niet wil.

toString() ga ik nu nog een beetje veranderen. Zodat ook de tekst inderdaad aan te passen is.

Ik heb nagedacht over throw/catch, maar omdat ik hier zo weinig kans heb op foutmeldingen dacht ik dat ik dat met 'normale' string-errors ook al zou redden.

Ik snap nu alleen nog niet waarom er altijd iets aan veranderd zou moeten worden? Het hele boeltje is best flexibel te gebruiken, het enige wat misschien aangepast moet worden is de connectie met de database e.d..
Iltar van der berg
iltar van der berg
13 jaar geleden
 
0 +1 -0 -1
Waarom zou ik voor 8 regels code een geheel nieuwe klasse/object aan moeten maken?

Welke 8 regels code heb je het over? Het is natuurlijk onzin omdat als het in het geheel past, het er maar in te gooien. Soms moet je wat meer typen, maar dan is het een stuk flexibeler.

Neem dit stukje code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
    // only execute when setQuery() isn't used.
    protected function createQuery() {
        $this->sCountQuery = "SELECT COUNT(*) AS ".$this->sQueryCountField." FROM ".$this->sTable;
        
        if(!empty($this->sWhereStatement)) {
            $this->sCountQuery .= " WHERE ".$this->sWhereStatement;
        }
    }

?>


Dit hoort niet thuis in dit object. Wat nou als ik een ander soort database ga gebruiken, waar dit niet zo werkt? Zou ik dan voor één project een kopie moeten maken van dit object?

Quote:
het enige wat misschien aangepast moet worden is de connectie met de database e.d..

Google eens op DRY, er staan ook nog een paar leuke en goeie OOP tutorials hier op de site van mensen die al een stuk langer OOP doen.
Jurgen assaasas
Jurgen assaasas
13 jaar geleden
 
0 +1 -0 -1
@Iltar van der Berg


(misschien niet helemaal ontopic)
Hoe zou jij zoiets oplossen als er een klasse user (deze regelt datatransformatie en gebruiker gerelateerde zaken) is die uit de database wordt gehaald? Elke applicatie heeft natuurlijk verschillende (data) velden voor de gebruiker. Hoe is dit dan zo flexibel mogelijk te implementeren?

Ik doe het meestal zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

class user
{
//vars
    public function getUserbyId($id)
    {

        //query
        //return array met data

    }
}


?>
Henktrol
henktrol
13 jaar geleden
 
0 +1 -0 -1
waarom zo fokking groot?
Iltar van der berg
iltar van der berg
13 jaar geleden
 
0 +1 -0 -1
@henktrol stfu

@Jurgen, ligt eraan...
Meestal gebruik ik Symfony:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
class UserDataPeer extends BaseUserDataPeer {
    static public function getUserDataByUserId($userId) {
        // code voor orm ophalen van een user per user_id veld in de database
    }
}

?>


Het user object is niet verantwoordelijk voor het ophalen van een user... Wel voor relaties.

Dit word standaard door Symfony gegenereerd, maar als voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
class User extends BaseUser {
    public function getUserData() {
        return UserDataPeer::getUserDataByUserId($this->getId());
    }
}

?>
Mar cel
Mar cel
13 jaar geleden
 
0 +1 -0 -1
Thx
Jesper Diovo
Jesper Diovo
13 jaar geleden
 
0 +1 -0 -1
Hij is vernieuwd!
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
RvW Of toch niet
RvW Of toch niet
13 jaar geleden
 
0 +1 -0 -1
Krijg errors bij je demo :)

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. paginanummering-klasse

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.