Implementering af et tagsystem

Tags:    php mysql
Skrevet af Bruger #5620 @ 09.06.2011
Artikel filer

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. Databasetabellerne
Denne 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).

Fold kodeboks ind/udSQL kode 

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.

Fold kodeboks ind/udSQL kode 

Kodeblok 4.2: Tagbrugstabellen.

4.2. Tag-klassen
Tag 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-klassen
Aiterator 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-klassen
TagFilter 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-klassen
TagSystem-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)

User
Bruger #15306 @ 28.07.11 00:26
Som at give slik til små børn... Well done :)
Du skal være logget ind for at skrive en kommentar.
t