21
Tags:
php
mysql
Skrevet af
Bruger #5620
@ 09.06.2011
4. Implementeringen
Den sektion vil gennemgå implementeringen af tagsystemet. Tagsystemet består af fire klasser (Tag, Aiterator, TagFilter og TagSystem) og af to (tre) databasetabeller (tags og tagsuse). Grunden til at der i parentes står tre tabeller er, at det forventes at der en tredje tabel med entiteterne, men dette er i realiteten en ekstern tabel i forhold til systemet.
4.1. DatabasetabellerneDenne sektion beskriver databasetabellerne.
Tabellen tags, se kodeeksempel undefined for sql, er tabellen, der indeholder de individuelle tags i systemet. Det præcise navn på tabellen kan ændres ved at sætte èt præfiks. I tabellen er kolonnen
tagid et autoinkrementerende tal felt og kolonnen
name er dets tekstlige navn, denne række er også unik (Tags kan ikke dele navn).
- CREATE TABLE IF NOT EXISTS `tags` (
- `tagid` int(11) NOT NULL AUTO_INCREMENT,
- `name` varchar(50) NOT NULL,
- PRIMARY KEY (`tagid`),
- UNIQUE KEY `name` (`name`)
- );
Kodeblok 4.1: Tagtabellen.
Tabellen tagsuses, se kodeeksempel 4.2 for sql, er tabellen, der indeholder relationerne mellem et tag og en entitet. Det præcise navn på tabellen kan ændres ved at sætte ét præfiks. I tabellen er kolonnen
tagid en fremmed nøgle fra tags tabellen og kolonnen
entityid en fremmed nøgle fra entitet tabellen. Navnet på
entitetid kolonnen kan ændres så det passer til entitet tabellens id kolonne. Hver kombination af tagid og entitetid er primær nøgle i tabellen.
- CREATE TABLE IF NOT EXISTS taguses(
- `entityid` INT NOT NULL ,
- `tagid` INT NOT NULL ,
- PRIMARY KEY (`entityId` , `tagid` )
- );
Kodeblok 4.2: Tagbrugstabellen.
4.2. Tag-klassenTag klassen er en dataklasse, der indeholder data om et specifikt tag. Koden for denne klasse kan ses i 1.1 på linjerne 2 – 12 og figur 4.1 viser klassediagrammet. Da dette er en simpel dataklasse burde koden tilklassen være let forståelig.
Figur 4.1: UML-diagrammet for Tag-klassen.
4.3. AIterator-klassenAiterator klassen implementerer
Iterator- og
Countable-grænsefladerne over den beskyttede variable
source, der forventes at være et array. Ideen i denne klasse er at klasser (TagFilter og TagSystem) kan arve fra klassen og ved kun at sætte
source som en reference til an variable i den arvende klasse implementerer den arvende klasse de to grænseflader at være array'et som
source blev sat til.
Koden for denne klasse kan ses i 1.1 på linjerne 15 – 43 og figur 4.2 viser klassediagrammet.
Figur 4.2: UML-diagrammet for AIterator-klassen.
Iterator-grænsefladen består af metoderne
key,
current,
next,
rewind,
valid. Se [url=http://php.net/manual/en/class.iterator.php]The Iterator interface[/url] for en mere detaljeret beskrivelse.
Metoden
key returnere indeksværdien, værdien af indekset ikke værdien gemt indekset, som iteratoren er ved.
Metoden
current returnerer værdien gemt i det indeks som iteratoren er ved.
Metoden
next returnerer rykker iteratoren til den næste værdi og returnerer denne.
Metoden
valid returnerer sandt, hvis iteratoren er ved et validt element.
Metoden
rewind spoler iteratoren tilbage til det første element.
Countable-grænsefladen består af metoden
count, der returnerer antallet af elementer i array'et. Se [url=http://www.php.net/manual/en/class.countable.php]The Countable interface
[/url] for en mere detaljeret beskrivelse.
4.4. TagFilter-klassenTagFilter klassen implementerer en kombination af de tre filtre alle, ingen og nogle beskrevet tidligere. Dette implementeres i et fladt array indekseret med et tags id og et tal (1, 2, 3) for at indikerer hvilke af de tre filtre som tagget er i. Klassen arver fra Aiterator og sætter
source til at referere til objektets filter array.
Koden for denne klasse kan ses i 1.1 på linjerne 45 – 104 og figur 4.3 viser klassediagrammet.
Figur 4.3: UML-diagrammet for TagFilter-klassen.
I stedet for at have magiske tal som 1, 2 og 3 gør klassen brug af konstanterne INCLUDED, EXCLUDED og COULDCLUDED fra TagSystem-klassen.
Metoderne
isXxx og
xxxTag, hvor
xxx er include, couldclude, exclude eller free, ændrer eller tester et given tags status i filtret. Til at ændre status bruges den private metode
changeState.
Metoderne
fromArray og
toArray henholdsvis sætter filtret til at givet filter array og returnerer filterarrayet.
Metoden
sessionField sætter filterarrayet til at være en reference til et givet felt i $_SESSION. Er feltet ikke sat sættes det.
4.5. TagSystem-klassenTagSystem-klassen er hovedklassen i tagsystemet. Klassen arver fra Aiterator og sætter
source til at være en reference til et array der har alle hentede tags indekseret med deres
id. Klassen står også for hele interaktionen med databasetilgangsklassen og dermed indirektet med databasen.
Koden for klassen kan ses i 1.1 på linjerne 106 – 509 og figur 4.4 viser klassediagrammet.
Figur 4.4: UML-diagrammet for TagFilter-klassen.
Objektvariablen
db skal sættes til et objekt af databasetilgangsklassen. Dette er en del af setup af TagSystem-objektet og skal derfor udføres før
load-metoden kaldes.
Objektvariablen
distribuition dikterer hvordan tag vægte bliver sat. Hvert tal i
distribuition er procenttal. Er den procentvise andel af antallet af relationer på et tag i forhold til det totale antal relationer mindre end et tal i
distribuition for tagget en vægt svarende til indekset for det tal. Dette er en del af setup af TagSystem objektet og skal derfor udføres før
load-metoden kaldes.
Metoden
makeFilter opretter og returnerer et tomt TagFilter.
Metoderne
setTableNamePrefix og
setEntityId sætter henholdsvis tagtabellernes præfix og navnet på entitets id kolonnen i
taguses tabellen. Kaldes disse ikke bruges det forudbestemte værdier i objektvariablerne
_tablePrefix og
_entityId. Dette er en del af setup af TagSystem-objektet og skal derfor udføres før
load-metoden kaldes.
Metoderne
getTagTableName og
getTagUseTableName returnerer navnet på tag - og tagbrugstabellen efter at præfikset er sat foran.
Metoden
applyFilter returnerer entiteter en entitettabel efter at et givet TagFiler har været påført. Det er muligt at definere hvilke kolonne værdier der skal returneres fra entitettabellen og kolonnen de skal sorteres efter.
Metoden
getRelatedEntitiesFilter opretter et TagFilter, hvor tilstanden i filtret for de tags som er associeret med en given entitet, er sat til nogle. Den pågældende entitet identificeres ved at give den id til metoden.
Metoden
getRelatedEntities returnerer de entiteter, der gennem deres tags relaterer til en entitet idenficeret via den id.
Metoden
orphansCheck returnerer et array med tags, der har har forældreløse relationer i tagbrugstabellen. Array'et er indekseret med taggets id og værdien i hvert indeks er antallet af forældreløse. En forældreløse relation, er en relation der har et entitet id som ikke eksisterer i entitet tabellen.
Metoden
deleteOrphans sletter alle forældreløse relationer og alle ubrugte tags.
Metoden
make opretter et Tag objekt og tilføjer der til de to objektvariabler
_tagids og
_tagnames. Disse variabler er begge array's med hele systemets tags. Forskellen er, at det ene er indekseret med id'et på et tag og det andet med navnet.
Metoden
load loader alle tags og tæller deres relationer fra databasen. Denne metode skal først kaldes efter setup af objektet er udført. Kaldes den før har setup ingen effekt og dette vil formentlig resulterer i fejl.
Metoden
calculateWeights tildeles tag vægte baseret på objektvariablen
distribuition.
Metoden
getEntityTags returnerer et array af de tags, der er associeret med en givet entitet identificeret af entitetens id.
Metoden
getEntitiesTags returnerer et array af de tags, der er associeret med en eller flere entiteter identificeret af deres id.
Metoden
deleteEntityTags sletter alle tagrelationer til en given entitet identificeret af dens id.
Metoden
getEntityTagsAsString returnerer et tekst af de tags, der er associeret med en givet entitet identificeret af entitetens id.
Metoden
associateTagsWith opretter relationer mellem en entitet, identificeret ved id, og tags identificeret ved navne. Findes et tag ikke oprettes det.
Metoden
addTag opretter et tag i databasen og kalder metoden
make med det oprettede tag.
Metoden
getFilterSql genererer en sql streng baseret på et givet TagFilter. Entiteterne der returneres når strengen ekskveres er de entiteter, der har alle de tags der er sat til alle i filtret, ingen af de tags der sat til ingen i filtret og mindst èt af de tags der er sat til nogle i filtret.
Metoden
getFreeTagsInResult returnerer et array med alle de tags som er i entiteterne i et resultatet, men ikke i filtret, der blev brugt til at skabe resultatet.
Metoden
getTagById returnerer et tag identificeret ved et id.
Metoden
hasTagById returnerer sandt, hvis der findes et tag med et givet id.
Metoden
getTagId returnerer et id for et tag identificeret ved dets navn.
Metoden
hasTagByName returnerer sandt, hvis der findes et tag med et givet navn.
Metoden
install oprettet tagsystemets tabeller i databasen. Denne metode skal først kaldes efter setup af objektet er udført. Kaldes den før har setup ingen effekt og dette vil formentlig resulterer i fejl.
Vedhæftede filer:
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (1)
Som at give slik til små børn... Well done
Du skal være
logget ind for at skrive en kommentar.