...

Πηπρηαθή Δξγαζία Σίηινο: ε αλάδεημε ηεο δηαθνξάο κεηαμύ Symfony θαη Drupal

by user

on
Category: Documents
21

views

Report

Comments

Transcript

Πηπρηαθή Δξγαζία Σίηινο: ε αλάδεημε ηεο δηαθνξάο κεηαμύ Symfony θαη Drupal
Σερλνινγηθό Δθπαηδεπηηθό Ίδξπκα Κξήηεο
΢ρνιή Σερλνινγηθώλ Δθαξκνγώλ
Σκήκα Δθαξκνζκέλεο Πιεξνθνξηθήο & Πνιπκέζσλ
Πηπρηαθή Δξγαζία
Σίηινο:
΢ρεδίαζε- Δεκηνπξγία Ιζηνζειίδσλ θαη
ε αλάδεημε ηεο δηαθνξάο κεηαμύ Symfony θαη Drupal
ΝΔΡΣΙΛΑ ΟΝΙΔΑ (ΑΜ: 1789)
Δπηβιέπσλ Καζεγεηήο: ΠΑΠΑΓΟΤΡΑΚΗ΢ ΓΔΩΡΓΙΟ΢
Δπηηξνπή Παξνπζίαζεο:
Ηκεξνκελία Παξνπζίαζεο: 00/00/0000
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δπραξηζηίεο
Αηζζάλνκαη ππφρξεε θαη ληψζσ φηη πξέπεη λα επραξηζηήζσ ηδηαηηέξσο ηνλ θαζεγεηή κνπ ηνλ Γξ.
Παπαδνπξάθε Γεψξγην ν φπνηνο κνπ αλάζεζε ην ζέκα απηφ θαη κε βνήζεζε ζηελ ζπλερεία γηα ηελ
νινθιήξσζε ηνπ. Δπίζεο επραξηζηψ ηνλ Γηάλλε ΢ηεθαλή ν φπνηνο κε ηελ ζεηξά ηνπ έγηλε πνιχηηκε
πεγή πιεξνθνξηψλ θαη βαζηθψλ αξρψλ ηνπ Drupal θαη Symfony αλάινγα .
2
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
΢ύλνςε
Απηή ε πηπρηαθή εξγαζία αλαθέξεηαη ζηελ εθκάζεζε ηνπ Symfony (open source framework) θαη ηνπ
Drupal (CMS) νη νπνίεο είλαη γιψζζεο πνπ ρξεζηκνπνηνχληαη γηα ηελ δεκηνπξγία ηζηνζειίδσλ, θαη
εζηηάδεηαη ζε θάπνηα ζεκεία φπσο αθνινπζεί παξαθάησ : ΢ηελ πιήξε παξνπζίαζε ησλ γισζζψλ
Symfony & Drupal θαη ησλ ιεηηνπξγηψλ ηεο.Δπίζεο ζηελ αλάιπζε ηνπ πεξηβάιινληνο ηνπο, θαη ζηελ
αμηνπνίεζε ελφο ειεθηξνληθνχ ηζηνχ κηθξήο θιίκαθαο, γξακκέλνπ θαη ζηεο δπν γιψζζεο απηέο
μερσξηζηά ( Symfony & Drupal ). Σν φιν εγρείξεκα απνηειεί έλα εχθνιν νδεγφ ν φπνηνο ζα
βνεζήζεη γηα κηα θαιή αξρή αθνκνίσζεο γηα φπνηνλ επηζπκεί λα κάζεη Symfony & Drupal. Απηφο ν
νδεγφο ζα δηεπθνιχλεη ηελ θξίζε ηνπ ρξήζηε ψζηε εθείλνο λα δηαιέμεη πνηα γισζζά ζα
ρξεζηκνπνηήζεη σο εξγαιείν γηα ηελ απνπεξάησζε ηεο εξγαζίαο ηνπ.
3
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Abstract
This study‘s purpose is for learning Symfony (open source framework) and Drupal, which are
languages that are used for building webpages, and focuses on some issues as follows below: The full
presentation and functionality of Symfony and Drupal languages. The analysis of their environment,
and the development of a small web site written in both languages (Symfony and Drupal) The project
is an easy guide that will help anyone who wishes to learn Symfony and Drupal. This guide will help
the user to choose which language can be used as a tool for his project.
4
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Πεξηερόκελα
1. Δηζαγσγή.....................................................................................................................................-151.1. Πεξίιεςε................................................................................................................................-151.2. Κίλεηξν γηα δηεμαγσγή ηεο εξγαζίαο.....................................................................................-151.3. ΢θνπφο θαη ΢ηφρνη εξγαζίαο...................................................................................................-151.4. Γνκή εξγαζίαο (Symfony & Drupal).....................................................................................-162. Μεζνδνινγία Τινπνίεζεο.............................................................................. ...........................-172.1. Μέζνδνο αλάιπζεο θαη αλάπηπμεο πηπρηαθήο.......................................................................-172.2. Σερλνινγίεο θαη εξγαιεία γηα ηελ αλάπηπμε ησλ ηζηνζειίδσλ (ΘΔΩΡΙΔ΢)..........................-172.2.1. Symfon..........................................................................................................................-172.2.2. Η Αξρηηεθηνληθή ηνπ Symfony.....................................................................................-172.2.3. Mode.............................................................................................................................-192.2.4. View...............................................................................................................................-192.2.5. Controller......................................................................................................................-202.3. ORM.......................................................................................................................................-212.3.1. Object-Relational Mapping (ORM) εξγαιεία:..............................................................-212.3.2. Ση είλαη ηα ORM ζπζηήκαηα.........................................................................................-222.3.3. Ωο αληηθεηκελν-ζρεζηαθή απεηθφληζε (Object-Relational Mapping ή ORM)..............-222.3.4. Υαξαθηεξηζηηθά ησλ ORM ζπζηεκάησλ.....................................................................-232.4. PHP framework......................................................................................................................-242.4.1. Σαρχηεηα.......................................................................................................................-252.4.2. Πνηφηεηα θψδηθα...........................................................................................................-262.5. Η ηερλνινγία
AJAX....................................................................................................................................-262.5.1. Γεληθά............................................................................................................................-262.5.2. Σαπηφηεηα.....................................................................................................................-275
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.5.3. Βηβιηνζήθεο...................................................................................................................-292.5.4. Σν AJAX ζην symfony..................................................................................................-292.6. Ση εηλαη Drupal........................................................................................................................-302.6.1. Modules (Δλφηεηεο)......................................................................................................-312.6.2. Themes (Θεκαηηθέο παξαιιαγέο).................................................................................-312.6.3. CMS..............................................................................................................................-312.6.4. XAAMP.........................................................................................................................-312.6.5. Αξρηηεθηνληθή...............................................................................................................-322.6.6. Απαηηήζεηο θαη ραξαθηεξηζηηθά....................................................................................-322.7. Apache....................................................................................................................................-322.8. MySQL...................................................................................................................................-332.8.1. Πιενλεθηήκαηα ηεο Mysql............................................................................................-352.9. PhpMyAdmin........................................................................................................................-352.10. ΢εµαληηθνί ζηφρνη γηα ηελ νινθιήξσζε ηεο πηπρηαθήο......................................................-362.10.1. Υξνλνδηάγξαµµα.......................................................................................................-363. ΢ρέδην Γξάζεο γηα εθπόλεζε ηεο πηπρηαθήο εξγαζίαο...........................................................-373.1. State of the art.........................................................................................................................-373.1.1. Δηζαγσγή ζην symfony framework..............................................................................-373.1.2. Υαξαθηεξηζηηθά ηνπ Symfony......................................................................................-373.2. Πξναπαηηήζεηο ΢πζηήκαηνο...................................................................................................-383.3. Ρπζκίζεηο Παξακέηξσλ PHP..................................................................................................-383.4. Δγθαηάζηαζε ηνπ Symfony....................................................................................................-383.4.1. Δπηβεβαίσζε ηεο Δγθαηάζηαζεο..................................................................................-393.5. Project Setup...........................................................................................................................-403.5.1. Γεκηνπξγία Project........................................................................................................-40
3.6. Γεκηνπξγία Δθαξκνγήο..........................................................................................................-416
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
3.6.1. Γηθαηψκαηα ζηηο Γνκέο ησλ Φαθέισλ..........................................................................-413.7. Ρπζκίζεηο Παξακέηξσλ ηνπ Web Server: O Αζθαιήο Σξφπνο..............................................-413.7.1. Ρπζκίζεηο Παξακέηξσλ ηνπ Web Server.......................................................................-423.7.2. Έιεγρνο ησλ θαηλνχξησλ Ρπζκίζεσλ............................................................................-433.8. Σα πεξηβάιινληα....................................................................................................................-443.9. Σν Project................................................................................................................................-463.9.1. Ιζηνξίεο F......................................................................................................................-473.9.1.1.
Ιζηνξία F1.....................................................................................................-47-
3.9.1.2.
Ιζηνξία F2.....................................................................................................-48-
3.9.1.3.
Ιζηνξία F3.....................................................................................................-48-
3.9.1.4.
Ιζηνξία F4.....................................................................................................-49-
3.9.1.5.
Ιζηνξία F5.....................................................................................................-49-
3.9.1.6.
Ιζηνξία F6.....................................................................................................-51-
3.9.1.7.
Ιζηνξία F7.....................................................................................................-52-
3.9.2. Ιζηνξίεο B......................................................................................................................-523.9.2.1.
Ιζηνξία B1....................................................................................................-52-
3.9.2.2.
Ιζηνξία B2....................................................................................................-52-
3.9.2.3.
Ιζηνξία B3....................................................................................................-52-
4. Σν Μνληέιν Γεδνκέλσλ..............................................................................................................-534.1. Σν ΢ρεζηαθφ Μνληέιν............................................................................................................-534.2. Σν ζρέδην (schema).................................................................................................................-534.3. Σν ORM..................................................................................................................................-534.4. Η Βάζε Γεδνκέλσλ................................................................................................................-564.5. Σα Αξρηθά Γεδνκέλα...............................................................................................................-584.6. ΢ηελ Πξάμε ζηνλ Browser......................................................................................................-615. Η Αξρηηεθηνληθή MVC..............................................................................................................-647
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.1. Σν Layout................................................................................................................................-655.2. Σα Stylesheet, νη Δηθφλεο θαη ηα Java Scripts.........................................................................-675.3. Η Αξρηθή ΢ειίδα ―Job............................................................................................................-685.4. Η Γξάζε (action)....................................................................................................................-685.5. Σν πξφηππν Templates............................................................................................................-695.6. To Template ηεο Ιζηνζειίδαο―Job..........................................................................................-705.7. Slots........................................................................................................................................-725.8. Η Γξάζε ηεο Ιζηνζειίδαο ―Job..............................................................................................-745.9. Σν Αίηεκα θαη ε Απάληεζε (request / respond).....................................................................-745.9.1. Request..........................................................................................................................-755.9.2. Respond.........................................................................................................................-766. H Γξνκνιόγεζε (Routing).........................................................................................................-766.1. URLs......................................................................................................................................-766.2. Ρχζκηζε Παξακέηξσλ ηνπ Routing........................................................................................-776.3. Πξνζαξκνγέο ησλ Γηαδξνκψλ (route customizations)...........................................................-786.4. Απαηηήζεηο..............................................................................................................................-796.5. Route Class.............................................................................................................................-806.6. Object Route Class.................................................................................................................-806.7. Routing ζε Actions θαη ζε Templates.....................................................................................-846.8. ΢πιινγή Route Class..............................................................................................................-856.9. Απνζθαικάησζε ηνπ Route (Debugging).............................................................................-886.10. Default Route.......................................................................................................................-897. Σν Doctrine Query Object.........................................................................................................-897.1. Απνζθαικαηψλνληαο SQL πνπ Γεκηνπξγήζεθε απφ Doctrine..............................................-907.2. Object Serialization................................................................................................................-917.3. Πεξηζζφηεξα κε ηα Fixtures...................................................................................................-928
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
7.4. Custom Configuration............................................................................................................-937.5. Refactoring.............................................................................................................................-947.6. Καηεγνξίεο ζηελ Αξρηθή ΢ειίδα............................................................................................-957.7. Πεξηνξίδνληαο ηα Απνηειέζκαηα...........................................................................................-987.8. Γπλακηθά Fixtures..................................................................................................................-997.9. Αζθαιίδνληαο ηε ΢ειίδα ―Θέζε Δξγαζίαο..........................................................................-1008. Η Καηεγνξία Route..................................................................................................................-1018.1. Ο ΢χλδεζκνο ηεο Καηεγνξίαο..............................................................................................-1028.2. Γεκηνπξγία Category Module ηεο ―Θέζεο Δξγαζίαο‖.........................................................-1048.3. Δλεκέξσζε ηεο Βάζεο Γεδνκέλσλ......................................................................................-1048.4. Partials..................................................................................................................................-1078.5. ΢ειηδνπνίεζε ηεο Λίζηαο.....................................................................................................-1089. Έιεγρνη ζην Symfony...............................................................................................................-1139.1. Έιεγρνη Μνλάδαο.................................................................................................................-1139.2. Σν Lime Testing Framework.................................................................................................-1149.3. Δθηειψληαο Διέγρνπο Μνλάδαο...........................................................................................-1159.4. Διέγρνληαο ην Slugify..........................................................................................................-1159.5. Πξνζζέηνληαο Διέγρνπο γηα Καηλνχξηα Υαξαθηεξηζηηθά...................................................-1169.6. Έιεγρνο Doctrine Μνλάδαο..................................................................................................-1179.6.1. Ρχζκηζε Παξακέηξσλ ηεο Βάζεο Γεδνκέλσλ............................................................-1179.7. Έιεγρνο Γεδνκέλσλ..............................................................................................................-1179.8. Διέγρνληαο ην JobeetJob......................................................................................................-1189.9. Harness Διέγρσλ Μνλάδαο..................................................................................................-12010. Λεηηνπξγηθνί Έιεγρνη...............................................................................................................-12010.1. Σν sfBrowser......................................................................................................................-12110.2. Η θιάζε sfTestFunctional..................................................................................................-1229
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
10.3. Ο Διεγθηήο ηνπ Αηηήκαηνο (Request Tester).....................................................................-12410.4. Ο Διεγθηήο ηεο Απάληεζεο (Response Tester...................................................................-12410.5. Δθηειψληαο Λεηηνπξγηθνχο Διέγρνπο................................................................................-12610.6. Έιεγρνο Γεδνκέλσλ...........................................................................................................-12610.7. Γξάθνληαο Λεηηνπξγηθνχο Διέγρνπο (functional).............................................................-12710.8. Με εκθάληζε ησλ ιεγκέλσλ εξγαζηψλ.............................................................................-12710.9. Δκθάληζε κφλν n Θέζεηο Δξγαζίαο γηα κηα θαηεγνξία.....................................................-12810.10. Μηα Καηεγνξία έρεη έλαλ ΢χλδεζκν ζηελ ΢ειίδα Καηεγνξηψλ Μφλν φηαλ ππάξρνπλ
πνιιέο Θέζεηο Δξγαζίαο.....................................................................................................-12810.11. Οη Θέζεηο Δξγαζίαο ηαμηλνκνχληαη αλά Ηκεξνκελία.....................................................-12910.12. Κάζε Θέζε Δξγαζίαο ζηελ Αξρηθή ΢ειίδα κπνξεί λα παηεζεί.......................................-13010.13. Απνζθαικάησζε Λεηηνπξγηθψλ Διέγρσλ.......................................................................-13410.14. Harness Λεηηνπξγηθψλ Διέγρσλ......................................................................................-13410.15. Harness Έιεγρνη..............................................................................................................-13411. Σν Form Framework................................................................................................................-13411.1.
Forms...............................................................................................................................-135-
11.2.
Doctrine Forms................................................................................................................-136-
11.3.
Πξνζαξκφδνληαο ηε Form ηεο ―Θέζεο Δξγαζίαο...........................................................-136-
11.4.
Σν Form Template...........................................................................................................-142-
11.5.
Η Form Action.................................................................................................................-143-
11.6.
Πξνζηαηεχνληαο ηε Form ―Θέζεο Δξγαζίαο‖ κε έλα Token..........................................-145-
11.7.
Η ΢ειίδα Πξνεπηζθφπεζεο.............................................................................................-147-
11.8.
Δλεξγνπνίεζε θαη Γεκνζίεπζε ηεο ―Θέζεο Δξγαζίαο...................................................-150-
12. Druapl........................................................................................................................................-15312.1. ΢πζηήκαηα δηαρείξηζεο Πεξηερνκέλνπ – Drupal.............................................................-15312.1.1. Δηζαγσγή ζην ΢χζηεκα Γηαρείξηζεο Πεξηερνκέλνπ (Content Management System –
CMS)...........................................................................................................................-15410
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
12.1.2. Ιζηνξηθά ΢ηνηρεηά CMS...........................................................................................-15412.1.3. Ση είλαη ην ζχζηεκα δηαρείξηζεο πεξηερνκέλνπ CMS..............................................-15412.1.4. Σα δηαζέζηκα Web CMS..........................................................................................-15412.1.5. CMS αλνηθηνχ θψδηθα............................................................................................-15512.1.6. Σα πην δεκνθηιή CMS αλνηρηνχ θψδηθα.................................................................-15512.1.7. Γπλαηφηεηεο θαη ραξαθηεξηζηηθά ελφο CMS
............................................... ....-155-
12.1.8. Πιενλεθηήκαηα ελφο CMS (Content Management System)...................................-15613. Γεληθή πεξηγξαθή ηνπ Drupal.................................................................................................-15713.1. Ση είλαη Drupal.................................................................................................................-15713.1.1. Πιενλεθηήκαηα Drupal...........................................................................................-15813.1.2. Μεηνλεθηήκαηα Drupal............................................................................................-15913.1.3. Σα θχξηα ραξαθηεξηζηηθά ηνπ Drupal.....................................................................-15913.1.4. Σερλνινγηθή ππνδνκή ηνπ Drupal...........................................................................-16114. Τινπνίεζε.................................................................................................................................-16114.1. Πνιιαπιά site κε κία εγθαηάζηαζε Drupal....................................................................-16114.2. Δγθαηάζηαζε απαξαίηεηνπ ινγηζκηθνχ..........................................................................-16214.3. Οινθιήξσζε ηεο εγθαηάζηαζεο ηνπ Drupal..................................................................-16814.4. Γλσξηκία κε ην πεξηβάιινλ εξγαζίαο.............................................................................-16814.4.1. Content management...............................................................................................-16914.5. Αζθάιεηα.........................................................................................................................-17114.6. Οη Μνλάδεο.....................................................................................................................-17114.6.1. Γηαρείξηζε................................................................................................................-17214.6.2. Content Construction Kit (CCK).............................................................................-17214.6.3. Views.......................................................................................................................-17314.7.
Σν δηαρεηξηζηηθφ πεξηβάιινλ ηνπ Drupal.....................................................................-174-
14.8.
Σν πξφηππν ζρεδίαζεο (Theme template)....................................................................-17611
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
14.9.
Modules........................................................................................................................-181-
14.10. Σα Drupal Hooks...........................................................................................................-18214.11. Γηαδηθαζία αίηεζεο ζειίδαο.........................................................................................-19314.12. Database Abstraction Layer..........................................................................................-19514.13. Τπνβνιή πεξηερνκέλνπ.................................................................................................-19714.14. Σαμηλφκεζε πεξηερνκέλνπ............................................................................................-19814.15. Γεκηνπξγία ζχλζεησλ ζειίδσλ.....................................................................................-19914.16. ΢χζηεκα Μελνχ............................................................................................................-20014.17. Blocks...........................................................................................................................-20514.18. Γηεπζχλζεηο URL..........................................................................................................-20514.19. Η δνκή ηεο ηζηνζειίδαο καο.........................................................................................-21014.20. Γεκηνπξγία θαη επεμεξγαζία ζειίδαο...........................................................................-21014.20.1. Γεκηνπξγία κπινθ.................................................................................................-21114.20.2. Αξρηθή ζειίδα.......................................................................................................-21115. Πίλαθαο ζύγθξηζεο ηνπ Framework Symfony κε ην Drupal................................................-212-
12
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Πίλαθαο εηθόλσλ:
Αξηζκόο
Δηθόλαο
΢ειίδα
Πεξηγξαθή
1
18
΢ρεκαηηθφ δηάγξακκα ηνπ αξρηηεθηνληθνχ κνληέινπ Model – View –
Controller θαη ησλ ζρέζεσλ κεηαμχ ησλ ηκεκάησλ
2
20
Η επηθνηλσλία κεηαμχ ησλ ηκεκάησλ Model – View – Controller.
3
21
Object-Relational Mapping (ORM)
4
25
Γξαθηθή παξάζηαζε ησλ επηδφζεσλ ζε αηηήκαηα αλά δεπηεξφιεπην (RPS) έμη
δηαδεδνκέλσλ PHP frameworks.
5
27
Κιαζηθή εθαξκνγή παγθφζκηνπ ηζηνχ κε επαλαθφξηηζε ηεο ζειίδαο γηα θάζε
αιιειεπίδξαζε ηνπ ρξήζε .
6
35
To ρξνλνδηάγξακκα πνπ ρξεηαζηεηθε γηα ηελ πινπνεζε ηεο πηπρηαθεο
7
42
Πξψηε ζειίδα εγθαηάζηαζεο ηνπ Symfony.
8
44
Σν πεξηβάιινλ παξαγσγήο ηνπ Symfony πνπ καο δείρλεη ην ζθάικα γηα λα
ελεξγνπνηεζεί.
9
45
Μεηά ηεο ξπζκίζεηο ηνπ πεξηβάιινλ παξαγσγήο (production environment).
10
46
Ιζηνξία F1: ΢ηελ αξρηθή ζειίδα ν ρξήζηεο βιέπεη ηηο ηειεπηαίεο ελεξγέο
ζέζεηο εξγαζίαο.
11
47
Ιζηνξία F2: Έλαο ρξήζηεο κπνξεί λα αλαδεηήζεη φιεο ηηο ζέζεηο εξγαζίεο ζε
ζπγθεθξηκέλε θαηεγνξία.
12
48
Ιζηνξία F4: Ο ρξήζηεο ―παηάεη‖ πάλσ ζε κηα ζέζε εξγαζίαο γηα λα δεη πην
ιεπηνκεξείο πιεξνθνξίεο.
13
50
Ιζηνξία F5: Ο ρξήζηεο ηνπνζεηεί κία ζέζε εξγαζίαο.
14
52
Σν Mνληέιν κνληέιν Γεδνκέλσλ (Data Model).
15
62
΢ηελ πξάμε ζηνλ Browser (πεξηεγεηή).
16
63
Η Αξρηηεθηνληθή MVC.
17
64
Σν Layout
18
66
Σα Stylesheet ηνπ jobeet
19
71
Σν Slots
20
148
Η ηειηθε ζειηδα ηνπ Jobeet
21
157
Η ηερλνινγηθή ππνδνκή ηνπ Drupal
13
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
22
160
Σα αξρεία ηνπ Drupal
23
161
Σν localhost/drupal ηνπ Drupal
24
162
Σν database ηνπ Drupal
25
163
Γίλεηε εγθαηάζηαζε ηνπ Drupal
26
163
Η δηαρεηξηζηή ηεο ηζηνζειίδαο ηνπ Drupal
27
164
Administration menu
28
170
Γεκηνπξγία θφκβνπ ηχπνπ χιεο Page
29
171
WYSIWYG editor
30
172
Σν πξφηππν ζρεδίαζεο (Theme template)
31
174
To bluemarine.
32
207
Η Αξρηθή ζειίδα ηνπ Drupal
14
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
1. Δηζαγσγή
΢ην θεθάιαην απηφ αξζξψλνληαη γεληθέο πιεξνθνξίεο γηα απηή ηελ πηπρηαθή εξγαζία.
Πην ζπγθεθξηκέλα αθνινπζεί κία αλάιπζε ηεο πηπρηαθήο εξγαζίαο, ησλ αίηησλ ηα νπνία καο
παξαθίλεζαλ ζηελ επηινγή ηνπ ζέκαηνο θαζψο θαη κία πεξηγξαθή θαη πεξίιεςε ησλ δηάθνξσλ
ζηνηρείσλ ηεο θαη ηεο εθαξκνγήο ηνπο .
1.1 Πεξίιεςε
Ο βαζηθφο ζηφρνο απηήο ηεο πηπρηαθήο είλαη ε δηεξεχλεζε πξσηνπνξηαθψλ κεζφδσλ αλάπηπμεο
δηαδηθηπαθψλ εθαξκνγψλ. Δπίζεο ε αλαθνξά ζηελ αλάπηπμε ηαθηηθψλ εθαξκνγήο γηα ηε ρξήζε ηνπ
Symfony θαη ηνπ Drupal θαη ε ππφδεημε ησλ δηαθνξψλ κεηαμχ ηνπο.
Σν Symfony είλαη έλα open source framework αλάπηπμεο εθαξκνγψλ βαζηζκέλν ζηελ γιψζζα
πξνγξακκαηηζκνχ PHP ζε πεξηβάιινλ LAMP. Τινπνηεί νινθιεξσκέλεο κεζφδνπο αλάπηπμεο,
ειέγρνπ θαη deployment κηαο εθαξκνγήο. Δίλαη θαηάιιειν γηα πινπνίεζε ηερληθψλ αλάπηπμεο
βαζηζκέλν ζε scum/XP Programing ηερληθψλ. ΢ηελ βάζε ηνπ ρξεζηκνπνηεί MVC αξρηηεθηνληθή πάλσ
ζε έλα αληηθεηκελνζηξαθέο κνληέιν ηεο βάζεο δεδνκέλσλ κέζσ ελφο ζηξψκαηνο ORM. Σν Symfony
είλαη επεξεαζκέλν απφ ην Ruby On Rails θαη κεηαθέξεη ηελ εκπεηξία απφ ην RoR ζηελ γιψζζα PHP
5.
Σν Drupal είλαη έλα πξφγξακκα ζχγρξνλνπ ζπζηήκαηνο δηαρείξηζεο πεξηερνκέλνπ (CMS) αλνηθηνχ
θψδηθα. Πνηφ ζπγθεθξηκέλα ρξεζηκνπνηήζεθαλ νη γιψζζεο πξνγξακκαηηζκνχ ηζηνζειίδσλ
PHP,Javascript θαη CSS. Γηα ηελ απνζήθεπζε θαη εκθάληζε πιεξνθνξηψλ απφ ηελ βάζε δεδνκέλσλ
ρξεζηκνπνηήζεθε ε MySql θαη δηάθνξα queries ηεο. Δπίζεο ζα αλαιχζνπκε κέζα απφ ηελ πξαθηηθή
εθαξκνγή, βήκα πξνο βήκα φιεο ηεο ιεπηνκέξεηεο πνπ ζα καο βνεζήζνπλ λα θαηαλνήζνπκε ηνλ
ηξφπν ιεηηνπξγίαο ηνπ Symfony θαη ηνπ Drupal θαη πσο αλαπηχζζνληαη νη δηάθνξεο ιεηηνπξγίεο ηνπ.
Απηφ ζα καο βνεζήζεη θαη ζηελ θαηαλφεζε ηεο γιψζζαο πξνγξακκαηηζκνχ PHP πνπ
ρξεζηκνπνηείηαη επξέσο ζην δηαδίθηπν ζήκεξα απφ ρηιηάδεο πξνγξακκαηηζηέο ζηνλ θφζκν.
1.2 Κίλεηξν γηα δηεμαγσγή ηεο εξγαζίαο
΢ηηο κέξεο καο, ην Internet θαη ε ηερλνινγία, αλαπηχζζνληαη κε αικαηψδε βήκαηα ζε έλα
θνηλσληθφ θαη επαγγεικαηηθνί πεξηβάιινλ πνπ φιν θαη πεξηζζφηεξν εμαξηάηαη θαη έρεη αλάγθε απφ
απηά. Απηή ε αλάγθε ππνδείρλεη ηνπο ιφγνπο χπαξμεο λέσλ θαη ζχγρξνλσλ δνκψλ, κε φιν θαη πνην
αλεπηπγκέλεο ππεξεζίεο γηα ηελ αλεχξεζε άκεζσλ ηξφπσλ πνπ ζα νδεγήζνπλ ζην θαιχηεξν θαη
γξεγνξφηεξν απνηέιεζκα .
Έηζη, ζπγθεθξηκέλα είλαη ζθφπηκν λα βξεζεί έλαο ηξφπνο φπνηνο ζα θάλεη δπλαηφλ ηεο δεκηνπξγία
κηαο ηζηνζειίδαο αλάινγα κε ηηο ηδηαίηεξεο ζπλζήθεο ηεο θάζε πεξηπηψζεηο .
Σα ζπκπεξάζκαηα βγαικέλα κεηά απφ ηελ αλάιπζε ησλ εθαξκνγψλ ηνπ Symfony θαη Drupal
αλαδεηθλχνπλ ηηο δηαθνξέο κεηαμχ απηφλ ησλ δπν θαη ζπγθεθξηκέλα απνδεηθλχνπλ φηη ην Symfony
αλαθέξεηαη ζε ρξήζηεο κε ηδηαίηεξεο γλψζεηο ελψ ην Drupal κε ηε ζεηξά ηνπ, ζε ρξήζηεο ρσξίο
ηδηαίηεξεο γλψζεηο. ΢ην πιηθφ απηήο ηεο εξγαζίαο, πην θάησ, ζα ζπλαληήζνπκε δηάθνξεο παξαιιαγέο
απηνχ.
1.3 ΢θνπόο θαη ΢ηόρνη εξγαζίαο
΢θνπφο ηεο εξγαζίαο απηήο είλαη ε εθκάζεζε ηνπ ζρεδηαζκνχ θαη πξνγξακκαηηζκνχ κηαο
ηζηνζειίδαο ρξεζηκνπνηψληαο ην framwoek symfony θαη ην εξγαιείν αλνηθηνχ θψδηθα Drupal θαη ε
θαηαλφεζε ηνπ ηξφπνπ ιεηηνπξγίαο ηνπο.
Δπίζεο ε αθνκνίσζε θάπνησλ βαζηθψλ γισζζψλ πξνγξακκαηηζκνχ ( πρ. HTML, ε PHP,ε SQL,
CSS θαη ε Javascript) πνπ απαηηνχληαη γηα ηελ δεκηνπξγία ηζηνζειίδσλ. Μέζα απφ ηελ αλάιπζε ζα
15
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
γίλεη θαηαλνεηή ε δνκή ηνπο, ε ηεξαξρία θαη ην ζχζηεκα αξρείσλ ηνπο, πξνθεηκέλνπ λα ρεηξηζηνχλ
απνδνηηθά θαη λα βνεζήζνπλ ζηελ απνπεξάησζε ηνπ θάζε έξγνπ αλάινγα κε ηελ πεξίπησζε.
1.4 Γνκή εξγαζίαο
 Η δνµή ηεο εξγαζίαο µαο είλαη νη εμήο ζηα πην θάησ θεθάιαηα πνπ αθνινπζνύλ:
1) ΢ην 2ν θεθάιαην αλαθεξφκαζηε ζηελ κεζνδνινγία πνπ ρξεζηκνπνηήζακε γηα ηελ πινπνίεζε ηεο
πηπρηαθήο θαη αλαθεξφκαζηε πεξηιεπηηθά ζε ζεσξίεο ησλ γισζζψλ πξνγξακκαηηζκνχ πνπ
ρξεζηκνπνηήζακε θαη ζην Symfony θαη ζην Drupal .
 Γηα ην Symfony
2) ΢ην 3ν θεθαιαην αθνινπζεη ε εγθαηαζηαζε ηνπ Symfony θαη ηα αξρεηα πνπ ζα ρξεηαζηνπλ λα
ηξεμεη ην Symfony
3) ΢ην 4ν θαη ζην 5ν θεθάιαην αθνινπζεί ε ιεπηφηεξεο ζρεδίαζε ηνπ ζπζηήκαηνο,ην κνληέιν
δεδνκέλσλ θαη ε. Αλαιχεηαη ε αξρηηεθηνληθή Model – View – Controller ζηα ζπζηαηηθά ηεο,
γίλεηαη αλαθνξά θαη αμηνιφγεζε ζην πιαίζην αλάπηπμεο (framework) πνπ πξφθεηηαη λα
ρξεζηκνπνηεζεί θαηά ηελ αλάπηπμε (PHP framework) θαη πεξηγξάθνληαη νη θιάζεηο απφ ηηο νπνίεο
απνηειείηαη ην ζχζηεµα. Δπίζεο, παξνπζηάδεηαη θαη ην ζρεζηαθφ ζρήµα ηεο βάζεο δεδνκέλσλ πνπ
αλαπηχρζεθε.
4) ΢ην 6ν θαη 7ν ,8ν αθνινπζε ην ηζηνξηθν ηνπ project θαη ε δξνκνινγεζε (routing) αθνινπζε ην
Doctrine Query object, θαηεγνξηεο router (δει. Ο ζπλδεζηκνο ησλ θαηεγνξησλ)
5) Καη ζην 9ν ,10ν θαη 11ν γηλεηαη ν ιερνο ηνπ Symfony θαη ιεηηνπξγηεο ειεγρνπ θαη ηεινο γηλεηε ην
from framework
 Καη γηα ην Drupal
Δηζαγσγή ζην ζχζηεκα δηαρείξηζεο πεξηερνκέλνπ
(6) Σν 12o θεθάιαην πεξηγξάθεη ηελ Δηζαγσγή ζην ζχζηεκα δηαρείξηζεο πεξηερνκέλνπ,γεληθα ηνπ
Drupla, (Γει. Σεο Σερλνινγηθή ππνδνκή πνπ ερεη ηνπ Drupal)
7) ΢ην 13ν θαη 15ν θεθάιαην αλαθεξφκαζηε ζηελ γελεθε πεξηγξαθή ηνπ Drupal ,θαη ζηελ
πινπνίεζε .
 ΢ην ηεινο ηνπ θεθαιενπ θαλνπκε ηελ ζπγθξηζε ηνπ Symfony θαη ηνπ Drupal ζε ελαλ
πηλαθα .
16
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.Μεζνδνινγία Τινπνίεζεο
Πεξηγξαθή ησλ παξαδνρψλ θαη ηεο κεζνδνινγίεο πινπνίεζεο ηεο εξγαζίαο.
2.1 Μέζνδνο αλάιπζεο θαη αλάπηπμεο πηπρηαθήο
΢ηελ ππνθαηεγνξία απηή ζα αζρνιεζνχκε κε ηελ παξαηήξεζε θαη πξαθηηθή αλάιπζε φισλ ησλ
βεκάησλ πνπ ζα αθνινπζήζνπκε γηα ηελ νινθιήξσζε ησλ ηζηνζειίδσλ κε ηελ βνήζεηα ηνπ Symfony
θαη Drupal αλάινγα. Η αθνκνίσζε ησλ μερσξηζηψλ ζηνηρείσλ ηνπο, ζα καο βνεζήζεη λα θηλεζνχκε
ζε επίπεδα βαηά θαη πξνζηηά ζε καο.
ΜΔΘΟΓΟΛΟΓΙΑ
Symfony
MVC
ORM
Framework
Drupal
Modules(Δλόηεηεο)
Themes
PHP
SQL
Javascript
Css
Πίλαθαο 1 - ΢ρεηηθέο Μεζνδνινγίεο Αλάπηπμεο
ΑΝΑΦΟΡΑ ΢ΣΗΝ ΒΙΒΛΙΟΓΡΑΦΙΑ
www.symfony-project.org/
www.wikipedia.org/wiki/MVC
en.wikipedia.org/wiki/Objectrelational_mapping
en.wikipedia.org/wiki/Framework
http://drupal.org/
http://drupal.org/project/Modules
http://drupal.org/project/Themes
http://en.wikipedia.org/wiki/PHP,
http://www.php.net/
http://www.sqlcourse.com,
http://en.wikipedia.org/wiki/SQL
http://en.wikipedia.org/wiki/Javascript
http://en.wikipedia.org/wiki/CSS
2.2 Σερλνινγίεο θαη εξγαιεία γηα ηελ αλάπηπμε ησλ ηζηνζειηδσλ (ΘΔΩΡΙΔ΢):
2.2.1 Symfony:
Σν Symfony είλαη έλα open source framework αλάπηπμεο εθαξκνγψλ βαζηζκέλν ζηελ γιψζζα
πξνγξακκαηηζκνχ PHP ζε πεξηβάιινλ LAMP. Τινπνηεί νινθιεξσκέλεο κεζφδνπο αλάπηπμεο,
ειέγρνπ θαη deployment κηαο εθαξκνγήο. Δίλαη θαηάιιειν γηα πινπνίεζε ηερληθψλ αλάπηπμεο
βαζηζκέλν ζε scum/XP Programing ηερληθψλ. ΢ηελ βάζε ηνπ ρξεζηκνπνηεί MVC αξρηηεθηνληθή πάλσ
ζε έλα αληηθεηκελνζηξαθέο κνληέιν ηεο βάζεο δεδνκέλσλ κέζσ ελφο ζηξψκαηνο ORM. Σν Symfony
είλαη επεξεαζκέλν απφ ην Ruby On Rails θαη κεηαθέξεη ηελ εκπεηξία απφ ην RoR ζηελ γιψζζα PHP
5.
2.2.2 Η Αξρηηεθηνληθή ηνπ Symfony
Σν Symfony είλαη βαζηζκελν ζηα θιαζηθα πξνηππα ζρεδηαδκνπ ηδηνπ γλσζηα ζαλ αξρηηεθηνληθε
Model– View–Controller(MVC)πνπ απνηεινπληαη απφ ηξεηα επίπεδα:
Η αξρηηεθηνληθή ηνπ ζπζηήκαηνο αθνινπζεί ην αξρηηεθηνληθφ πξφηππν Model – View – Controller.
17
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Σν ζπγθεθξηκέλν αξρηηεθηνληθφ πξφηππν επηηξέπεη ην δηαρσξηζκφ ηεο ινγηθήο απφ ηελ παξνπζίαζε
ζην ππφ αλάπηπμε ζχζηεκα κε απνηέιεζκα λα πξνζθέξεη κεγαιχηεξε επειημία ζηελ αλάπηπμε θαη
ζηε ζπληήξεζε ηνπ ζπζηήκαηνο θαη επθνιφηεξν έιεγρν ησλ επηκέξνπο ππνζπζηεκάησλ. Μία
εθαξκνγή πνπ αλαπηχζζεηαη αθνινπζψληαο ηε ζπγθεθξηκέλε ηερλνηξνπία απαξηίδεηαη απφ
μερσξηζηέο δνκηθέο κνλάδεο πνπ πινπνηνχλ ηνπο ηξεηο δηαθξηηνχο ξφινπο πνπ νξίδνληαη απφ ηε
ζπγθεθξηκέλε αξρηηεθηνληθή. Σα κνληέια είλαη θνκκάηηα θψδηθα πνπ αλαπαξηζηνχλ ηα δεδνκέλα ηεο
εθαξκνγήο. Οη φςεηο (views) είλαη θνκκάηηα θψδηθα πνπ αλαιακβάλνπλ λα παξνπζηάζνπλ ην
απνηέιεζκα ηνπ ζπζηήκαηνο ζην ρξήζηε. Οη ειεγθηέο είλαη ηκήκαηα θψδηθα πνπ δέρνληαη θαη
δηεθπεξαηψλνπλ ηηο εληνιέο ηνπ ρξήζηε. ΢ηε ζχγρξνλε αλάπηπμε δηθηπαθψλ εθαξκνγψλ ην
αξρηηεθηνληθφ πξφηππν Model – View – Controller βξίζθεη ηδηαίηεξε εθαξκνγή θαη απνδεηθλχεηαη
ζηαδηαθά σο ηδαληθή ιχζε γηα ηελ αλάπηπμε πνιχπινθσλ εθαξκνγψλ κηαο θαη ην κνληέιν αλάπηπμεο
δηθηπαθψλ ζπζηεκάησλ επηβάιιεη εγγελψο ην δηαρσξηζκφ ηεο παξνπζίαζεο, ε νπνία γίλεηαη κέζσ
HTML, θαη ηεο ινγηθήο, ε νπνία πξαγκαηνπνηείηαη ζην δηαθνκηζηή ηεο εθαξκνγήο. ΢ε απηφ ην
πιαίζην ηαηξηάδεη απφιπηα ε ινγηθή ηεο ιεηηνπξγίαο ηνπ ζπγθεθξηκέλνπ αξρηηεθηνληθνχ πξνηχπνπ.
΢ην ζρήκα πνπ αθνινπζεί παξνπζηάδνληαη δηαγξακκαηηθά ηα επηκέξνπο ζηνηρεία ηεο αξρηηεθηνληθήο
θαη αλαπαξίζηαληαη νη ζπζρεηίζεηο κεηαμχ απηψλ. Δπηγξακκαηηθά, αμίδεη λα αλαθεξζεί φηη ν ειεγθηήο
έρεη πξφζβαζε ηφζν ζηηο φςεηο, ηηο νπνίεο δίλεη πξνο απεηθφληζε, φζν θαη ζηα κνληέια, απφ ηα νπνία
αληιεί πιεξνθνξίεο ελψ θαη νη φςεηο, κε ηε ζεηξά ηνπο, έρνπλ ηε δπλαηφηεηα άληιεζεο πιεξνθνξηψλ
απφ ηα κνληέια. ΢ηε ζπλέρεηα αθνινπζεί ε ελδειερήο αλάιπζε ηνπ αξρηηεθηνληθνχ πξνηχπνπ Model
– View – Controller ζηα επηκέξνπο ηκήκαηα πνπ ην απνηεινχλ.
Δηθόλα 1 : ΢ρεκαηηθό δηάγξακκα ηνπ αξρηηεθηνληθνύ κνληέινπ Model – View – Controller θαη
ησλ ζρέζεσλ κεηαμύ ησλ ηκεκάησλ ηνπ.
Με κία πξψηε κάηηα ηεο εηθφλαο κπνξεί θάπνηνο λα θαηαιάβεη φηη ππάξρεη επηθνηλσλία κεηαμχ ηνπ
Διηθηή ηεο Πξνβνιήο θαη ηνπ Μνληέινπ. Όηαλ ν ρξήζηεο (browser) αηηεζεί κηα ελέξγεηα, ηφηε απηή
πεγαίλεη ζηνλ Διεγθηή. Απηφο κε ηε ζεηξά ηνπ, αλαιφγσο ην αίηεκα, αλνίγεη κηα επηθνηλσλία κε ην
Μνληέιν απφ ην νπνίν αηηείηαη θάπνηα δεδνκέλα εθφζνλ ηα δεδνκέλα πνπ δεηήζεθαλ είλαη
18
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
απνζεθεπκέλα ζε βάζε. Δάλ βξίζθνληαη ζηε βάζε, ην Μνληέιν απαληάεη, ζηέιλνληαο ηα
απνηειέζκαηα πίζσ ζηνλ Διεγθηή. Αθνχ ηα ιάβεη, θαιεί ηελ αληίζηνηρε πξνβνιή πνπ ζα αλαιάβεη λα
εκθαληζηεί ηα απνηειέζκαηα. Όηαλ βξεζεί ε απαξαίηεηε πξνβνιή, ηα απνηειέζκαηα ζηέιλνληαη πάιη
πίζσ ζηνλ ειεγθηή ν φπνηνο θαη ζέζσ ηνπ δηαθνκηζηεί παξνπζηάδεη ηα ζηνηρεηά ζηνλ ρξεζηή. ΢ηελ
ζπλέρεηα ηεο ελφηεηαο, αθνινπζεί ε εθηελή αλάιπζε ησλ ηξηψλ βηβιηνζεθψλ βάζε ησλ νπνίσλ
πινπνηείηαη ην MVC ζε κηα Symfony εθαξκνγή.
2.2.3 Model
Έλα Μνληέιν αληηπξνζσπεχεη ηηο πιεξνθνξηεο (δεδνκελα) κηαο εθξακνγεο θαη ηνπο θαλνλεο
πνπ ρξεηαδεηαη γηα ην ρεηξηζκφ απησλ ησλ δεδνκέλσλ. ΢ηελ πεξίπησζε ηνπ Symfony, ηα
κνληεια ρξεζηκνπνηνχληαη θπξησο γηα ηε δηαρεηξηζε ησλ θαλφλσλ αιιειεπίδξαζεο κε ηελ
αληηζηνηρε βάζε δεδνκέλσλ. ΢ηηο πεξηζζνηεξεο πεξηπησζεηο, ελαο πηλαθαο ηεο βαζεο
δεδνκελσλ ζαο ζα αληηζηνηρεη ζε ελα κνληειν δει. Απνηειεί ηελ αλαπαξάζηαζε ησλ
δεδνκέλσλ ηα νπνία ρξεζηκνπνηεί θαη επεμεξγάδεηαη ε εθαξκνγή. Σα κνληέια πξνζζέηνπλ
ινγηθή ζηελ πιεξνθνξία ησλ εθάζηνηε δεδνκέλσλ, π.ρ. ππνινγίδνληαο αλ ζήκεξα είλαη ε
κέξα γελεζιίσλ ελφο ρξήζηε ηνπ ζπζηήκαηνο. Όηαλ έλα κνληέιν κεηαβάιιεη ηελ θαηάζηαζή
ηνπ ελεκεξψλεη ηα views πνπ ζρεηίδνληαη κε απηφ ψζηε λα αλαλεσζνχλ κε ηε λέα θαηάζηαζε.
Σα πεξηζζφηεξα ζπζηήκαηα ρξεζηκνπνηνχλ έλα κεραληζκφ κφληκεο απνζήθεπζεο, π.ρ. κία
ζρεζηαθή βάζε δεδνκέλσλ, γηα ηελ απνζήθεπζε ησλ δεδνκέλσλ. Σα κνληέια δελ είλαη
απαξαίηεην λα γλσξίδνπλ γηα ην κέζν απνζήθεπζεο ηεο πιεξνθνξίαο. Παξφια απηά είλαη
πνιχ βνιηθφ αλ ην εθάζηνηε κνληέιν γλσξίδεη πψο λα αλαγλψζεη θαη λα απνζεθεχζεη ηνλ
εαπηφ ηνπ ζην κέζν κφληκεο απνζήθεπζεο ηεο εθαξκνγήο. Μία πινπνίεζε ηεο
ζπγθεθξηκέλεο ηδέαο επηηπγράλεηαη κε ην πξφηππν ζρεδίαζεο Active Record.
2.2.4 View
Πξνβάιεη έλα κνληέιν ζε κνξθή θαηαλνεηή από ην ρξήζηε θαη πξνζαξκνζκέλε ζην κέζν
πεηθόληζεο. Σπλήζσο, παξέρνληαη δηαθνξεηηθά views γηα θάζε κνληέιν ηα νπνία
ρξεζηκνπνηνύληαη αλάινγα ηελ εθάζηνηε αλάγθε παξνπζίαζεο ηεο πιεξνθνξίαο ηνπ
κνληέινπ. Σπλεζηζκέλν παξάδεηγκα είλαη ε ύπαξμε ελόο view κε ζπλνπηηθέο πιεξνθνξίεο
γηα ην κνληέιν θαη ελόο δεύηεξνπ view, ην νπνίν απεηθνλίδεη αλαιπηηθά όια ηα ζηνηρεία ηνπ
κνληέινπ. Εθηόο από ηε δηάθξηζε ζηνλ ηξόπν κε ηνλ νπνίν απεηθνλίδεηαη ην κνληέιν, ηα
views δηαθξίλνληαη θαη κε βάζε ην κέζν ζην νπνίν είλαη ζρεδηαζκέλα λα πξνβάιινληαη.
Πνιιέο θνξέο έλα κεγάιν ζύζηεκα παξέρεη ζηνπο ρξήζηεο ηνπ πνιιαπιέο δπλαηόηεηεο
πξόζβαζεο θαη απεηθόληζεο ηεο πιεξνθνξίαο, π.ρ. κέζσ ηνπ web browser, κέζσ κίαο
αλεμάξηεηεο γξαθηθήο εθαξκνγήο, κέζσ κίαο αλεμάξηεηεο εθαξκνγήο θεηκέλνπ ή κέζσ
εθηππσκέλεο πιεξνθνξίαο. Σε θάζε δηαθνξεηηθό κέζν απεηθόληζεο αληηζηνηρεί θαη έλα
δηαθνξεηηθό view, ην νπνίν ιακβάλεη ππόςε ηνπ ηηο ηδηαηηεξόηεηεο ηνπ κέζνπ ώζηε λα
εκθαλίζεη κε ην βέιηηζην δπλαηό ηξόπν ηα ζηνηρεία ηνπ κνληέινπ, π.ρ. ε πξνβνιή ελόο
γξαθήκαηνο ζηελ θνλζόια ηνπ ζπζηήκαηνο ή πξνβνιή κίαο έγρξσκεο εηθόλαο ζε κία
αζπξόκαπξε εθηύπσζε είλαη πεξηπηώζεηο πνπ απαηηνύλ ηδηαίηεξν ρεηξηζκό από ην
αληίζηνηρν view.
19
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.2.5 Controller
Λακβάλεη ηα κελύκαηα θαη ηηο εληνιέο εηζόδνπ από ην ρξήζηε θαη απνθξίλεηαη ελεξγώληαο
πάλσ ζηα κνληέια ή / θαη εκθαλίδνληαο θάπνην ζπγθεθξηκέλν view. Ο ειεγθηήο απνηειεί ην
ζπλδεηηθό θξίθν ηνπ ζπζηήκαηνο θαη είλαη ππεύζπλνο γηα ηε δηεθπεξαίσζε ησλ εληνιώλ ηνπ
ρξήζηε ηεο εθαξκνγήο. Η ζπλήζεο ιεηηνπξγία ηνπ είλαη ε αλαγλώξηζε ησλ εληνιώλ ηνπ
ρξήζηε, ε άληιεζε θαη επεμεξγαζία ηεο πιεξνθνξίαο από ηα κνληέια βάζεη ησλ εληνιώλ
ηνπ ρξήζηε θαη ε παξνπζίαζε ηεο δεηνύκελεο πιεξνθνξίαο κέζσ ηνπ θαηάιιεινπ view.
Δηθόλα 2 : Η επηθνηλσλία κεηαμύ ησλ ηκεκάησλ Model – View – Controller.
20
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Η αρχι τθσ αρχιτεκτονικισ του MVC είναι να διαχωρίςει τον κώδικα ςε τρία layers, ςφμφωνα με τθ
φφςθ του. Ο κώδικασ λογικισ δεδομζνων είναι τοποκετθμζνοσ μζςα ςτο model, ο κώδικασ τθσ
παρουςίαςθσ μζςα ςτο view, και θ λογικι τθσ εφαρμογισ μζςα ςτον controller. Άλλα επιπρόςκετα
ςχεδιαςτικά πρότυπα μποροφν να κάνουν τθν εμπειρία του προγραμματιςμοφ ακόμα ευκολότερθ.
Τα επίπεδα model, view και controller μποροφν να υποδιαιρεκοφν περαιτζρω.



Model : Σα δεδνκέλα καο ή αιιηψο ε επηρεηξεζηαθή ινγηθή ηεο εθαξκνγήο καο
View : Σν επίπεδν παξνπζίαζεο, δειαδή ην πψο εκθαλίδνληαη ηα
απνηειέζκαηα / δεδνκέλα
Controller: Η δηεπαθή κε ηνλ ρξήζηε θαη νπζηαζηηθά ε ιεηηνπξγηθφηεηα ηεο εθαξκνγήο
Ζνα κάλοσ κανόνασ που κακορίηει εάν το View είλαη αξθεηό μεθάζαξν είλαη όηη πξέπεη λα
πεξηέρεη κόλν ην ειάρηζην PHP θώδηθα. Γηα λα κπνξεί λα θαηαλνεζεί από έλαλ ζρεδηαζηή
HTML που δεν ζχει γνώςθ PHP. Η όπνηα γλώζηεο εληνιέο ζηα View είλαη απηέο εδώ echo,
if/endif, foreach/endforeach, και αυτά είναι όλο.Επίςθσ δεν πρζπει να υπάρχει κώδικασ PHP πνπ
λα κνηάδεη κε HTML tags. Όλοι οι λογικι είναι μεταφερόμενθ ςτο controller script, και περιζχει
μόνο κακαρό κώδικα PHP ρσξίο HTML μζςα. Φανταςτείτε ότι ο ίδιοσ Controller κπνξεί λα
μαλαρξεζηκνπνηεζεί ζε κηα ηειείσο μερσξηζηή παξνπζίαζε ίζσο ζε έλα PDF θ ςε δομι
XML.
2.3 ORM:
2.3.1 Object-Relational Mapping (ORM) εργαλεία:
Είναι ζνα interface που μεταφράηει τθν object-oriented λογικι του Symfony και PHP 5 ςε relational
λογικι των Βάςεων Δεδομζνων. Σε αυτιν τθν κατθγορία βρίςκεται θ τεχνικι ςτθν οποία κα
επικεντρωκοφμε. Τα ORM εργαλεία επιτρζπουν τθν εφκολθ και αυτοματοποιθμζνθ αποκικευςθ
ολόκλθρων γράφων από ςυνδεδεμζνα μεταξφ τουσ αντικείμενα ςε μια ςχεςιακι βάςθ δεδομζνων.
Τθν αποκικευςθ και το φόρτωμα των αντικειμζνων τα αναλαμβάνει το ORM εργαλείο, εκτελώντασ
αυτόματα τα κατάλλθλα SQL ερωτιματα. Εμείσ απλώσ πρζπει να το τροφοδοτιςουμε με τθν
κατάλλθλθ μετά-πλθροφορία για τθν απεικόνιςθ των αντικειμζνων μασ ςτθ ςχεςιακι βάςθ
δεδομζνων
Εικόνα 3: Object-Relational Mapping (ORM).
21
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.3.2 Ση είλαη ηα ORM ζπζηήκαηα
Ωο αληηθεηκελν-ζρεζηαθή απεηθφληζε (Object-Relational Mapping ή ORM) νξίδεηαη έλαο
απηνκαηνπνηεκέλνο ηξφπνο δηαζχλδεζεο ηνπ κνληέινπ αληηθεηκέλσλ (object model) κίαο
αληηθεηκελνζηξαθνχο εθαξκνγήο κε ηε ζρεζηαθή βάζε δεδνκέλσλ ηεο εθαξκνγήο, ρξεζηκνπνηψληαο
κεηά-δεδνκέλα (metadata) γηα ηελ πεξηγξαθή ηνπ ηξφπνπ ηεο δηαζχλδεζεο.
Με ηα ORM ζπζηήκαηα, κπνξνχκε λα θηηάμνπκε ζηελ νπζία κηα εηθνληθή βάζε δεδνκέλσλ απφ
αληηθείκελα, ε νπνία κπνξεί λα ρξεζηκνπνηεζεί απφ ηελ αληηθεηκελνζηξαθή γιψζζα
πξνγξακκαηηζκνχ πνπ ππνζηεξίδεη ην ORM ζχζηεκα.
Οπζηαζηηθά, ηα ORM ζπζηήκαηα αλαιακβάλνπλ ην επίπεδν DAL ηεο εθαξκνγήο.
Δπηηξέπνπλ ηελ εχθνιε απνζήθεπζε νιφθιεξσλ γξάθσλ απφ ζπλδεδεκέλα αληηθείκελα ζε
κηα ζρεζηαθή βάζε δεδνκέλσλ. Σν ORM δηαρεηξίδεηαη κφλν ηνπ απηή ηε δηαδηθαζία,
δηακνξθψλνληαο απηφκαηα ηα θαηάιιεια SQL εξσηήκαηα πξνο ηε βάζε.
2.3.3 Ωο αληηθεηκελν-ζρεζηαθή απεηθόληζε (Object-Relational Mapping ή ORM)
Οξίδεηαη έλαο απηνκαηνπνηεκέλνο ηξφπνο δηαζχλδεζεο ηνπ κνληέινπ αληηθεηκέλσλ (object model)
κίαο αληηθεηκελνζηξαθνχο εθαξκνγήο κε ηε ζρεζηαθή βάζε δεδνκέλσλ ηεο εθαξκνγήο,
ρξεζηκνπνηψληαο κεηά-δεδνκέλα (metadata) γηα ηελ πεξηγξαθή ηνπ ηξφπνπ ηεο δηαζχλδεζεο.
Με ηα ORM ζπζηήκαηα, κπνξνχκε λα θηηάμνπκε ζηελ νπζία κηα εηθνληθή βάζε δεδνκέλσλ απφ
αληηθείκελα, ε νπνία κπνξεί λα ρξεζηκνπνηεζεί απφ ηελ αληηθεηκελνζηξαθή γιψζζα
πξνγξακκαηηζκνχ πνπ ππνζηεξίδεη ην ORM ζχζηεκα.
Ουςιαςτικά, τα ORM ςυςτιματα αναλαμβάνουν το επίπεδο DAL τθσ εφαρμογισ. Επιτρζπουν τθν
εφκολθ αποκικευςθ ολόκλθρων γράφων από ςυνδεδεμζνα αντικείμενα ςε μια ςχεςιακι βάςθ
δεδομζνων. Το ORM διαχειρίηεται μόνο του αυτι τθ διαδικαςία, διαμορφώνοντασ αυτόματα τα
κατάλλθλα SQL ερωτιματα προσ τθ βάςθ.

Σν πξφβιεκα ηεο θιεξνλνκηθφηεηαο θαη ηνπ πνιπκνξθηζκνχ. Δλψ νη αληηθεηκελνζηξαθείο
γιψζζεο πξνγξακκαηηζκνχ ππνζηεξίδνπλ ηελ έλλνηα ηεο θιεξνλνκηθφηεηαο, νη ζρεζηαθέο
βάζεηο δεδνκέλσλ δελ ηελ ππνζηεξίδνπλ. Έηζη, δελ ππάξρεη επζχο ηξφπνο ηεο απνζήθεπζεο
κηαο ηεξαξρίαο θιάζεσλ θαη ππνθιάζεσλ ζε κηα βάζε δεδνκέλσλ.

Με ηελ ίδηα αλαινγία, ππάξρεη ην πξφβιεκα ηεο πξφζβαζεο ζηα αληηθείκελα. Δλψ ζην
αληηθεηκελνζηξαθέο κνληέιν πξνγξακκαηηζκνχ, ε πξφζβαζε ζε έλα αληηθείκελν κπνξεί λα
δηαθνξνπνηεζεί αλάινγα κε ηε δηεπαθή (interface) πνπ ρξεζηκνπνηείηαη πξνο απηφ, ζηηο
βάζεηο δεδνκέλσλ πξέπεη λα ρξεζηκνπνηεζνχλ φςεηο (views) γηα ηελ δηαθνξνπνίεζε ησλ
πξννπηηθψλ κε ηηο νπνίεο βιέπνπκε ηα δεδνκέλα. 
Το πρόβλθμα των ςχζςεων. Στα μοντζλα αντικειμζνων, ζνα αντικείμενο μπορεί να ςχετιςτεί
με ζνα άλλο, χρθςιμοποιώντασ μια απλι αναφορά (object reference). Όμωσ ςτισ ςχεςιακζσ
βάςεισ δεδομζνων, μια ςχζςθ αναπαριςτάται μζςω ενόσ ξζνου κλειδιοφ (foreign key). Οι
διαφορζσ μεταξφ των δφο είναι λεπτζσ και μικρζσ, όπωσ θ κατευκυντικότθτα.
Σν πξφβιεκα ησλ ηχπσλ δεδνκέλσλ. Οη βαζκσηνί ηχπνη δεδνκέλσλ ζε κηα
αληηθεηκελνζηξαθή γιψζζα πξνγξακκαηηζκνχ δηαθέξνπλ ζπλήζσο απφ ηνπο βαζκσηνχο
ηχπνπο πνπ κπνξεί λα απνζεθεχζεη κηα ζρεζηαθή βάζε δεδνκέλσλ. Έλα παξάδεηγκα είλαη ε
δηαθνξεηηθή αληηκεηψπηζε ελφο String. Δλψ ζηηο βάζεηο δεδνκέλσλ ηα strings πξέπεη λα έρνπλ
collation θαη λα έρνπλ θάπνην κέγηζην κέγεζνο, ζηηο αληηθεηκελνζηξαθείο γιψζζεο δελ
ππάξρνπλ απηνί νη πεξηνξηζκνί γηαηί ην collation ρξεηάδεηαη κφλν ζε νξηζκέλεο ιεηηνπξγίεο
(φπσο ε ηαμηλφκεζε) ελψ ην κέγεζνο ηνπ String απμνκεηψλεηαη ζηε κλήκε.


22
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων




Σν πξφβιεκα ηεο ηαπηφηεηαο. Δλψ ζηηο ζρεζηαθέο βάζεηο δεδνκέλσλ ε ηαπηφηεηα κηαο
γξακκήο εθθξάδεηαη απφ ηελ ηηκή ηνπ πξσηεχνληνο θιεηδηνχ (primary key), ζηα αληηθείκελα
ε ηαπηφηεηα ζπλήζσο βαζίδεηαη ζηελ ηνπνζεζία ηνπ αληηθεηκέλνπ ζηε κλήκε ή ζε κηα
πξνζαξκνζκέλε κέζνδν ηζφηεηαο αληηθεηκέλσλ.
Σν πξφβιεκα ηεο ελζπιάθσζεο. Σα αληηθεηκελνζηξαθή πξνγξάκκαηα ζρεδηάδνληαη κε
κεζφδνπο πνπ θαηαιήγνπλ ζε ελζπιαθσκέλα αληηθείκελα ησλ νπνίσλ νη ιεπηνκέξεηεο είλαη
θξπκκέλεο. Αληίζεηα, ζηηο ζρεζηαθέο βάζεηο δεδνκέλσλ δελ ππάξρνπλ πεξηνξηζκνί γηα ηε
ζρεδίαζε ελζπιαθσκέλσλ αληηθεηκέλσλ πνπ έρνπλ θξπκκέλεο ιεπηνκέξεηεο, αιιά ηα
δεδνκέλα είλαη ειεχζεξα πξνο ρξήζε. Καη‘ απηήλ ηελ έλλνηα, ε απεηθφληζε ησλ θξπκκέλσλ
ιεπηνκεξεηψλ ζε κηα βάζε δεδνκέλσλ, θαζηζηά ηηο ζπγθεθξηκέλεο βάζεηο δεδνκέλσλ
επαίζζεηεο ζχκθσλα κε ηηο αξρέο ηνπ αληηθεηκελνζηξαθνχο πξνγξακκαηηζκνχ.
Σν πξφβιεκα ησλ κεραληζκψλ πξνζηαζίαο ησλ ελζπιαθσκέλσλ αληηθεηκέλσλ. Σα RDBMS
ηείλνπλ λα ρξεζηκνπνηνχλ κεραληζκνχο πξνζηαζίαο πνπ ζηεξίδνληαη ζε θαλφλεο θαη ξφινπο.
Καηά ηελ αξρηθνπνίεζε ησλ δεδνκέλσλ, ηνπο δίλεηαη έλα πξνθαζνξηζκέλν ζχλνιν απφ
θαλφλεο θαη ιεηηνπξγίεο. Γηα ηελ ηξνπνπνίεζε ησλ θαλφλσλ, πξέπεη λα «αθαηξεζνχλ»
θάπνηνη θαλφλεο απφ ην πξνθαζνξηζκέλν ζεη, γη‘ απηφ ιέκε φηη ηα RDBMS ζηεξίδνληαη ζε
«αθαηξεηηθνχο» κεραληζκνχο πξνζηαζίαο. Αληίζεηα, ζην αληηθεηκελνζηξαθέο κνληέιν, έλα
ελζπιαθσκέλν αληηθείκελν δελ είλαη πξνζβάζηκν απφ ηνλ έμσ θφζκν κέρξη λα νξηζηεί κηα
δηεπαθή (interface) πνπ λα παξέρεη απηήλ ηελ πξφζβαζε.
Σν πξφβιεκα ησλ ζπλαιιαγψλ. Δλψ νη ζρεζηαθέο βάζεηο δεδνκέλσλ ππνζηεξίδνπλ ηηο
κεγάιεο ζπλαιιαγέο, ζηνλ OOP νη ζπλαιιαγέο είλαη πνιχ κηθξέο θαη πεξηνξίδνληαη ζπλήζσο
ζηελ αλάζεζε κηαο ηηκήο. ΢ηνλ OOP δελ ππάξρνπλ νη αλάινγεο έλλνηεο ηεο απνκφλσζεο θαη
ηεο κνληκφηεηαο.
2.3.4 Υαξαθηεξηζηηθά ησλ ORM ζπζηεκάησλ
Η απηφκαηε απεηθφληζε ησλ αληηθεηκέλσλ κηαο αληηθεηκελνζηξαθνχο εθαξκνγήο ζε κηα
ζρεζηαθή βάζε δεδνκέλσλ πξνζθέξεη πνιιά πιενλεθηήκαηα έλαληη άιισλ ηερληθψλ
πξφζβαζεο δεδνκέλσλ. Μεξηθά απφ ηα ραξαθηεξηζηηθά θαη ηα πιενλεθηήκαηα ησλ ORM
ζπζηεκάησλ είλαη ηα εμήο:




Γξακαηηθή κείσζε ηνπ ρξφλνπ αλάπηπμεο ινγηζκηθνχ, ηνπ θφζηνπο αλάπηπμεο θαη ηνπ
θφζηνπο ζπληήξεζεο, γηαηί ην ORM απηνκαηνπνηεί ηε δηαδηθαζία ηνπ persistency ησλ
αληηθεηκέλσλ. Οπζηαζηηθά αλαιακβάλεη φιν ην DAL πνπ παξνπζηάζακε παξαπάλσ. Ο
πξνγξακκαηηζηήο δελ ρξεηάδεηαη λα αζρνιεζεί κε ην γξάςηκν πνιχπινθσλ SQL εξσηεκάησλ
θαη ηελ πινπνίεζε ηνπ DAL επηπέδνπ.
Γίλεη ηε δπλαηφηεηα ζηνλ πξνγξακκαηηζηή λα κνληεινπνηήζεη ηηο νληφηεηεο ηεο εθαξκνγήο
βαζηδφκελνο ζηηο πξαγκαηηθέο business έλλνηεο θαη αλάγθεο παξά ζηελ δνκή ηεο βάζεο
δεδνκέλσλ.
Ληγφηεξν θψδηθα ζε ζχγθξηζε κε ηελ ζπγγξαθή SQL εξσηεκάησλ κέζα ζηνλ θψδηθα.
Βνεζάεη ηνλ πξνγξακκαηηζηή λα επηθεληξσζεί ζηε business ινγηθή ηεο εθαξκνγήο παξά ζηελ
δεκηνπξγία ησλ CRUD SQL εξσηεκάησλ. 
Μεγαλφτερθ ευελιξία ςτθν δθμιουργία ερωτθμάτων. Τα ORM εργαλεία προςφζρουν
ςυνικωσ μια αντικειμενοςτραφι γλώςςα ερωτθμάτων. Οι γλώςςεσ αυτζσ επικεντρώνονται
ςτο μοντζλο αντικειμζνων παρά ςτθ μορφι τθσ δομισ μιασ βάςθσ δεδομζνων. Το ORM
εργαλείο κα μεταφράςει αυτόματα τθν γλώςςα αυτι ςε κατάλλθλα SQL ερωτιματα.
23
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

Γηαθαλήο πινήγεζε κεηαμχ ησλ ζρεηηδφκελσλ αληηθεηκέλσλ (lazy loading). Σα ζπλδεδεκέλα
αληηθείκελα θνξηψλνληαη δπλακηθά απφ ην ORM (αλαθηψληαη δπλακηθά απφ ηε βάζε
δεδνκέλσλ) θαζψο ν ρξήζηεο πινεγείηαη ζε απηά. Έηζη βειηηζηνπνηείηαη ε ρξήζε ηεο κλήκεο
ηνπ εμππεξεηεηή.
 ΢πγρξνληζκφο. Τπνζηεξίδνληαη πνιιαπινί ρξήζηεο πνπ ηξνπνπνηνχλ ηα ίδηα δεδνκέλα
ηαπηφρξνλα.
 Caching. Σα αληηθείκελα γίλνληαη cached ζηελ κλήκε γηα ηελ θαιχηεξε απφδνζε ηεο
εθαξκνγήο θαη γηα ηελ κείσζε ηνπ θφξηνπ ηεο βάζεο δεδνκέλσλ.
 Τπνζηήξημε γηα ζπλαιιαγέο (transactions): Όιεο νη αιιαγέο ζε αληηθείκελα γίλνληαη κέζα ζε
κηα ζπλαιιαγή. Όιε ε ζπλαιιαγή είηε ζα γίλεη committed είηε rolled back.
Πνιιέο ζπλαιιαγέο κπνξνχλ λα πξαγκαηνπνηνχληαη ηαπηφρξνλα θαη νη αιιαγέο ηεο κίαο
είλαη απνκνλσκέλεο απφ ηηο αιιαγέο ηεο άιιεο.
 Γηαθαλήο δηαηήξεζε (transparent persistence): Σν ORM εξγαιείν παξαθνινπζεί ηηο αιιαγέο
πνπ γίλνληαη ζηα αληηθείκελα. Όηαλ θιεζεί έπεηηα λα ηα απνζεθεχζεη, μέξεη ηη αιιαγέο
πξέπεη λα θάλεη ζηε βάζε δεδνκέλσλ θαη δεκηνπξγεί απηφκαηα ηα CRUD εξσηήκαηα πνπ
πξέπεη λα εθηειεζηνχλ.
 Με παξεκβαηηθφ persistence: Έλα θαιφ ORM εξγαιείν δελ ζέηεη πεξηνξηζκνχο φζνλ αθνξά
ηα αληηθείκελα ηνπ business model ηεο εθαξκνγήο. Γειαδή ηα αληηθείκελα δελ πξέπεη λα
ρξεηάδεηαη λα θιεξνλνκήζνπλ θάπνηα ζπγθεθξηκέλε θιάζε ή interface.
 Τπνζηήξημε πνιιψλ RDBMS φπσο Oracle, DB2, Microsoft SQL Server, PostgreSQL,
MySQL θ.α.
Βέβαηα πξέπεη λα ηνλίζνπκε φηη ηα ORM εξγαιεία δελ είλαη πάληα ε θαιχηεξε ιχζε γηα ηελ
πινπνίεζε ηνπ DAL επηπέδνπ κηα εθαξκνγήο. Γηα παξάδεηγκα, γηα κηθξέο εθαξκνγέο, ε δηαδηθαζία
ηεο ξχζκηζεο ηεο ζσζηήο απεηθφληζεο ησλ αληηθεηκέλσλ ζε πίλαθεο θαζψο θαη ε δηαδηθαζία ηεο
βειηίσζεο ηεο απνδνηηθφηεηαο ησλ SQL εξσηεκάησλ πνπ παξάγνληαη απηφκαηα, ίζσο είλαη
πεξηζζφηεξν ρξνλνβφξεο απφ ηελ ρξεζηκνπνίεζε απινχζηεξσλ ηερληθψλ φπσο SQL εξσηεκάησλ.
Απφ ηελ άιιε, γηα κεγάιεο business εθαξκνγέο, πξέπεη λα δπγηζηνχλ θαηάιιεια ηα πιενλεθηήκαηα
ησλ ORM εξγαιείσλ πνπ αλαθέξακε παξαπάλσ.
2.4 PHP framework
Γηα ηε ζρεδίαζε ηεο εθαξκνγήο κε ην αξρηηεθηνληθφ πξφηππν Model – View – Controller
ρξεζηκνπνηήζεθε ην PHP framework, ην νπνίν δηεπθνιχλεη ηελ αλάπηπμε εθαξκνγψλ ζε PHP
αθνινπζψληαο ην ζπγθεθξηκέλν αξρηηεθηνληθφ πξφηππν. Η επηινγή ηνπ ζπγθεθξηκέλνπ framework
βαζίζηεθε ζηελ πιεζψξα δπλαηνηήησλ, νη νπνίεο παξέρνληαη απφ απηφ. Οη ελφηεηεο πνπ αθνινπζνχλ
πεξηγξάθνπλ ηηο δπλαηφηεηεο θαη ηα ραξαθηεξηζηηθά ηνπ PHP framework. Σα δηαγξάκκαηα πνπ
παξαηίζεληαη ζηε ζπλέρεηα παξνπζηάδνπλ ηα ζηξψκαηα ζηα νπνία νξγαλψλεηαη ν θψδηθαο ηνπ PHP
framework. ΢ην πξψην ζρήκα θαίλεηαη ε βάζε, ε νπνία πεξηιακβάλεη φιεο ηηο απαξαίηεηεο
ιεηηνπξγίεο γηα ηνλ εχξπζκν ζπληνληζκφ ησλ ππνινίπσλ ηκεκάησλ ηνπ framework. Πάλσ απφ ηε
βάζε βξίζθνληαη κία ζεηξά απφ ππνζπζηήκαηα, εθ ησλ νπνίσλ ην ππνζχζηεκα ηεο δηαρείξηζεο
βάζεσλ δεδνκέλσλ θαη ην ππνζχζηεκα ιεηηνπξγηψλ ζρεηηθψλ κε ην Web αλαιχνληαη πεξαηηέξσ ζε
μερσξηζηά δηαγξάκκαηα πνπ αθνινπζνχλ.
24
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.4.1 Σαρύηεηα
Σν PHP framework παξέρεη αμηφινγε ηαρχηεηα ζηελ εθηέιεζε ηεο εθαξκνγήο κέζσ ηεο ηερληθήο ηεο
νθλεξήο θφξησζεο ησλ ζπζηαηηθψλ ηνπ. Απηφ ζεκαίλεη φηη θνξηψλεη ηα απαξαίηεηα ζπζηαηηθά γηα
ηελ εθηέιεζε ηεο εθαξκνγήο θαζψο απηά απαηηνχληαη ζε αληίζεζε κε ηα ππφινηπα PHP frameworks,
ηα νπνία γηα ιφγνπο επθνιίαο θνξηψλνπλ ζηε κλήκε φια ηα ζπζηαηηθά πξηλ ηελ εμππεξέηεζε ηνπ
θάζε HTTP αηηήκαηνο πξνζζέηνληαο κε απηφλ ηνλ ηξφπν κία αλαπφθεπθηε ρξνληθή θαζπζηέξεζε
ζηελ HTTP απάληεζε.΢ην ζρήκα πνπ αθνινπζεί παξνπζηάδεηαη κία ζπγθξηηηθή αλαπαξάζηαζε ηεο
ηαρχηεηαο νξηζκέλσλ δεκνθηιψλ PHP frameworks. Η κνλάδα κέηξεζεο είλαη ν αξηζκφο αηηεκάησλ
αλά δεπηεξφιεπην (RPS) πνπ κπνξεί λα εμππεξεηήζεη ην θάζε framework. Δπηπιένλ, ιακβάλεηαη
ππφςε θαη ε ζπλεηζθνξά ηνπ Alternative PHP Cache (APC), ην νπνίν είλαη έλα ζχζηεκα
βειηηζηνπνίεζεο ηνπ ελδηάκεζνπ θψδηθα ηεο PHP, ην νπνίν απνζεθεχεη ζηε κλήκε ηνπ δηαθνκηζηή ην
κεηαγισηηηζκέλν θψδηθα θαη ηα απαξαίηεηα δεδνκέλα έηζη ψζηε λα επηηαρχλεηαη ε εθηέιεζε ησλ
εθαξκνγψλ PHP. Γηα θάζε PHP framework ε άλσ ξάβδνο δειψλεη ηνλ αξηζκφ αηηεκάησλ αλά
δεπηεξφιεπην κε ρξήζε ηνπ APC θαη ε θάησ ξάβδνο δειψλεη ην RPS δίρσο ηε ρξήζε APC.
Δηθόλα 4: Γξαθηθή παξάζηαζε ησλ επηδόζεσλ ζε αηηήκαηα αλά δεπηεξόιεπην (RPS) έμη δηαδεδνκέλσλ
PHP frameworks.
25
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.4.2 Πνηόηεηα θώδηθα
Σν PHP framework είλαη γξακκέλν εμνινθιήξνπ αμηνπνηψληαο ηηο αληηθεηκελνζηξεθείο δπλαηφηεηεο
ηεο PHP κε απνηέιεζκα λα απνηειείηαη απφ επαλάγλσζην θψδηθα, ν νπνίνο είλαη εχθνινο ζηε
ζπληήξεζε. Με απηφ ηνλ ηξφπν ππάξρεη ε εγγχεζε φηη ηπρφλ πξνβιήκαηα πνπ αλαθαιχπηνληαη ζην
framework είλαη εχθνιν λα επηιπζνχλ ζε ζχληνκν ρξνληθφ δηάζηεκα. Η ρξήζε ησλ
αληηθεηκελνζηξαθψλ ραξαθηεξηζηηθψλ ηεο PHP ζπλεπάγεηαη ηελ αλάγθε ρξήζεο ηεο έθδνζεο 5 ή
κεηαγελέζηεξεο απηήο, απφ ηελ νπνία θαη έπεηηα ππνζηεξίδνληαη πιήξσο ηα ζπγθεθξηκέλα
ραξαθηεξηζηηθά.
Ση είλαη web framework. ΢πλήζσο νη πξνγξακκαηηζηέο γλσξίδνπλ θάπνηεο γιψζζεο πξνγξακκαηηζκνχ
κε ηηο νπνίεο κπνξεί λα δεκηνπξγήζνπλ δηάθνξεο εθαξκνγέο είηε απφ ην κεδέλ είηε ρξεζηκνπνηψληαο
δηάθνξεο βηβιηνζήθεο πνπ ηνπο πξνζθέξνπλ έηνηκεο θάπνηεο ιεηηνπξγίεο. Έλα framework πξνζθέξεη
θαη απηφ θάπνηεο έηνηκεο ιεηηνπξγίεο φπσο caching, templating, object mapping αιιά θαη κπνξεί λα
επεθηαζεί κε
plugins αιιά θαηά θχξην ιφγν πξνηππνπνηεί θάπνηεο δηαδηθαζίεο φπσο ε αξρηηεθηνληθή ηεο
εθαξκνγήο, ε ζχλδεζε ζηε βάζε δεδνκέλσλ αιιά κπνξεί θαη λα δίλεη δπλαηφηεηα γηα γξήγνξε θαη
απηφκαηε δεκηνπξγία θψδηθα φπσο ην scaffolding.
Η PHP είλαη κηα γιψζζα πξνγξακκαηηζκνχ πνπ ζρεδηάζηεθε γηα ηε δεκηνπξγία δπλακηθψλ ζειίδσλ
ζην δπαδίθηπν θαη είλαη επηζήκσο γλσζηή σο: HyperText preprocessor. Δίλαη κηα server-side
(εθηειείηε ζηνλ δηαθνκηζηή) scripting γιψζζα πνπ γξάθεηαη ζπλήζσο 13 πιαηζησκέλε απφ HTML,
γηα κνξθνπνίεζε ησλ απνηειεζκάησλ. Αληίζεηα απφ κηα ζπλεζηζκέλε HTML ζειίδα ε ζειίδα PHP
δελ ζηέιλεηαη άκεζα ζε έλαλ πειάηε (client), αλη' απηνχ πξψηα αλαιχεηαη θαη κεηά απνζηέιιεηαη ην
παξαγφκελν απνηέιεζκα. Σα ζηνηρεία HTML ζηνλ πεγαίν θψδηθα κέλνπλ σο έρνπλ, αιιά ν PHP
θψδηθαο εξκελεχεηαη θαη εθηειείηαη. Ο θψδηθαο PHP κπνξεί λα ζέζεη εξσηήκαηα ζε βάζεηο
δεδνκέλσλ, λα δεκηνπξγήζεη εηθφλεο, λα δηαβάζεη θαη λα γξάςεη αξρεία, λα ζπλδεζεί κε
απνκαθξπζκέλνπο ππνινγηζηέο , θ.ν.θ. ΢ε γεληθέο γξακκέο νη δπλαηφηεηεο πνπ καο δίλεη είλαη
απεξηφξηζηεο.
Η JavaScript είλαη γιψζζα πξνγξακκαηηζκνχ ε νπνίαέρεη ζαλ ζθνπφ ηελ παξαγσγή δπλακηθνχ
πεξηερνκέλνπ θαη ηελ εθηέιεζε θψδηθα ζηελ πιεπξά ηνπ πειάηε (client-side) ζε ηζηνζειίδεο. To
πξφηππν ηεο γιψζζαο θαηά ηνλ νξγαληζκφ ηππνπνίεζεο ECMA νλνκάδεηαη ECMAscript.
2.5 Η ηερλνινγία AJAX:
2.5.1 Γεληθά
Παξά ηελ ηξνκεξή ηερλνινγηθή αλάπηπμε ηνπ δηαδηθηχνπ ηελ πεξαζκέλε δεθαεηία ε επρξεζηία ησλ
εθαξκνγψλ ηνπ παγθφζκηνπ ηζηνχ πζηεξεί ζε ζχγθξηζε κε απηή ησλ εθαξκνγψλ πνπ εθηεινχληαη ζην
πεξηβάιινλ ηνπ θάζε ππνινγηζηή, ηηο ιεγφκελεο θαη σο εθαξκνγέο επηθάλεηαο εξγαζίαο. Κάζε
ζεκαληηθή αιιειεπίδξαζε ζε κηα εθαξκνγή παγθφζκηνπ ηζηνχ ζπλεπάγεηαη έλα δηάζηεκα αλακνλήο
γηα ηελ απφθξηζή ηεο, κέρξη απηή λα επηθνηλσλήζεη κέζσ δηαδηθηχνπ κε ηνλ δηαθνκηζηή πνπ ηελ
εμππεξεηεί. Οη Γηαδηθηπαθέο Δθαξκνγέο Δκπινπηηζκέλσλ κέζσλ είλαη εθαξκνγέο ηνπ παγθφζκηνπ
ηζηνχ νη νπνίεο πξνζεγγίδνπλ ηελ φςε θαη αίζζεζε ησλ εθαξκνγψλ επηθάλεηαο εξγαζίαο. Οη
εκπινπηηζκέλεο δηαδηθηπαθέο εθαξκνγέο έρνπλ δχν βαζηθά ραξαθηεξηζηηθά, ηελ απνδνηηθφηεηα θαη
ηε δηαινγηθή γξαθηθή δηεπαθή ρξήζηε.
26
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δηθόλα 5 :Κιαζηθή εθαξκνγή παγθόζκηνπ ηζηνύ κε επαλαθόξηηζε ηεο ζειίδαο γηα θάζε
αιιειεπίδξαζε ηνπ ρξήζε .
Η απνδνηηθφηεηα ησλ εκπινπηηζκέλσλ δηαδηθηπαθψλ εθαξκνγψλ πξνέξρεηαη απφ ηελ ηερλνινγία
AJAX ε νπνία ρξεζηκνπνηεί πξνγξάκκαηα ζελαξίσλ ζηελ πιεπξά ηνπ πειάηε γηα λα δψζεη ζηηο
εθαξκνγέο παγθφζκηνπ ηζηνχ κηθξφηεξνπο ρξφλνπο απφθξηζεο. Οη AJAX εθαξκνγέο δηαρσξίδνπλ ηελ
αιιειεπίδξαζε ηεο πιεπξάο ηνπ πειάηε απφ ηελ επηθνηλσλία κε ηηο εθηεινχλ παξάιιεια,
κεηψλνληαο ηηο θαζπζηεξήζεηο ηεο επεμεξγαζίαο ζηελ πιεπξά ηνπ δηαθνκηζηή πνπ ππνκέλεη ν
ρξήζηεο. Η ιεηηνπξγία ησλ παξαδνζηαθψλ θαη ησλ αζχγρξνλσλ εθαξκνγψλ παγθφζκηνπ ηζηνχ
παξνπζηάδεηαη ζρεκαηηθά ζηελ Δηθφλα? θαη ηελ Δηθφλα αληίζηνηρα. Τπάξρνπλ δχν θαηεπζχλζεηο γηα
ηελ εθαξκνγή ιεηηνπξγηθφηεηαο AJAX. Η πξψηε είλαη ε ρξήζε ―αθαηέξγαζηνπ‖ AJAX.
Υξεζηκνπνηείηαη ε γιψζζα ζελαξίσλ JavaScript γηα ηελ απνζηνιή αζχγρξνλσλ αηηεκάησλ πξνο ην
δηαθνκηζηή κηαο εθαξκνγήο κε απεπζείαο ρξήζε ηνπ αληηθεηκέλνπ ηεο XMLHttpRequest (XHR γηα
ζπληνκία). Καηφπηλ κέζσ ηεο ηεξαξρίαο αληηθεηκέλσλ ηνπ DOM, ελεκεξψλεηαη ην πεξηερφκελν. Η
δεχηεξε αθνξά ηε ρξήζε έηνηκσλ βηβιηνζεθψλ, νλνκαδφκελσλ θαη σο πιαίζηα αλάπηπμεο
εθαξκνγψλ, φπσο ηα Prototype, Script.aculo.us, Sarissa, θ.α., πιεξνθνξίεο γηα ηα νπνία δίλνληαη ζηε
κεζεπφκελε παξάγξαθν.
2.5.2 Σαπηόηεηα
Ο φξνο AJAX επηλνήζεθε ην 2005 απφ ηνλ Jesse James Garrett ν νπνίνο ζην άξζξν ηνπ ―Ajax: A New
Approach to Web Applications‖ αλαθέξεη φηη ε AJAX δελ είλαη κηα ηερλνινγία άιια δηάθνξεο, θάζε
κηα κε ηε δηθή ηεο ιάκςε. ΢θνπφο ηεο είλαη ε αζχγρξνλε θφξησζε πεξηερνκέλνπ ησλ ηζηνζειίδσλ
ζην θπιινκεηξεηή. Η ιέμε AJAX απνηειεί αξθηηθφιεμν ησλ φξσλ Asynchronous JavaScript And
XML (Αζχγρξνλε JavaScript θαη XML). Η ηερλνινγία AJAX ρξεζηκνπνηεί ηηο αθφινπζεο γηα λα
πεηχρεη ην ζθνπφ ηεο:
27
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
 Σηο γιψζζεο, επηζήκαλζεο ηζηνζειίδσλ XHTML θαη κνξθνπνίεζεο CSS, γηα ηελ
παξνπζίαζε ηνπ πεξηερνκέλνπ.
 Σν κνληέιν νληνηήησλ DOM γηα ηε δπλακηθή πξνβνιή θαη ηελ αιιειεπίδξαζε ζηηο
ηζηνζειίδεο.
 Σηο γιψζζεο, επηζήκαλζεο XML θαη κεηαζρεκαηηζκψλ XSLT, γηα ηελ αληαιιαγή θαη ηε
δηαρείξηζε δεδνκέλσλ αληίζηνηρα.
 Σν αληηθείκελν XMLHttpRequest ηεο JavaScript, γηα ηελ αζχγρξνλε αλάθηεζε δεδνκέλσλ.
 Σε γιψζζα ζελαξίσλ JavaScript γηα ηε δηαζχλδεζε θαη δηαιεηηνπξγηθφηεηα ησλ
πξνεγνχκελσλ ηερλνινγηψλ.
 Βέβαηα απφ ηφηε πνπ πξσηνεκθαλίζηεθε ν φξνο AJAX έρνπλ πξννδεχζεη νη δηάθνξεο
ηερλνινγίεο ηνπ παγθφζκηνπ ηζηνχ κε απνηέιεζκα:
 Η JavaScript λα κελ είλαη πιένλ ε κφλε γιψζζα πινπνίεζεο AJAX ιχζεσλ. Μπνξνχλ λα
ρξεζηκνπνηεζνχλ θαη άιιεο γιψζζεο ζελαξίσλ φπσο ε VBScript.
 Σν αληηθείκελν XMLHttpRequest δελ ρξεζηκνπνηείηαη απνθιεηζηηθά γηα αζχγρξνλε
επηθνηλσλία. Ο κεραληζκφο ησλ ελζσκαησκέλσλ πιαηζίσλ iframe πνπ πξσηνεκθαλίζηεθε ην
1996 ζηνλ Microsoft Internet Explorer κπνξεί λα ρξεζηκνπνηεζεί γηα ην ίδην απνηέιεζκα.
 Οη γιψζζεο XML θαη XSLT δελ είλαη νη κφλεο πνπ κπνξνχλ λα ρξεζηκνπνηεζνχλ γηα ηελ
αληαιιαγή θαη δηαρείξηζε δεδνκέλσλ. Μπνξνχλ ελαιιαθηηθά λα ρξεζηκνπνηεζνχλ θαη άιιεο
κνξθέο αληαιιαγήο δεδνκέλσλ, φπσο ε JSON, ε γιψζζα επηζήκαλζεο HTML, αθφκε θαη ην
απιφ θείκελν.
2.5.3 Βηβιηνζήθεο
Η ζχγρξνλε ηάζε ζηελ αλάπηπμε αιιειεπηδξαζηηθψλ εθαξκνγψλ AJAX γηα ηνλ παγθφζκην ηζηφ είλαη
ε ρξήζε έηνηκσλ βηβιηνζεθψλ JavaScript - ή πιαηζίσλ αλάπηπμεο θψδηθα JavaScript (framework)
φπσο ζπρλά
θαινχληαη. Με ηνλ ηξφπν απηφ επηηπγράλεηαη ε επθνιία πινπνίεζεο δχζθνισλ ηερληθψλ θαη ε
ζηαζεξφηεηα θαη ζπκβαηφηεηα κε ηηο δηαθνξεηηθέο πιαηθφξκεο ινγηζκηθνχ ησλ θπιινκεηξεηψλ. Οη
βηβιηνζήθεο απηέο είλαη εθαηνληάδεο.
2.5.4 Σν AJAX ζην symfony
΢ε γεληθέο γξακκέο ε ρξήζε ηεο ηερλνινγίαο AJAX ζην Moodle είλαη έσο ζήκεξα mia apo ths
texnologies poy dieykolinei ton xrhsth gia na anpatyx8y I eformogh toy gry. Μφλν δχν είλαη ηα
ππνέξγα ηνπ πνπ ρξεζηκνπνηνχλ AJAX. Σν πξψην αθνξά ηε ρξήζε AJAX ζηηο ζειίδεο πνπ αθνξνχλ
καζήκαηα θαη ην δεχηεξν είλαη έλα δπλακηθφ ζέκα εκθάληζεο ηνπ πεξηβάιινληνο εξγαζίαο ηνπ
Moodle κε φλνκα chameleon. Σν chameleon είλαη έλα αιιειεπηδξαζηηθφ ζέκα ζην νπνίν κπνξεί
θαλείο λα επηιέμεη δηαθνξεηηθά ρξψκαηα θαη ξπζκίζεηο γξακκαηνζεηξάο, πεξηγξακκάησλ, θ.ν.θ. Οη
δηαρεηξηζηέο ηνπ Moodle έρνπλ επηιέμεη απφ ηνλ Ινχιην ηνπ 2006 ηε βηβιηνζήθε Yahoo! User
Interface σο ην ζεκέιην αλάπηπμεο θψδηθα JavaScript θαη πινπνίεζεο AJAX ιχζεσλ. Omow simera
exei aneptyx8i se poli grugorous ri8moiys .
28
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.6 Ση είλαη ην Drupal:
Σν Drupal είλαη έλα πξφγξακκα ζχγρξνλνπ ζπζηήκαηνο δηαρείξηζεο πεξηερνκέλνπ (Content
Management System, CMS) αλνηθηνχ/ειεχζεξνπ ινγηζκηθνχ. Πνηφ ζπγθεθξηκέλα ρξεζηκνπνηήζεθαλ
νη γιψζζεο πξνγξακκαηηζκνχ ηζηνζειίδσλ PHP,Javascript θαη CSS. Σν Drupal, φπσο πνιιά
ζχγρξνλα CMS, επηηξέπεη ζην δηαρεηξηζηή ζπζηήκαηνο λα νξγαλψλεη ην πεξηερφκελν, λα
πξνζαξκφδεη ηελ παξνπζίαζε, λα απηνκαηνπνηεί δηαρεηξηζηηθέο εξγαζίεο θαη λα δηαρεηξίδεηαη ηνπο
επηζθέπηεο ηνπ ηζηνηφπνπ θαη απηνχο πνπ ζπλεηζθέξνπλ. Παξφιν πνπ ππάξρεη κηα πνιχπινθε
πξνγξακκαηηζηηθή δηεπαθή, νη πεξηζζφηεξεο εξγαζίεο κπνξνχλ λα γίλνπλ κε ιίγν ή θαη θαζφινπ
πξνγξακκαηηζκφ
2.6.1 Modules (Δλόηεηεο):
Η ιεηηνπξγίεο ηνπ Drupal πεξηέρνληαη ζε ‗‘modules‘‘, ηα νπνία κπνξνχλ λα ελεξγνπνηεζνχλ ή λα
απελεξγνπνηεζνχλ. Σα Modules είλαη δηάθνξα θνκκάηηα θψδηθα ηα νπνία εθηεινχλ κηα ζπγθεθξηκέλε
εξγαζία θαη κπνξνχκε λα έρνπκε φζεο ζέινπκε ζε κηα ηζηνζειίδα. Σα modules είλαη ειεχζεξα λα ηα
θαηεβάζεη θάπνηνο θαη απαηηνχλ θάπνηα δηακφξθσζε, αιιά είλαη άξηζηα εξγαιεία ζρεδηαζκέλα γηα
λα καο βνεζήζνπλ λα επηηχρνπκε ηα απνηειέζκαηα πνπ ζέινπκε απφ ην δηθηπαθφ καο ηφπν κε ρξήζε
ηνπ Drupal.
2.6.2 Themes (Θεκαηηθέο παξαιιαγέο):
Σν Drupal, σο έλα νξζνινγηζκέλν cms πνπ είλαη, δηαρσξίδεη απφιπηα ηα δεδνκέλα απφ ηελ εκθάληζή
ηνπο. Γηα ηνλ ηξφπν εκθάληζεο ηεο ζειίδαο, ησλ εηθφλσλ, ησλ ρξσκάησλ, ησλ γξακκαηνζεηξψλ θιπ,
είλαη ππεχζπλεο νη ζεκαηηθέο παξαιιαγέο. Ο ππξήλαο ηνπ drupal εγθαζηζηά θαη 6 βαζηθέο ζεκαηηθέο
παξαιιαγέο νη νπνίεο βξίζθνληαη ζηνλ θάθειν "themes" ηεο εγθαηάζηαζεο καο. Δθηφο απφ ηηο 6
απηέο παξαιιαγέο, κπνξνχκε λα θαηεβάζνπκε θαη λα ρξεζηκνπνηήζνπκε δεθάδεο άιιεο πνπ
ππάξρνπλ ζην θχξην απνζεπηήξην ηνπ Drupal.
2.6.3 CMS:
Σν ΢πζηήκαηα Γηαρείξηζεο Πεξηερνκέλνπ ( Content Management Systems, CMS) είλαη ην ζχζηεκα
ησλ κεζφδσλ θαη ηερληθψλ πνπ απηνκαηνπνηνπλ ηηο δηαδηθαζίεο ηεο ζπιινγήο, δηαρεηξηζεο θαη
δεκνζηεπζεο πεξηερνκελνπ κε ρξεζε ηερλνινγηψλ πιεξνθνξηθήο.
2.6.4 XAAMP
Σν φλνκα ηνπ Xampp είλαη έλα αθξσλχκην ησλ:
Υ(ζεκαίλεη cross-platform=πνπ ιεηηνπξγεί ζε πνιιέο πιαηθφξκεο)
Apache HTTP Server
MySQL
PHP
Perl
29
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Σν XAMPP δξα ζαλ έλαο ειεχζεξνο web server ηθαλφο λα εμππεξεηήζεη δπλακηθέο ηζηνζειίδεο. Δίλαη
δηαζέζηκν γηα Microsoft Windows, Linux, Solaris θαη Mac OS X,θαη ρξεζηκνπνηείηαη θπξίσο γηα web
development projects.To ινγηζκηθφ απηφ είλαη ρξήζηκν φηαλ δεκηνπξγνχκε δπλακηθέο ηζηνζειίδεο κε
jsp θαη servlet. Μπνξνχκε λα ην βξνχκε ζε κνξθή zip tar ή exe γηα λα ην θαηεβάζνπκε θαη λα ην
εγθαηαζηήζνπκε. Αλαβαζκίδεηαη ζπρλά γηα λα ππνζηεξίμεη ηηο ηειεπηαίεο εθδφζεηο ησλ
Apache/MySQL/PHP θαη Perl.
Η εγθαηάζηαζε ηνπ ΥΑΜPP παίξλεη ιηγφηεξν ρξφλν απφ φηη ζα έπαηξλε αλ εγθαηαζηήζνπκε θάζε
έλα απφ ηα παθέηα μερσξηζηά. Δίλαη αλεμάξηεην θαη κπνξεί λα ιεηηνπξγήζνπλ πνιιέο εγθαηαζηάζεηο
ηνπ ζηνλ ίδην ππνινγηζηή. Αξρηθά νη δεκηνπξγνί ηνπ ΥΑΜPP ην ζρεδίαζαλ ζαλ εξγαιείν αλάπηπμεο
γηα web designers θαη πξνγξακκαηηζηέο λα ειέγμνπλ ηε δνπιεηά ηνπο ζην δηθφ ηνπο PC ρσξίο λα
ρξεηάδεηαη λα έρνπλ πξφζβαζε ζην Internet.
2.6.5 Αξρηηεθηνληθή
Η εθαξκνγή πνπ αλαπηχρζεθε έρεη ζρεδηαζηεί έρνληαο σο βάζε ηελ κέγηζηε δπλαηή
ιεηηνπξγηθφηεηα. Έηζη έρεη πξνζερζεί ψζηε λα είλαη:

Αλεμάξηεηε ιεηηνπξγηθνχ ζπζηήκαηνο (δειαδή κπνξεί λα εγθαηαζηαζεί ζε νπνηνδήπνηε
ιεηηνπξγηθφ ζχζηεκα),

Πξνζπειάζηκε κέζσ νπνηνπδήπνηε θπιινκεηξεηή (browser),

πιήξσο ζπνλδπισηή ζηε δνκή ηεο, δειαδή λα ρξεζηκνπνηεί αξζξψκαηα (modules) γηα ηηο
δηάθνξεο ιεηηνπξγίεο πνπ εθηειεί

Πξνζηηή ζηε δηαρείξηζε απφ ηνλ δηδάζθνληα.
Οη παξαπάλσ ηδηφηεηεο-ζηφρνη νδεγνχλ ζε έλα ζχζηεκα πιηθνχ (H/W) θαη ινγηζκηθνχ (S/W) ην
νπνίν απνηειείηαη απφ:

Σε βάζε δεδνκέλσλ πνπ πεξηέρεη φιεο ηηο απαξαίηεηεο πιεξνθνξίεο γηα ηε ιεηηνπξγία ηνπ
ζπζηήκαηνο,

Σα απνζεθεπηηθά κέζα, δειαδή ηνπο ππνινγηζηέο πνπ θηινμελνχλ ην πιηθφ ηνπ καζήκαηνο,

Σν πεξηβάιινλ εξγαζίαο, δειαδή ην ινγηζκηθφ δηεπαθήο πνπ επεμεξγάδεηαη ηηο πιεξνθνξίεο
θαη θάλεη δπλαηή ηελ αιιειεπίδξαζε ησλ ρξεζηψλ κε ην εθπαηδεπηηθφ πιηθφ. Η εθαξκνγή είλαη
βαζηζκέλε ζην πξφηππν ηχπνπ «πειάηε-εμππεξεηεηή» (client-server). Δγθαζίζηαηαη ζε νπνηνδήπνηε
ιεηηνπξγηθφ ζχζηεκα, ππνζηεξίδεη web server ηχπνπ Apache ή Microsoft IIS, ελψ ζηεξίδεηαη εμ‘
νινθιήξνπ ζε πεξηβάιινληα «αλνηρηνχ θψδηθα» (open source) γηα ηελ ιεηηνπξγία ηεο. Γηα ηελ
αλάπηπμε ηνπ ηζηνγελνχο πεξηβάιινληνο ηεο εθαξκνγήο θαη ησλ αιγνξίζκσλ ηεο ρξεζηκνπνηήζεθε ε
γιψζζα PHP (Pre Hypertext Processor) .
2.6.6 Απαηηήζεηο θαη ραξαθηεξηζηηθά
Σν XAMPP απαηηεί κφλν έλα zip, tar, ή exe αξρείν γηα λα θαηέβεη θαη λα ηξέμεη, θαη απαηηείηαη κία
κηθξή δηάξζξσζε ησλ επηκέξνπο ζηνηρείσλ πνπ ζπλζέηνπλ ηνλ web server. Σν XAMPP ελεκεξψλεηαη
ηαθηηθά θαη ζπκπεξηιακβάλεη ηηο ηειεπηαίεο εθδφζεηο ηνπ Apache / MySQL / PHP θαη Perl. Δπίζεο,
έξρεηαη κε κηα ζεηξά απφ άιιεο κνλάδεο, ζπκπεξηιακβαλνκέλσλ ησλ OpenSSL θαη phpMyAdmin.
30
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.7 Apache
Ο Apache HTTP server, ζπρλά αλαθεξφκελνο απιά ζαλ Apache, είλαη έλαο web server o νπνίνο
δηαδξακάηηζε θαίξην ξφιν ζηελ αξρηθή αλάπηπμε ηνπ παγθφζκηνπ ηζηνχ. Σν 2009 έγηλε ν web server
πνπ μεπέξαζε ην φξην ησλ εθαηφ εθαηνκκπξίσλ ζειίδσλ ζην δηαδίθηπν. Ο Apache ήηαλ ε πξψηε
βηψζηκε ελαιιαθηηθή ιχζε απέλαληη ζηνλ Netscape Corporation web server (γλσζηφ ζήκεξα σο Sun
Java System web server), θαη απφ ηφηε εμειίρζεθε ζε ππνινγίζηκν αληίπαιν άιισλ web server πνπ
βαζίδνληαη ζε Unix φζνλ αθνξά ηελ ιεηηνπξγηθφηεηα θαη ηηο επηδφζεηο.
Ο Apache αλαπηχζζεηαη θαη ζπληεξείηαη απφ κηα αλνηθηή θνηλφηεηα πξνγξακκαηηζηψλ ππφ ηελ
αηγίδα ηνπ Apache Software Foundation. Η εθαξκνγή είλαη δηαζέζηκε γηα κηα κεγάιε πνηθηιία
ιεηηνπξγηθψλ ζπζηεκάησλ ζηα νπνία πεξηιακβάλνληαη ηα Unix, GNU, FreeBSD, Linux, Solaris,
Novell NetWare, Mac OS X, Microsoft Windows, OS/2, TPF θαη eComStation. Ο Apache
ραξαθηεξίδεηαη σο έλα ινγηζκηθφ αλνηθηνχ θψδηθα. Απφ ηνλ Απξίιην ηνπ 1996 θαη κεηά, ν Apache
είλαη ν πην δεκνθηιήο HTTP server ηνπ δηαδηθηχνπ. Δπίζεο κεηά απφ κέηξεζε πνπ
πξαγκαηνπνηήζεθε ηνλ Αχγνπζην ηνπ 2009, ν Apache εμππεξεηεί ην 54,32% φισλ ησλ ζειίδσλ ηνπ
δηαδηθηχνπ θαη ην 66% απφ ηηο 1.000.000 πην δεκνθηιείο.
Η πξψηε έθδνζε ηνπ Apache δεκηνπξγήζεθε απφ ηνλ Robert McCool, ν νπνίνο ζπκκεηείρε ζηελ
αλάπηπμε ηνπ National Center of Supercomputing Applications web server, γλσζηφ απιά σο NCSA
HTTPd. Όηαλ ν McCool έθπγε απφ ηελ NCSA ζηα κέζα ηνπ 1994, ε αλάπηπμε ηνπ HTTPd
ζηακάηεζε, αθήλνληαο κηα πνηθηιία απφ πξνζζήθεο γηα βειηηψζεηο λα θπθινθνξεί κέζσ email. Απηέο
ηηο πξνζζήθεο παξείρε έλαο αξηζκφο πξνγξακκαηηζηψλ νη νπνίνη βνήζεζαλ λα δεκηνπξγεζεί ε αξρηθή
νκάδα αλάπηπμεο ηνπ Apache γλσζηή θαη σο ―Apache Group‖.
Τπάξρνπλ δχν επεμεγήζεηο φζνλ αθνξά ην φλνκα ηνπ project. ΢χκθσλα κε ην Apache Foundation,
ην φλνκα επειέγε απφ ζεβαζκφ ζηελ θπιή ησλ απηνρζφλσλ Ακεξηθαλψλ Apache νη νπνίνη ήηαλ
γλσζηνί γηα ηελ αληνρή θαη ηηο ηθαλφηεηεο ηνπο ζηελ κάρε. Παξ‘ φια απηά, θαηά ηελ πεξίνδν 19962001, ε επεμήγεζε πνπ έδηλε ε ηζηνζειίδα ηνπ Apache project ήηαλ φηη επεηδή πξφθεηηαη γηα έλαλ
server ν νπνίνο δεκηνπξγήζεθε βαζηζκέλνο ζε πξνζζήθεο (patches), νλνκάζηεθε patchy server θαη κε
ηνλ θαηξφ θαηέιεμε λα απνθαιείηαη Apache.
Ο Apache ππνζηεξίδεη κία πνιχ κεγάιε πνηθηιία ραξαθηεξηζηηθψλ θαη δπλαηνηήησλ. Πνιιά απφ
απηά πξνζαξηψληαη ζηνλ ππξήλα κε ηελ κνξθή modules επεθηείλνληαο ηηο δπλαηφηεηεο ηνπ. Απηά
πεξηιακβάλνπλ απφ ππνζηήξημε server-side γισζζψλ πξνγξακκαηηζκνχ έσο θαη αιγφξηζκνπο
απζεληηθνπνίεζεο. Κάπνηεο απφ ηηο δεκνθηιείο γιψζζεο πνπ ππνζηεξίδνληαη είλαη νη Perl, Python, Tcl
θαη PHP. Κάπνηα απφ ηα δεκνθηιή modules απζεληηθνπνίεζεο πνπ ππνζηεξίδνληαη είλαη ηα
mod_access, mod_auth, mod_digest θαη mod_auth_digest. Κάπνηεο απφ ηηο άιιεο δπλαηφηεηεο
πεξηιακβάλνπλ ππνζηήξημε ησλ πξσηνθφιισλ SSL θαη TLS(mod_ssl), έλα proxy module, έλα URL
rewriter (mod_rewrite), παξακεηξνπνηεκέλεο θαηαγξαθέο ζπκβάλησλ (mod_log_config) θαζψο θαη
ππνζηήξημε θίιηξσλ (mod_ext_filter).
Μηα δεκνθηιείο κέζνδνο ζπκπίεζεο πνχ ρξεζηκνπνηείηαη ζηνλ Apache είλαη ην external extension
module (mod_gzip) ην νπνίν βνήζα ζηνλ λα κεησζεί ην κέγεζνο ησλ ηζηνζειίδσλ πνπ εμππεξεηνχληαη
κέζσ HTTP. Δπίζεο δεκνθηιέο είλαη θαη ην ModSecurity ην νπνίν είλαη κηα κεραλή αλνηρηνχ θψδηθα
πνπ εληνπίδεη θαη εκπνδίδεη εηζβνιέο ζε δηαδηθηπαθέο εθαξκνγέο. Σν ηζηνξηθφ ηνπ Apache κπνξεί λα
δηαρεηξηζηεί κέζσ ελφο web browser ρξεζηκνπνηψληαο ειεχζεξεο εθαξκνγέο φπσο AWStats/W3Perl ή
ην Visitors. Κάπνηα επηπιένλ ραξαθηεξηζηηθά ηνπ Apache είλαη ην Virtual Hosting, πνπ επηηξέπεη ζε
πνιιέο δηαθνξεηηθέο ηζηνζειίδεο λα εμππεξεηνχληαη απφ κία κφλν εγθαηάζηαζε ηνπ server,
παξακεηξνπνηήζηκα κελχκαηα ζθάικαηνο, Βάζεηο δεδνκέλσλ βαζηζκέλεο ζε απζεληηθνπνίεζε
DBMS, δηαρείξηζε πεξηερνκέλνπ θαη ππνζηήξημε δηαθφξσλ
31
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
GUIs(Graphical User Interfaces). Ο Apache ρξεζηκνπνηείηαη θπξίσο γηα ηελ εμππεξέηεζε ζηαηηθψλ
θαη δπλακηθψλ ζειίδσλ ζην δηαδίθηπν. Πνιιέο δηαδηθηπαθέο εθαξκνγέο ζρεδηάδνληαη κε βάζε ην
πεξηβάιινλ θαη ηα ραξαθηεξηζηηθά πνπ πξνζθέξεη ν Apache. Ο ζπγθεθξηκέλνο server απνηειεί
θνκκάηη ηεο δεκνθηινχο νκάδαο εθαξκνγψλ LAMP ηελ νπνία απνηεινχλ ν Apache, ην ιεηηνπξγηθφ
Linux, ην ζχζηεκα δηαρείξηζεο βάζεσλ δεδνκέλσλ MySQL θαη νη γιψζζεο πξνγξακκαηηζκνχ
PHP/Perl/Python. Ο Apache απνηειεί βαζηθφ θνκκάηη πνιιψλ παθέησλ εθαξκνγψλ φπσο: Oracle
Database, IBM WebSphere application server, WebObject application server, Mac OS X, Novell
NetWare6.5 θαζψο θαη ζε πνιιέο δηαλνκέο ηνπ ιεηηνπξγηθνχ ζπζηήκαηνο Linux.
2.8 MySQL
Η MySQL είλαη έλα ζχζηεκα δηαρείξηζεο ζρεζηαθψλ βάζεσλ δεδνκέλσλ (RDBMS) ην νπνίν κεηξά
πεξηζζφηεξεο απφ 10 εθαηνκκχξηα εγθαηαζηάζεηο. Έιαβε ην φλνκά ηνπ απφ ηελ θφξε ηνπ Μφληπ
Βηληέληνπο, ηελ Μάη. Σν πξφγξακκα ηξέρεη έλαλ εμππεξεηεηή (server) παξέρνληαο πξφζβαζε πνιιψλ
ρξεζηψλ ζε έλα ζχλνιν βάζεσλ δεδνκέλσλ. Η βάζε δεδνκέλσλ MySQL έρεη γίλεη ε πην δεκνθηιήο
βάζε δεδνκέλσλ αλνηρηνχ ινγηζκηθνχ εμαηηίαο ηεο ζηαζεξά πςειήο απφδνζήο ηεο, ηεο αμηνπηζηίαο
ηεο θαη ηεο επθνιίαο ηεο ρξήζεο ηεο. Υξεζηκνπνηείηαη παγθνζκίσο ηφζν απφ κεκνλσκέλνπο
δεκηνπξγνχο δηαδηθηπαθψλ ρψξσλ φζν θαη απφ πνιινχο απφ ηνπο κεγαιχηεξνπο θαη ηνπο πην ξαγδαία
αλαπηπζζφκελνπο νξγαληζκνχο γηα ηελ εμνηθνλφκεζε ρξφλνπ θαη ρξήκαηνο. Δπίζεο, ρξεζηκνπνηείηαη
γηα ηε δεκηνπξγία δηαδηθηπαθψλ ρψξσλ κε κεγάιν φγθν δεδνκέλσλ, θξίζηκσλ ζπζηεκάησλ γηα ηε
ιεηηνπξγία εηαηξηθψλ εθαξκνγψλ θαη παθέησλ ινγηζκηθνχ κεγάισλ εηαηξεηψλ. Η MySQL δελ είλαη
κφλν ε πην δεκνθηιήο βάζε δεδνκέλσλ αλνηρηνχ ινγηζκηθνχ, αιιά ζπγρξφλσο έρεη γίλεη θαη ε
επηιεγκέλε βάζε δεδνκέλσλ γηα ηε λέα γεληά εθαξκνγψλ πνπ βαζίδεηαη ζην LAMP (Linux, Apache,
MySQL, PHP/Perl/Python). Η MySQL ηξέρεη ζε πεξηζζφηεξεο απφ 20 πιαηθφξκεο
ζπκπεξηιακβαλνκέλσλ ηνπ Linux, ησλ Windows, ηνπ OS/X, ηνπ HP-UX, ηνπ AIX θαη ηνπ Netware,
παξέρνληαο ζην ρξήζηε φιε ηελ απαηηνχκελε επειημία. Η έθδνζε ηεο MySQL Enterprise Server 5.0
δηαζέηεη ηα αθφινπζα ραξαθηεξηζηηθά:

΢πλαιιαγέο ACID γηα ηε δεκηνπξγία αμηφπηζησλ θαη αζθαιψλ θξίζηκσλ εηαηξηθψλ
εθαξκνγψλ.

Απνζεθεπκέλεο δηαδηθαζίεο γηα ηε βειηίσζε ηεο παξαγσγηθφηεηαο ησλ πξνγξακκαηηζηψλ.

Γηαδηθαζίεο ππξνδφηεζεο γηα ηελ επηβνιή πνιχπινθσλ επηρεηξεκαηηθψλ θαλφλσλ ζην
επίπεδν ηεο βάζεο δεδνκέλσλ.

Μεζφδνπο πξνζηαζίαο ησλ επαίζζεησλ δεδνκέλσλ.

΢ρήκα Πιεξνθνξηψλ γηα ηελ παξνρή εχθνιεο πξφζβαζεο ζε κεηαδεδνκέλα.

Καηαλεκεκέλεο ΢πλαιιαγέο γηα ηελ ππνζηήξημε πνιχπινθσλ ζπλαιιαγψλ εληφο πνιιαπιψλ
βάζεσλ δεδνκέλσλ.

Αξρηηεθηνληθή Μεραλήο Απνζήθεπζεο γηα ηελ παξνρή ηεο κέγηζηεο δπλαηήο επειημίαο.

Μεραλή Απνζήθεπζεο Αξρείσλ γηα ηελ θαηαγξαθή ηνπ ηζηνξηθνχ θαη ησλ δεδνκέλσλ
ινγηζηηθνχ ειέγρνπ.

Δλνπνηεκέλε Μεραλή Απνζήθεπζεο γηα ηε δεκηνπξγία κίαο ινγηθήο βάζεο δεδνκέλσλ απφ
πνιινχο θπζηθνχο εμππεξεηεηέο.

Δθδφζεηο κε δηνξζψζεηο ησλ πην ζεκαληηθψλ ζθαικάησλ. Με ηε βνήζεηα ηεο PHP κπνξνχκε
λα ζπλδεζνχκε ζε έλαλ νπνηνδήπνηε MySQL Server ζηνλ νπνίν έρνπκε ινγαξηαζκφ, λα πάξνπκε
δεδνκέλα απφ ήδε ππάξρνπζεο βάζεηο, λα εηζάγνπκε δεδνκέλα ζε πίλαθεο βάζεσλ, λα αλαλεψζνπκε
θάπνηα ππάξρνληα δεδνκέλα, λα θηηάμνπκε λέεο βάζεηο θαη λένπο πίλαθεο θαη γεληθά λα θάλνπκε
νηηδήπνηε γίλεηαη κε κηα MySQL βάζε δεδνκέλσλ. Δπνκέλσο, κέζα απφ ηηο Web ζειίδεο καο
κπνξνχκε λα δηαρεηξηζηνχκε εχθνια κηα MySQL βάζε δεδνκέλσλ θαη έηζη νη ζειίδεο καο λα
απνθηήζνπλ πνιιέο άιιεο δπλαηφηεηεο πνπ απαηηνχλ νη ζχγρξνλεο απαηηήζεηο ησλ ρξεζηψλ δειαδή
32
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
λα γίλνπλ δπλακηθέο, ειθπζηηθέο θαη αληαγσληζηηθέο.
Μηα ηππηθή δηαδηθηπαθή ζπλαιιαγή βάζεσλ δεδνκέλσλ απνηειείηαη απφ ηηο παξαθάησ θάζεηο:

Ο web browser ελφο ρξήζηε θάλεη κηα HTTP αίηεζε γηα κηα ζπγθεθξηκέλε δηαδηθηπαθή
ζειίδα.

Ο δηαδηθηπαθφο δηαθνκηζηήο (Apache Server) ιακβάλεη ηελ αίηεζε γηα ηε ζειίδα, αλαθαιεί
ην αξρείν θαη ην πεξλά ζηε κεραλή PHP γηα επεμεξγαζία.

Η κεραλή PHP αξρίδεη ηελ αλάιπζε ηνπ script. Μέζα ζην script, ππάξρεη κηα εληνιή πνπ
ζπλδέεη ηε βάζε δεδνκέλσλ θαη εθηειεί έλα εξψηεκα. Η PHP αλνίγεη κηα ζχλδεζε κε ην MySQL
δηαθνκηζηή (server) θαη ζηέιλεη ην θαηάιιειν εξψηεκα.

Ο MySQL δηαθνκηζηήο (server) ιακβάλεη ην εξψηεκα ηεο βάζεο δεδνκέλσλ, ην
επεμεξγάδεηαη θαη ζηέιλεη ηα απνηειέζκαηα μαλά ζηε κεραλή PHP.

Η κεραλή PHP ζηακαηά ηελ εθηέιεζε ηνπ script, πνπ ζπλήζσο πεξηιακβάλεη ηε κνξθνπνίεζε
ησλ απνηειεζκάησλ ηνπ εξσηήκαηνο ζε HTML. Δπηζηξέθεη κεηά ηελ ηειηθή HTML ζειίδα ζηνλ web
δηαθνκηζηή (Apache Server).
2.8.1 Πιενλεθηήκαηα ηεο Mysql
Μεξηθνί απφ ηνπο θχξηνπο αληαγσληζηέο ηεο Mysql είλαη νη PostgreSQL, Microsoft SQL Server,
Oracle. Η Mysql φκσο δηαθέξεη γηαηί έρεη ηα εμήο πιενλεθηήκαηα:

Τςειή απφδνζε

Υακειφ θφζηνο

Δχθνιε δηακφξθσζε θαη εθκάζεζε

Μεηαθεξζηκφηεηα

Γηαζεζηκφηεηα ηνπ θψδηθα πξνέιεπζεο

Γηαζεζηκφηεηα ππνζηήξημεο

Ο δηαδηθηπαθφο δηαθνκηζηήο (Apache Server) πεξλά ηελ HTML ζειίδα μαλά ζην browser,
φπνπ ν ρξήζηεο κπνξεί λα δεη ηα απνηειέζκαηα πνπ δήηεζε
2.9 PhpMyAdmin
Σν phpMyAdmin είλαη έλα ζχλνιν απφ php scripts κε ην νπνίν δηαρεηξηδφκαζηε ηηο βάζεηο
δεδνκέλσλ πνπ έρνπκε κέζν web. Σν phpMyAdmin κπνξεί λα δηαρεηξηζηεί έλα νιφθιεξν mysq server
ή αθφκα θαη απιέο βάζεηο δεδνκέλσλ φπνπ ν θάζε ρξήζηεο έρεη έλα ινγαξηαζκφ θαη κπνξεί λα
δεκηνπξγήζεη θαη λα δηαρεηξηζηεί ηηο δηθέο ηνπ βάζεηο δεδνκέλσλ. Τπνζηεξίδεη 47 γιψζζεο κεηαμχ
ησλ νπνίσλ θαη ηα Διιεληθά θαη είλαη ινγηζκηθφ αλνηρηνχ θψδηθα. Οη δπλαηφηεηεο ηνπ PhpMyAdmin
είλαη νη εμήο:

Γεκηνπξγεί θαη λα δηαγξάθεη βάζεηο δεδνκέλσλ

Γεκηνπξγεί, ηξνπνπνηεί, δηαγξάθεη, αληηγξάθεη θαη κεηνλνκάδεη πίλαθεο

Κάλεη ζπληήξεζε ηεο βάζεο

Πξνζζέηεη, δηαγξάθεη θαη ηξνπνπνηεί πεδία πηλάθσλ

Δθηειεί Sql εξσηήκαηα, αθφκα θαη νκαδηθά (batch)

Γηαρεηξίδεηαη θιεηδηά ζε πεδία

―Φνξηψλεη‖ αξρεία θεηκέλνπ ζε πίλαθεο

Γεκηνπξγεί θαη δηαβάδεη πίλαθεο (πνπ πξνέξρνληαη απφ dump βάζεο)

Δμάγεη δεδνκέλα ζε κνξθή CVS, Latex, XML

Γηαρεηξίδεηαη πνιινχο δηαθνκηζηέο

Γηαρεηξίδεηαη ηνπο ρξήζηεο MySQL θαη ηα δηθαηψκαηά ηνπο

Διέγρεη ηελ αλαθνξηθή αθεξαηφηεηα ησλ δεδνκέλσλ ησλ MyISAM πηλάθσλ
33
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων




Γεκηνπξγεί PDF γξαθηθψλ ηνπ layout ηεο βάζεο δεδνκέλσλ
Δθηειεί αλαδεηήζεηο ζε φιε ηε βάζε ή κέξνο απηήο
Τπνζηεξίδεη πίλαθεο InnoDB θαη μέλα θιεηδηά
Τπνζηεξίδεη MySQLi, κηα βειηησκέλε επέθηαζε ηεο MySQL
2.10 ΢εµαληηθνί ζηόρνη γηα ηελ νινθιήξσζε ηεο πηπρηαθήο
Χρονοδιάγραµµα
state of the art
Αλάιπζεο ηνπ πξνβιήµαηνο
΢ρεδηαζµνχ & αλάπηπμεο ηεο πηπρηαθήο
Τινπνίεζε ηεο ηζηνζειίδαο Symfony
Τινπνίεζε ηεο ηζηνζειίδαο Drupal
Λεηηνπξγίαο ηεο ηζηνζειίδαο Symfony
Λεηηνπξγίαο ηεο ηζηνζειίδαο Drupal
΢πγγξαθή αλαθνξάο εξγαζίαο Symfony
΢πγγξαθή αλαθνξάο εξγαζίαο Druapl
Aίηεζεο αμηνιφγεζεο εξγαζίαο
Πενεηνηµαζία παξνπζίαζεο αλαθνξάο
Παξνπζίαζε αλαθνξάο
ΗΜΕΡΕ΢
30
30
30
90
30
9
5
110
30
1
1
1
34
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
2.10.1 Υξνλνδηάγξαµµα
Δηθόλα 6 :Σν ρξνλνδηάγξακκα πνπ ρξεηαζηεηθε γηα ηελ πινπνηεζε ηεο πηπρηαθεο
35
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
3. ΢ρέδην Γξάζεο γηα εθπόλεζε ηεο πηπρηαθήο εξγαζίαο
3.1 State of the art
3.1.1 Δηζαγσγή ζην symfony framework
Σο Symfony σε συντομία
Σν 2009, ζρεδφλ ηελ ίδηα ρξνληθή πεξίνδν, θπθινθφξεζαλ δχν δηαθνξεηηθέο εθδφζεηο ηνπ symfony,
ε έθδνζε 1.3 θαη ε έθδνζε 1.4. Καη νη δχν εθδφζεηο έρνπλ ηα ίδηα ραξαθηεξηζηηθά κφλν πνπ ε έθδνζε
1.3 κπνξεί λα ππνζηεξίμεη projects παιαηνηέξσλ εθδφζεσλ ελψ ε 1.4 φρη.
Έλα framework βειηηψλεη ηελ αλάπηπμε ησλ εθαξκνγψλ απηνκαηνπνηψληαο πνιιά απφ ηα πξφηππα
πνπ ρξεζηκνπνηνχληαη γηα έλα ζπγθεθξηκέλν ζθνπφ. Έλα framework πξνζζέηεη επίζεο δνκή ζηνλ
θψδηθα, πξνηξέπνληαο ηνλ πξνγξακκαηηζηή λα γξάθεη θαιχηεξν, πην επαλάγλσζην, θαη πεξηζζφηεξν
δηαηεξήζηκν θψδηθα. Σειηθά, έλα framework θαζηζηά ηνλ πξνγξακκαηηζκφ επθνιφηεξν, θαζψο
ζπζθεπάδεη πεξίπινθεο ιεηηνπξγίεο κέζα ζε απιέο δειψζεηο.
Σν symfony είλαη έλα πιήξεο framework πνπ ζρεδηάζηεθε γηα λα βειηηζηνπνηεί ηελ αλάπηπμε ησλ
web εθαξκνγψλ κε αξθεηά απφ βαζηθά ραξαθηεξηζηηθά. Γηα πξσηάξεδεο, δηαρσξίδεη ηνπο
επηρεηξεζηαθνχο θαλφλεο, ηε ινγηθή ηνπ εμππεξεηεηή, θαη ηηο παξνπζηάζεηο κίαο web εθαξκνγήο.
Πεξηέρεη πνιιά εξγαιεία θαη θιάζεηο πνπ ζηνρεχνπλ ζην λα κεηψλνπλ ην ρξφλν αλάπηπμεο κίαο
πεξίπινθεο web εθαξκνγήο. Δπίζεο, απηνκαηνπνηεί θνηλέο δηεξγαζίεο έηζη ψζηε ν πξνγξακκαηηζηήο
λα κπνξεί λα εζηηάζεη εμνινθιήξνπ ζηηο ηδηαηηεξφηεηεο κηαο εθαξκνγήο. Σν ηειηθφ απνηέιεζκα
απηψλ ησλ πιενλεθηεκάησλ ζεκαίλεη φηη δελ ρξεηάδεηαη μαλά-αλαθαιχςνπκε ηνλ ηξνρφ θάζε θνξά
πνπ δεκηνπξγείηαη κία θαηλνχξηα web εθαξκνγή.
Σν Symfony είλαη γξακκέλν εμνινθιήξνπ ζε PHP 5. Έρεη δνθηκαζηεί πιήξσο ζε δηάθνξα projects,
θαη ήδε ρξεζηκνπνηείηαη ζε πςειήο δήηεζεο e-business ηζηνζειίδεο. Δίλαη ζπκβαηφ κε ηηο
πεξηζζφηεξεο απφ ηηο δηαζέζηκεο κεραλέο βάζεο δεδνκέλσλ, ζπκπεξηιακβαλνκέλσλ ησλ MySQL,
PostgreSQL, Oracle θαη Microsoft SQL Server. Σξέρεη ζε *nix θαη Windows πιαηθφξκεο.
3.1.2 Υαξαθηεξηζηηθά ηνπ Symfony
Σν symfony δεκηνπξγήζεθε κε ζθνπφ λα εθπιεξψζεη ηηο παξαθάησ απαηηήζεηο:








Ευκολία ςτο να το εγκαταςτιςουμε και να το ρυκμίςουμε ςτισ περιςςότερεσ πλατφόρμεσ
Ανεξάρτθτθ μθχανι βάςθσ δεδομζνων
Εφκολο ςτθ χριςθ, ςτισ περιςςότερεσ περιπτώςεισ, αλλά ακόμα ευλφγιςτο αρκετά για να
προςαρμοςτεί με περίπλοκα ηθτιματα.
Βαςιςμζνο ςτθν παραδοχι τθσ ςφμβαςθσ για τθ διαμόρφωςθ – ο προγραμματιςτισ χρειάηεται
να ρυκμίςει μόνο τα αντιςυμβατικά
Συμβατό με τισ περιςςότερεσ καλζσ πρακτικζσ web και πρότυπα ςχεδίων
Ζτοιμο για επιχειριςεισ – προςαρμόηεται ςτισ υπάρχουςεσ πολιτικζσ και αρχιτεκτονικζσ τθσ
τεχνολογίασ πλθροφοριών, και είναι αρκετά ςτακερό για μακροπρόκεςμα projects
Πολφ ευανάγνωςτοσ κώδικασ, με ςχόλια phpDocumentor, για εφκολθ ςυντιρθςθ
Εφκολο ςτο να επεκτακεί, επιτρζποντασ τθν ζνταξθ με άλλεσ βιβλιοκικεσ καταςκευαςτών.
36
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δδψ ζα πεξηγξάςνπκε ηε δεκηνπξγία κηαο εθαξκνγήο γηα ην δηαδίθηπν κε ρξήζε ηνπ symfony
framework, βήκα-βήκα, απφ ηηο πξνδηαγξαθέο κέρξη θαη ηελ εθηέιεζε. ΢θνπφο καο είλαη λα δείμνπκε
φηη ην symfony κπνξεί λα ρξεζηκνπνηεζεί γηα λα αλαπηχμνπκε επαγγεικαηηθέο εθαξκνγέο κε ζηπι θαη
κε ιίγε πξνζπάζεηα. Με απηφλ ηνλ ηξφπν ζα κάζνπκε λα δεκηνπξγνχκε πξαγκαηηθέο ηζηνζειίδεο απφ
ηελ αξρή κέρξη ην ηέινο θάλνληαο ρξήζε ηνπ symfony.
3.2 Πξναπαηηήζεηο ζπζηήκαηνο.1
Πξηλ εγθαηαζηήζνπκε ην symfony ζα πξέπεη λα ειέγμνπκε φηη ην ινγηζκηθφ πνπ πξναπαηηείηαη γηα
ηελ ζσζηή ιεηηνπξγία ηνπ, είλαη εγθαηεζηεκέλν ζηνλ ππνινγηζηή θαη έρεη ξπζκηζηεί αλάινγα. Θα
πξέπεη λα ππάξρεη θηιηθφ εξγαζηαθφ πεξηβάιινλ γηα web development. Δπίζεο ρξεηάδεηαη λα είλαη
εγθαηεζηεκέλα, έλαο web server (π.ρ. Apache), κία κεραλή βάζεο δεδνκέλσλ, (MySQL, PostgreSQL,
SQLite ή νπνηαδήπνηε ζπκβαηή κε PDO2 κεραλή βάζεο δεδνκέλσλ), θαη ε PHP 5.2.4 ή
κεηαγελέζηεξε έθδνζε.
3.3 Ρπζκίζεηο παξακέηξσλ PHP
Καζψο νη ξπζκίζεηο ησλ παξακέηξσλ ηνπ PHP κπνξνχλ λα δηαθέξνπλ αξθεηά απφ έλα Λεηηνπξγηθφ
΢χζηεκα ζε έλα άιιν, αθφκα θαη κεηαμχ δηαθνξεηηθψλ δηαλνκψλ Linux, ζα πξέπεη λα ειεγρζεί φηη
θαιχπηνπλ ηηο ειάρηζηεο απαηηήζεηο ηνπ symfony.
Πξψηα, πξέπεη λα ζηγνπξεπηνχκε φηη έρνπκε ηνπιάρηζηνλ ην PHP 5.2.4 εγθαηεζηεκέλν θάλνληαο
ρξήζε ηεο ελζσκαησκέλεο ζπλάξηεζεο phpinfo() ή εθηειψληαο ηελ εληνιή php -v ζηε γξακκή
εληνιψλ. ΢ε θάπνηεο ξπζκίζεηο παξακέηξσλ ππάξρεη πεξίπησζε λα έρνπκε δχν δηαθνξεηηθέο εθδφζεηο
PHP εγθαηεζηεκέλεο: κία γηα ηε γξακκή εληνιψλ, θαη κία γηα ην web.Έπεηηα, θαηεβάδνπκε ην script
πνπ ειέγρεη ηηο ξπζκίζεηο ησλ παξακέηξσλ απφ ην παξαθάησ URL:
http://sf-to.org/1.4/check.php
Σν απνζεθεχνπκε ζηνλ ξηδηθφ θαηάινγν ηνπ web, θαη ην εθηεινχκε απφ ηε γξακκή εληνιψλ:
$ php check_configuration.php
Αλ ππάξμεη θάπνην πξφβιεκα κε ηηο ξπζκίζεηο ησλ παξακέηξσλ ηνπ PHP, ε έμνδνο ηεο εληνιήο ζα
δψζεη ηξφπνπο γηα ην ηη πξέπεη λα δηνξζσζεί θαη πσο. Θα πξέπεη πάλησο λα εθηειεζηεί ην script ηνπ
ειέγρνπ θαη κέζσ browser γηα λα δηνξζσζνχλ θη εθεί ηπρψλ ζθάικαηα.
3.4 Δγθαηάζηαζε ηνπ symfony.
Έζησ φηη νλνκάδνπκε ην project πνπ ζέινπκε λα θηηάμνπκε Jobeet. Σν Jobeet ζα είλαη έλα site γηα
εχξεζε εξγαζίαο. Θα αζρνιεζνχκε ζε βάζνο θαη αλαιπηηθά γηα ην πσο ζα ην πινπνηήζνπκε
παξαθάησ. Πξηλ μεθηλήζνπκε ηελ εγθαηάζηαζε ζα πξέπεη λα δεκηνπξγήζνπκε έλαλ θάθειν κέζα
ζηνλ νπνίν ζα πεξηέρνληαη φια ηα αξρεία πνπ ζπζρεηίδνληαη κε ην Jobeet:
$ mkdir -p /home/sfprojects/jobeet
1 .Συνιςτάται θ χριςθ Unix-like Λειτουργικοφ Συςτιματοσ για λόγουσ αςφαλείασ και γριγορθσ εκτζλεςθσ.
37
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$ cd /home/sfprojects/jobeet
Δλώ ζηα Windows:
c:\> mkdir c:\development\sfprojects\jobeet
c:\> cd c:\development\sfprojects\jobeet
΢πλεζίδεηαη ηα αξρεία ηνπ symfony framework λα εγθαζίζηαληαη ζηνλ θάθειν lib/vendor. Οπφηε
πξψηα αο ηνλ δεκηνπξγήζνπκε:
$ mkdir -p lib/vendor
Ο πην εχθνινο ηξφπνο γηα λα εγθαηαζηήζνπκε ην symfony είλαη λα επηιέμνπκε ην ζπκπηεζκέλν
αξρείν (ζε κνξθή .tgz ή .zip) κε ηελ έθδνζε ηνπ symfony πνπ επηζπκνχκε απφ ην site ηνπ symfony,
λα ην ηνπνζεηήζνπκε ζηνλ θάθειν /lib/vendor πνπ κφιηο δεκηνπξγήζακε, λα ην απνζπκπηέζνπκε θαη
λα κεηνλνκάζνπκε ηνλ θάθειν ζε symfony:
$ cd lib/vendor
$ tar zxpf symfony-1.4.0.tgz
$ mv symfony-1.4.0 symfony
$ rm symfony-1.4.0.tgz
΢ηα Windows ε απνζπκπίεζε ηνπ αξρείνπ κπνξεί λα επηηεπρζεί κε ηε ρξήζε ηνπ Windows
Explorer. Μεηά ηε κεηνλνκαζία ηνπ θαθέινπ ζε symfony ε δνκή ηνπ θαθέινπ ζα είλαη:
c:\dev\sfprojects\jobeet\lib\vendor\symfony.
3.4.1 Δπηβεβαίσζε ηεο εγθαηάζηαζεο
Γηα λα επαιεζεχζνπκε φηη κεηά ηελ εγθαηάζηαζε φια ιεηηνπξγνχλ θαλνληθά ρξεζηκνπνηνχκε ηελ
γξακκή εληνιψλ ηνπ symfony γηα λα εκθαλίζνπκε ηελ έθδνζε ηνπ symfony:
$ cd ../..
$ php lib/vendor/symfony/data/bin/symfony -V
θαη ζηα Windows:
cd:\> cd ..\..
cd:\> php lib\vendor\symfony\data\bin\symfony -V
38
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
3.5 Project Setup
΢ην symfony, νη εθαξκνγέο νη νπνίεο κνηξάδνληαη ην ίδην κνληέιν δεδνκέλσλ νκαδνπνηνχληαη ζε
projects. Γηα ηα πεξηζζφηεξα projects, ζα ππάξρνπλ δχν εθαξκνγέο: κία αξρηθή θαη κία ηειηθή.
3.5.1 Γεκηνπξγία Project
Απφ ηνλ θάθειν sfprojects/jobeet, ηξέρνπκε ηελ δηεξγαζία ηνπ symfony generate:project γηα λα
δεκηνπξγήζνπκε ην symfony project:
$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet
΢ηα Windows:
c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet
Η εξγαζία generate:project παξάγεη ηελ πξνθαζνξηζκέλε δνκή ησλ θαθέισλ θαη ησλ αξρείσλ πνπ
ρξεηάδνληαη γηα έλα symfony project:
Φάθεινο
Πεξηγξαθή
apps/:
Φηινμελεί φιεο ηηο εθαξκνγέο ηνπ project
cache/:
Σα αξρεία ηνπ framework ηεο θξπθήο κλήκεο
config/:
Σα αξρεία ξχζκηζεο παξακέηξσλ ηνπ project
lib/:
Σηο βηβιηνζήθεο θαη θιάζεηο ηνπ project
Log/:
Σα αξρεία log ηνπ framework
plugins/:
Σα εγθαηεζηεκέλα plugins
test/:
Σα αξρεία ειέγρνπ ηεο κνλάδαο θαη ηεο ιεηηνπξγίαο
Σνλ web root θάθειν
web/:
39
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Η δηεξγαζία generate:project έρεη επίζεο δεκηνπξγήζεη κηα ζπληφκεπζε ηνπ symfony ζηνλ ξηδηθφ
θάθειν ηνπ project έηζη ψζηε λα κεηψζεη ησλ αξηζκφ ησλ ραξαθηήξσλ πνπ πξέπεη λα γξαθηνχλ φηαλ
ηξέρνπκε κία δηεξγαζία.
Έηζη, πιένλ, αληί λα ρξεζηκνπνηνχκε ην πιήξε κνλνπάηη γηα ην πξφγξακκα ηνπ symfony ζα
κπνξνχκε λα ρξεζηκνπνηήζνπκε ηε ζπληφκεπζε.
3.6 Γεκηνπξγία Δθαξκνγήο
Σψξα, δεκηνπξγνχκε ηελ αξρηθή εθαξκνγή ηξέρνληαο ηελ δηεξγαζία generate:app
$ php symfony generate:app frontend
Βαζηδφκελε ζην φλνκα ηεο εθαξκνγήο πνπ δφζεθε ζαλ επηρείξεκα, ε δηεξγαζία generate:app
δεκηνπξγεί ηελ πξνθαζνξηζκέλε δνκή θαθέισλ πνπ ρξεηάδεηαη γηα ηελ εθαξκνγή ζηνλ apps/frontend/
θάθειν:
Φάθεινο
Πεξηγξαθή
config/:
Σα αξρεία
εθαξκνγήο
ξχζκηζεο
παξακέηξσλ
ηηο
lib/:
Οη βηβιηνζήθεο θαη νη θιάζεηο ηεο εθαξκνγήο
modules/:
Ο θψδηθαο ηεο εθαξκνγήο (MVC)
templates/:
Σα θαζνιηθά πξφηππα αξρεία
3.6.1 Γηθαηώκαηα ζηηο δνκέο ησλ θαθέισλ
Πξηλ πξνζπαζήζνπκε λα έρνπκε πξφζβαζε ζην θαηλνχξην project πνπ κφιηο δεκηνπξγήζακε, ζα
πξέπεη λα νξίζνπκε ηα δηθαηψκαηα εγγξαθήο ζηνπο θαθέινπο cache/ θαη log/ έηζη ψζηε ν web server
λα κπνξεί λα γξάςεη ζε απηά:
$ chmod 777 cache/ log/
3.7 Ρπζκίζεηο παξακέηξσλ Web Server: Ο αζθαιήο ηξόπνο
Μηα θαιή πξαθηηθή γηα ην web είλαη λα κπνπλ ζηνλ web root θάθειν κφλν ηα αξρεία πνπ
ρξεηάδεηαη λα έρεη πξφζβαζε ν web browser, φπσο stylesheets, JavaScripts, θαη εηθφλεο. Ωο
πξνεπηινγή, ζπληζηάηαη ηα αξρεία απηά λα απνζεθεχνληαη ζηνλ ππνθάθειν web/ ελφο project
40
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
symfony. ΢ε απηφλ ηνλ θάθειν ππάξρνπλ κεξηθνί ππνθάθεινη γηα web assets (css/ θαη images/) θαη
δχν αξρεία front controller. Σα front controllers είλαη ηα κφλα PHP αξρεία πνπ ρξεηάδεηαη λα
βξίζθνληαη θάησ απφ ηνλ web root θάθειν.
3.7.1 Ρπζκίζεηο παξακέηξσλ ηνπ Web Server
Γηα λα γίλεη ην λέν project πξνζβάζηκν ζηνλ θφζκν, ζα πξέπεη λα αιιάμνπκε ηηο ξπζκίζεηο
παξακέηξσλ ηνπ Apache.
Δληνπίδνπκε θαη αλνίγνπκε ην αξρείν httpd.conf θαη πξνζζέηνπκε ηηο αθφινπζεο ξπζκίζεηο ζην
ηέινο ηνπ:
# Be sure to only have this line once in your configuration
NameVirtualHost 127.0.0.1:8080
# This is the configuration for your project
Listen 127.0.0.1:8080
<VirtualHost 127.0.0.1:8080>
DocumentRoot "/home/sfprojects/jobeet/web"
DirectoryIndex index.php
<Directory "/home/sfprojects/jobeet/web">
AllowOverride All
Allow from All
</Directory>
Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
<Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf">
AllowOverride All
Allow from All
</Directory>
</VirtualHost>
Απηέο νη ξπζκίζεηο θάλνπλ ηνλ Apache λα ―αθνχεη‖ ζηελ port 8080 ζηνλ ππνινγηζηή καο, έηζη,
κεηά απφ ηελ επαλεθθίλεζε ηνπ Apache, ε ηζηνζειίδα ζα είλαη πξνζβάζηκε απφ ην αθφινπζν URL:
http://~localhost~:8080/
41
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Η port 8080 κπνξεί λα αιιαρζεί ζε νπνηνλδήπνηε αξηζκφ κεγαιχηεξν ηνπ 1024 θαζψο νη αξηζκνί
απηνί δελ ρξεηάδνληαη δηθαηψκαηα δηαρεηξηζηή.
3.7.2 Διέγρνπκε ηηο θαηλνύξηεο ξπζκίζεηο
Δπαλεθθηλνχκε ηνλ Apache θη ειέγρνπκε εάλ κπνξνχκε λα έρνπκε πξφζβαζε ζηελ θαηλνχξηα
εθαξκνγή αλνίγνληαο έλαλ browser θαη πιεθηξνινγψληαο http://localhost:8080/index.php, ή
http://www.jobeet.com.localhost/index.php/ αλάινγα κε ηηο ξπζκίζεηο πνπ επηιέμακε.
Δηθόλα 7: Πξώηε ζειίδα εγθαηάζηαζεο ηνπ Symfony
Μπνξνχκε επίζεο λα δνθηκάζνπκε λα απνθηήζνπκε πξφζβαζε ζηελ εθαξκνγή ζην πεξηβάιινλ ηεο
αλάπηπμεο:
42
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
http://www.jobeet.com.localhost/frontend_dev.php/
΢ηε γξακκή εξγαιείσλ ειέγρνπ ζθαικάησλ ηνπ web ζηελ πάλσ δεμηά γσλία ζα πξέπεη ηα
ζπκπεξηιακβαλφκελα κηθξά εηθνλίδηα λα απνδεηθλχνπλ φηη ε ξχζκηζε ηνπ ςεπδσλχκνπ sf/ είλαη
ζσζηή.
3.8 Σα πεξηβάιινληα
΢ηνλ θάθειν web/ ππάξρνπλ δχν PHP αξρεία: ην index.php θαη ην frontend_dev.php ηα νπνία
νλνκάδνληαη front controllers. Όια ηα αηηήκαηα πξνο ηελ εθαξκνγή γίλνληαη κέζσ απηψλ.
Καη ηα δχν ηα αξρεία δείρλνπλ ζηελ ίδηα εθαξκνγή αιιά ζε δηαθνξεηηθά πεξηβάιινληα. Όηαλ
αλαπηχζζεηαη κία εθαξκνγή, εθηφο απφ ηελ πεξίπησζε πνπ αλαπηχζζεηαη απ' επζείαο ζηνλ
production server, ρξεηάδνληαη δηάθνξα πεξηβάιινληα.
 Σν πεξηβάιινλ αλάπηπμεο (development environment): Απηφ είλαη ην πεξηβάιινλ πνπ
ρξεζηκνπνηείηαη απφ ηνπο web developers φηαλ εξγάδνληαη ζηελ εθαξκνγή γηα λα
πξνζζέζνπλ λέα ραξαθηεξηζηηθά, δηνξζψζνπλ ζθάικαηα,...
 Σν πεξηβάιινλ ειέγρνπ (test environment): Απηφ ην πεξηβάιινλ ρξεζηκνπνηείηαη γηα λα
ειέγρεη απηφκαηα ηελ εθαξκνγή.
 Σν πεξηβάιινλ ζηαδηνπνίεζεο (staging environment): Απηφ ην πεξηβάιινλ ρξεζηκνπνηείηαη
απφ ηνλ πειάηε γηα λα ειέγμεη ηελ εθαξκνγή θαη λα αλαθέξεη ζθάικαηα ή ραξαθηεξηζηηθά ηα
νπνία ιείπνπλ.
 Σν πεξηβάιινλ παξαγσγήο (production environment): Απηφ είλαη ην πεξηβάιινλ κε ην νπνίν
νη ηειηθνί ρξήζηεο αιιειεπηδξνχλ.
Ση θάλεη έλα πεξηβάιινλ κνλαδηθφ; ΢ην πεξηβάιινλ αλάπηπμεο γηα παξάδεηγκα, ε εθαξκνγή
ρξεηάδεηαη λα θαηαγξάςεη φιεο ηηο ιεπηνκέξεηεο ελφο αηηήκαηνο γηα λα δηεπθνιχλεη ηελ
απνζθαικάησζε (debugging), αιιά ην ζχζηεκα cache ζα πξέπεη λα είλαη απελεξγνπνηεκέλν θαζψο
φιεο νη αιιαγέο πνπ γίλνληαη ζηνλ θψδηθα ζα πξέπεη λα ιεθζνχλ ππφςηλ ακέζσο. Έηζη, ην
πεξηβάιινλ αλάπηπμεο ζα πξέπεη λα βειηηζηνπνηείηαη γηα ηνλ developer. Σν θαιχηεξν παξάδεηγκα
είλαη ζίγνπξα φηαλ κία εμαίξεζε | Exception Handling ζπκβαίλεη. Γηα λα βνεζεζεί έλαο developer
ζηνλ εληνπηζκφ ησλ ζθαικάησλ γξεγνξφηεξα, ην symfony εκθαλίδεη ηελ εμαίξεζε (exception) κε
φιεο ηηο πιεξνθνξίεο πνπ έρεη γηα ην ηξέρσλ αίηεκα κέζα ηνλ browser:
43
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δηθόλα 7: Σν πεξηβάιινλ παξαγσγήο ηνπ Symfony πνπ καο δείρλεη ην ζθάικα γηα λα
ελεξγνπνηεζεί
Αιιά ζηνλ πεξηβάιινλ παξαγσγήο (production environment), πξέπεη λα ελεξγνπνηεζεί ην επίπεδν
cache (cache layer) θαη ε εθαξκνγή ζα πξέπεη λα εκθαλίδεη πξνζαξκνζκέλα κελχκαηα ζθαικάησλ
αληί γηα αθαηέξγαζηεο εμαηξέζεηο (raw exceptions). Έηζη, ην πεξηβάιινλ παξαγσγήο ζα πξέπεη λα
βειηηζηνπνηεζεί γηα επίδνζε θαη ηελ εκπεηξία ηνπ ρξήζηε.
44
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δηθόλα 8: Μεηά ηεο ξπζκίζεηο ηνπ πεξηβάιινλ παξαγσγήο (production environment).
3.9 Σν Project
Όπσο είπακε θαη παξαπάλσ ην Jobeet είλαη project αλνηρηνχ θψδηθα ην νπνίν ζαλ ζέκα έρεη ηελ
εχξεζε εξγαζίαο. Δίλαη εχθνιν ζηε ρξήζε, κπνξεί λα πξνζαξκνζηεί, λα επεθηαζεί θαζψο θαη λα
ελζσκαησζεί κέζα ζηελ ηζηνζειίδα. Τπνζηεξίδεη πνιιαπιέο γιψζζεο, θαη ρξεζηκνπνηεί ηηο
ηειεπηαίεο ηερλνινγίεο WEB 2.0 γηα λα εληζρχζεη ηελ εκπεηξία ηνπ ρξήζηε. Δπίζεο παξέρεη feeds θαη
κηα δηεπαθή API (Application Programming Interface) γηα λα κπνξνχκε λα αιιειεπηδξνχκε κε απηφ
πξνγξακκαηηζηηθά.
Πξηλ αζρνιεζνχκε κε ηνλ θψδηθα ζα δνχκε κεξηθά αθφκα πξάγκαηα γηα ην project. Θα
πεξηγξάςνπκε ηα ραξαθηεξηζηηθά πνπ ζα εθαξκφζνπκε ζηελ πξψηε έθδνζε ηνπ project κε θάπνηεο
απιέο ηζηνξίεο.
Σν Jobeet website έρεη ηέζζεξα είδε ρξεζηψλ:
 Admin: Σνπ αλήθεη ην website θαη έρεη ηε ―καγηθή δχλακε‖
 user: Δπηζθέπηεηαη ην site γηα λα βξεη κηα ζέζε εξγαζίαο
 poster: Δπηζθέπηεηαη ην site γηα λα ηνπνζεηήζεη κία ζέζε εξγαζίαο
 affiliate: Αλαδεκνζηεχεη θάπνηεο ζέζεηο εξγαζίαο ζην δηθφ ηνπ site.
45
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Σν Project έρεη δχν εθαξκνγέο: ηελ frontend (ηζηνξίεο F1 έσο F7 παξαθάησ), φπνπ νη ρξήζηεο
αιιειεπηδξνχλ κε ην website, θαη ηελ backend (ηζηνξίεο B1 έσο B3), φπνπ νη δηαρεηξηζηέο (admins)
δηαρεηξίδνληαη ην website.H backend εθαξκνγή έρεη αζθάιεηα θαη ρξεηάδνληαη δηαπηζηεπηήξηα γηα
λα έρεη θάπνηνο πξφζβαζε ζε απηή.
3.9.1 Ιζηνξηεο F
3.9.1.1 Ιζηνξία F1: ΢ηελ αξρηθή ζειίδα ν ρξήζηεο βιέπεη ηηο ηειεπηαίεο ελεξγέο ζέζεηο
εξγαζίαο.
Όηαλ ν ρξήζηεο εηζέξρεηαη ζηελ ηζηνζειίδα, βιέπεη κία ιίζηα απφ ηηο ελεξγέο ζέζεηο εξγαζίαο. Οη
ζέζεηο εξγαζίαο είλαη ηαμηλνκεκέλεο αλά θαηεγνξία θαη αλά εκεξνκελία δεκνζίεπζεο (νη λεφηεξεο
ζέζεηο εξγαζίαο πξψηα). Γηα θάζε ζέζε εξγαζίαο, εκθαλίδεηαη κφλν ε ηνπνζεζία, ε ζέζε εξγαζίαο,
θαη ε εηαηξεία.
Γηα θάζε θαηεγνξία, ε ιίζηα δείρλεη κφλν ηηο πξψηεο 10 θαη έλα link επηηξέπεη λα πξνβάιεη φιεο ηηο
ζέζεηο εξγαζίαο ζε ζπγθεθξηκέλε θαηεγνξία (Ιζηνξία F2).΢ηελ αξρηθή ζειίδα, ν ρξήζηεο κπνξεί λα
θαζαξίζεη ηε ιίζηα κε ηηο ζέζεηο εξγαζίαο (Ιζηνξία F3), ή λα ηνπνζεηήζεη κία θαηλνχξηα ζέζε
εξγαζίαο (Ιζηνξία F5).
Δηθόλα 9: Ιζηνξία F1: ΢ηελ αξρηθή ζειίδα ν ρξήζηεο βιέπεη ηηο ηειεπηαίεο ελεξγέο ζέζεηο
εξγαζίαο.
46
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
3.9.1.2 Ιζηνξία F2: Έλαο ρξήζηεο κπνξεί λα αλαδεηήζεη όιεο ηηο ζέζεηο εξγαζίεο ζε
ζπγθεθξηκέλε θαηεγνξία
Όηαλ ν ρξήζηεο ―παηάεη‖ ζε έλα φλνκα θαηεγνξίαο ή ζε έλα link ―more jobs‖ ζηελ αξρηθή ζειίδα,
βιέπεη φιεο ηηο ζέζεηο εξγαζίαο γη απηή ηελ θαηεγνξία ηαμηλνκεκέλεο θαηά εκεξνκελία.
Δηθόλα 9: Ιζηνξία F2: Έλαο ρξήζηεο κπνξεί λα αλαδεηήζεη όιεο ηηο ζέζεηο εξγαζίεο ζε
ζπγθεθξηκέλε θαηεγνξία
3.9.1.3 Ιζηνξία F3: Έλαο ρξήζηεο βειηηώλεη ηα απνηειέζκαηα ηεο ιίζηαο κε θάπνηεο ιέμεηοθιεηδηά
Ο ρξήζηεο κπνξεί λα εηζάγεη θάπνηεο ιέμεηο-θιεηδηά γηα λα βειηηψζεη ηελ εχξεζε. Οη ιέμεηο-θιεηδηά
κπνξνχλ λα είλαη ιέμεηο πνπ αλαθέξνληαη ζηελ ηνπνζεζία, ηελ ζέζε, ηελ θαηεγνξία, ή ηα πεδία ηηο
εηαηξείαο.
47
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
3.9.1.4 Ιζηνξία F4: Ο ρξήζηεο “παηάεη” πάλσ ζε κηα ζέζε εξγαζίαο γηα λα δεη πην ιεπηνκεξείο
πιεξνθνξίεο
Ο ρξήζηεο κπνξεί λα δηαιέμεη κία ζέζε εξγαζίαο απφ ηε ιίζηα γηα λα δεη πην ιεπηνκεξείο
πιεξνθνξίεο.
Δηθόλα 10: Ιζηνξία F4: Ο ρξήζηεο “παηάεη” πάλσ ζε κηα ζέζε εξγαζίαο γηα λα δεη πην
ιεπηνκεξείο πιεξνθνξίεο
3.9.1.5 Ιζηνξία F5: Ο ρξήζηεο ηνπνζεηεί κία ζέζε εξγαζίαο
Έλαο ρξήζηεο κπνξεί λα ηνπνζεηήζεη κία ζέζε εξγαζίαο. Μηα ζέζε εξγαζίαο απαξηίδεηαη απφ
αξθεηά θνκκάηηα απφ πιεξνθνξίεο:





Δηαηξεία
Σχπνο εξγαζίαο (full-time, part-time, ή αλεμάξηεηε)
Λνγφηππν (πξναηξεηηθά)
URL (πξναηξεηηθά)
Θέζε
48
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων





Σνπνζεζία
Καηεγνξία (Ο ρξήζηεο δηαιέγεη ζε ιίζηα ηηο πηζαλέο θαηεγνξίεο)
Πεξηγξαθή εξγαζίαο (ηα URL θαη ηα email ζπλδένληαη απηφκαηα)
Πσο λα γίλεη ε αίηεζε (ηα URL θαη ηα email ζπλδένληαη απηφκαηα)
Email
Γελ ρξεηάδεηαη ε δεκηνπξγία ινγαξηαζκνχ γηα λα ηνπνζεηεζεί κία ζέζε εξγαζίαο.
Η δηαδηθαζία ρξεηάδεηαη κφλν δχν βήκαηα: πξψηα, ν ρξήζηεο ζπκπιεξψλεη ηε θφξκα κε φιεο ηηο
απαξαίηεηεο πιεξνθνξίεο γηα λα πεξηγξάςεη ηε ζέζε εξγαζίαο, κεηά επηβεβαηψλεη ηηο πιεξνθνξίεο
θάλνληαο πξν-επηζθφπεζε ηεο ηειηθήο ζειίδαο γηα ηε ζέζε εξγαζίαο.
Αθφκα θη αλ ν ρξήζηεο δελ έρεη ινγαξηαζκφ, κία ζέζε εξγαζίαο κπνξεί λα ηξνπνπνηεζεί θη έπεηηα
απφ ηελ ηνπνζέηεζή ηεο ράξηο ζε έλα ζπγθεθξηκέλν URL.
Κάζε αλαξηεκέλε ζέζε εξγαζίαο παξακέλεη δηαζέζηκε (online) γηα 30 εκέξεο (απηφ ξπζκίδεηαη απφ
ηνλ δηαρεηξηζηή). Έλαο ρξήζηεο κπνξεί λα μαλά ελεξγνπνηήζεη ή λα επεθηείλεη ηελ εγθπξφηεηα κηαο
ζέζεο εξγαζίαο γηα αθφκα 30 εκέξεο αιιά κφλν φηαλ ε ζέζε εξγαζίαο ιήγεη ζε ιηγφηεξν απφ 5
εκέξεο.
49
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δηθόλα 11: Ιζηνξία F5: Ο ρξήζηεο ηνπνζεηεί κία ζέζε εξγαζίαο
3.9.1.6 ζηνξία F6: Έλαο ρξήζηεο θάλεη αίηεζε γηα λα πξνσζήζεη ην site
Έλαο ρξήζηεο ρξεηάδεηαη λα θάλεη αίηεζε θαη λα εγθξηζεί γηα λα κπνξέζεη λα πξνσζήζεη θαη λα
ρξεζηκνπνηήζεη ην Jobeet API. Γηα λα θάλεη ηελ αίηεζε, ζα πξέπεη λα δψζεη ηηο παξαθάησ
πιεξνθνξίεο:
 Όλνκα
 Email
 Website URL
Ο ινγαξηαζκφο ζα πξέπεη λα ελεξγνπνηεζεί απφ ηνλ δηαρεηξηζηή (Ιζηνξία B3).
50
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
3.9.1.7 Ιζηνξία F7: Έλαο πξνσζεηήο παξαιακβάλεη ηελ ππάξρνπζα ιίζηα κε ηηο ζέζεηο
εξγαζίαο
Έλαο πξνσζεηήο κπνξεί λα παξαιάβεη ηελ ππάξρνπζα ιίζηα κε ηηο ζέζεηο εξγαζίαο θαιψληαο ην
API κε ην token. Η ιίζηα κπνξεί λα επηζηξαθεί ζε δηακφξθσζε XML, JSON ή YAML.
Η ιίζηα πεξηέρεη ηηο δεκφζηεο πιεξνθνξίεο πνπ είλαη δηαζέζηκεο γηα κία ζέζε εξγαζίαο.
3.9.2 Ιζηνξίεο Β
3.9.2.1 Ιζηνξία Β1: Έλαο δηαρεηξηζηήο (admin) ξπζκίδεη ηηο παξακέηξνπο γηα ην website
Έλαο δηαρεηξηζηήο κπνξεί λα επεμεξγαζηεί ηηο θαηεγνξίεο πνπ είλαη δηαζέζηκεο ζην website.
3.9.2.2 Ιζηνξία Β2: Έλαο δηαρεηξηζηήο (admin) δηαρεηξίδεηαη ηηο ζέζεηο εξγαζίαο
Έλαο δηαρεηξηζηήο κπνξεί λα επεμεξγαζηεί θαη λα αθαηξέζεη θάζε ζέζε εξγαζίαο πνπ έρεη
ηνπνζεηεζεί.
3.9.2.3 Ιζηνξία Β3: Έλαο δηαρεηξηζηήο (admin) δηαρεηξίδεηαη ηνπο πξνσζεηέο
Ο δηαρεηξηζηήο κπνξεί λα δεκηνπξγήζεη ή λα επεμεξγαζηεί ηνπο πξνσζεηέο θαζψο είλαη ππεχζπλνο
θαη γηα ηελ ελεξγνπνίεζε ε απελεξγνπνίεζε απηψλ.
Όηαλ ν δηαρεηξηζηήο ελεξγνπνηεί έλαλ λέν πξνσζεηή, ην ζχζηεκα δεκηνπξγεί έλα κνλαδηθφ token
γηα λα ρξεζηκνπνηεζεί απφ ηνλ πξνσζεηή.
51
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
4 Σν Mνληέιν Γεδνκέλσλ (Data Model)
4.1 Σν ζρεζηαθό κνληέιν (relational model)
Οη ηζηνξίεο πνπ είδακε παξαπάλσ αλαθέξνληαη ζηα θχξηα αληηθείκελα ηνπ project: ζέζε εξγαζίαο
(job), πξνσζήζεηο (affiliate) θαη θαηεγνξία (category). Δδψ είλαη ην αληίζηνηρν δηάγξακκα:
Δηθόλα 12: Σν Mνληέιν κνληέιν Γεδνκέλσλ (Data Model).
4.2 Σν ζρέδην (schema)
Γηα λα ηα απνζεθεχζνπκε απηά ρξεηαδφκαζηε κηα ζρεζηαθή βάζε δεδνκέλσλ. Καζψο ην symfony
είλαη έλα αληηθεηκελνζηξαθή (Object-Oriented) framework αληί λα γξάθνπκε SQL statements
κπνξνχκε γηα λα αλαθηήζνπκε εγγξαθέο απφ ηε βάζε δεδνκέλσλ πξνηηκνχκε λα ρξεζηκνπνηνχκε
αληηθείκελα (objects).
Μπνξεί λα γίλεη αληηζηνίρηζε ησλ πιεξνθνξηψλ ηεο ζρεζηαθήο βάζεο δεδνκέλσλ κε έλα object
model (κνληέιν αληηθεηκέλνπ) ρξεζηκνπνηψληαο έλα εξγαιείν ORM. Σν symfony έξρεηαη κε δχν
ηέηνηα εξγαιεία: ην Propel θαη ην Doctrine. Δκείο ζα ρξεζηκνπνηήζνπκε ην Doctrine.
4.3 Σν ORM
ρξεηάδεηαη ηελ πεξηγξαθή ησλ tables θαη ηηο ζρέζεηο ηνπο γηα λα δεκηνπξγήζεη ηηο ζρεηηθέο classes.
Τπάξρνπλ δχν ηξφπνη γηα λα δεκηνπξγήζνπκε απηφ ην ζρέδην ηεο πεξηγξαθήο (description schema):
είηε κε ην λα απηνεμεηάζνπκε κία ππάξρνπζα βάζε δεδνκέλσλ ή δεκηνπξγψληαο ηελ απφ ηελ αξρή.
52
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Καζψο ε βάζε δεδνκέλσλ δελ ππάξρεη αθφκα ζα δεκηνπξγήζνπκε ην αξρείν ηνπ ζρεδίνπ (schema
file) επεμεξγάδνληαο ην θελφ αξρείν config/doctrine/schema.yml:
# config/doctrine/schema.yml
JobeetCategory:
actAs: { Timestampable: ~ }
columns:
name: { type: string(255), notnull: true, unique: true }
JobeetJob:
actAs: { Timestampable: ~ }
columns:
category_id: { type: integer, notnull: true }
type:
{ type: string(255) }
company:
logo:
url:
{ type: string(255), notnull: true }
{ type: string(255) }
{ type: string(255) }
position:
{ type: string(255), notnull: true }
location:
{ type: string(255), notnull: true }
description: { type: string(4000), notnull: true }
how_to_apply: { type: string(4000), notnull: true }
token:
{ type: string(255), notnull: true, unique: true }
is_public: { type: boolean, notnull: true, default: 1 }
is_activated: { type: boolean, notnull: true, default: 0 }
email:
{ type: string(255), notnull: true }
expires_at: { type: timestamp, notnull: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias:
JobeetJobs }
JobeetAffiliate:
53
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
actAs: { Timestampable: ~ }
columns:
url:
{ type: string(255), notnull: true }
email:
{ type: string(255), notnull: true, unique: true }
token:
{ type: string(255), notnull: true }
is_active: { type: boolean, notnull: true, default: 0 }
relations:
JobeetCategories:
class: JobeetCategory
refClass: JobeetCategoryAffiliate
local: affiliate_id
foreign: category_id
foreignAlias: JobeetAffiliates
JobeetCategoryAffiliate:
columns:
category_id: { type: integer, primary: true }
affiliate_id: { type: integer, primary: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id }
JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }
Σν schema (ζρέδην) είλαη ε απεπζείαο κεηάθξαζε (translation) ηνπ entity relationship diagram
(δηαγξάκκαηνο ζρέζεο νληφηεηαο) ζηελ YAML format.
Σν αξρείν schema.yml πεξηιακβάλεη ηελ πεξηγξαθή φισλ ησλ table θαη ηηο ζηήιεο (columns)
απηψλ. Κάζε ζηήιε πεξηγξάθεηαη κε ηηο παξαθάησ πιεξνθνξίεο:
 Type: Ο ηχπνο ησλ ζηειψλ. (boolean, integer, float, decimal, string, array, object, blob, clob,
timestamp, time, date, enum, gzip)
 Notnull: Σν βάδνπκε true αλ ζέινπκε λα απαηηείηαη ε ζηήιε
54
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
 Unique: Σν βάδνπκε true αλ ζέινπκε λα δεκηνπξγήζνπκε έλαλ κνλαδηθφ δείθηε γηα ηε ζηήιε
4.4 Η Βάζε Γεδνκέλσλ
Σν symfony framework ππνζηεξίδεη φιεο ηηο βάζεηο δεδνκέλσλ πνπ ππνζηεξίδνληαη απφ PDO.
Δκείο ζα ρξεζηκνπνηήζνπκε MySQL:
$ mysqladmin -uroot -p create jobeet
Enter password: mYsEcret ## The password will echo as ********
Πξέπεη λα πνχκε ζην symfony λα ρξεζηκνπνηήζεη απηή ηε βάζε δεδνκέλσλ γηα ην Jobeet project:
$ php symfony configure:database
"mysql:host=localhost;dbname=jobeet" root mYsEcret
Η δηεξγαζία configure:database παίξλεη ηξία arguments: ην PDO DSN, ην username, θαη ην
password γηα ηελ πξφζβαζε ζηε βάζε δεδνκέλσλ.
4.3 Σν ORM
Υάξε ζηελ πεξηγξαθή ηεο βάζεο δεδνκέλσλ απφ ην αξρείν schema.yml, κπνξνχκε λα
ρξεζηκνπνηήζνπκε κεξηθέο δηεξγαζίεο ηνπ Doctrine γηα λα παξάγνπκε ηα SQL statements πνπ
ρξεηάδνληαη γηα λα δεκηνπξγήζνπκε ηα tables ηεο βάζεο δεδνκέλσλ:
Γηα λα παξάγνπκε ην SQL ζα πξέπεη λα δεκηνπξγήζνπκε ηα models από ηα αξρεία schema.
$ php symfony doctrine:build --model
Σώξα κπνξνύκε λα παξάγνπκε θαη λα εηζάγνπκε ην SQL.
$ php symfony doctrine:build -- sql
Η δηεξγαζία doctrine:build - - sql παξάγεη SQL statements ζηνλ θάθειν data/sql/ γηα ηελ κεραλή
ηεο βάζεο δεδνκέλσλ πνπ έρνπκε ξπζκίζεη:
# snippet from data/sql/schema.sql
55
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
CREATE TABLE jobeet_category (id BIGINT AUTO_INCREMENT), name VARCHAR(255)
NOT NULL COMMENT 'test', created_at DATETIME, updated_at DATETIME, slug
VARCHAR(255), UNIQUE INDEX sluggable_idx (slug), PRIMARY KEY(id))
ENGINE = INNODB;
Γηα λα δεκηνπξγήζνπκε ηα tables ζηελ βάζε δεδνκέλσλ πξέπεη λα ηξέμνπκε ηελ δηεξγαζία
doctrine:insert-sql:
$ php symfony doctrine:insert-sql
Σν ORM επίζεο παξάγεη PHP classes πνπ ραξηνγξαθνύλ table records ζε objects:
$ php symfony doctrine:build - - model
Η δηεξγαζία doctrine:build - - model παξάγεη αξρεία PHP ζηνλ θάθειν lib/model/ ηα νπνία
κπνξνχλ λα ρξεζηκνπνηεζνχλ γηα λα αιιειεπηδξάζνπλ κε ηε βάζε δεδνκέλσλ.
Σν Doctrine παξάγεη ηξεηο classes αλά table. Γηα ην jobeet_job table:
 JobeetJob: Έλα αληηθείκελν απηήο ηεο θιάζεο αληηπξνζσπεχεη κία εγγξαθή ηνπ jobeet_job
table. Η θιάζε είλαη άδεηα απφ πξνεπηινγή.
 BaseJobeetJob: Η γνλέαο θιάζε ηνπ JobeetJob.
 JobeetJobTable: Η θιάζε θαζηεξψλεη κεζφδνπο πνπ θπξίσο επηζηξέθνπλ ζπιινγέο απφ
αληηθείκελα JobeetJob. Η θιάζε είλαη άδεηα απφ πξνεπηινγή.
Η ζηήιε values κηαο εγγξαθήο κπνξεί λα ―ρεηξαγσγεζεί‖ (manipulate) κε έλα model object
ρξεζηκνπνηψληαο θάπνηα accessors(get*() methods) θαη mutators(set*()methods):
$job = new JobeetJob();
$job->setPosition('Web developer');
$job->save();
echo $job->getPosition();
$job->delete();
Μπνξνχκε επίζεο λα θαζνξίζνπκε μέλα θιεηδηά απεπζείαο, ζπλδένληαο ηα objects καδί:
$category = new JobeetCategory();
56
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$category->setName('Programming');
$job = new JobeetJob();
$job->setCategory($category);
Η δηεξγαζία doctrine:build - - all είλαη κία ζπληφκεπζε γηα ηηο εξγαζίεο πνπ έρνπλ ήδε ηξέμεη ζε
απηφλ ηνλ ηνκέα. Οπφηε ην ηξέρνπκε γηα λα παξάγνπκε θφξκεο θαη επηθπξσηέο γηα ηα model classes
ηνπ Jobeet:
$php symfony doctrine:build - - all - - no – confirmation
4.5 Σα αξρηθά δεδνκέλα
Σα tables έρνπλ δεκηνπξγεζεί ζηελ βάζε δεδνκέλσλ αιιά δελ έρνπλ θαζφινπ δεδνκέλα κέζα. Γηα
θάζε εθαξκνγή web, ππάξρνπλ ηξεηο ηχπνη δεδνκέλσλ:
 Initial data (αξρηθά δεδνκέλα): Σα αξρηθά δεδνκέλα ρξεηάδνληαη γηα λα ιεηηνπξγήζεη ε
εθαξκνγή.
 Test data (δεδνκέλα ειέγρνπ): Σα δεδνκέλα ειέγρνπ ρξεηάδνληαη γηα λα ειεγρζεί ε
εθαξκνγή.
 User data (δεδνκέλα ρξήζηε): Σα δεδνκέλα ρξήζηε δεκηνπξγνχληαη απφ ηνπο ρξήζηεο θαηά
ηε δηάξθεηα ηεο ―θαλνληθήο δσήο‖ ηεο εθαξκνγήο.
Κάζε θνξά πνπ ην symfony δεκηνπξγεί ηα tables ζηε βάζε δεδνκέλσλ, φια ηα δεδνκέλα ράλνληαη.
Γηα λα ζπκπιεξψζνπκε ηελ βάζε δεδνκέλσλ κε θάπνηα αξρηθά δεδνκέλα, ζα κπνξνχζακε λα
θηηάμνπκε έλα PHP script, ή λα εθηειέζνπκε θάπνηα SQL statements κε ην πξφγξακκα mysql. Με ην
symfony φκσο ππάξρεη θαιχηεξνο ηξφπνο: δεκηνπξγνχκε αξρεία YAML ζηνλ θάθειν data/fixtures/
θαη ρξεζηκνπνηψληαο ηελ δηεξγαζία doctrine:data- load κπνξνχκε λα ηα θνξηψζνπκε κέζα ζηελ
βάζε δεδνκέλσλ.
Πξψηα θηηάρλνπκε ηα αλαπφζπαζηα αξρεία:
# data/fixtures/categories.yml
JobeetCategory:
design:
name: Design
programming:
name: Programming
manager:
name: Manager
administrator:
57
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
name: Administrator
# data/fixtures/jobs.yml
JobeetJob:
job_sensio_labs:
JobeetCategory: programming
type:
company:
logo:
url:
full-time
Sensio Labs
sensio-labs.gif
http://www.sensiolabs.com/
position:
Web Developer
location:
Paris, France
description: |
You've already developed websites with symfony and you want to work
with Open-Source technologies. You have a minimum of 3 years
experience in web development with PHP or Java and you wish to
participate to development of Web 2.0 sites using the best
frameworks available.
how_to_apply: |
Send your resume to fabien.potencier [at] sensio.com
is_public: true
is_activated: true
token:
job_sensio_labs
email:
[email protected]
expires_at: '2010-10-10'
job_extreme_sensio:
JobeetCategory: design
type:
part-time
58
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
company:
logo:
url:
Extreme Sensio
extreme-sensio.gif
http://www.extreme-sensio.com/
position:
Web Designer
location:
Paris, France
description: |
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in.
Voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa
qui officia deserunt mollit anim id est laborum.
how_to_apply: |
Send your resume to fabien.potencier [at] sensio.com
is_public: true
is_activated: true
token:
job_extreme_sensio
email:
[email protected]
expires_at: '2010-10-10'
Έλα αξρείν πξνγξάκκαηνο γξάθεηαη ζε YAML θαη νξίδεη ηα model objects ηα νπνία
επηζεκαίλνληαη κε έλα κνλαδηθφ φλνκα. Η επηζήκαλζε έρεη ζαλ ρξήζε ηελ ζχλδεζε ζπγγελψλ
αληηθεηκέλσλ ρσξίο λα ρξεηάδεηαη λα νξίζνπκε πξσηεχνληα θιεηδηά.
΢ε έλα αξρείν πξνγξάκκαηνο δελ είλαη απαξαίηεην λα νξίζνπκε φιεο ηηο ηηκέο ησλ ζηειψλ κηαο θαη
ην symfony ζα βάιεη ηηο πξνεπηιεγκέλεο ηηκέο, ζε φηη είλαη θελφ, ρξεζηκνπνηψληαο ην ζρέδην ηεο
βάζεο δεδνκέλσλ πνπ έρνπλ νξηζηεί πξνεγνπκέλσο.
59
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Σα αξρηθά δεδνκέλα (initial data) θνξηψλνληαη κέζα ζηελ βάζε δεδνκέλσλ εθηειψληαο ην
παξαθάησ:
$ php symfony doctrine:data-load
Δθηειψληαο ην doctrine:build - - all - - and – load ηα πάληα φπσο, θφξκεο, θίιηξα, κνληέια,
παξάγνληαη απφ ην ζρέδην (schema), ε βάζε δεδνκέλσλ ζα πέζεη, θαη ζα μαλά δεκηνπξγεζνχλ ηα
tables.
$ php symfony doctrine:build - - all - - and – load
4.6 Σα βιέπνπκε ζηελ πξάμε ζηνλ Browser (πεξηεγεηή).
Σψξα ζα κάζνπκε πσο ν web browser κπνξεί λα αιιειεπηδξάζεη κε ηε βάζε δεδνκέλσλ. Όπσο
έρνπκε πεη πην πάλσ, ην symfony project είλαη δεκηνπξγεκέλν απφ εθαξκνγέο (applications). Κάζε
εθαξκνγή δηαηξείηαη ζε ελφηεηεο (modules). Κάζε ελφηεηα απνηειείηαη απφ θψδηθα PHP ν νπνίνο
αληηπξνζσπεχεη έλα ραξαθηεξηζηηθφ ηεο εθαξκνγήο ή έλα ζχλνιν απφ ρεηξηζκνχο πνπ κπνξεί λα
θάλεη ν ρξήζηεο ζε έλα model object.
Σν symfony κπνξεί λα παξάγεη απηφκαηα κηα ελφηεηα (module) γηα έλα model ην νπνίν παξέρεη
βαζηθά ραξαθηεξηζηηθά ρεηξηζκψλ:
$ php symfony doctrine:generate-module --with-show
--non-verbose-templates frontend job JobeetJob
Σν doctrine:generate-module παξάγεη έλα job module ζηελ frontend εθαξκνγή γηα ην JobeetJob
model. Όπσο κε ηα πεξηζζφηεξεο εξγαζίεο ηνπ symfony κεξηθά αξρεία θαη θάθεινη έρνπλ
δεκηνπξγεζεί θάησ απφ ηνλ θάθειν apps/frontend/modules/job/:
Φάθεινο
Πεξηγξαθή
actions/:
Η ελφηεηα ελεξγεηψλ
templates/:
Η ελφηεηα πξφηππα
Σν αξρείν actions/actions.class.php νξίδεη φιεο ηηο δηαζέζηκεο ελέξγεηεο (action) γηα ην Job module:
60
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
΋λνκα ελέξγεηαο
Πεξηγξαθή
Index:
Δκθαλίδεη ηηο εγγξαθέο ηνπ table
Show:
Δκθαλίδεη ηα πεδία θαη ηηο ηηκέο γηα ζπγθεθξηκέλε εγγξαθή
New:
Δκθαλίδεη κία θφξκα γηα ηε δεκηνπξγία κηαο λέαο εγγξαθήο
Create:
Γεκηνπξγεί κία θαηλνχξηα εγγξαθή
Edit:
Δκθαλίδεη κία θφξκα γηα λα γίλεη επεμεξγαζία ζπγθεθξηκέλεο
εγγξαθήο
Update:
Δλεκεξψλεη κία εγγξαθή κε βάζε ηηο ηηκέο πνπ έρεη νξίζεη ν ρξήζηεο
Delete:
Γηαγξάθεη κία ζπγθεθξηκέλε εγγξαθή απφ ην table
Σψξα κπνξνχκε λα ειέγμνπκε ην job module ζηνλ browser:
http://www.jobeet.com.localhost/frontend_dev.php/job
61
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δηθόλα 13: ΢ηελ πξάμε ζηνλ Browser (πεξηεγεηή).
Η ιίζηα πνπ εκθαλίδεηαη παίξλεη ηηο ηηκέο επηινγψλ απφ ηε κέζνδν _toString(). Δάλ ζέινπκε λα
θηηάμνπκε δηθηά καο ιίζηα ζα πξέπεη λα θηηάμνπκε κία κέζνδν _toString() φπσο παξαθάησ:
// lib/model/doctrine/JobeetJob.class.php
class JobeetJob extends BaseJobeetJob
{
public function __toString()
{
return sprintf('%s at %s (%s)', $this->getPosition(), $this->getCompany(), $this>getLocation());
}
}
// lib/model/doctrine/JobeetAffiliate.class.php
class JobeetAffiliate extends BaseJobeetAffiliate
{
public function __toString()
{
return $this->getUrl();
}
62
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.Η Αξρηηεθηνληθή MVC
Η αρχι τθσ αρχιτεκτονικισ του MVC είναι να διαχωρίςει τον κώδικα ςε τρία layers, ςφμφωνα με τθ
φφςθ του. Ο κώδικασ λογικισ δεδομζνων είναι τοποκετθμζνοσ μζςα ςτο model, ο κώδικασ τθσ
παρουςίαςθσ μζςα ςτο view, και θ λογικι τθσ εφαρμογισ μζςα ςτον controller. Άλλα επιπρόςκετα
ςχεδιαςτικά πρότυπα μποροφν να κάνουν τθν εμπειρία του προγραμματιςμοφ ακόμα ευκολότερθ.
Τα επίπεδα model, view και controller μποροφν να υποδιαιρεκοφν περαιτζρω.
 Model : Σα δεδνκέλα καο ή αιιηψο ε επηρεηξεζηαθή ινγηθή ηεο εθαξκνγήο καο
 View : Σν επίπεδν παξνπζίαζεο, δειαδή ην πψο εκθαλίδνληαη ηα απνηειέζκαηα /
δεδνκέλα
 Controller: Η δηεπαθή κε ηνλ ρξήζηε θαη νπζηαζηηθά ε ιεηηνπξγηθφηεηα ηεο
εθαξκνγήο
Εικόνα 14 : Η Αξρηηεθηνληθή MVC.
63
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.1 Σν Layout
Σν layout είλαη έλαο κεραληζκφο ζην symfony ν νπνίνο ιεηηνπξγεί απνηξεπηηθά σο πξνο ην λα
δεκηνπξγεζνχλ επηθαιχςεηο θψδηθα (code duplication). Σν layout απηφ πνπ θάλεη είλαη λα πεξηβάιεη
ην template (πξφηππν) φπσο δείρλεη ε εηθφλα παξαθάησ:
Δηθόλα 15: Σν Layout
Σν πξνεπηιεγκέλν layout κίαο εθαξκνγήο νλνκάδεηαη layout.php θαη βξίζθεηαη ζηνλ θάθειν
/apps/frontend/templates/. Απηφο ν θάθεινο πεξηέρεη φια ηα θαζνιηθά πξφηππα γηα κία εθαξκνγή.
Αληηθαζηζηνχκε ηνλ πξνεπηιεγκέλν layout ηνπ symfony κε ηνλ παξαθάησ θψδηθα:
<!-- apps/frontend/templates/layout.php -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Jobeet - Your best job board</title>
<link rel="shortcut icon" href="/favicon.ico" />
<?php include_javascripts() ?>
<?php include_stylesheets() ?>
</head>
<body>
<div id="container">
<div id="header">
<div class="content">
<h1><a href="<?php echo url_for('job/index') ?>">
<img src="/images/logo.jpg" alt="Jobeet Job Board" />
</a></h1>
<div id="sub_header">
<div class="post">
<h2>Ask for people</h2>
<div>
<a href="<?php echo url_for('job/index') ?>">Post a Job</a>
</div>
</div>
<div class="search">
<h2>Ask for a job</h2>
<form action="" method="get">
<input type="text" name="keywords"
64
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
id="search_keywords" />
<input type="submit" value="search" />
<div class="help">
Enter some keywords (city, country, position, ...)
</div>
</form>
</div>
</div>
</div>
</div>
<div id="content">
<?php if ($sf_user->hasFlash('notice')): ?>
<div class="flash_notice">
<?php echo $sf_user->getFlash('notice') ?>
</div>
<?php endif ?>
<?php if ($sf_user->hasFlash('error')): ?>
<div class="flash_error">
<?php echo $sf_user->getFlash('error') ?>
</div>
<?php endif ?>
<div class="content">
<?php echo $sf_content ?>
</div>
</div>
<div id="footer">
<div class="content">
<span class="symfony">
<img src="/images/jobeet-mini.png" />
powered by <a href="http://www.symfony-project.org/">
<img src="/images/symfony.gif" alt="symfony framework" />
</a>
</span>
<ul>
<li><a href="">About Jobeet</a></li>
<li class="feed"><a href="">Full feed</a></li>
<li><a href="">Jobeet API</a></li>
<li class="last"><a href="">Affiliates</a></li>
</ul>
</div>
</div>
</div>
</body>
</html>
Δάλ αλνίμνπκε ηψξα ην (http://www.jobeet.com.localhost/frontend_dev.php/job) ζα δνχκε φηη φιεο
νη ελέξγεηεο (actions) έρνπλ δηαθνζκεζεί απφ ην layout.
65
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.2 Σα Stylesheet, νη εηθόλεο θαη ηα JavaScript
Η function include_stylesheets() παξάγεη <link> tags γηα ην stylesheet θαη νλνκάδεηαη βνεζφο
(helper). Έλαο helper κπνξεί λα δερηεί παξακέηξνπο θαη λα επηζηξέςεη HTML θψδηθα.
Δηθόλα 16: Σα Stylesheet ηνπ jobeet.
Σν επίπεδν View (View Layer) κπνξεί λα ξπζκηζηεί κε ηελ επεμεξγαζία ηνπ view.yml αξρείνπ ηεο
εθαξκνγήο. Δδψ είλαη ην πξνεπηιεγκέλν πνπ έρεη παξαρζεί απφ ηελ δηεξγαζία generate:app:
# apps/frontend/config/view.yml
default:
http_metas:
content-type: text/html
metas:
#title:
symfony project
66
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
#description: symfony project
#keywords: symfony, project
#language: en
#robots:
index, follow
stylesheets: [main.css]
javascripts: []
has_layout:
layout:
true
layout
5.3 Η αξρηθή ζειίδα ηνπ Job
Η αξρηθή ζειίδα ηεο ζέζεο εξγαζίαο παξάγεηαη απφ ηε δξάζε ηνπ δείθηε (index action) ηεο
ελφηεηαο ζέζε εξγαζίαο. Η δξάζε ηνπ δείθηε είλαη κέξνο ηνπ Controller ηεο ζειίδαο θαη ην
ζπλδεδεκέλν πξφηππν indexSuccess.php, είλαη ην κέξνο ηνπ View:
apps/
frontend/
modules/
job/
actions/
actions.class.php
templates/
indexSuccess.php
5.4 Η δξάζε (action)
Κάζε δξάζε αληηπξνζσπεχεηαη απφ κία κέζνδν κηαο θιάζεο. Γηα ηελ αξρηθή ζειίδα ηεο ζέζεο
εξγαζίαο απηή ε θιάζε είλαη ε jobActions θαη ε κέζνδφο ηεο είλαη ε executeIndex(). Γίλεηαη
αλάθηεζε φισλ ησλ ζέζεσλ εξγαζίαο απφ ηε βάζε δεδνκέλσλ:
// apps/frontend/modules/job/actions/actions.class.php
class jobActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
$this->jobeet_jobs = Doctrine::getTable('JobeetJob')
->createQuery('a')
->execute();
}
// ...
}
67
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Η κέζνδνο executeIndex() θαιεί ην Table JobeetJob γηα λα δεκηνπξγήζεη έλα εξψηεκα γηα λα
επηζηξέςεη φιεο ηηο ζέζεηο εξγαζίαο. Δπηζηξέθεη κία Doctrine_Collection ησλ αληηθεηκέλσλ JobeetJob
ηα νπνία έρνπλ αλαηεζεί ζηελ ηδηνθηεζία ηνπ object jobeet_jobs. Απηνχ ηνπ είδνπο νη ηδηφηεηεο ησλ
αληηθεηκέλσλ πεξλάλε απηφκαηα ζην πξφηππν (ην View). Γηα λα πεξάζνπκε δεδνκέλα απφ ηνλ
Controller ζην View, απιά δεκηνπξγνχκε κία λέα ηδηφηεηα:
public function executeFooBar(sfWebRequest $request)
{
$this->foo = 'bar';
$this->bar = array('bar', 'baz');
}
Ο θψδηθαο ζα θάλεη ηηο κεηαβιεηέο $foo θαη $bar δηαζέζηκεο ζην πξφηππν.
5.5 Σν πξόηππν (template)
Σν πξφηππν indexSuccess.php παξάγεη έλα HTML table γηα φιεο ηηο ζέζεηο εξγαζίαο. Δδψ είλαη ν
θψδηθαο ηνπ πξνηχπνπ:
<!-- apps/frontend/modules/job/templates/indexSuccess.php -->
<?php use_stylesheet('jobs.css') ?>
<h1>Job List</h1>
<table>
<thead>
<tr>
<th>Id</th>
<th>Category</th>
<th>Type</th>
<!-- more columns here -->
<th>Created at</th>
<th>Updated at</th>
</tr>
</thead>
<tbody>
<?php foreach ($jobeet_jobs as $jobeet_job): ?>
<tr>
<td>
<a href="<?php echo url_for('job/show?id='.$jobeet_job->getId()) ?>">
<?php echo $jobeet_job->getId() ?>
</a>
</td>
<td><?php echo $jobeet_job->getCategoryId() ?></td>
<td><?php echo $jobeet_job->getType() ?></td>
<!-- more columns here -->
<td><?php echo $jobeet_job->getCreatedAt() ?></td>
<td><?php echo $jobeet_job->getUpdatedAt() ?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<a href="<?php echo url_for('job/new') ?>">New</a>
68
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
΢ηνλ θψδηθα ηνπ πξνηχπνπ, ην θάζε ζηνηρείν επαλαιακβάλεηαη κέζα απφ ηε ιίζηα ησλ
αληηθεηκέλσλ Job ($jobeet_jobs), θαη γηα θάζε ζέζε εξγαζίαο, θάζε ηηκή κηαο ζηήιεο γίλεηαη έμνδνο.
Η πξφζβαζε ζηελ ηηκή κηαο ζηήιεο γίλεηαη απιά κε ην λα θαινχκε κία κέζνδν εθηίκεζεο ηεο νπνίαο
ην φλνκα μεθηλάεη κε ην get θαη ην φλνκα ηεο ζηήιεο camelCased.
Αο ην μεθαζαξίζνπκε απηφ κε ην λα πξνβάινπκε κφλν έλα ππνζχλνιν απφ ηηο δηαζέζηκεο ζηήιεο:
<!-- apps/frontend/modules/job/templates/indexSuccess.php -->
<?php use_stylesheet('jobs.css') ?>
<div id="jobs">
<table class="jobs">
<?php foreach ($jobeet_jobs as $i => $job): ?>
<tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>">
<td class="location"><?php echo $job->getLocation() ?></td>
<td class="position">
<a href="<?php echo url_for('job/show?id='.$job->getId()) ?>">
<?php echo $job->getPosition() ?>
</a>
</td>
<td class="company"><?php echo $job->getCompany() ?></td>
</tr>
<?php endforeach ?>
</table>
</div>
5.6 Σν πξόηππν ηεο ζειίδαο ηεο ζέζεο εξγαζίαο
Αο πξνζαξκφζνπκε ην πξφηππν ηεο ζειίδαο ηεο ζέζεο εξγαζίαο. Αλνίγνπκε ην αξρείν
showSuccess.php θαη αληηθαζηζηνχκε ην πεξηερφκελν ηνπ κε ηνλ παξαθάησ θψδηθα:
<!-- apps/frontend/modules/job/templates/showSuccess.php -->
<?php use_stylesheet('job.css') ?>
<?php use_helper('Text') ?>
<div id="job">
<h1><?php echo $job->getCompany() ?></h1>
<h2><?php echo $job->getLocation() ?></h2>
<h3>
<?php echo $job->getPosition() ?>
<small> - <?php echo $job->getType() ?></small>
</h3>
<?php if ($job->getLogo()): ?>
<div class="logo">
<a href="<?php echo $job->getUrl() ?>">
<img src="/uploads/jobs/<?php echo $job->getLogo() ?>"
alt="<?php echo $job->getCompany() ?> logo" />
</a>
69
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
</div>
<?php endif ?>
<div class="description">
<?php echo simple_format_text($job->getDescription()) ?>
</div>
<h4>How to apply?</h4>
<p class="how_to_apply"><?php echo $job->getHowToApply() ?></p>
<div class="meta">
<small>posted on <?php echo $job->getDateTimeObject('created_at')->format('m/d/Y')
?></small>
</div>
<div style="padding: 20px 0">
<a href="<?php echo url_for('job/edit?id='.$job->getId()) ?>">
Edit
</a>
</div>
</div>
Απηφ ην πξφηππν ρξεζηκνπνηεί ηελ κεηαβιεηή $job πνπ πεξάζηεθε απφ ηε δξάζε γηα λα πξνβάιεη
ηηο πιεξνθνξίεο γηα ηε ζέζε εξγαζίαο. Καζψο έρνπκε κεηνλνκάζεη ηελ κεηαβιεηή πνπ πεξάζηεθε
ζην πξφηππν απφ ην $jobeet_job ζην $job, ρξεηάδεηαη επίζεο λα γίλεη θαη απηή ε αιιαγή ζηελ δξάζε
πξνβνιήο:
// apps/frontend/modules/job/actions/actions.class.php
public function executeShow(sfWebRequest $request)
{
$this->job = Doctrine::getTable('JobeetJob')-> find($request->getParameter('id'));
$this->forward404Unless($this->job);
}
Παξαηεξνχκε φηη νη ζηήιεο ηεο εκεξνκελίαο κπνξνχλ λα κεηαηξαπνχλ ζε ππνδείμεηο αληηθεηκέλσλ
PHP DateTime. Καζψο έρνπκε θαζνξίζεη ηε ιίζηα created_at ζαλ timestamp, κπνξνχκε λα
κεηαηξέςνπκε ηελ ηηκή ηεο ζηήιεο ζε έλα αληηθείκελν DateTime ρξεζηκνπνηψληαο ηε κέζνδν
getDateTimeObject() θαη ζηε ζπλέρεηα λα θαιέζνπκε ηε κέζνδν format() ε νπνία παίξλεη έλα
δηακνξθσκέλν πξφηππν εκεξνκελίαο ζαλ πξψην ηεο επηρείξεκα (argument):
$job->getDateTimeObject('created_at')->format('m/d/Y');
70
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.7 Slots
Ο ηίηινο φισλ ησλ ζειίδσλ θαζνξίδνληαη ζηελ εηηθέηα <title> ηνπ layout:
Δηθόλα 17: Σν Slots
<title>Jobeet – Your best job board</title>
Αιιά γηα ηε ζειίδα ηεο ζέζεο εξγαζίαο, ζέινπκε λα παξέρνπκε πην ρξήζηκεο πιεξνθνξίεο, φπσο ην
φλνκα ηεο εηαηξείαο θαη ηε ζέζε εξγαζίαο. ΢ην symfony, φηαλ κία δψλε ηνπ layout εμαξηάηαη απφ ην
πξφηππν πνπ πξέπεη λα πξνβιεζεί, πξέπεη λα θαζνξίζνπκε έλα slot:
Πξνζζέηνπκε έλα slot ζην layout γηα λα επηηξέςνπκε λα γίλεη δπλακηθφο ν ηίηινο:
// apps/frontend/templates/layout.php
<title><?php include_slot('title') ?></title>
Κάζε slot θαζνξίδεηαη απφ ην φλνκα (ηίηινο) θαη κπνξεί λα πξνβιεζεί ρξεζηκνπνηψληαο ηνλ helper
include_slot(). Σψξα, ζηελ αξρή ηνπ πξνηχπνπ showSuccess.php, ρξεζηκνπνηνχκε ηνλ helper slot()
γηα λα θαζνξίζνπκε ην πεξηερφκελν ηνπ slot γηα ηελ ζειίδα εξγαζίαο:
// apps/frontend/modules/job/templates/showSuccess.php
<?php slot(
'title',
sprintf('%s is looking for a %s', $job->getCompany(), $job->getPosition()))
?>
71
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δάλ ν ηίηινο είλαη πεξίπινθνο γηα λα παξαρζεί, κπνξεί επίζεο λα ρξεζηκνπνηεζεί ν helper slot() κε
έλα κπινθ απφ θψδηθα:
// apps/frontend/modules/job/templates/showSuccess.php
<?php slot('title') ?>
<?php echo sprintf('%s is looking for a %s', $job->getCompany(), $job->getPosition()) ?>
<?php end_slot() ?>
Γηα θάπνηεο ζειίδεο, φπσο γηα παξάδεηγκα ηελ αξρηθή ζειίδα, ρξεηαδφκαζηε απιά έλαλ γεληθφ
ηίηιν. Αληί λα επαλαιακβάλνπκε ηνλ ίδην ηίηιν μαλά θαη μαλά ζε πξφηππα, κπνξνχκε λα νξίζνπκε
έλαλ πξνεπηιεγκέλν ηίηιν ζην layout:
// apps/frontend/templates/layout.php
<title>
<?php include_slot('title', 'Jobeet - Your best job board') ?>
</title>
Σν δεχηεξν επηρείξεκα ηεο κεζφδνπ include_slot() είλαη ε πξνεπηιεγκέλε ηηκή γηα ην slot εάλ δελ
έρεη πξνθαζνξηζηεί. Δάλ ε πξνεπηιεγκέλε ηηκή είλαη καθξχηεξε ή έρεη θάπνηεο εηηθέηεο HTML
(HTML tags), κπνξνχκε επίζεο λα ην νξίζνπκε κε ηνλ παξαθάησ θψδηθα:
// apps/frontend/templates/layout.php
<title>
<?php if (!include_slot('title')): ?>
Jobeet - Your best job board
<?php endif ?>
</title>
Ο helper include_slot() επηζηξέθεη true εάλ ην slot έρεη νξηζηεί. Έηζη, φηαλ νξίδνπκε ην
πεξηερφκελν ηνπ slot title ζε έλα πξφηππν, ρξεζηκνπνηείηαη απηφ. Δάλ φρη, ηφηε ρξεζηκνπνηείηαη ν
πξνθαζνξηζκέλνο ηίηινο.
72
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.8 Η Γξάζε Σεο ΢ειίδαο Θέζεο Δξγαζίαο
Η ζειίδα ηεο εξγαζίαο παξάγεηαη απφ ηελ δξάζε show (show action), ε νπνία νξίδεηαη ζηε κέζνδν
executeShow() ηεο ελφηεηαο ηεο ζέζεο εξγαζίαο (job module):
class jobActions extends sfActions
{
public function executeShow(sfWebRequest $request)
{
$this->job = Doctrine::getTable('JobeetJob')-> find($request->getParameter('id'));
$this->forward404Unless($this->job);
}
// ...
}
Όπσο θαη ζηε δξάζε ηνπ index (index action), ε θιάζε ηνπ JobeetJob table ρξεζηκνπνηείηαη γηα ηελ
αλάθηεζε κηαο ζέζεο εξγαζίαο, ρξεζηκνπνηψληαο ηελ κέζνδν find(). Η παξάκεηξνο απηήο ηεο
κεζφδνπ, ην κνλαδηθφ αλαγλσξηζηηθφ γηα ηελ εξγαζία, είλαη ην πξσηεχνλ ηεο θιεηδί.
Δάλ ε ζέζε εξγαζίαο δελ ππάξρεη ζηελ βάζε δεδνκέλσλ, ζέινπκε λα πξνσζήζνπκε ηνλ ρξήζηε ζε
κία ζειίδα 404, ην νπνίν είλαη αθξηβψο απηφ πνπ θάλεη ε κέζνδνο forward404unless(). Παίξλεη κία
Boolean ζαλ ην πξψην ηεο επηρείξεκα θαη ζηακαηάεη ηελ ηξέρνπζα ξνή εθηειέζεσλ, εθηφο αλ είλαη
true. Καζψο νη πξνσζεηηθέο κέζνδνη ζηακαηάλε ηελ εθηέιεζε κηαο δξάζεο ακέζσο, δίλνληαο έλα
sfError404Exception, δελ ρξεηάδεηαη λα εκείο λα επηζηξέςνπκε παξ' φια απηά.
Γηα ηηο εμαηξέζεηο, ε ζειίδα πνπ πξνβάιιεηαη ζηνλ ρξήζηε είλαη δηαθνξεηηθή ζην prod environment
θαη ζην dev environment:
5.9 Σν αίηεκα θαη ε απάληεζε
Όηαλ πεξηεγεζνχκε ζηηο ζειίδεο /job ή /job/show/id/1 κέζα απφ ηνλ browser καο, μεθηλνχκε έλα
ηαμίδη κε ηνλ web server. Ο πεξηεγεηήο απνζηέιιεη έλα αίηεκα θαη ν server ζηέιλεη πίζσ κία
απάληεζε.
Σν symfony ελζπιαθψλεη ην αίηεκα ζε έλα αληηθείκελν sfWebRequest θαη θαζψο ην symfony είλαη
έλα αληηθεηκελνζηξαθή framework ε απάληεζε είλαη επίζεο αληηθείκελν, ηεο θιάζεο sfWebResponse.
Μπνξνχκε λα έρνπκε πξφζβαζε ζε έλα αληηθείκελν απάληεζεο ζε κία δξάζε θαιψληαο ην $this>getResponse().
Απηά ηα αληηθείκελα παξέρνπλ πνιιέο θαηάιιειεο κεζφδνπο γηα λα πξνζπειάζνπκε πιεξνθνξίεο
απφ PHP functions θαη PHP θαζνιηθέο κεηαβιεηέο.
73
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.9.1 Σν αίηεκα (Request)
Η θιάζε sfWebRequest θαιχπηεη ηηο θαζνιηθέο ζπζηνηρίεο $_SERVER, $_COOKIE, $_GET,
$_POST, θαη $_FILES PHP:
Method name
PHP equivalent
getMethod():
$_SERVER['REQUEST_METHOD']
getUri():
$_SERVER['REQUEST_URI']
getReferer():
$_SERVER['HTTP_REFERER']
getHost():
$_SERVER['HTTP_HOST']
getLanguages():
$_SERVER['HTTP_ACCEPT_LANGUAGE']
getCharsets():
$_SERVER['HTTP_ACCEPT_CHARSET']
isXmlHttpRequest():
$_SERVER['X_REQUESTED_WITH'] ==
'XMLHttpRequest'
getHttpHeader():
$_SERVER
getCookie():
$_COOKIE
isSecure():
$_SERVER['HTTPS']
getFiles():
$_FILES
getGetParameter():
$_GET
getPostParameter():
$_POST
getUrlParameter():
$_SERVER['PATH_INFO']
getRemoteAddress():
$_SERVER['REMOTE_ADDR']
74
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
5.9.2 Η απάληεζε (Response)
Η θιάζε sfWebResponse θαιχπηεη ηηο κεζφδνπο header() θαη setrawcookie() PHP:
Method name
PHP equivalent
setCookie()
setrawcookie()
setStatusCode()
header()
setHttpHeader()
header()
setContentType()
header()
addVaryHttpHeader()
header()
addCacheControlHttpHeader()
header()
6 Η δξνκνιόγεζε (Routing)
6.1 URLS
΢ε έλα πιαίζην web, έλα URL είλαη έλα κνλαδηθφ πξνζδηνξηζηηθφ κηαο πεγήο web. Όηαλ
πεγαίλνπκε ζε έλα URL, δεηάκε απφ ηνλ browser λα θέξεη κία πεγή πνπ πξνζδηνξίδεηαη απφ απηφ ην
URL. Καζψο ην URL είλαη ε δηεπαθή κεηαμχ ηεο ηζηνζειίδαο θαη ηνπ ρξήζηε, ζα πξέπεη λα
κεηαβηβάζεη ζεκαληηθέο πιεξνθνξίεο γηα ηελ πεγή ζηελ νπνία αλαθέξεηαη.
Σα URL είλαη ηφζν ζεκαληηθά ζην symfony φπνπ έρεη έλα νιφθιεξν framework αθηεξσκέλν ζηελ
δηαρείξηζή ηνπο: ην routing framework. Σν routing δηαρεηξίδεηαη εζσηεξηθά URIs θαη εμσηεξηθά
URLs. Όηαλ έξρεηαη έλα αίηεκα, ην routing αλαιχεη ην URL θαη ην κεηαηξέπεη ζε έλα εζσηεξηθφ
URI.
Δζσηεξηθφ URI ηεο ζειίδαο εξγαζίαο ζην πξφηππν indexSuccess.php:
'job/show?id='.$job->getId()
Ο helper url_for() κεηαηξέπεη απηφ ην εζσηεξηθφ URI ζε έλα θαηάιιειν URL:
/job/show/id/1
Σν εζσηεξηθφ URI απνηειείηαη απφ δηάθνξα κέξε: ην job είλαη ην module, ην show είλαη ην action
θαη ην query string πξνζζέηεη παξακέηξνπο γηα λα πεξάζεη ζηελ δξάζε. Σν γεληθφ πξφηππν γηα ηα
εζσηεξηθά URI είλαη:
75
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
MODULE/ACTION?key=value&key_1=value_1&...
Καζψο ην routing ηνπ symfony είλαη κηα ακθίδξνκε δηεξγαζία, κπνξνχκε λα αιιάμνπκε ηα URLs
ρσξίο λα αιιάμνπκε ηελ ηερληθή εθηέιεζε. Απηφ είλαη έλα απφ ηα θχξηα πιενλεθηήκαηα ην πξφηππν
ζρέδην ηνπ front-controller.
6.2 Ρύζκηζε παξακέηξσλ ηνπ Routing
Η ραξηνγξάθεζε κεηαμχ ησλ εζσηεξηθψλ URI θαη ησλ εμσηεξηθψλ URL γίλεηαη απφ ην αξρείν
ξχζκηζεο παξακέηξσλ routing.yml:
# apps/frontend/config/routing.yml
homepage:
url: /
param: { module: default, action: index }
default_index:
url: /:module
param: { action: index }
default:
url: /:module/:action/*
Σν αξρείν routing.yml πεξηγξάθεη δηαδξνκέο. Μία δηαδξνκή έρεη έλα φλνκα, έλα ππφδεηγκα, θαη
θάπνηεο παξακέηξνπο.
Όηαλ εηζέξρεηαη έλα αίηεκα, ην routing επηρεηξεί λα ηαηξηάμεη έλα ππφδεηγκα ζε έλα δνζέλ URL. Η
πξψηε δηαδξνκή πνπ ηαηξηάδεη θεξδίδεη, νπφηε ε ζεηξά κέζα ζην routing.yml είλαη ζεκαληηθή.
Γηα παξάδεηγκα εάλ ζηείινπκε αίηεκα γηα ηελ ζειίδα /job/show/id/1, ην symfony ζα ηαηξηάμεη ην
ηειεπηαίν ππφδεηγκα: /:module/:action/*. ΢ην ππφδεηγκα, ν αζηεξίζθνο (*) ηαηξηάδεη κία ζπιινγή απφ
δεχγε κεηαβιεηψλ θαη ηηκψλ πνπ δηαρσξίδνληαη κε πιάγηνπο (slashes /):
Request parameter
Value
Module:
job
Action:
show
Id:
1
76
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Σν URL /job/show/id/1 κπνξεί λα δεκηνπξγεζεί απφ έλα πξφηππν ρξεζηκνπνηψληαο ηελ παξαθάησ
θιήζε ζην url_for()helper:
url_for('job/show?id='.$job->getId())
Μπνξνχκε επίζεο λα ρξεζηκνπνηήζνπκε ην φλνκα ηεο δηαδξνκήο βάδνληαο κπξνζηά ην ζχκβνιν
@:
url_for('@default?module=job&action-show&id='.$job->getId())
6.3 Πξνζαξκνγέο ηεο δηαδξνκήο (Route Customizations)
Γηα λα αιιάμνπκε ηε πξνεπηιεγκέλε ζειίδα ζπγραξεηεξίσλ ηνπ symfony ζηελ αξρηθή ζειίδα ηνπ
Jobeet ηξνπνπνηνχκε ηελ κεηαβιεηή module ηεο δηαδξνκήο ηεο αξρηθήο ζειίδαο ζε εξγαζία:
# apps/frontend/config/routing.yml
homepage:
url: /
param: { module: job, action: index }
Σψξα κπνξνχκε λα αιιάμνπκε ηνλ ζχλδεζκν ηνπ ινγνηχπνπ ηνπ Jobeet ζην layout γηα λα
ρξεζηκνπνηήζεη ηε δηαδξνκή ηεο αξρηθήο ζειίδαο:
<!-- apps/frontend/templates/layout.php -->
<h1>
<a href="<?php echo url_for('homepage') ?>">
<img src="/images/logo.jpg" alt="Jobeet Job Board" />
</a>
</h1>
Αο αιιάμνπκε ην URL ηεο ζειίδαο εξγαζίαο ζε θάηη πην ζεκαληηθφ:
/job/sensio-labs/paris-france/1/web-developer
Σν παξαθάησ ππφδεηγκα ηαηξηάδεη ζε έλα ηέηνην URL:
/job/:company/:location/:id/:position
77
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δπεμεξγαδφκαζηε ην αξρείν routing.yml θαη πξνζζέηνπκε ηε δηαδξνκή job_show_user ζηελ αξρή
ηνπ αξρείνπ:
job_show_user:
url: /job/:company/:location/:id/:position
param: { module: job, action: show }
Δάλ αλαλεψζνπκε ηελ αξρηθή ζειίδα ηνπ Jobeet παξαηεξνχκε φηη νη ζχλδεζκνη ζηηο εξγαζίεο δελ
έρνπλ αιιάμεη. Απηφ ζπκβαίλεη δηφηη γηα λα παξάγνπκε κία δηαδξνκή, πξέπεη λα πεξάζνπκε φιεο ηηο
απαηηνχκελεο κεηαβιεηέο. Οπφηε, πξέπεη λα αιιάμνπκε ηελ θιήζε url_for() κέζα ζην
indexSyccess.php ζε:
url_for('job/show?id='.$job->getId().'&company='.$job->getCompany().
'&location='.$job->getLocation().'&position='.$job->getPosition())
Έλα εζσηεξηθφ URI κπνξεί επίζεο λα εθθξαζηεί ζαλ κηα ζπζηνηρία:
url_for(array(
'module' => 'job',
'action' => 'show',
'id'
=> $job->getId(),
'company' => $job->getCompany(),
'location' => $job->getLocation(),
'position' => $job->getPosition(),
))
6.4 Απαηηήζεηο
Σν routing system έρεη έλα ελζσκαησκέλν ραξαθηεξηζηηθφ επηθχξσζεο. Κάζε κεηαβιεηή
ππνδείγκαηνο κπνξεί λα επηθπξσζεί κε κία θαλνληθή έθθξαζε ε νπνία νξίδεηαη ρξεζηκνπνηψληαο ηελ
είζνδν απαηηήζεσλ ελφο νξηζκνχ δηαδξνκήο:
job_show_user:
url: /job/:company/:location/:id/:position
param: { module: job, action: show }
requirements:
id: \d+
78
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
6.5 Route Class
Κάζε δηαδξνκή πνπ έρεη νξηζηεί ζην routing.yml έρεη κεηαηξαπεί εζσηεξηθά ζε αληηθείκελν ηεο
θιάζεο sfRoute. Απηή ε θιάζε κπνξεί λα αιιαρζεί νξίδνληαο κία είζνδν θιάζεο (class entry) ζηνλ
νξηζκφ ηεο δηαδξνκήο.
Γηα λα πεξηνξίζνπκε κία δηαδξνκή λα ηαηξηάμεη γηα ζπγθεθξηκέλεο κεζφδνπο αίηεζεο, κπνξνχκε λα
αιιάμνπκε ηελ θιάζε δηαδξνκή (route class) ζε sfRequestRoute θαη λα πξνζζέζνπκε κία απαίηεζε
γηα ηελ εηθνληθή κεηαβιεηή (virtual variable) sf_method:
job_show_user:
url: /job/:company/:location/:id/:position
class: sfRequestRoute
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [get]
7.6 Object Route Class
Σν λέν εζσηεξηθφ URI γηα κηα εξγαζία είλαη αξθεηά καθξχ θαη θνπξαζηηθφ γηα λα γξαθεί, αιιά
φπσο είδακε, ε route class κπνξεί λα αιιαρζεί. Γηα ηε δηαδξνκή job_show_user, είλαη θαιχηεξν λα
ρξεζηκνπνηήζνπκε ζαλ θιάζε ηελ sfDoctrineRoute θαζψο είλαη βειηηζηνπνηεκέλε γηα δηαδξνκέο πνπ
αληηπξνζσπεχνπλ αληηθείκελα Doctrine ή ζπιινγέο απφ αληηθείκελα Doctrine:
job_show_user:
url:
/job/:company/:location/:id/:position
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [get]
Η θαηαρψξεζε options πξνζαξκφδεη ηελ ζπκπεξηθνξά ηεο δηαδξνκήο. Δδψ, ε επηινγή model
θαζνξίδεη ηελ model class (JobeetJob) πνπ ζρεηίδεηαη κε ηε δηαδξνκή, θαη ε επηινγή type θαζνξίδεη
φηη απηή ε δηαδξνκή είλαη ―δεκέλε‖ ζε έλα αληηθείκελν (object).
79
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Η δηαδξνκή job_show_user γλσξίδεη ηε ζρέζε ηεο κε ην JobeetJob νπφηε θαη κπνξνχκε λα
απινπνηήζνπκε ηελ θιήζε ηνπ helper url_for()|url_for ζε:
url_for(array('sf_route' => 'job_show_user', 'sf_subject' => $job))
ή απιά:
url_for('job_show_user'. $job)
Αλ θνηηάμνπκε ζηα URL πνπ έρνπλ παξαρζεί, αθφκα δελ έρνπλ ηε κνξθή πνπ επηζπκνχκε:
http://www.jobeet.com.localhost/frontend_dev.php/job/Sensio+Labs/Paris%2C+France/1/Web+De
veloper
Πξέπεη λα αιιάμνπκε ηηο ηηκέο ησλ ζηειψλ αληηθαζηζηψληαο φινπο ηνπο κε ASCII ραξαθηήξεο κε
έλα [-]. Αλνίγνπκε ην αξρείν JobeetJob θαη πξνζζέηνπκε ηηο παξαθάησ κεζφδνπο ζηελ θιάζε:
// lib/model/doctrine/JobeetJob.class.php
public function getCompanySlug()
{
return Jobeet::slugify($this->getCompany());
}
public function getPositionSlug()
{
return Jobeet::slugify($this->getPosition());
}
public function getLocationSlug()
{
return Jobeet::slugify($this->getLocation());
}
΢ηε ζπλέρεηα δεκηνπξγνχκε ην αξρείν lib/Jobeet.class.php θαη πξνζζέηνπκε ηελ ίδηα κέζνδν:
// lib/Jobeet.class.php
class Jobeet
{
80
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
static public function slugify($text)
{
// replace all non letters or digits by $text = preg_replace('/\W+/', '-', $text);
// trim and lowercase
$text = strtolower(trim($text, '-'));
return $text;
}
}
Έρνπκε νξίζεη ηξεηο λένπο ―εηθνληθνχο‖ accessors: ηνπο getCompanySlug(), getPositionSlug(), θαη
getLocationSlug(). Οη accessors απηνί επηζηξέθνπλ ηελ αληίζηνηρε ηηκή ηεο ζηήιεο κεηά ηελ
εθαξκνγή ηεο κεζφδνπ slugify(). Σψξα κπνξνχκε λα αληηθαηαζηήζνπκε ηα πξαγκαηηθά νλφκαηα ησλ
ζηειψλ κε απηά ησλ εηθνληθψλ ζηε δηαδξνκή job_show_user:
job_show_user:
url:
/job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [get]
Πιένλ έρνπκε ηα αλακελόκελα URL:
http://www.jobeet.com.localhost/frontend_dev.php/job/sensio-labs/paris-france/1/web-developer
Η δηαδξνκή είλαη ηθαλή λα παξάμεη έλα URL βαζηζκέλν ζε έλα αληηθείκελν, αιιά επίζεο κπνξεί λα
βξεη θαη ην αληηθείκελν πνπ ζρεηίδεηαη ζε έλα δνζκέλν URL. Σν ζπζρεηηζκέλν αληηθείκελν κπνξεί λα
αλαθηεζεί κε ηε κέζνδν getObject() ηνπ route object. Όηαλ αλαιχεη έλα εηζεξρφκελν αίηεκα, ην
routing απνζεθεχεη ην ―ηαηξηαζηφ‖ route object γηα λα ρξεζηκνπνηεζεί ζηηο actions. Οπφηε,
αιιάδνπκε ηε κέζνδν executeShow() γηα λα ρξεζηκνπνηήζεη ην route object λα αλαθηήζεη ην Jobeet
object:
81
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
class jobActions extends sfActions
{
public function executeShow(sfWebRequest $request)
{
$this->job = $this->getRoute()->getObject();
$this->forward404Unless($this->job);
}
// ...
Δάλ πξνζπαζήζνπκε λα πάξνπκε κία εξγαζία κε άγλσζην id, ζα δνχκε κία ζειίδα ζθάικαηνο 404,
αιιά ην κήλπκα ζθάικαηνο ζα έρεη αιιάμεη:
Απηφ ζπκβαίλεη δηφηη ην ζθάικα 404 έρεη ξηρηεί απηφκαηα απφ ηε κέζνδν getRoute(). Οπφηε
κπνξνχκε λα απινπνηήζνπκε ηε κέζνδν executeShow αθφκα πεξηζζφηεξν:
class jobActions extends sfActions
{
public function executeShow(sfWebRequest $request)
{
$this->job = $this->getRoute()->getObject();
}
// ...
}
6.7 Routing ζε Actions θαη ζε Templates
΢ε έλα πξφηππν (template), ν helper url_for() κεηαηξέπεη έλα εζσηεξηθφ URI ζε έλα εμσηεξηθφ
URL. Κάπνηνη άιινη helpers ηνπ symfony επίζεο παίξλνπλ έλα εζσηεξηθφ URI ζαλ argument, φπσο ν
helper link_to() ν νπνίνο παξάγεη κία εηηθέηα <a>:
<?php echo link_to($job->getPosition(), 'job_show_user', $job) ?>
82
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Παξάγεη ηνλ παξαθάησ θώδηθα HTML:
<a href="/job/sensio-labs/paris-france/1/web-developer">Web Developer</a>
Δπίζεο ηα url_for() θαη link_to() κπνξνχλ επίζεο λα παξάγνπλ απφιπηα URL:
url_for('job_show_user', $job, true);
link_to($job->getPosition(), 'job_show_user', $job, true);
Δάλ ζειήζνπκε λα παξαρζεί έλα URL απφ κία action, κπνξνχκε λα ρξεζηκνπνηήζνπκε ηε κέζνδν
generateURL():
$this->redirect($this->generateUrl('job_show_user', $job));
6.8 ΢πιινγή Route Class
Γηα ην job module, έρνπκε ήδε πξνζαξκφζεη ηελ route show action, αιιά ηα URLs γηα ηηο άιιεο
κεζφδνπο (index, new, edit, create, update θαη delete) δηαρεηξίδνληαη αθφκα απφ ηελ πξνεπηιεγκέλε
route:
default:
url: /:module/:action/*
Καζψο φιεο νη job actions ζπζρεηίδνληαη κε ηελ model class JobeetJob, κπνξνχκε εχθνια λα
νξίζνπκε κία route sfDoctrineRoute γηα ηελ θάζε κία φπσο έρνπκε ήδε θάλεη γηα ηελ show action.
Καζψο φκσο ην job module νξίδεη ηηο θιαζζηθέο εθηά πηζαλέο actions γηα έλα model, κπνξνχκε
επίζεο λα ρξεζηκνπνηήζνπκε ηελ class sfDoctrineRouteCollection. Αλνίγνπκε ην αξρείν routing.yml
θαη ην ηξνπνπνηνχκε ψζηε λα δείρλεη σο εμήο:
# apps/frontend/config/routing.yml
job:
class: sfDoctrineRouteCollection
options: { model: JobeetJob }
job_show_user:
url:
/job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show }
83
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
requirements:
id: \d+
sf_method: [get]
# default rules
homepage:
url: /
param: { module: job, action: index }
default_index:
url: /:module
param: { action: index }
default:
url: /:module/:action/*
Η job route παξαπάλσ, είλαη κία ζπληφκεπζε πνπ παξάγεη απηφκαηα ηηο παξαθάησ εθηά
sfDoctrineRoute routes:
job:
url:
/job.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: list }
param: { module: job, action: index, sf_format: html }
requirements: { sf_method: get }
job_new:
url:
/job/new.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: new, sf_format: html }
84
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
requirements: { sf_method: get }
job_create:
url:
/job.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: create, sf_format: html }
requirements: { sf_method: post }
job_edit:
url:
/job/:id/edit.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: edit, sf_format: html }
requirements: { sf_method: get }
job_update:
url:
/job/:id.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: update, sf_format: html }
requirements: { sf_method: put }
job_delete:
url:
/job/:id.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
85
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
param: { module: job, action: delete, sf_format: html }
requirements: { sf_method: delete }
job_show:
url: /job/:id.:sf_format
class: sfDoctrineRoute
options: { model: JobeetJob, type: object }
param: { module: job, action: show, sf_format: html }
requirements: { sf_method: get }
Οη routes job_delete θαη job_update απαηηνχλ κεζφδνπο HTTP νη νπνίεο δελ ππνζηεξίδνληαη απφ
ηνπο browsers. Λεηηνπξγεί φκσο δηφηη ην symfony ηηο εμνκνηψλεη. Αλνίγνπκε ην πξφηππν
the_form.php γηα λα δνχκε έλα παξάδεηγκα:
// apps/frontend/modules/job/templates/_form.php
<form action="..." ...>
<?php if (!$form->getObject()->isNew()): ?>
<input type="hidden" name="sf_method" value="PUT" />
<?php endif; ?>
<?php echo link_to(
'Delete',
'job/delete?id='.$form->getObject()->getId(),
array('method' => 'delete', 'confirm' => 'Are you sure?')
) ?>
Μπνξνχκε λα ―πνχκε‖ ζε φινπο ηνπο symfony helpers λα εμνκνηψζνπλ νπνηαδήπνηε κέζνδν HTTP
πνπ ζέινπκε πεξλψληαο ηελ εηδηθή παξάκεηξν sf_method.
6.9 Απνζθαικάησζε Route (Debugging)
Όηαλ ρξεζηκνπνηνχκε collection routes, είλαη ρξήζηκν λα θαηαγξάθνπκε ηηο routes πνπ έρνπλ
παξαρζεί. Η δηεξγαζία app:routes εμάγεη φιεο ηηο routes γηα κηα ζπγθεθξηκέλε εθαξκνγή:
$ php symfony app:routes frontend
86
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δπίζεο κπνξνχκε λα έρνπκε αξθεηέο πιεξνθνξίεο απνζθαικάησζεο γηα κία route πεξλψληαο ην
φλνκα ηεο ζαλ έλα επηπξφζζεην argument:
$ php symfony app:routes frontend job_edit
6.10 Πξνεπηιεγκέλα Routes
Μηα θαιή πξαθηηθή είλαη ην λα νξίζνπκε δηαδξνκέο γηα φια ηα URLs καο. Καζψο ε job route νξίδεη
φιεο ηηο δηαδξνκέο πνπ ρξεηάδνληαη γηα λα πεξηγξάςνπλ ηελ εθαξκνγή Jobeet, κπνξνχκε λα
αθαηξέζνπκε, ή λα νξίζνπκε ζαλ ζρφιηα, ηηο πξνεπηιεγκέλεο δηαδξνκέο ζην αξρείν ξπζκίζεσο
παξακέηξσλ routing.yml:
# apps/frontend/config/routing.yml
#default_index:
# url: /:module
# param: { action: index }
#default:
# url: /:module/:action/*
7 Σν Doctrine Query Object
Δλψ παξαπάλσ είρακε πεη ζηηο απαηηήζεηο πσο φηαλ έλαο ρξήζηεο εηζέξρεηαη ζην site ζα βιέπεη κία
ιίζηα κφλν κε ηηο ελεξγέο εξγαζίεο, αθφκα εκθαλίδνληαη φιεο νη εξγαζίεο, είηε είλαη ελεξγέο, είηε φρη:
// apps/frontend/modules/job/actions/actions.class.php
class jobActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
$this->jobeet_jobs = Doctrine::getTable('JobeetJob')
->createQuery('a')
->execute();
}
// ...
}
87
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Μία ελεξγή εξγαζία είλαη απηή πνπ έρεη αλαξηεζεί ζε ιηγφηεξν απφ 30 εκέξεο πξηλ. Η κέζνδνο
~Doctrine_Query~::execute() ζα ζηείιεη έλα αίηεκα ζηελ βάζε δεδνκέλσλ. ΢ηνλ παξαπάλσ θψδηθα,
δελ θαζνξίδνπκε θακία θαηάζηαζε γηα ην πνπ, ην νπνίν ζεκαίλεη πσο φιεο νη εγγξαθέο αλαθηνχληαη
απφ ηε βάζε δεδνκέλσλ.
Αο ην αιιάμνπκε γηα λα επηιέγνπκε κόλν ελεξγέο εξγαζίεο:
public function executeIndex(sfWebRequest $request)
{
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.created_at > ?', date('Y-m-d H:i:s', time() - 86400 * 30));
$this->jobeet_jobs = $q->execute();
}
7.1 Απνζθαικαηώλνληαο SQL πνπ δεκηνπξγήζεθε από Doctrine
Καζψο δελ γξάθνπκε ζην ρέξη SQL statements, ην Doctrine ζα αλαιάβεη ηηο δηαθνξέο κεηαμχ ησλ
κεραλψλ ηεο βάζεο δεδνκέλσλ θαη ζα παξάγεη SQL statements βειηηζηνπνηεκέλα γηα ηε κεραλή ηεο
βάζεο δεδνκέλσλ πνπ έρνπκε επηιέμεη. Δίλαη ζπρλά ρξήζηκν λα βιέπνπκε ην SQL πνπ έρεη παξαρζεί
απφ ην Doctrine, γηα παξάδεηγκα, λα θάλνπκε απνζθαικάησζε ζε query πνπ δελ ιεηηνπξγεί φπσο ζα
έπξεπε. ΢ην πεξηβάιινλ dev, ην symfony θαηαγξάθεη απηά ηα queries ζηνλ θάθειν log/. Τπάξρεη έλα
αξρείν θαηαγξαθήο
γηα θάζε ζπλδπαζκφ κηαο εθαξκνγήο θη έλα πεξηβάιινλ. Σν αξρείν πνπ ζέινπκε νλνκάδεηαη
frontend_dev.log:
# log/frontend_dev.log
Dec 04 13:58:33 symfony [info] {sfDoctrineLogger} executeQuery : SELECT
j.id AS j__id, j.category_id AS j__category_id, j.type AS j__type,
j.company AS j__company, j.logo AS j__logo, j.url AS j__url,
j.position AS j__position, j.location AS j__location,
j.description AS j__description, j.how_to_apply AS j__how_to_apply,
j.token AS j__token, j.is_public AS j__is_public,
j.is_activated AS j__is_activated, j.email AS j__email,
j.expires_at AS j__expires_at, j.created_at AS j__created_at,
88
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
j.updated_at AS j__updated_at FROM jobeet_job j
WHERE j.created_at > ? (2008-11-08 01:13:35)
Υάξε ζην symfony web debug toolbar, φιεο νη πιεξνθνξίεο πνπ ρξεηαδφκαζηε είλαη επίζεο
δηαζέζηκεο κέζα ζηνλ browser:
7.2 Object Serialization
Όηαλ ζέινπκε λα θάλνπκε θάηη απηφκαηα πξηλ έλα Doctrine object ζεηξηνπνηεζεί ζηελ βάζε
δεδνκέλσλ, κπνξνχκε λα παξαθάκςνπκε ηε κέζνδν save() ηεο model class:
// lib/model/doctrine/JobeetJob.class.php
class JobeetJob extends BaseJobeetJob
{
public function save(Doctrine_Connection $conn = null)
{
if ($this->isNew() && !$this->getExpiresAt())
{
$now = $this->getCreatedAt() ? $this->getDateTimeObject('created_at')->format('U') : time();
$this->setExpiresAt(date('Y-m-d H:i:s', $now + 86400 * 30));
}
return parent::save($conn);
}
Η κέζνδνο isNew() επηζηξέθεη true φηαλ ην αληηθείκελν δελ έρεη ζεηξηνπνηεζεί αθφκα ζηε βάζε
δεδνκέλσλ, θαη false δηαθνξεηηθά. Αο αιιάμνπκε ηελ action γηα λα ρξεζηκνπνηήζνπκε ηε ζηήιε
expires_at αληί γηα ηε created_at γηα λα επηιέμνπκε ηηο ελεξγέο εξγαζίεο:
public function executeIndex(sfWebRequest $request)
{
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.expires_at > ?', date('Y-m-d H:i:s', time()));
89
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$this->jobeet_jobs = $q->execute();
}
7.3 Πεξηζζόηεξα κε ηα Fixtures
Αλαλεψλνληαο ηελ αξρηθή ζειίδα ηνπ Jobeet ζηνλ browser δελ ζα αιιάμεη ηίπνηα φζν νη εξγαζίεο
ζηε βάζε δεδνκέλσλ έρνπλ αλαξηεζεί κφλν ιίγεο κέξεο πξηλ. Αο αιιάμνπκε ηα fixtures γηα λα
πξνζζέζνπκε κία εξγαζία ε νπνία έρεη ήδε ιήμεη:
# data/fixtures/jobs.yml
JobeetJob:
# other jobs
expired_job:
JobeetCategory: programming
company:
Sensio Labs
position:
Web Developer
location:
Paris, France
description: Lorem ipsum dolor sit amet, consectetur adipisicing elit.
how_to_apply: Send your resume to lorem.ipsum [at] dolor.sit
is_public:
true
is_activated: true
created_at:
'2005-12-01 00:00:00'
token:
job_expired
email:
[email protected]
Η ηηκή ηεο ζηήιεο created_at κπνξεί λα νξηζηεί αθφκα θη αλ έρεη ζπκπιεξσζεί απηφκαηα απφ ην
Doctrine. Η νξηζκέλε ηηκή ζα αληηθαηαζηήζεη ηελ πξνεπηιεγκέλε. Ξαλά θνξηψλνπκε ηα fixtures θαη
αλαλεψλνπκε ηνλ browser γηα λα ζηγνπξεπηνχκε φηη ε παιηά εξγαζία δελ εκθαλίδεηαη:
$ php symfony doctrine:data-load
Μπνξνχκε επίζεο λα εθηειέζνπκε ην παξαθάησ query γηα λα ζηγνπξεπηνχκε φηη ε ζηήιε
expires_at έρεη ζπκπιεξσζεί απηφκαηα απφ ηε κέζνδν save(), βαζηδφκελε ζηελ ηηκή created_at:
SELECT 'position', 'created_at', 'expires_at' FROM 'jobeet_job';
90
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
7.4 Custom Configuration
΢ηε κέζνδν JobeetJob::save(), έρνπκε ζθιεξφ-θσδηθνπνηήζεη ηνλ αξηζκφ ησλ εκεξψλ κέρξη λα
ιήμεη ε εξγαζία. Θα ήηαλ θαιχηεξν λα θάλνπκε ηηο 30 εκέξεο δηακνξθψζηκεο. Σν symfony
framework παξέρεη έλα ελζσκαησκέλν αξρείν ξπζκίζεσο παξακέηξσλ γηα ζπγθεθξηκέλεο ξπζκίζεηο
ηεο application, ην αξρείν app.yml. Απηφ ην αξρείν YAML κπνξεί λα πεξηέρεη νπνηαδήπνηε ξχζκηζε
ζέινπκε:
# apps/frontend/config/app.yml
all:
active_days: 30
΢ηελ εθαξκνγή, νη ξπζκίζεηο απηέο είλαη δηαζέζηκεο κέζα από ηελ θαζνιηθή θιάζε sfConfig:
sfConfig::get('app_active_days')
Η ξχζκηζε έρεη πξνηαρζεί απφ ην app_ δηφηη ε class sfConfig παξέρεη επίζεο πξφζβαζε ζηηο
ξπζκίζεηο ηνπ symfony. Αο ελεκεξψζνπκε ηνλ θψδηθα γηα λα κπεη ζηνλ ινγαξηαζκφ απηή ε λέα
ξχζκηζε:
public function save(Doctrine_Connection $conn = null)
{
if ($this->isNew() && !$this->getExpiresAt())
{
$now = $this->getCreatedAt() ? $this->getDateTimeObject('created_at')->format('U') : time();
$this->setExpiresAt(date('Y-m-d H:i:s', $now + 86400 * sfConfig::get('app_active_days')));
}
return parent::save($conn);
}
91
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
7.5 Refactoring
Ο θψδηθαο Doctrine_Query δελ αλήθεη ζηελ action (Controller layer), αλήθεη ζην Model layer. ΢ην
κνληέιν MVC, ην Model νξίδεη ηελ επηρεηξεκαηηθή ινγηθή, θαη ν Controller θαιεί κφλν ην Model γηα
λα αληιήζεη δεδνκέλα απφ απηφ. Καζψο ν θψδηθαο επηζηξέθεη κία ζπιινγή απφ εξγαζίεο, αο
κεηαθέξνπκε ηνλ θψδηθα ζηελ JobeetJobTable class θαη αο δεκηνπξγήζνπκε κία κέζνδν
getActiveJobs():
// lib/model/doctrine/JobeetJobTable.class.php
class JobeetJobTable extends Doctrine_Table
{
public function getActiveJobs()
{
$q = $this->createQuery('j')
->where('j.expires_at > ?', date('Y-m-d H:i:s', time()));
return $q->execute();
}
}
Σψξα ν action θψδηθαο κπνξεί λα ρξεζηκνπνηήζεη απηή ηε λέα κέζνδν γηα λα αλαθηήζεη ηηο ελεξγέο
εξγαζίεο.
public function executeIndex(sfWebRequest $request)
{
$this->jobeet_jobs = Doctrine_Core::getTable('JobeetJob')->getActiveJobs();
}
Σν refactoring έρεη αξθεηά πιενλεθηήκαηα ζε ζρέζε κε ηνλ πξνεγνύκελν θώδηθα:
 Η ινγηθή ηνπ λα ιακβάλεη ελεξγέο εξγαζίεο ηψξα ππάξρεη ζην Model, εθεί πνπ αλήθεη.
 Ο θψδηθαο ζηνλ controller είλαη ιεπηφηεξνο θαη πην επαλάγλσζηνο.
 Η κέζνδνο getActiveJobs() κπνξεί λα επαλαρξεζηκνπνηεζεί.
 Ο θψδηθαο ηνπ model κπνξεί πιένλ λα δνθηκαζηεί ζηε κνλάδα.
92
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Αο θαηαλείκνπκε ηηο εξγαζίεο θαηά ηε ζηήιε expires_at:
public function getActiveJobs()
{
$q = $this->createQuery('j')
->where('j.expires_at > ?', date('Y-m-d H:i:s', time()))
->orderBy('j.expires_at DESC');
return $q->execute();
}
7.6 Καηεγνξίεο ζηελ Αξρηθή ΢ειίδα
Απφ ηηο απαηηήζεηο ε αξρηθή ζειίδα ζα πξέπεη λα πξνβάιεη ηηο εξγαζίεο αλά θαηεγνξία. Πξψηα,
ρξεηάδεηαη λα θάλνπκε φιεο ηηο θαηεγνξίεο λα έρνπλ ηνπιάρηζηνλ κία ελεξγή εξγαζία.
Αλνίγνπκε ηελ θιάζε JobeetCategoryTable θαη πξνζζέηνπκε ηε κέζνδν getWithJobs():
// lib/model/doctrine/JobeetCategoryTable.class.php
class JobeetCategoryTable extends Doctrine_Table
{
public function getWithJobs()
{
$q = $this->createQuery('c')
->leftJoin('c.JobeetJobs j')
->where('j.expires_at > ?', date('Y-m-d H:i:s', time()));
return $q->execute();
}
}
93
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Αιιάδνπκε ηελ index action:
// apps/frontend/modules/job/actions/actions.class.php
public function executeIndex(sfWebRequest $request)
{
$this->categories = Doctrine_Core::getTable('JobeetCategory')->getWithJobs();
}
΢ην template, ρξεηάδεηαη λα επαλαιάβνπκε κέζα απφ φιεο ηηο θαηεγνξίεο θαη λα πξνβάινπκε ηηο
ελεξγέο εξγαζίεο:
// apps/frontend/modules/job/templates/indexSuccess.php
<?php use_stylesheet('jobs.css') ?>
<div id="jobs">
<?php foreach ($categories as $category): ?>
<div class="category_<?php echo Jobeet::slugify($category->getName()) ?>">
<div class="category">
<div class="feed">
<a href="">Feed</a>
</div>
<h1><?php echo $category ?></h1>
</div>
<table class="jobs">
<?php foreach ($category->getActiveJobs() as $i => $job): ?>
<tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>">
<td class="location">
<?php echo $job->getLocation() ?>
</td>
<td class="position">
94
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
<?php echo link_to($job->getPosition(), 'job_show_user', $job) ?>
</td>
<td class="company">
<?php echo $job->getCompany() ?>
</td>
</tr>
<?php endforeach; ?>
</table>
</div>
<?php endforeach; ?>
</div>
Γηα λα ιεηηνπξγήζεη απηό, ζα πξέπεη λα πξνζζέζνπκε ηε κέζνδν getActiveJobs() ζηελ θιάζε
JobeetCategory:
// lib/model/doctrine/JobeetCategory.class.php
public function getActiveJobs()
{
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.category_id = ?', $this->getId());
return Doctrine_Core::getTable('JobeetJob')->getActiveJobs($q);
}
Η κέζνδνο JobeetCategory::getActiveJobs()ρξεζηκνπνηεί ηελ κέζνδν
Doctrine_core::getTable('JobeetJob')->getActiveJobs() γηα λα αλαθηήζεη ηεο ελεξγέο εξγαζίεο ζε
ζπγθεθξηκέλε θαηεγνξία.
95
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Όηαλ θαινχκε ηελ Doctrine_core::getTable('JobeetJob')->getActiveJobs(), ζέινπκε λα
πεξηνξίζνπκε ηε ζπλζήθε αθφκα πεξηζζφηεξν παξέρνληαο κία θαηεγνξία. Αληί λα πεξάζνπκε ην
category object, έρνπκε επηιέμεη λα πεξάζνπκε έλα Doctrine_Query object θαζψο είλαη ν θαιχηεξνο
ηξφπνο γηα λα ελζπιαθψζνπκε κία γεληθή ζπλζήθε.
Η getActiveJobs() ρξεηάδεηαη λα ελζσκαηψζεη απηφ ην Doctrine_Query object κε ηε δηθηά ηνπ
query. Καζψο ην Doctrine_Query είλαη αληηθείκελν, απηφ είλαη ζρεηηθά απιφ:
// lib/model/doctrine/JobeetJobTable.class.php
public function getActiveJobs(Doctrine_Query $q = null)
{
if (is_null($q))
{
$q = Doctrine_Query::create()
->from('JobeetJob j');
}
$q->andWhere('j.expires_at > ?', date('Y-m-d H:i:s', time()))
->addOrderBy('j.expires_at DESC');
return $q->execute();
}
7.7 Πεξηνξίδνληαο ηα Απνηειέζκαηα
Γηα θάζε θαηεγνξία είπακε, ζέινπκε ηε ιίζηα λα δείρλεη ηηο πξψηεο δέθα εξγαζίεο θη έλα ζχλδεζκν
γηα λα επηηξέπεη λα ηηο εκθαλίδεη φιεο.
Απηό είλαη αξθεηά απιό γηα λα ην πξνζζέζνπκε ζηε κέζνδν getActiveJobs():
// lib/model/doctrine/JobeetCategory.class.php
public function getActiveJobs($max = 10)
{
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.category_id = ?', $this->getId())
96
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
->limit($max);
return Doctrine_Core::getTable('JobeetJob')->getActiveJobs($q);
}
Η θαηάιιειε LIMIT ξήηξα είλαη πιένλ ζθιεξφ-θσδηθνπνηεκέλε κέζα ζην Model, αιιά είλαη
θαιχηεξα απηή ε ηηκή λα είλαη δηακνξθψζηκε. Αιιάδνπκε ην template γηα λα πεξάζεη ηνλ κέγηζην
αξηζκφ απφ εξγαζίεο ζην app.yml:
<!-- apps/frontend/modules/job/templates/indexSuccess.php -->
<?php foreach ($category->getActiveJobs(sfConfig::get('app_max_jobs_on_homepage')) as $i =>
$job): ?>
θαη πξνζζέηνπκε κία θαηλνύξηα ξύζκηζε ζην app.yml:
all:
active_days:
30
max_jobs_on_homepage: 10
7.8 Γπλακηθά Fixtures
Δθηφο θη αλ θαηεβάζνπκε ηε ξχζκηζε max_jobs_on_homepage ζε έλα, δελ ζα δνχκε θακία
δηαθνξά. Θα πξέπεη λα πξνζζέζνπκε έλα ζσξφ απφ εξγαζίεο ζην fixture. Σα αξρεία YAML κπνξνχλ
λα πεξηέρνπλ PHP θψδηθα ν νπνίνο ζα αμηνινγεζεί πξηλ ην πέξαζκα ηνπ αξρείν. Δπεμεξγαδφκαζηε ην
fixture αξρείν jobs.yml θαη πξνζζέηνπκε ηνλ παξαθάησ θψδηθα ζην ηέινο ηνπ:
# Starts at the beginning of the line (no whitespace before)
<?php for ($i = 100; $i <= 130; $i++): ?>
job_<?php echo $i ?>:
JobeetCategory: programming
company:
Company <?php echo $i."\n" ?>
position:
Web Developer
location:
Paris, France
description: Lorem ipsum dolor sit amet, consectetur adipisicing elit.
how_to_apply: |
Send your resume to lorem.ipsum [at] company_<?php echo $i ?>.sit
97
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
is_public: true
is_activated: true
token:
job_<?php echo $i."\n" ?>
email:
[email protected]
<?php endfor ?>
΋ηαλ πξνζζέηνπκε PHP θώδηθα ζε έλα αξρείν YAML, ζα πξέπεη λα πξνζέρνπκε ηα
παξαθάησ:
 Σα <?php?> statements ζα πξέπεη πάληα λα μεθηλάλε ηε γξακκή ή λα είλαη ελζσκαησκέλα ζε
κία ηηκή.
 Δάλ έλα <?php?> statement ηειεηψλεη κία γξακκή, ζα πξέπεη λα εμάγνπκε κία λέα γξακκή
(“\n”)
Σψξα κπνξνχκε λα μαλά θνξηψζνπκε ηα fixtures κε ηελ δηεξγαζία doctrine:data-load θαη λα δνχκε
αλ εκθαλίδνληαη κφλν 10 εξγαζίεο ζηελ αξρηθή ζειίδα γηα ηελ θαηεγνξία Programming. ΢ην
παξαθάησ screenshot, έρνπκε αιιάμεη ηνλ κέγηζην αξηζκφ εξγαζηψλ ζε πέληε γηα λα θάλνπκε ηελ
εηθφλα κηθξφηεξε:
7.9 Αζθαιίδνληαο ηε ΢ειίδα Θέζεο Δξγαζίαο
Όηαλ κία εξγαζία ιήγεη, αθφκα θη αλ γλσξίδνπκε ην URL, δελ ζα πξέπεη λα είλαη πξνζβάζηκε.
/frontend_dev.php/job/sensio-labs/paris-france/ID/web-developer-expired
Αληί λα πξνβάιιεηαη ε εξγαζία, ζα πξέπεη λα πξνσζνχκε ηνλ ρξήζηε ζε κία ζειίδα 404.
# apps/frontend/config/routing.yml
job_show_user:
url:
/job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options:
model: JobeetJob
type: object
method_for_query: retrieveActiveJob
param: { module: job, action: show }
98
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
requirements:
id: \d+
sf_method: [GET]
Η κέζνδνο retrieveActiveJob() ζα ιάβεη ην Doctrine_Query object πνπ δεκηνπξγήζεθε από ηελ
route:
// lib/model/doctrine/JobeetJobTable.class.php
class JobeetJobTable extends Doctrine_Table
{
public function retrieveActiveJob(Doctrine_Query $q)
{
$q->andWhere('a.expires_at > ?', date('Y-m-d H:i:s', time()));
return $q->fetchOne();
}
// ...
Σψξα εάλ πξνζπαζήζνπκε λα πάξνπκε κία ιεγκέλε εξγαζία, ζα πξνσζεζνχκε ζε κία ζειίδα 404.
8 Η Καηεγνξία Route
Πξψηα, ζα πξέπεη λα πξνζζέζνπκε κία δηαδξνκή γηα λα νξίζνπκε έλα φκνξθν URL γηα ηελ ζειίδα
ησλ θαηεγνξηψλ. Σν πξνζζέηνπκε ζηελ αξρή ηνπ αξρείνπ routing:
# apps/frontend/config/routing.yml
category:
url:
/category/:slug
class: sfDoctrineRoute
param:
{ module: category, action: show }
options: { model: JobeetCategory, type: object }
Μία δηαδξνκή κπνξεί λα ρξεζηκνπνηήζεη νπνηαδήπνηε ζηήιε ζαλ παξάκεηξν απφ ηα ζπζρεηηζκέλα
αληηθείκελά ηεο. Μπνξεί επίζεο λα ρξεζηκνπνηήζεη νπνηαδήπνηε άιιε ηηκή εάλ ππάξρεη
ζπζρεηηζκέλνο accessor ν νπνίνο έρεη νξηζηεί ζηελ object class. Δπεηδή ε παξάκεηξνο slug δελ έρεη
αληίζηνηρε ζηήιε ζην category table, ζα πξέπεη λα πξνζζέζνπκε έλαλ εηθνληθφ accessor ζηε
JobeetCategory γηα λα θάλνπκε ηε δηαδξνκή λα ιεηηνπξγήζεη:
// lib/model/doctrine/JobeetCategory.class.php
public function getSlug()
{
99
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
return Jobeet::slugify($this->getName());
}
8.1 Ο ΢ύλδεζκνο ηεο Καηεγνξίαο
Σψξα, αο επεμεξγαζηνχκε ην template indexSuccess.php ηνπ module job γηα λα πξνζζέζνπκε ηνλ
ζχλδεζκν ζηελ ζειίδα category:
<!-- some HTML code -->
<h1>
<?php echo link_to($category, 'category', $category) ?>
</h1>
<!-- some HTML code -->
</table>
<?php if (($count = $category->countActiveJobs() sfConfig::get('app_max_jobs_on_homepage')) > 0): ?>
<div class="more_jobs">
and <?php echo link_to($count, 'category', $category) ?>
more...
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
Πξνζζέηνπκε ηνλ ζχλδεζκν απηφλ κφλν εάλ ππάξρνπλ παξαπάλσ απφ 10 εξγαζίεο ζηε
ζπγθεθξηκέλε θαηεγνξία γηα λα πξνβιεζνχλ. Ο ζχλδεζκνο πεξηέρεη ηνλ αξηζκφ ησλ εξγαζηψλ πνπ
δελ πξνβάιινληαη. Γηα λα ιεηηνπξγήζεη ην ζπγθεθξηκέλν template, ζα πξέπεη λα πξνζζέζνπκε ηε
κέζνδν countActiveJobs() ζην JobeetCategory:
// lib/model/doctrine/JobeetCategory.class.php
public function countActiveJobs()
{
100
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.category_id = ?', $this->getId());
return Doctrine_Core::getTable('JobeetJob')->countActiveJobs($q);
}
Η κέζνδνο countActiveJobs() ρξεζηκνπνηεί κία κέζνδν countActiveJobs() ε νπνία δελ ππάξρεη
αθφκα ζην JobeetJobTable. Αληηθαζηζηνχκε ην πεξηερφκελν ηνπ αξρείνπ JobeetJobTable.php κε ηνλ
παξαθάησ θψδηθα:
// lib/model/doctrine/JobeetJobTable.class.php
class JobeetJobTable extends Doctrine_Table
{
public function retrieveActiveJob(Doctrine_Query $q)
{
return $this->addActiveJobsQuery($q)->fetchOne();
}
public function getActiveJobs(Doctrine_Query $q = null)
{
return $this->addActiveJobsQuery($q)->execute();
}
public function countActiveJobs(Doctrine_Query $q = null)
{
return $this->addActiveJobsQuery($q)->count();
}
public function addActiveJobsQuery(Doctrine_Query $q = null)
{
101
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
if (is_null($q))
{
$q = Doctrine_Query::create()
->from('JobeetJob j');
}
$alias = $q->getRootAlias();
$q->andWhere($alias . '.expires_at > ?', date('Y-m-d H:i:s', time()))
->addOrderBy($alias . '.created_at DESC');
return $q;
}
}
΢ηε κέζνδν countActiveJobs() αληί λα ρξεζηκνπνηνχκε ην execute() θαη χζηεξα λα κεηξάκε ηνλ
αξηζκφ ησλ απνηειεζκάησλ, έρνπκε ρξεζηκνπνηήζεη ηελ πην γξήγνξε count() κέζνδν.
Έρνπκε αιιάμεη αξθεηά αξρεία, απιά γηα απηφ ην απιφ ραξαθηεξηζηηθφ. Αιιά θάζε θνξά πνπ
έρνπκε πξνζζέζεη θάπνηνλ θψδηθα, έρνπκε πξνζπαζήζεη λα ηνλ ηνπνζεηήζνπκε ζην ζσζηφ layer ηεο
εθαξκνγήο θαζψο θαη λα ηνλ θάλνπκε λα είλαη επαλαρξεζηκνπνηήζηκνο. ΢ηελ επεμεξγαζία έρνπκε
ήδε αλαδηαξζξψζεη θάπνηνλ ήδε ππάξρνληα θψδηθα. Απηή είλαη κία ηππηθή ξνή εξγαζίαο φηαλ
εξγαδφκαζηε κε ην symfony project.
8.2 Γεκηνπξγία Category Module ηεο Θέζεο Δξγαζίαο
Γεκηνπξγία ηνπ category module:
$ php symfony generate:module frontend category
Όηαλ έρνπκε πξφζβαζε ζηελ category page, ε category route ζα πξέπεη λα βξεη ηελ θαηεγνξία πνπ
ζπλδέεηαη κε ηελ αηηνχζα slug variable. Καζψο ην slug δελ απνζεθεχεηαη κέζα ζηε βάζε δεδνκέλσλ,
θαη επεηδή δελ κπνξνχκε λα αλάγνπκε ην φλνκα ηεο θαηεγνξίαο απφ ην slug, δελ ππάξρεη ηξφπνο λα
βξνχκε ηελ θαηεγνξία πνπ ζπλδέεηαη κε ην slug.
8.3 Δλεκέξσζε ηεο Βάζεο Γεδνκέλσλ
Θα πξέπεη λα πξνζζέζνπκε έλα slug column γηα ην category table: Μία Doctrine behavior πνπ
νλνκάδεηαη Sluggable κπνξεί λα ―πξνζέρεη‖ απηφ ην slug column. Απιά ζα πξέπεη λα
ελεξγνπνηήζνπκε ηε behavior ζην JobeetCategory model θαη απηφ ζα ην αλαιάβεη γηα εκάο.
102
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
# config/doctrine/schema.yml
JobeetCategory:
actAs:
Timestampable: ~
Sluggable:
fields: [name]
columns:
name:
type: string(255)
notnull: true
Σώξα πνπ ην slug είλαη πξαγκαηηθό column, ζα πξέπεη λα αθαηξέζνπκε ηε κέζνδν getSlyug()
από ην JobeetCategory.
Υξεζηκνπνηνχκε ηελ δηεξγαζία doctrine:build - - all - -and – load γηα λα ελεκεξψζνπκε ηα tables
ηεο βάζεο δεδνκέλσλ κε ηα fixtures:
$ php symfony doctrine:build - - all - - and – load - - no – confirmation
Σψξα είλαη φια έηνηκα γηα λα δεκηνπξγήζνπκε ηε κέζνδν executeShow(). Αληηθαζηζηνχκε ην
πεξηερφκελν απφ ην αξρείν ησλ category actions κε ηνλ παξαθάησ θψδηθα:
// apps/frontend/modules/category/actions/actions.class.php
class categoryActions extends sfActions
{
public function executeShow(sfWebRequest $request)
{
$this->category = $this->getRoute()->getObject();
}
}
103
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Σν ηειεπηαίν βήκα είλαη λα δεκηνπξγήζνπκε ην template showSuccess.php:
// apps/frontend/modules/category/templates/showSuccess.php
<?php use_stylesheet('jobs.css') ?>
<?php slot('title', sprintf('Jobs in the %s category', $category->getName())) ?>
<div class="category">
<div class="feed">
<a href="">Feed</a>
</div>
<h1><?php echo $category ?></h1>
</div>
<table class="jobs">
<?php foreach ($category->getActiveJobs() as $i => $job): ?>
<tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>">
<td class="location">
<?php echo $job->getLocation() ?>
</td>
<td class="position">
<?php echo link_to($job->getPosition(), 'job_show_user', $job) ?>
</td>
<td class="company">
<?php echo $job->getCompany() ?>
</td>
</tr>
<?php endforeach; ?>
</table>
104
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
8.4 Partials
Όηαλ ζέινπκε λα επαλαρξεζηκνπνηήζνπκε έλα κέξνο ελφο template, ζα πξέπεη λα δεκηνπξγήζνπκε
έλα partial. Σν partial είλαη έλα απφζπαζκα απφ θψδηθα template ην νπνίν κπνξεί λα δηακνηξαζηεί ζε
δηάθνξα templates. Σν partial είλαη αθφκα έλα template πνπ μεθηλάεη κε ηελ θάησ παχια (_).
Γεκηνπξγνύκε ην αξρείν _list.php:
// apps/frontend/modules/job/templates/_list.php
<table class="jobs">
<?php foreach ($jobs as $i => $job): ?>
<tr class="<?php echo fmod($i, 2) ? 'even' : 'odd' ?>">
<td class="location">
<?php echo $job->getLocation() ?>
</td>
<td class="position">
<?php echo link_to($job->getPosition(), 'job_show_user', $job) ?>
</td>
<td class="company">
<?php echo $job->getCompany() ?>
</td>
</tr>
<?php endforeach; ?>
</table>
Μπνξνύκε λα ζπκπεξηιάβνπκε έλα partial ρξεζηκνπνηώληαο ηνλ helper include_partial():
<?php include_partial('job/list', array('jobs' => $jobs)) ?>
Σν πξψην argument ηνπ include_partial() είλαη ην φλνκα ηνπ partial, θαη ην δεχηεξν argument είλαη
ζπζηνηρία απφ κεηαβιεηέο πνπ ζα πεξάζνπλ ζην partial.
105
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Αληηθαζηζηνύκε ηνλ θώδηθα HTML <table> θη από ηα δύν templates κε ηελ θιήζε ηνπ
include_partial():
// in apps/frontend/modules/job/templates/indexSuccess.php
<?php include_partial('job/list', array('jobs' => $category>getActiveJobs(sfConfig::get('app_max_jobs_on_homepage')))) ?>
// in apps/frontend/modules/category/templates/showSuccess.php
<?php include_partial('job/list', array('jobs' => $category->getActiveJobs())) ?>
8.5 ΢ειηδνπνίεζε ηεο Λίζηαο
Γηα λα γίλεη ε ζειηδνπνίεζε κηαο ιίζηαο απφ Doctrine objects, ην symfony παξέρεη κία αθηεξσκέλε
class: sfDoctrinePager. ΢ηελ category action, αληί λα πεξάζνπκε ηα job objects ζην showSuccess
template, πεξλάκε έλα pager:
// apps/frontend/modules/category/actions/actions.class.php
public function executeShow(sfWebRequest $request)
{
$this->category = $this->getRoute()->getObject();
$this->pager = new sfDoctrinePager(
'JobeetJob',
sfConfig::get('app_max_jobs_on_category')
);
$this->pager->setQuery($this->category->getActiveJobsQuery());
$this->pager->setPage($request->getParameter('page', 1));
$this->pager->init();
}
106
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
O sfDoctrinePager constructor παίξλεη έλα model class θαη ηνλ κέγηζην αξηζκφ απφ αληηθείκελα γηα
λα επηζηξέςεη αλά ζειίδα. Πξνζζέηνπκε ηελ ηειεπηαία ηηκή ζην αξρείν ξχζκηζεο παξακέηξσλ:
# apps/frontend/config/app.yml
all:
active_days:
30
max_jobs_on_homepage: 10
max_jobs_on_category: 20
Η κέζνδνο sfDoctrinePager::setQuery() παίξλεη έλα Doctrine_Query object γηα λα
ρξεζηκνπνηήζεη όηαλ επηιέγνληαη αληηθείκελα από ηε βάζε δεδνκέλσλ.
Πξνζζέηνπκε ηε κέζνδν getActiveJobsQuery():
// lib/model/doctrine/JobeetCategory.class.php
public function getActiveJobsQuery()
{
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.category_id = ?', $this->getId());
return Doctrine_Core::getTable('JobeetJob')->addActiveJobsQuery($q);
}
Σψξα πνπ έρνπκε νξίζεη ηε κέζνδν getActiveJobsQuery(), κπνξνχκε λα αλαδηαξζξψζνπκε άιιεο
κεζφδνπο JobeetCategory γηα λα ηηο ρξεζηκνπνηήζνπκε:
// lib/model/doctrine/JobeetCategory.class.php
public function getActiveJobs($max = 10){
$q = $this->getActiveJobsQuery()
->limit($max);
return $q->execute();
}
public function countActiveJobs()
{
return $this->getActiveJobsQuery()->count();}
107
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Σέινο, αο ελεκεξώζνπκε ην template:
<!-- apps/frontend/modules/category/templates/showSuccess.php -->
<?php use_stylesheet('jobs.css') ?>
<?php slot('title', sprintf('Jobs in the %s category', $category->getName())) ?>
<div class="category">
<div class="feed">
<a href="">Feed</a>
</div>
<h1><?php echo $category ?></h1>
</div>
<?php include_partial('job/list', array('jobs' => $pager->getResults())) ?>
<?php if ($pager->haveToPaginate()): ?>
<div class="pagination">
<a href="<?php echo url_for('category', $category) ?>?page=1">
<img src="/images/first.png" alt="First page" title="First page" />
</a>
<a href="<?php echo url_for('category', $category) ?>?page=<?php echo $pager>getPreviousPage() ?>">
<img src="/images/previous.png" alt="Previous page" title="Previous page" />
</a>
<?php foreach ($pager->getLinks() as $page): ?>
<?php if ($page == $pager->getPage()): ?>
<?php echo $page ?>
<?php else: ?>
<a href="<?php echo url_for('category', $category) ?>?page=<?php echo $page
?>"><?php echo $page ?></a>
<?php endif; ?>
<?php endforeach; ?>
108
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
<a href="<?php echo url_for('category', $category) ?>?page=<?php echo $pager>getNextPage() ?>">
<img src="/images/next.png" alt="Next page" title="Next page" />
</a>
<a href="<?php echo url_for('category', $category) ?>?page=<?php echo $pager>getLastPage() ?>">
<img src="/images/last.png" alt="Last page" title="Last page" />
</a>
</div>
<?php endif; ?>
<div class="pagination_desc">
<strong><?php echo count($pager) ?></strong> jobs in this category
<?php if ($pager->haveToPaginate()): ?>
- page <strong><?php echo $pager->getPage() ?>/<?php echo $pager->getLastPage()
?></strong>
<?php endif; ?>
</div>
Σν πεξηζζφηεξν κέξνο ηνπ θψδηθα απηνχ αζρνιείηαη κε ηνπο ζπλδέζκνπο ζε άιιεο ζειίδεο. Δδψ
είλαη ε ιίζηα κε ηηο κεζφδνπο sfDoctrinePager πνπ ρξεζηκνπνηνχληαη ζε απηφ ην template:
 getResulats(): Δπηζηξέθεη έλα array απφ Doctrine objects γηα ηε ζπγθεθξηκέλε ζειίδα.
 getNbResults(): Δπηζηξέθεη ην ζπλνιηθφ αξηζκφ ησλ απνηειεζκάησλ.
 haveToPaginate(): Δπηζηξέθεη true εάλ ππάξρνπλ παξαπάλσ απφ κία ζειίδα.
 getLinks(): Δπηζηξέθεη κία ιίζηα απφ ζπλδέζκνπο ζειίδαο γηα λα ηνπο πξνβάιιεη.
 getPage(): Δπηζηξέθεη ηνλ αξηζκφ ηεο ηξέρνπζαο ζειίδαο.
 getPreviousPage(): Δπηζηξέθεη ηνλ αξηζκφ ηεο πξνεγνχκελεο ζειίδαο.
 getNextPage(): Δπηζηξέθεη ηνλ αξηζκφ ηεο επφκελεο ζειίδαο.
 GetLastPage(): Δπηζηξέθεη ηνλ αξηζκφ ηεο ηειεπηαίαο ζειίδαο.
109
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Καζψο ην sfDoctrinePager πινπνηεί ηηο δηεπαθέο Iterator θαη Countable, κπνξνχκε λα
ρξεζηκνπνηήζνπκε ηελ function count() γηα λα πάξνπκε ηνλ αξηζκφ ησλ απνηειεζκάησλ αληί γηα ηε
κέζνδν getNbResults().
9 Έιεγρνη ζην Symfony
Τπάξρνπλ δχν δηαθνξεηηθά είδε απηνκαηνπνηεκέλσλ ηεζη ζην symfony: unit tests | Unit Testing
θαη functional tests.
Σα unit tests επαιεζεχνπλ φηη ε θάζε method θαη function ιεηηνπξγεί θαλνληθά. Σν θάζε ηεζη ζα
πξέπεη λα είλαη φζν αλεμάξηεην γίλεηαη απφ ηα άιια.
Απφ ηελ άιιε, ηα functional ηεζη επαιεζεχνπλ ην φηη ε εθαξκνγή ησλ απνηειεζκάησλ
ζπκπεξηθέξεηαη ζσζηά.
Όια ηα ηεζη ζην symfony βξίζθνληαη θάησ απφ ηνλ θάθειν test/ ηνπ project. ΢πκπεξηιακβάλεη δχν
ππφ-θαθέινπο, έλαλ γηα ηα unit tests (test/unit/) θη έλα γηα ηα functional tests (test/functional/).
9.1 Έιεγρνη Μνλάδαο
9.1.1 Σν lime Testing Framework
Όια ηα unit tests πνπ έρνπλ γξαθηεί κε ην lime framework μεθηλνχλ κε ηνλ ίδην θψδηθα:
require_once dirname(__FILE__).'/../bootstrap/unit.php';
$t = new lime_test(1);
Πξψηα ην bootstrap αξρείν unit.php ζπκπεξηιακβάλεηαη γηα λα αξρηθνπνηήζεη θάπνηα πξάγκαηα.
Έπεηηα δεκηνπξγείηαη έλα θαηλνχξην lime_test object θαη νη αξηζκνί ησλ ειέγρσλ πνπ ζρεδηάζηεθαλ
λα ιαλζαξηζηνχλ πεξλάλε ζαλ argument.
Ο έιεγρνο πξαγκαηνπνηείηαη κε ηελ θιήζε κίαο κεζφδνπ ε κίαο function κε έλα ζχλνιν απφ
πξνθαζνξηζκέλεο εηζφδνπο θαη ζηε ζπλέρεηα κε ηε ζχγθξηζε ησλ απνηειεζκάησλ κε ηελ
αλακελφκελε έμνδν. Απηή ε ζχγθξηζε θαζνξίδεη ην εάλ ν έιεγρνο πεξλάεη ε απνηπγράλεη.
110
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Γηα λα δηεπθνιύλνπκε ηε ζύγθξηζε, ην lime_test object παξέρεη αξθεηέο κεζόδνπο:
Method
Πεξηγξαθή
ok($test):
Διέγρεη κία ζπλζήθε θαη πεξλάεη εάλ είλαη true
is($value1, $value2):
΢πγθξίλεη δχν ηηκέο θαη πεξλάεη εάλ είλαη ίζεο (==)
isnt($value1, $value2):
΢πγθξίλεη δχν ηηκέο θαη πεξλάεη εάλ είλαη άληζεο
like($string, $regexp):
Διέγρεη έλα string ελάληηα ζε κία θαλνληθή
έθθξαζε
unlike($string, $regexp):
Διέγρεη εάλ έλα string δελ ηαηξηάδεη κε κία
θαλνληθή έθθξαζε
is_deeply($array1, $array2):
Διέγρεη εάλ ηα δχν arrays έρνπλ ηηο ίδηεο ηηκέο
Σν lime_test object παξέρεη επίζεο άιιεο θαηάιιειεο κεζόδνπο:
Μέζνδνο
Πεξηγξαθή
fail():
Πάληα απνηπγράλεη
pass():
Πάληα πεξλάεη
skip($msg. $nb_tests):
Μεηξάεη θαζψο ην $nb_tests ειέγρεη
todo():
Μεηξάεη ζαλ έλαο έιεγρνο
9.2 Δθηειώληαο Διέγρνπο Μνλάδαο
Γηα λα επεμεγήζνπκε ην unit testing, ζα ειέγμνπκε ην Jobeet class.
Γεκηνπξγνχκε έλα αξρείν ειέγρνπ /unit/JobeetTest.php θαη αληηγξάθνπκε κέζα ηνπ ηνλ παξαθάησ
θψδηθα:
// test/unit/JobeetTest.php
require_once dirname(__FILE__).'/../bootstrap/unit.php';
$t = new lime_test(1);
$t->pass('This test always passes.');
111
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Για να ηπέξοςμε ηοςρ ελέγσοςρ, μποπούμε να εκηελέζοςμε ηο απσείο:
$ php test/unit/JobeetTest.php
Ή να σπηζιμοποιήζοςμε ηην διεπγαζία test:unit:
$ php symfony test:unit Jobeet
9.4 Διέγρνληαο ην slugify
Αληηθαζηζηνχκε ην πεξηερφκελν ηνπ αξρείνπ ειέγρνπ κε ηνλ παξαθάησ θψδηθα:
// test/unit/JobeetTest.php
require_once dirname(__FILE__).'/../bootstrap/unit.php';
$t = new lime_test(6);
$t->is(Jobeet::slugify('Sensio'), 'sensio');
$t->is(Jobeet::slugify('sensio labs'), 'sensio-labs');
$t->is(Jobeet::slugify('sensio labs'), 'sensio-labs');
$t->is(Jobeet::slugify('paris,france'), 'paris-france');
$t->is(Jobeet::slugify(' sensio'), 'sensio');
$t->is(Jobeet::slugify('sensio '), 'sensio');
Παξαηεξνύκε όηη ε θάζε γξακκή ειέγρεη κόλν έλα πξάγκα.
Μπνξνχκε ηψξα λα εθηειέζνπκε ην αξρείν ειέγρνπ. Δάλ πεξάζνπλ φινη νη έιεγρνη, ζα δνχκε έλα
―green bar‖ δηαθνξεηηθά ην ―red bar‖ ζα καο εηδνπνηήζεη φηη θάπνηνη έιεγρνη δελ πέξαζαλ θαη ζα
πξέπεη λα ηα δηνξζψζνπκε.
Δάλ απνηχρεη έλαο έιεγρνο, ε έμνδνο ζα καο δψζεη θάπνηεο πιεξνθνξίεο γηα ηνλ ιφγν γηα ηνλ νπνίν
απέηπρε.
112
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Όιεο νη κέζνδνη ησλ lime test παίξλνπλ έλα string ζαλ ην ηειεπηαίν ηνπο argument ην νπνίν
εμππεξεηεί ζαλ ηελ πεξηγξαθή ηνπ ειέγρνπ. Δίλαη πνιχ βνιηθφ θαζψο καο σζεί ζην λα πεξηγξάςνπκε
ζην ηη αθξηβψο ειέγρνπκε. Μπνξεί επίζεο λα εμππεξεηήζεη ζαλ κία κνξθή ηεθκεξίσζεο γηα ηελ
αλακελφκελε ζπκπεξηθνξά ηεο κεζφδνπ. Πξνζζέηνπκε κεξηθά κελχκαηα ζην αξρείν ειέγρνπ slugify:
require_once dirname(__FILE__).'/../bootstrap/unit.php';
$t = new lime_test(6);
$t->comment('::slugify()');
$t->is(Jobeet::slugify('Sensio'), 'sensio', '::slugify() converts all characters to lower case');
$t->is(Jobeet::slugify('sensio labs'), 'sensio-labs', '::slugify() replaces a white space by a -');
$t->is(Jobeet::slugify('sensio labs'), 'sensio-labs', '::slugify() replaces several white spaces by a
single -');
$t->is(Jobeet::slugify(' sensio'), 'sensio', '::slugify() removes - at the beginning of a string');
$t->is(Jobeet::slugify('sensio '), 'sensio', '::slugify() removes - at the end of a string');
$t->is(Jobeet::slugify('paris,france'), 'paris-france', '::slugify() replaces non-ASCII characters by a
-');
Σν string ηεο πεξηγξαθήο ειέγρνπ είλαη έλα πνιύηηκν εξγαιείν όηαλ πξνζπαζνύκε λα
θαηαιάβνπκε ην ηη λα ειέγμνπκε.
9.5 Πξνζζέηνληαο Διέγρνπο γηα Καηλνύξηα Υαξαθηεξηζηηθά
To slug γηα έλα άδεην string είλαη έλα άδεην string. Αιιά έλα άδεην string ζε έλα URL δελ είλαη
θαιή ηδέα. Αο αιιάμνπκε ηελ κέζνδν slugify() έηζη ψζηε λα επηζηξέθεη ην string ―n-a‖ ζηελ
πεξίπησζε πνπ ππάξρεη άδεην string.
Μπνξνύκε λα γξάςνπκε ηνλ έιεγρν πξώηα, έπεηηα λα ελεκεξώζνπκε ηε κέζνδν, ή θαη
αληίζηξνθα.
$t->is(Jobeet::slugify(''), 'n-a', '::slugify() converts the empty string to n-a');
Απηή ε κεζνδνινγία αλάπηπμεο φπνπ γξάθνπκε πξψηα ηνπο ειέγρνπο θαη ζηε ζπλέρεηα
εθαξκφδνπκε ηα ραξαθηεξηζηηθά, είλαη γλσζηή σο Test Driven Development (TDD).
113
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δπεμεξγαδόκαζηε ηελ Jobeet class θαη πξνζζέηνπκε ηελ παξαθάησ ζπλζήθε ζηελ αξρή:
// lib/Jobeet.class.php
static public function slugify($text)
{
if (empty($text))
{
return 'n-a';
} // ..
9.6 Έιεγρνη Doctrine ηεο Μνλάδαο
9.6.1 Ρύζκηζε Παξακέηξσλ ηεο Βάζεο Γεδνκέλσλ
Ο έιεγρνο ηεο κνλάδαο ζε έλα Doctrine model class είλαη ιίγν πην πνιχπινθν θαζψο απαηηεί κία
ζχλδεζε βάζεο δεδνκέλσλ. Θα δεκηνπξγήζνπκε κία εηδηθή βάζε δεδνκέλσλ γηα ηνπο ειέγρνπο:
$ php symfony configure:database --name=doctrine --class=sfDoctrineDatabase --env=test
"mysql:host=localhost;dbname=jobeet_test" root mYsEcret
Η επηινγή env ιέεη ζηελ δηεξγαζία φηη νη ξπζκίζεηο ηεο βάζεο δεδνκέλσλ είλαη κφλν γηα ην
πεξηβάιινλ ηνπ ειέγρνπ.
Δθφζνλ ξπζκίζακε ηελ βάζε δεδνκέλσλ, κπνξνχκε λα ηελ θάλνπκε bootstrap ρξεζηκνπνηψληαο ηε
δηεξγαζία doctrine:insert-sql:
$ mysqladmin -uroot -pmYsEcret create jobeet_test
$ php symfony doctrine:insert-sql –env=test
9.7 Έιεγρνο Γεδνκέλσλ
Σψξα πνπ έρνπκε ηελ εηδηθή βάζε δεδνκέλσλ γηα ηνπο ειέγρνπο, ρξεηαδφκαζηε έλαλ ηξφπν γηα λα
θνξηψζνπκε κεξηθά δεδνκέλα ειέγρνπ.
Η δηεξγαζία doctrine:data-load εζσηεξηθά ηεο ρξεζηκνπνηεί ηε κέζνδν Doctrine_Core::loadData()
γηα λα θνξηψζεη ηα δεδνκέλα:
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
114
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Η κέζνδνο loadData() παίξλεη ζαλ πξψην ηεο argument έλαλ θάθειν ή έλα αξρείν. Μπνξεί επίζεο
λα πάξεη έλα array απφ θαθέινπο θαη/ή αξρεία.
Γηα ηνπο ειέγρνπο ζα βάινπκε ηα fixtures κέζα ζηνλ θάθειν test/fixtures/. Απηά ηα fixtures ζα
ρξεζηκνπνηεζνχλ γηα ην Doctrine unit θαη ηνπο ιεηηνπξγηθνχο ειέγρνπο.
Αληηγξάθνπκε ηα αξρεία απφ ηνλ θάθειν data/fixtures ζηνλ θάθειν test/fixtures/
9.8 Διέγρνληαο ην JobeetJob
Θα δεκηνπξγήζνπκε θάπνηνπο ειέγρνπο κνλάδαο γηα ηελ model class JobeetJob.
Καζψο φινη νη Doctrine έιεγρνη κνλάδαο ζα μεθηλνχλ κε ηνλ ίδην θψδηθα, δεκηνπξγνχκε έλα αξρείν
Doctrine.php ζηνλ test θάθειν bootstrap/ κε ηνλ παξαθάησ θψδηθα:
// test/bootstrap/Doctrine.php
include(dirname(__FILE__).'/unit.php');
$configuration = ProjectConfiguration::getApplicationConfiguration( 'frontend', 'test', true);
new sfDatabaseManager($configuration);
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
Σν script είλαη απηνλόεην:
 Γηα ηνπο front controllers, αξρηθνπνηνχκε έλα configuration object γηα ην test environment:
 $configuration = ProjectConfiguration::getApplicationConfiguration( 'frontend', 'test',
true);
 Γεκηνπξγνχκε έλαλ δηαρεηξηζηή βάζεο δεδνκέλσλ. Αξρηθνπνηεί ηελ ζχλδεζε Doctrine
θνξηψλνληαο ην αξρείν databases.yml
 new sfDatabaseManager($configuration);
 Φνξηψλνπκε ηα δεδνκέλα ειέγρνπ ρξεζηκνπνηψληαο ην Doctrine_Core::loadData():
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
Σψξα κπνξνχκε λα μεθηλήζνπκε ηνπο ειέγρνπο ζην JobeetJob class.
Αξρηθά δεκηνπξγνύκε ην αξρείν JobeetJobTest.php ζηνλ θάθειν test/unit/model:
// test/unit/model/JobeetJobTest.php
include(dirname(__FILE__).'/../../bootstrap/Doctrine.php');
$t = new lime_test(1);
115
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
΢ηε ζπλέρεηα πξνζζέηνπκε έλαλ έιεγρν ζηε κέζνδν getCompanySlug():
$t->comment('->getCompanySlug()');
$job = Doctrine_Core::getTable('JobeetJob')->createQuery()->fetchOne();
$t->is($job->getCompanySlug(),
return the slug for the company');
Jobeet::slugify($job->getCompany()),
'->getCompanySlug()
Παξαηεξνχκε φηη ειέγρνπκε κφλν ηε κέζνδν getCompanySlug() θαη φρη εάλ ην slug είλαη ζσζηφ ή
φρη θαζψο απηφ ην έρνπκε ήδε ειέγμεη θάπνπ αιινχ. Η γξαθή ησλ ειέγρσλ γηα ηε κέζνδν save() είλαη
ιίγν πην πεξίπινθε:
$t->comment('->save()');
$job = create_job();
$job->save();
$expiresAt = date('Y-m-d', time() + 86400 * sfConfig::get('app_active_days'));
$t->is($job->getDateTimeObject('expires_at')->format('Y-m-d'), $expiresAt, '->save() updates
expires_at if not set');
$job = create_job(array('expires_at' => '2008-08-08'));
$job->save();
$t->is($job->getDateTimeObject('expires_at')->format('Y-m-d'), '2008-08-08', '->save() does not
update expires_at if set');
function create_job($defaults = array())
{
static $category = null;
if (is_null($category))
{
$category = Doctrine_Core::getTable('JobeetCategory')
->createQuery()
->limit(1)
->fetchOne();
}
116
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$job = new JobeetJob();
$job->fromArray(array_merge(array(
'category_id' => $category->getId(),
'company'
=> 'Sensio Labs',
'position'
=> 'Senior Tester',
'location'
=> 'Paris, France',
'description' => 'Testing is fun',
'how_to_apply' => 'Send e-Mail',
'email'
=> '[email protected]',
'token'
=> rand(1111, 9999),
'is_activated' => true,
), $defaults));
return $job;
}
9.9 Harness Έιεγρσλ Μνλάδαο
Η δηεξγαζία test:unit κπνξεί λα ρξεζηκνπνηεζεί γηα λα πξαγκαηνπνηεζνχλ φια ηα unit tests ζε έλα
project:
$ php symfony test:unit
Η έμνδνο ηεο δηεξγαζίεο καο δείρλεη έλα ν έιεγρνο πεξλάεη ή φρη:
10 Λεηηνπξγηθνί Διέγρνη
Σα functional tests είλαη έλα θαιφ εξγαιείν γηα ηνλ έιεγρν ηεο εθαξκνγήο απφ άθξε ζε άθξε: απφ
ην request πνπ έγηλε απφ έλαλ browser κέρξη ην response πνπ απέζηεηιε ν server. Διέγρνπλ φια ηα
layers κηαο εθαξκνγήο: ην routing, ην model, ηηο actions, θαη ηα templates.
117
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
10.1 Σν sfBrowser
΢ην symfony, ηα functional tests ηξέρνπλ κέζα απφ έλαλ εηδηθφ browser, πνπ εθηειείηαη κέζα απφ
ηε sfBrowser class. Δλεξγεί ζαλ έλαλ πξνζαξκνζκέλν browser γηα ηελ εθαξκνγή καο ν νπνίνο είλαη
θαη ζπλδεδεκέλνο καδί ηεο, ρσξίο ηελ αλάγθε γηα έλαλ web server. Μαο δίλεη πξφζβαζε ζε φια ηα
symfony objects πξηλ θαη κεηά ηελ αίηεζε, δίλνληαο καο ηελ επθαηξία λα ηα εμεηάζεη θαη λα θάλεη
ηνπο ειέγρνπο πνπ ζέινπκε πξνγξακκαηηζηηθά.
Σν sfBrowser παξέρεη κεζόδνπο νη νπνίεο εμνκνηώλνπλ ηελ πεξηήγεζε πνπ γίλεηαη ζε έλαλ
θιαζηθό browser:
Method
Description
get():
Λακβάλεη έλα URL
post():
Σνπνζεηεί ζε έλα URL
call():
Καιεί έλα URL
back():
Πάεη κία ζειίδα πίζσ
forward():
Πάεη κία ζειίδα κπξνζηά
reload():
Φνξηψλεη μαλά ηελ ηξέρνπζα ζειίδα
click():
Κάλεη θιηθ ζε έλα link ή έλα button
select():
Δπηιέγεη έλα radiobutton ή έλα checkbox
deselect():
Απνεπηιέγεη έλα radiobutton ή έλα checkbox
restart():
Δπαλεθθηλεί ηνλ browser
Μεξηθά ρξήζηκα παξαδείγκαηα από ηηο κεζόδνπο sfBrowser:
$browser = new sfBrowser();
$browser->
get('/')->
click('Design')->
get('/category/programming?page=2')->
get('/category/programming', array('page' => 2))->
118
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
post('search', array('keywords' => 'php'));
Σν sfBrowser πεξηέρεη επηπξφζζεηεο κεζφδνπο γηα λα ξπζκίδνπλ ηε ζπκπεξηθνξά ηνπ browser:
Method
Description
setHttpHeader():
Ορίζει έναν HTTP header
setAuth():
Ορίζει τα βασικά πιστοποιητικά επικύρωσης
setCookie():
Ορίζει ένα cookie
removeCookie():
Αυαιρεί ένα cookie
clearCookies():
Καθαρίζει όλα τα cookies
followRedirect():
Ακολοσθεί ένα redirect
10.2 Η θιάζε sfTestFunctional
Έρνπκε έλαλ browser, αιιά ρξεηαδφκαζηε έλαλ ηξφπν γηα λα εμεηάζεη ηα symfony objects ηα νπνία
ζα θάλνπλ ηνλ πξαγκαηηθφ έιεγρν.
Οη test methods παξέρνληαη απφ κία άιιε class, ε sfTestFunctional πνπ παίξλεη κία ππφδεημε
sfBrowser κέζα ζηνλ constructor. Η class sfTestFunctional αλαζέηεη ηνπο ειέγρνπο ζε tester objects.
Αξθεηνί ειεγθηέο ζπλνδεχνληαη κε ην symfony, αιιά επίζεο κπνξνχκε λα δεκηνπξγήζνπκε ηνπο
δηθνχο καο.
Σα functional tests φπσο έρνπκε δεη απνζεθεχνληαη θάησ απφ ηνλ θάθειν test/functional/. Γηα ην
Jobeet, νη έιεγρνη βξίζθνληαη ζηνλ ππφ-θάθειν test/functional/frontend/ θαζψο θάζε εθαξκνγή έρεη
ηνλ δηθφ ηεο ππφ-θάθειν. Απηφο ν θάθεινο πεξηέρεη ήδε δχν αξρεία: ην categoryActionsTest.php, θαη
ην jobActionsTest.php θαζψο φιεο νη δηεξγαζίεο δεκηνπξγνχλ έλα module απηφκαηα δεκηνπξγνχλ έλα
βαζηθφ αξρείν functional test:
// test/functional/frontend/categoryActionsTest.php
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new sfTestFunctional(new sfBrowser());
$browser->
get('/category/index')->
with('request')->begin()->
isParameter('module', 'category')->
isParameter('action', 'index')->
119
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
end()->
with('response')->begin()->
isStatusCode(200)->
checkElement('body', '!/This is a temporary page/')->
end()
;
Οη methods ηνπ sfBrowser θαη sfTestFunctional εθαξκφδνπλ κία ―ξεπζηή‖ δηεπαθή επηζηξέθνληαο
πάληα ην $this. Μαο επηηξέπεη λα ―αιπζνδέζνπκε‖ ηα method calls γηα θαιχηεξε αμηνπηζηία. Σν
παξαπάλσ απφζπαζκα είλαη ηζνδχλακν κε ην:
// test/functional/frontend/categoryActionsTest.php
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new sfTestFunctional(new sfBrowser());
$browser->get('/category/index');
$browser->with('request')->begin();
$browser->isParameter('module', 'category');
$browser->isParameter('action', 'index');
$browser->end();
$browser->with('response')->begin();
$browser->isStatusCode(200);
$browser->checkElement('body', '!/This is a temporary page/');
$browser->end();
Οη έιεγρνη ηξέρνπλ κέζα ζε έλα tester block context. Έλα tester block context μεθηλάεη κε ην ('
TESTER NAME ') -> begin() θαη ηειεηψλεη κε ην end():
$browser->
with('request')->begin()->
isParameter('module', 'category')->
isParameter('action', 'index')->
end();
120
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Ο θώδηθαο ειέγρεη εάλ ην module πνπ αηηείηαη παξάκεηξν ηζνύηαη κε ην category θαη εάλ ην
action ηζνύηαη κε ην index.
10.3 Ο ειεγθηήο ηνπ αηηήκαηνο (Request Tester)
Ο request tester παξέρεη κεζφδνπο ειεγθηή γηα λα απηφ-ειεγρζεί θαη λα ειέγμεη ην sfWebRequest
object:
Method
Description
isParameter():
Διέγρεη ηελ ηηκή ηεο παξακέηξνπ ελφο αηηήκαηνο
isFormat():
Διέγρεη ηε δηακφξθσζε ελφο αηηήκαηνο
isMethod():
Διέγρεη ηε κέζνδν
hasCookie():
Διέγρεη εάλ ην αίηεκα έρεη έλα cookie κε ην φλνκα
isCookie():
Διέγρεη ηελ ηηκή ελφο cookie
10.4.Ο ειεγθηήο ηεο Απάληεζεο (Response Tester)
Τπάξρεη επίζεο κία θιάζε απαληεηηθνχ ειεγθηή πνπ παξέρεη κεζφδνπο ειεγθηή απέλαληη ζην
sfWebResponse object:
Method
Description
checkElement():
Διέγρεη έλαο απαληεηηθφο επηινγέαο CSS ηαηξηάδεη κε θάπνηα θξηηήξηα
checkForm():
Διέγρεη έλα sfForm form object
debug():
Σππψλεη ηελ έμνδν ηεο απάληεζεο γηα λα δηεπθνιχλεη ηελ απνζθαικάησζε
matches():
Διέγρεη ηελ απάληεζε απέλαληη ζε έλα regexp
isHeader():
Διέγρεη ηελ ηηκή ελφο header
isStatusCode():
Διέγρεη ηνλ θψδηθα ηεο θαηάζηαζεο ηεο απάληεζεο
isRedirected():
Διέγρεη εάλ ε ηξέρνπζα απάληεζε είλαη αλαθαηεχζπλζε
isValid():
Διέγρεη εάλ ε απάληεζε είλαη θαιά ζπγθξνηεκέλε
121
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
10.5 Δθηειώληαο Λεηηνπξγηθνύο Διέγρνπο
Όπσο θαη γηα ηα unit tests, ηα functional tests κπνξνχλ λα ηξέμνπλ εθηειψληαο θαηεπζείαλ ην
αξρείν ειέγρνπ:
$ php test/functional/frontend/categoryActionsTest.php
Ή ρξεζηκνπνηώληαο ηε δηεξγαζία test:functional
$ php symfony test:functional frontend categoryActions
10.6 Έιεγρνο Γεδνκέλσλ
Όπσο θαη ζηα Doctrine unit tests, ζα πξέπεη λα θνξηψζνπκε δεδνκέλα ειέγρνπ θάζε θνξά πνπ
ηξέρνπκε έλα functional test. Μπνξνχκε λα επαλαρξεζηκνπνηήζνπκε ηνλ θψδηθα πνπ έρνπκε γξάςεη
πξνεγνπκέλσο:
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new sfTestFunctional(new sfBrowser());
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
Σν λα θνξηψζνπκε δεδνκέλα ζε έλα functional test είλαη ιίγν πην εχθνιν απφ φηη ζε έλα unit test
θαζψο ε βάζε δεδνκέλσλ έρεη ήδε αξρηθνπνηεζεί απφ ην bootstrapping script.
Όπσο θαη ζηα unit tests, δελ ζα αληηγξάςνπκε θαη ζα επηθνιιήζνπκε απηφ ην απφζπαζκα απφ
θψδηθα ζε θάζε αξρείν ειέγρνπ, αιιά ζα δεκηνπξγήζνπκε ηελ δηθηά καο functional class ε νπνία
―θιεξνλνκεί‖ απφ ην sfTestFunctional:
// lib/test/JobeetTestFunctional.class.php
class JobeetTestFunctional extends sfTestFunctional
{
public function loadData()
{
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
return $this;
}
}
122
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
10.7 Γξάθνληαο Λεηηνπξγηθνύο Έιεγρνπο
Θα θάλνπκε έιεγρν ηεο αξρηθήο ζειίδαο ηνπ Jobeet επεμεξγάδνληαο ην αξρείν ειέγρνπ
JobActionsTest.php. Αληηθαζηζηνχκε ηνλ θψδηθα κε ηνλ παξαθάησ:
10.8 Οη ιεγκέλεο εξγαζίεο δελ εκθαλίδνληαη
// test/functional/frontend/jobActionsTest.php
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new JobeetTestFunctional(new sfBrowser());
$browser->loadData();
$browser->info('1 - The homepage')->
get('/')->
with('request')->begin()->
isParameter('module', 'job')->
isParameter('action', 'index')->
end()->
with('response')->begin()->
info(' 1.1 - Expired jobs are not listed')->
checkElement('.jobs td.position:contains("expired")', false)->
end()
;
Όπσο θαη κε ην lime, έλα κήλπκα πιεξνθνξίαο κπνξεί λα εηζαρζεί θαιψληαο ηε κέζνδν info() γηα
λα γίλεη ε έμνδνο πην επαλάγλσζηε. Γηα λα επαιεζεχζνπκε ηνλ απνθιεηζκφ ησλ ιεγκέλσλ εξγαζηψλ
απφ ηελ αξρηθή ζειίδα, ειέγρνπκε φηη ν CSS επηινγέαο .jobs td.position:contains(“expired”) δελ
ηαηξηάδεη πνπζελά ζην HTML απαληεηηθφ πεξηερφκελν. Όηαλ ην δεχηεξν argument απφ ηελ κέζνδν
checkElement() είλαη Boolean, ε κέζνδνο ειέγρεη ηελ χπαξμε θφκβσλ πνπ λα ηαηξηάδνπλ κε ηνλ CSS
επηινγέα.
123
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
10.9 Μόλν n Θέζεηο Δξγαζίαο Δκθαλίδνληαη γηα κία Καηεγνξία
Πξνζζέηνπκε ηνλ παξαθάησ θψδηθα ζην ηέινο ηνπ αξρείνπ ειέγρνπ:
// test/functional/frontend/jobActionsTest.php
$max = sfConfig::get('app_max_jobs_on_homepage');
$browser->info('1 - The homepage')->
get('/')->
info(sprintf(' 1.2 - Only %s jobs are listed for a category', $max))->
with('response')->
checkElement('.category_programming tr', $max)
;
10.10 Μία Καηεγνξία έρεη έλαλ ΢ύλδεζκν ζηελ ΢ειίδα Καηεγνξηώλ Μόλν όηαλ ππάξρνπλ
πνιιέο Θέζεηο Δξγαζίαο
// test/functional/frontend/jobActionsTest.php
$browser->info('1 - The homepage')->
get('/')->
info(' 1.3 - A category has a link to the category page only if too many jobs')->
with('response')->begin()->
checkElement('.category_design .more_jobs', false)->
checkElement('.category_programming .more_jobs')->
end()
;
124
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
10.11 Οη Θέζεηο Δξγαζίαο Σαμηλνκνύληαη αλά Ηκεξνκελία
$q = Doctrine_Query::create()
->select('j.*')
->from('JobeetJob j')
->leftJoin('j.JobeetCategory c')
->where('c.slug = ?', 'programming')
->andWhere('j.expires_at > ?', date('Y-m-d', time()))
->orderBy('j.created_at DESC');
$job = $q->fetchOne();
$browser->info('1 - The homepage')->
get('/')->
info(' 1.4 - Jobs are sorted by date')->
with('response')->begin()->
checkElement(sprintf('.category_programming tr:first a[href*="/%d/"]', $job->getId()))->
end();
Θα κεηαθέξνπκε ηνλ θψδηθα ζηελ JobeetTestFunctional class πνπ έρνπκε δεκηνπξγήζεη. Απηή ε
class ιεηηνπξγεί ζαλ Domain Specific ιεηηνπξγηθή ειεγθηηθή θιάζε γηα ην Jobeet:
// lib/test/JobeetTestFunctional.class.php
class JobeetTestFunctional extends sfTestFunctional
{
public function getMostRecentProgrammingJob()
{
$q = Doctrine_Query::create()
->select('j.*')
->from('JobeetJob j')
->leftJoin('j.JobeetCategory c')
->where('c.slug = ?', 'programming');
125
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$q = Doctrine_Core::getTable('JobeetJob')->addActiveJobsQuery($q);
return $q->fetchOne(); }
// ...
Μπνξνύκε ηώξα λα αληηθαηαζηήζνπκε ηνλ πξνεγνύκελν θώδηθα ειέγρνπ κε ηνλ παξαθάησ:
// test/functional/frontend/jobActionsTest.php
$browser->info('1 - The homepage')->
get('/')->
info(' 1.4 - Jobs are sorted by date')->
with('response')->begin()->
checkElement(sprintf('.category_programming tr:first a[href*="/%d/"]',
$browser->getMostRecentProgrammingJob()->getId()))->
end()
;
10.12 Κάζε Θέζε Δξγαζίαο ζηελ Αξρηθή ΢ειίδα κπνξεί λα παηεζεί
$job = $browser->getMostRecentProgrammingJob();
$browser->info('2 - The job page')->
get('/')->
info(' 2.1 - Each job on the homepage is clickable and give detailed information')->
click('Web Developer', array(), array('position' => 1))->
with('request')->begin()->
isParameter('module', 'job')->
isParameter('action', 'show')->
isParameter('company_slug', $job->getCompanySlug())->
isParameter('location_slug', $job->getLocationSlug())->
isParameter('position_slug', $job->getPositionSlug())->
isParameter('id', $job->getId())->
end();
126
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Παξαθάησ, παξνπζηάδεηαη φινο ν θψδηθαο πνπ ρξεηάδεηαη γηα λα ειέγμεη ηελ εξγαζία θαη ηηο
ζειίδεο ησλ θαηεγνξηψλ:
// lib/test/JobeetTestFunctional.class.php
class JobeetTestFunctional extends sfTestFunctional
{
public function loadData()
{
Doctrine_Core::loadData(sfConfig::get('sf_test_dir').'/fixtures');
return $this;
}
public function getMostRecentProgrammingJob()
{
$q = Doctrine_Query::create()
->select('j.*')
->from('JobeetJob j')
->leftJoin('j.JobeetCategory c')
->where('c.slug = ?', 'programming');
$q = Doctrine_Core::getTable('JobeetJob')->addActiveJobsQuery($q);
return $q->fetchOne();
}
public function getExpiredJob()
{
$q = Doctrine_Query::create()
->from('JobeetJob j')
->where('j.expires_at < ?', date('Y-m-d', time()));
return $q->fetchOne();
}
}
127
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
// test/functional/frontend/jobActionsTest.php
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new JobeetTestFunctional(new sfBrowser());
$browser->loadData();
$browser->info('1 - The homepage')->
get('/')->
with('request')->begin()->
isParameter('module', 'job')->
isParameter('action', 'index')->
end()->
with('response')->begin()->
info(' 1.1 - Expired jobs are not listed')->
checkElement('.jobs td.position:contains("expired")', false)->
end();
$max = sfConfig::get('app_max_jobs_on_homepage');
$browser->info('1 - The homepage')->
info(sprintf(' 1.2 - Only %s jobs are listed for a category', $max))->
with('response')->
checkElement('.category_programming tr', $max);
$browser->info('1 - The homepage')->
get('/')->
info(' 1.3 - A category has a link to the category page only if too many jobs')->
with('response')->begin()->
checkElement('.category_design .more_jobs', false)->
checkElement('.category_programming .more_jobs')->
end();
$browser->info('1 - The homepage')->
info(' 1.4 - Jobs are sorted by date')->
with('response')->begin()->
checkElement(sprintf('.category_programming tr:first a[href*="/%d/"]', $browser>getMostRecentProgrammingJob()->getId()))->
end();
$job = $browser->getMostRecentProgrammingJob();
$browser->info('2 - The job page')->
get('/')->
info(' 2.1 - Each job on the homepage is clickable and give detailed information')->
click('Web Developer', array(), array('position' => 1))->
with('request')->begin()->
isParameter('module', 'job')->
isParameter('action', 'show')->
isParameter('company_slug', $job->getCompanySlug())->
128
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
isParameter('location_slug', $job->getLocationSlug())->
isParameter('position_slug', $job->getPositionSlug())->
isParameter('id', $job->getId())->
end()->
info(' 2.2 - A non-existent job forwards the user to a 404')->
get('/job/foo-inc/milano-italy/0/painter')->
with('response')->isStatusCode(404)->
info(' 2.3 - An expired job page forwards the user to a 404')->
get(sprintf('/job/sensio-labs/paris-france/%d/web-developer', $browser->getExpiredJob()>getId()))->
with('response')->isStatusCode(404);
// test/functional/frontend/categoryActionsTest.php
include(dirname(__FILE__).'/../../bootstrap/functional.php');
$browser = new JobeetTestFunctional(new sfBrowser());
$browser->loadData();
$browser->info('1 - The category page')->
info(' 1.1 - Categories on homepage are clickable')->
get('/')->
click('Programming')->
with('request')->begin()->
isParameter('module', 'category')->
isParameter('action', 'show')->
isParameter('slug', 'programming')->
end()->
info(sprintf(' 1.2 - Categories with more than %s jobs also have a "more" link',
sfConfig::get('app_max_jobs_on_homepage')))->
get('/')->
click('27')->
with('request')->begin()->
isParameter('module', 'category')->
isParameter('action', 'show')->
isParameter('slug', 'programming')->
end()->
info(sprintf(' 1.3 - Only %s jobs are listed', sfConfig::get('app_max_jobs_on_category')))->
with('response')->checkElement('.jobs tr', sfConfig::get('app_max_jobs_on_category'))->
info(' 1.4 - The job listed is paginated')->
with('response')->begin()->
checkElement('.pagination_desc', '/32 jobs/')->
checkElement('.pagination_desc', '#page 1/2#')->
end()->
click('2')->
129
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
with('request')->begin()->
isParameter('page', 2)->
end()->
with('response')->checkElement('.pagination_desc', '#page 2/2#')
;
10.13 Απνζθαικάησζε Λεηηνπξγηθώλ Διέγρσλ
Σν symfony παξέρεη ηε κέζνδν ~debug|Debug~() γηα λα εμάγεη ηνλ response header θαη ην
πεξηερφκελν:
$browser->with('response')->debug();
Η κέζνδνο debug() κπνξεί λα εηζαρζεί νπνπδήπνηε κέζα ζε έλα response tester block θαη ζα
ζηακαηήζεη ηελ εθηέιεζε ηνπ script.
10.14 Harness Λεηηνπξγηθώλ Διέγρσλ
Η δηεξγαζία test:functional κπνξεί επίζεο λα ρξεζηκνπνηεζεί γηα λα ηξέμεη φια ηα functional tests
γηα κία εθαξκνγή:
$ php symfony test:functional frontend
Η δηεξγαζία εμάγεη κία κνλή γξακκή γηα θάζε αξρείν ειέγρνπ:
10.15 Harness Έιεγρνη
Τπάξρεη επίζεο δηεξγαζία πνπ ηξέρεη φινπο ηνπο ειέγρνπο ζε έλα project (unit θαη functional):
$ php symfony test:all
Οη δηεξγαζίεο test:all έρνπλ ηελ επηινγή --only-failed ε νπνία εμαλαγθάδεη ηε δηεξγαζία λα ηξέμεη
μαλά κφλν ηα test ηα νπνία απέηπραλ ζε πξνεγνχκελε εθηέιεζε:
$ php symfony test:all –only-failed
11 Σν Form Framework
Σν form framework είλαη θαηαζθεπαζκέλν απφ ηξία κέξε:
 validation: Σν validation sub-framework παξέρεη classes γηα λα επηθπξψζεη ηηο εηζφδνπο (integer,
string, email address, ...)
 widgets: Σν widget sub-framework παξέρεη classes γηα λα εμάγεη πεδία HTML (input, textarea,
select, ...)
130
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
 forms: Οη form classes αλαπαξηζηνχλ θφξκεο πνπ έρνπλ δεκηνπξγεζεί απφ widgets θαη validators
θαη παξέρνπλ κεζφδνπο νη νπνίεο βνεζάλε ζηε δηαρείξηζε ηεο θφξκαο. Σν θάζε πεδίν ηεο θφξκαο
έρεη ην δηθφ ηνπ validator θαη widget.
11.1 Forms
Μία θφξκα ηνπ symfony είλαη κηα class ε νπνία έρεη δεκηνπξγεζεί απφ πεδία. Σν θάζε πεδίν έρεη
έλα φλνκα, έλα validator θαη έλα widget. Μία απιή ContactForm κπνξεί λα νξηζηεί κε ηελ παξαθάησ
class:
class ContactForm extends sfForm
{
public function configure()
{
$this->setWidgets(array(
'email' => new sfWidgetFormInputText(),
'message' => new sfWidgetFormTextarea(),
));
$this->setValidators(array(
'email' => new sfValidatorEmail(),
'message' => new sfValidatorString(array('max_length' => 255)),
));
}
}
Σα πεδία ηεο θφξκαο ξπζκίδνληαη απφ ηε κέζνδν configure() ρξεζηκνπνηψληαο ηηο κεζφδνπο
setValidators() θαη setWidgets().
131
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
11.2 Doctrine Forms
Καζψο ην symfony γλσξίδεη ηα πάληα γηα ην κνληέιν ηεο βάζεο δεδνκέλσλ καο, κπνξεί απηφκαηα
λα παξάγεη θφξκεο βαζηζκέλεο πάλσ ζε απηή ηελ πιεξνθνξία. Όηαλ ηξέρνπκε ηε δηεξγαζία
doctrine:build --all ην symfony απηφκαηα θαιεί ηε δηεξγαζία doctrine:build --forms:
$ php symfony doctrine:build –forms
Η δηεξγαζία doctrine:build - -forms παξάγεη θφξκα απφ ηηο classes ζηνλ θάθειν lib/form/. Η
νξγάλσζε απηψλ ησλ παξαγφκελσλ αξρείσλ είλαη παξφκνηα κε απηή ηνπ lib/model. Κάζε model class
έρεη κία ζπζρεηηζκέλε form class, ε νπνία είλαη άδεηα απφ πξνεπηινγή θαζψο θιεξνλνκεί απφ κία
base class:
// lib/form/doctrine/JobeetJobForm.class.php
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
}
}
11.3.Πξνζαξκόδνληαο ηε Form ηεο Θέζεο Δξγαζίαο
Πξψηα αιιάδνπκε ηνλ ζχλδεζκν ―Post a job‖ ζην layout έηζη ψζηε λα κπνξνχκε λα ειέγμνπκε ηηο
αιιαγέο απεπζείαο ζηνλ browser:
<!-- apps/frontend/templates/layout.php -->
<a href="<?php echo url_for('job_new') ?>">Post a Job</a>
Αθαηξνχκε πεδία απφ κία form έηζη ψζηε κεξηθά απφ ηα table columns λα κελ κπνξεί λα ηα
επεμεξγαζηεί ν ηειηθφο ρξήζηεο:
// lib/form/doctrine/JobeetJobForm.class.php
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
132
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
unset(
$this['created_at'], $this['updated_at'],
$this['expires_at'], $this['is_activated']
);
}
}
Όηαλ αθαηξνχκε έλα πεδίν ζεκαίλεη πσο αθαηξνχληαη επίζεο ηα πεδία widget θαη validator.
Δθηφο απφ ηελ αθαίξεζε ησλ πεδίσλ πνπ δελ ζέινπκε λα πξνβάιινληαη κπνξνχκε επίζεο λα
ζέζνπκε ηα πεδία πνπ κφλν ζέινπκε λα εκθαλίδνληαη ρξεζηκνπνηψληαο ηε κέζνδν useFields():
// lib/form/doctrine/JobeetJobForm.class.php
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
$this->useFields(array('category_id', 'type', 'company', 'logo', 'url', 'position', 'location',
'description', 'how_to_apply', 'token', 'is_public', 'email'));
}
}
Αιιάδνπκε ην πξνεπηιεγκέλν sfValidatorString ζε έλα sfValidatorEmail:
// lib/form/doctrine/JobeetJobForm.class.php
public function configure()
{
// ...
$this->validatorSchema['email'] = new sfValidatorEmail();
}
133
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δίλαη θαιύηεξν πάληα λα πξνζζέηνπκε έλαλ θαηλνύξην validator ζηνπο ήδε ππάξρνληεο
ρξεζηκνπνηώληαο ηνλ εηδηθό validator sfValidatorAnd:
// lib/form/doctrine/JobeetJobForm.class.php
public function configure()
{
// ...
$this->validatorSchema['email'] = new sfValidatorAnd(array(
$this->validatorSchema['email'],
new sfValidatorEmail(),
));
}
Αθφκα θη αλ ν ηχπνο ηνπ column είλαη varchar ζην schema, ζέινπκε ηελ ηηκή ηνπ λα είλαη
πεξηνξηζκέλε ζε κία ιίζηα απφ επηινγέο: full time, part time, ή freelance.
Πξώηα νξίδνπκε ηηο πηζαλέο ηηκέο ζην JobeetJobTable:
// lib/model/doctrine/JobeetJobTable.class.php
class JobeetJobTable extends Doctrine_Table
{
static public $types = array(
'full-time' => 'Full time',
'part-time' => 'Part time',
'freelance' => 'Freelance',
);
public function getTypes()
{
return self::$types;
}
// ...
134
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
}
Έπεηηα ρξεζηκνπνηνύκε ην sfWidgetFormChoise γηα ηνλ ηύπν ηνπ widget:
$this->widgetSchema['type'] = new sfWidgetFormChoice(array(
'choices' => Doctrine_Core::getTable('JobeetJob')->getTypes(),
'expanded' => true,
));
Σν sfWidgetFormChoice αληηπξνζσπεχεη έλα choice widget ην νπνίν κπνξεί λα θαηαζηεί απφ έλα
δηαθνξεηηθφ widget ζχκθσλα κε θάπνηεο επηινγέο πξνζαξκνγήο (expanded θαη multiple):
 Dropdown list (<select>): array('multiple' => false, 'expanded' => false)
 Dropdown box (<select multiple="multiple">): array('multiple' => true, 'expanded' => false)
 List of radio buttons: array('multiple' => false, 'expanded' => true)
 List of checkboxes: array('multiple' => true, 'expanded' => true)
Αο αιιάμνπκε ηνλ validator έηζη ψζηε λα έρεη πεξηνξηζκέλεο πηζαλέο επηινγέο γηα ιφγνπο αζθαιείαο:
$this->validatorSchema['type'] = new sfValidatorChoice(array(
'choices' => array_keys(Doctrine_Core::getTable('JobeetJob')->getTypes()),
));
Καζψο ην logo column ζα απνζεθεχζεη ην φλνκα αξρείνπ ηνπ logo ην νπνίν ζπλδέεηαη κε ηελ
εξγαζία, ζα πξέπεη λα αιιάμνπκε ην widget ζε κία εηηθέηα αξρείνπ εηζφδνπ:
$this->widgetSchema['logo'] = new sfWidgetFormInputFile(array(
'label' => 'Company logo',
));
135
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Γηα θάζε πεδίν, ην symfony παξάγεη απηόκαηα κία εηηθέηα. Απηό κπνξεί λα αιιαρηεί κε κία
επηινγή εηηθέηαο.
Μπνξνχκε επίζεο λα αιιάμνπκε ηηο εηηθέηεο ζε κία δέζκε κε ηε κέζνδν setLabels() ελφο widget
array:
$this->widgetSchema->setLabels(array(
'category_id'
'is_public'
=> 'Category',
=> 'Public?',
'how_to_apply' => 'How to apply?',
));
Υξεηάδεηαη επίζεο λα αιιάμνπκε ηνλ πξνεπηιεγκέλν validator:
$this->validatorSchema['logo'] = new sfValidatorFile(array(
'required' => false,
'path'
=> sfConfig::get('sf_upload_dir').'/jobs',
'mime_types' => 'web_images',
));
Σν sfValidatorFile είλαη ελδηαθέξνλ θαζώο θάλεη θάπνηα πξάγκαηα:
 Δπηθπξψλεη ην φηη ην αλεβαζκέλν αξρείν είλαη έλα είδσιν ζε έλα web format(mime_types)
 Μεηνλνκάδεη ην αξρείν ζε θάηη ην κνλαδηθφ
 Απνζεθεχεη ην αξρείν ζε έλα δεδνκέλν path
 Δλεκεξψλεη ην logo column κε έλα παξαγφκελν φλνκα
Καζψο ν validator απνζεθεχεη κφλν ην φλνκα ζηελ βάζε δεδνκέλσλ, αο αιιάμνπκε ην path πνπ
ρξεζηκνπνηείηαη ζηελ showSuccess template:
// apps/frontend/modules/job/templates/showSuccess.php
<img src="/uploads/jobs/<?php echo $job->getLogo() ?>" alt="<?php echo $job->getCompany()
?> logo" />
136
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Αο πξνζζέζνπκε έλα βνεζεηηθό κήλπκα γηα ην column is_public:
$this->widgetSchema->setHelp('is_public', 'Whether the job can also be published on affiliate
websites or not.');
H ηειηθή JobeetJobForm class έρεη σο εμήο:
// lib/form/doctrine/JobeetJobForm.class.php
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
unset(
$this['created_at'], $this['updated_at'],
$this['expires_at'], $this['is_activated']
);
$this->validatorSchema['email'] = new sfValidatorAnd(array(
$this->validatorSchema['email'],
new sfValidatorEmail(),
));
$this->widgetSchema['type'] = new sfWidgetFormChoice(array(
'choices' => Doctrine_Core::getTable('JobeetJob')->getTypes(),
'expanded' => true,
));
$this->validatorSchema['type'] = new sfValidatorChoice(array(
'choices' => array_keys(Doctrine_Core::getTable('JobeetJob')->getTypes()),
));
$this->widgetSchema['logo'] = new sfWidgetFormInputFile(array(
'label' => 'Company logo',
));
137
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$this->widgetSchema->setLabels(array(
'category_id'
'is_public'
=> 'Category',
=> 'Public?',
'how_to_apply' => 'How to apply?',
));
$this->validatorSchema['logo'] = new sfValidatorFile(array(
'required' => false,
'path'
=> sfConfig::get('sf_upload_dir').'/jobs',
'mime_types' => 'web_images',
));
$this->widgetSchema->setHelp('is_public', 'Whether the job can also be published on affiliate
websites or not.');
}
}
11.4 Σν Form Template
Σψξα πνπ ε form class έρεη πξνζαξκνζηεί, ζα πξέπεη λα ηελ πξνβάινπκε. Σν template γηα ηε
θφξκα είλαη ην ίδην είηε ζειήζνπκε λα δεκηνπξγήζνπκε θαηλνχξηα εξγαζία είηε λα επεμεξγαζηνχκε
κία ήδε ππάξρνπζα. ΢ηελ πξαγκαηηθφηεηα θαη ηα δχν ηα templates, ην newSuccess.php θαη ην
editSuccess.php είλαη ζρεδφλ φκνηα:
<!-- apps/frontend/modules/job/templates/newSuccess.php -->
<?php use_stylesheet('job.css') ?>
<h1>Post a Job</h1>
<?php include_partial('form', array('form' => $form)) ?>
Η θόξκα από κόλε ηεο θαζίζηαηαη ζην partial the_form. Αληηθαζηζηνύκε ην πεξηερόκελν ηνπ
generated_form partial κε ηνλ παξαθάησ θώδηθα:
<!-- apps/frontend/modules/job/templates/_form.php -->
<?php use_stylesheets_for_form($form) ?>
<?php use_javascripts_for_form($form) ?>
<?php echo form_tag_for($form, '@job') ?>
138
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
<table id="job_form">
<tfoot>
<tr>
<td colspan="2">
<input type="submit" value="Preview your job" />
</td>
</tr>
</tfoot>
<tbody>
<?php echo $form ?>
</tbody>
</table>
</form>
11.5 Η Form Action
Έρνπκε ηψξα κία form class θη έλα template ην νπνίν ηελ θαζηζηά. Σψξα είλαη ε ψξα λα ην
θάλνπκε λα ιεηηνπξγήζεη κε θάπνηεο ελέξγεηεο.
Η θόξκα εξγαζίαο δηαρεηξίδεηαη από πέληε κεζόδνπο ζην module εξγαζίαο:
 new: Πξνβάιεη κία ιεπθή θφξκα γηα λα δεκηνπξγήζεη κία λέα εξγαζία
 edit: Πξνβάιεη κία θφξκα γηα ηελ επεμεξγαζία κηαο ππάξρνπζαο εξγαζίαο
 create: Γεκηνπξγεί κία λέα εξγαζία κε ηηο ηηκέο πνπ έρεη ππνβάιιεη ν ρξήζηεο
 update: Δλεκεξψλεη κία ππάξρνπζα εξγαζία κε ηηο ηηκέο πνπ έρεη ππνβάιιεη ν ρξήζηεο
 processForm: Καιείηαη απφ ην create θαη ην update, επεμεξγάδεηαη ηε θφξκα
Όιεο νη θφξκεο έρνπλ ηνλ παξαθάησ θχθιν δσήο:
Μπνξνχκε λα απινπνηήζνπκε ηνλ θψδηθα γηα ηε δηαρείξηζε ηεο θφξκαο:
// apps/frontend/modules/job/actions/actions.class.php
public function executeNew(sfWebRequest $request)
{
139
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$this->form = new JobeetJobForm();
}
public function executeCreate(sfWebRequest $request)
{
$this->form = new JobeetJobForm();
$this->processForm($request, $this->form);
$this->setTemplate('new');
}
public function executeEdit(sfWebRequest $request)
{
$this->form = new JobeetJobForm($this->getRoute()->getObject());
}
public function executeUpdate(sfWebRequest $request)
{
$this->form = new JobeetJobForm($this->getRoute()->getObject());
$this->processForm($request, $this->form);
$this->setTemplate('edit');
}
public function executeDelete(sfWebRequest $request)
{
$request->checkCSRFProtection();
$job = $this->getRoute()->getObject();
$job->delete();
$this->redirect('job/index');
}
protected function processForm(sfWebRequest $request, sfForm $form)
140
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
{
$form->bind(
$request->getParameter($form->getName()),
$request->getFiles($form->getName())
);
if ($form->isValid())
{
$job = $form->save();
$this->redirect('job_show', $job);
}
}
Αιιάδνπκε ηε κέζνδν executeNew() γηα λα νξίζνπκε ην full-time ζαλ πξνεπηιεγκέλε ηηκή γηα
ηνλ ηύπν ηεο ζηήιεο:
// apps/frontend/modules/job/actions/actions.class.php
public function executeNew(sfWebRequest $request)
{
$job = new JobeetJob();
$job->setType('full-time');
$this->form = new JobeetJobForm($job);
}
11.6.Πξνζηαηεύνληαο ηε Form Θέζεο Δξγαζίαο κε έλα Token
Δλεκεξψλνπκε ηε κέζνδν save() ηνπ JobeetJob θαη πξνζζέηνπκε ηε ινγηθή πνπ παξάγεη ην token
πξηλ απνζεθεπηεί ε θαηλνχξηα εξγαζία:
// lib/model/doctrine/JobeetJob.class.php
public function save(Doctrine_Connection $conn = null)
{
// ...
141
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
if (!$this->getToken())
{
$this->setToken(sha1($this->getEmail().rand(11111, 99999)));
}
return parent::save($conn);
}
Σώξα κπνξνύκε λα αθαηξέζνπκε ην πεδίν token από ηε θόξκα:
// lib/form/doctrine/JobeetJobForm.class.php
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
unset(
$this['created_at'], $this['updated_at'],
$this['expires_at'], $this['is_activated'],
$this['token']
);
// ...
}
// ...
}
Μία route sfDoctrineRouteCollection παξάγεη URLs κε ην πξσηεχνλ θιεηδί, αιιά κπνξεί λα
αιιαρηεί ζε νπνηαδήπνηε κνλαδηθή ζηήιε πεξλψληαο ηελ επηινγή ζηήιεο:
# apps/frontend/config/~routing|Routing~.yml
job:
class:
options:
sfDoctrineRouteCollection
{ model: JobeetJob, column: token }
requirements: { token: \w+ }
142
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Πιένλ ε δηαδξνκή γηα λα επεμεξγαζηνύκε κία εξγαζία γίλεηαη από ην παξαθάησ pattern:
http://www.jobeet.com.localhost/job/TOKEN/edit
Θα πξέπεη επίζεο λα αιιάμνπκε ηνλ ζύλδεζκν “Edit” ζην template showSuccess:
<!-- apps/frontend/modules/job/templates/showSuccess.php -->
<a href="<?php echo url_for('job_edit', $job) ?>">Edit</a>
11.7 Η ΢ειίδα Πξνεπηζθόπεζεο
Η ζειίδα ηεο πξνεπηζθφπεζεο είλαη ίδηα κε ηελ ζειίδα ηεο εξγαζίαο. Υάξε ζην routing, φηαλ έλαο
ρξήζηεο εηζέξρεηαη κε ην ζσζηφ token, ζα είλαη πξνζβάζηκν ζηελ παξάκεηξν ηνπ token request.
Όηαλ έλαο ρξήζηεο εηζέξρεηαη κε έλα tokenized URL, ζα πξνζζέζνπκε έλα admin bar ζηελ
θνξπθή. ΢ηελ αξρή ηνπ template showSuccess, πξνζζέηνπκε έλα partial γηα λα θηινμελήζεη ην admin
bar θαη αθαηξνχκε ηνλ ζχλδεζκν ηεο επεμεξγαζίαο ζην ηέινο:
<!-- apps/frontend/modules/job/templates/showSuccess.php -->
<?php if ($sf_request->getParameter('token') == $job->getToken()): ?>
<?php include_partial('job/admin', array('job' => $job)) ?>
<?php endif ?>
Έπεηηα, δεκηνπξγνύκε ην _admin partial:
<!-- apps/frontend/modules/job/templates/_admin.php -->
<div id="job_actions">
<h3>Admin</h3>
<ul>
<?php if (!$job->getIsActivated()): ?>
<li><?php echo link_to('Edit', 'job_edit', $job) ?></li>
<li><?php echo link_to('Publish', 'job_edit', $job) ?></li>
<?php endif ?>
143
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
<li><?php echo link_to('Delete', 'job_delete', $job, array('method' => 'delete', 'confirm' => 'Are
you sure?')) ?></li>
<?php if ($job->getIsActivated()): ?>
<li<?php $job->expiresSoon() and print ' class="expires_soon"' ?>>
<?php if ($job->isExpired()): ?>
Expired
<?php else: ?>
Expires in <strong><?php echo $job->getDaysBeforeExpires() ?></strong> days
<?php endif ?>
<?php if ($job->expiresSoon()): ?>
- <a href="">Extend</a> for another <?php echo sfConfig::get('app_active_days') ?> days
<?php endif ?>
</li>
<?php else: ?>
<li>
[Bookmark this <?php echo link_to('URL', 'job_show', $job, true) ?> to manage this job in the
future.]
</li>
<?php endif ?>
</ul>
</div>
144
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Γηα λα θάλνπκε ην template πην επαλάγλσζην, πξνζζέζακε έλα ζσξό από κεζόδνπο
ζπληόκεπζεο ζην JobeetJob class:
// lib/model/doctrine/JobeetJob.class.php
public function getTypeName()
{
$types = Doctrine_Core::getTable('JobeetJob')->getTypes();
return $this->getType() ? $types[$this->getType()] : '';
}
public function isExpired()
{
return $this->getDaysBeforeExpires() < 0;
}
public function expiresSoon()
{
return $this->getDaysBeforeExpires() < 5;
}
public function getDaysBeforeExpires()
{
return ceil(($this->getDateTimeObject('expires_at')->format('U') - time()) / 86400);
}
Σν admin bar πξνβάιεη ηηο δηαθνξεηηθέο ελέξγεηεο βαζηδφκελν ζηελ θαηάζηαζε ηεο εξγαζίαο:
145
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
11.8.Δλεξγνπνίεζε θαη Γεκνζίεπζε ηεο Θέζεο Δξγαζίαο
Τπάξρεη έλαο ζχλδεζκνο γηα λα δεκνζηνπνηήζνπκε ηελ εξγαζίαο. Ο ζχλδεζκνο ρξεηάδεηαη λα
αιιαρηεί γηα λα δείρλεη ζε έλα θαηλνχξην publish action. Αληί λα δεκηνπξγήζνπκε κία θαηλνχξηα
δηαδξνκή κπνξνχκε απιά λα ξπζκίζνπκε ηελ ήδε ππάξρνπζα job route:
# apps/frontend/config/routing.yml
job:
class: sfDoctrineRouteCollection
options:
model:
JobeetJob
column:
token
object_actions: { publish: put }
requirements:
token: \w+
Σν object_actions παίξλεη έλαλ πίλαθα κε επηπξόζζεηεο ελέξγεηεο γηα ην δεδνκέλν αληηθείκελν.
Σώξα κπνξνύκε λα αιιάμνπκε ηνλ ζύλδεζκν ηνπ ζπλδέζκνπ “Publish”:
<!-- apps/frontend/modules/job/templates/_admin.php -->
<li>
<?php echo link_to('Publish', 'job_publish', $job, array('method' => 'put')) ?>
</li>
Σν ηειεπηαίν βήκα είλαη λα δεκηνπξγήζνπκε ηελ publish action:
// apps/frontend/modules/job/actions/actions.class.php
public function executePublish(sfWebRequest $request)
{
$request->checkCSRFProtection();
$job = $this->getRoute()->getObject();
$job->publish();
146
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$this->getUser()->setFlash('notice',
sfConfig::get('app_active_days')));
sprintf('Your
job
is
now
online
for
%s
days.',
$this->redirect('job_show_user', $job);
}
Παξαηεξνχκε φηη ν ζχλδεζκνο ―Publish‖ παξέρεηαη κε ηελ HTTP put method. Γηα λα
εμνκνηψζνπκε ηελ put method, ν ζχλδεζκνο κεηαηξέπεηαη απηφκαηα ζε form φηαλ θάλνπκε θιηθ ζε
απηφλ.
Δπεηδή έρνπκε ελεξγνπνηήζεη ηελ πξνζηαζία CSRF, o helper link_to() ελζσκαηψλεη έλα CSRF
token κέζα ζηνλ ζχλδεζκν θαη ε κέζνδνο checkCSRFProtection() ηνπ request object ειέγρεη ηελ
εγθπξφηεηα ηνπ ζηελ ππνβνιή.
Η κέζνδνο executePublish() ρξεζηκνπνηεί κία θαηλνύξηα κέζνδν publish() ε νπνία κπνξεί λα
νξηζηεί όπσο παξαθάησ:
// lib/model/doctrine/JobeetJob.class.php
public function publish()
{
$this->setIsActivated(true);
$this->save();
}
ψξα κπνξνχκε λα ειέγμνπκε ην ραξαθηεξηζηηθφ ηεο δεκνζίεπζεο ζηνλ browser.
Πξέπεη λα θηηάμνπκε θαη θάηη άιιν. Η κε ελεξγνπνηεκέλεο εξγαζίεο δελ ζα πξέπεη λα είλαη
πξνζβάζηκεο, ην νπνίν ζεκαίλεη φηη δελ πξέπεη λα εκθαλίδνληαη ζηελ αξρηθή ζειίδα ηνπ Jobeet, θαη
δελ ζα πξέπεη λα είλαη πξνζβάζηκεο απφ ην URL ηνπο. Καζψο έρνπκε δεκηνπξγήζεη κία κέζνδν
addActiveJobsQuery() γηα λα πεξηνξίζνπκε έλα Doctrine_Query ζε ελεξγέο εξγαζίεο, κπνξνχκε απιά
λα ην επεμεξγαζηνχκε θαη λα πξνζζέζνπκε λέεο απαηηήζεηο ζην ηέινο:
// lib/model/doctrine/JobeetJobTable.class.php
public function addActiveJobsQuery(Doctrine_Query $q = null)
{
// ...
$q->andWhere($alias . '.is_activated = ?', 1);
return $q;
}
147
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Εικόνα 18 :Η τελικθ ςελιδα του Jobeet.
148
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
12 ΢πζηήκαηα δηαρείξηζεο Πεξηερνκέλνπ – Drupal
Παξαθάησ παξνπζηάδεηαη κηα ζχληνκε πεξηγξαθή ηνπ ζπζηήκαηνο δηαρείξηζεο πεξηερνκέλνπ
(Drupal), φπνπ ζα ρξεζηκνπνηεζεί ζην πινπνηεκέλν ζχζηεκα. Πην ζπγθεθξηκέλα παξνπζηάδνληαη νη
ηερλνινγίεο, ε κνξθή ησλ αξρείσλ πνπ πεξηιακβάλεη θαη νη δηάθνξνη ελλνηνινγηθνί φξνη πνπ
ρξεζηκνπνηεί ην Drupal. Σέηνηνη φξνη είλαη νη nodes, hooks, blocks θαη themes.
12.1
CMS)
Δηζαγσγή ζην ΢ύζηεκα Γηαρείξηζεο Πεξηερνκέλνπ (Content Management System -
Η απηνκαηνπνίεζε ησλ δηαδηθαζηψλ δεκηνπξγίαο ησλ πιεξνθνξηψλ, πνπ απνηεινχλ ην
πεξηερφκελν ηνπ δηαδηθηχνπ, δεκνζίεπζεο ηνπο θαη παξνπζίαζεο ηνπο ζπληζηά ην επφκελν βήκα ζηηο
πξνεγνχκελεο απαηηήζεηο. Ο κεγάινο φγθνο ηεο πιεξνθνξίαο ζε ζπλδπαζκφ κε ηελ απαηηνχκελε
ηερληθή γλψζε δελ επέηξεπε ζηνπο νξγαληζκνχο λα επηηχρνπλ ηελ ηζνξξνπία αλάκεζα ζε έλα
εχρξεζην θαη ειθπζηηθφ πεξηβάιινλ παξνπζίαζεο θαη ζε έλα ζπλερψο αλαλεψζηκν πεξηερφκελν, πνπ
ζα ηνπο εμαζθάιηδε κία ζηαζεξή βάζε επηζθεςηκφηεηαο ζηε ηζηνζειίδα ηνπο. Όηαλ δε έκπαηλε θαη ν
παξάγνληαο ηνπ ειέγρνπ ηεο ξνήο ηεο πιεξνθνξίαο απφ πνιιαπιά άηνκα, ε θαηάζηαζε γηλφηαλ
αθφκε πην δχζθνιε. Απνηέιεζκα ήηαλ ε δεκηνπξγία κεγάισλ ηζηνρψξσλ κε θαιή ζρεδίαζε, αιιά
μεπεξαζκέλν ρξνληθά πεξηερφκελν, ή κε θαθή ζρεδίαζε ρσξίο κεγάια πεξηζψξηα επειημίαο, αιιά κε
ππέξ-αλαλεσκέλν πεξηερφκελν. Η έιιεηςε ηερληθψλ γλψζεσλ απφ ηα ζηειέρε ηνπ νξγαληζκνχ
νδεγνχζε ηηο επηρεηξήζεηο ζε δεκηνπξγία γξαθείσλ ή ζε εθκίζζσζε εηδηθεπκέλσλ εηαηξηψλ γηα ηελ
δηαηήξεζε ησλ ηζηνζειίδσλ ηνπο. Δθηφο απφ ην θαλεξφ θφζηνο ηεο θίλεζεο απηήο, ε ιχζε ηεο
δεκηνπξγίαο ελφο εηδηθνχ γξαθείνπ παξνπζίαδε ζεκαληηθά πξνβιήκαηα. Λίγα άηνκα κε ηερληθέο
γλψζεηο επηκεξίδνληαλ ηνλ ηεξάζηην φγθν ησλ πιεξνθνξηψλ ηνπ ηζηνρψξνπ, ελψ επηκεξίδνληαλ
ηαπηφρξνλα θαη φιεο ηηο ιεηηνπξγίεο, απφ ηελ εχξεζε ηνπ πεξηερνκέλνπ, ηελ επεμεξγαζία ηνπ, ηελ
δεκνζίεπζε ηνπ θαη ηελ απνζήθεπζε ηνπ γηα κειινληηθή ρξήζε. ΢πλέπεηα ήηαλ λα κελ κπνξεί ην
γξαθείν πνιιέο θνξέο λα δηαρεηξηζηεί ηνλ ηεξάζηην φγθν ησλ πιεξνθνξηψλ, απηέο λα δεκνζηεχνληαη
κε θαζπζηέξεζε θαη λα κελ ππάξρεη πνιπθσλία θαη πινχηνο πεξηερνκέλνπ. Ιδηαίηεξα, αλ ε
ηζηνζειίδα ήηαλ κεγάιε, ηφηε πνιιέο θνξέο ην πεξηερφκελν ηεο δηακνηξάδνληαλ ζε πνιιά γξαθεία,
κε απνηέιεζκα λα έρνπκε έλαλ ηζηφρσξν κε έιιεηςε δηαζχλδεζεο θαη πνιιέο θνξέο ρσξίο θακία
ζπλνρή. Σν ηνπίν ινηπφλ ήηαλ γφληκν γηα ηελ δεκηνπξγία ησλ ειεθηξνληθψλ εξγαιείσλ, πνπ ζα
έδηλαλ ιχζε ζην πξφβιεκα ηεο επηηπρεκέλεο ειεθηξνληθήο παξνπζίαο ησλ νξγαληζκψλ ζην
δηαδίθηπν. Σα CMS επηηξέπνπλ ζηνπο νξγαληζκνχο λα δεκηνπξγνχλ, αιιά θαη λα εηζάγνπλ έηνηκν
πνιπκεζηθφ πιηθφ. Να πηζηνπνηνχλ ηνπο ρξήζηεο ηνπ ζπζηήκαηνο θαη λα επηκεξίδνπλ μερσξηζηνχο
ξφινπο ζηνλ θαζέλα ζηνλ θχθιν ηεο ιεηηνπξγίαο ηνπο. Δπίζεο, επηηξέπνπλ ηνλ πξνζδηνξηζκφ
εξγαζηψλ ξνήο ηνπ πεξηερνκέλνπ, ζπρλά ζε ζπλδπαζκφ κε ηελ ιεηηνπξγία ησλ εηδνπνηήζεσλ
ζπκβάλησλ, πνπ επηηξέπνπλ ζηνπο δηαρεηξηζηέο ηνπ πεξηερνκέλνπ λα εηδνπνηνχληαη γηα νπνηαδήπνηε
αιιαγή. Σα CMS δίλνπλ αθφκε ζηνπο ρξήζηεο ηελ δπλαηφηεηα λα εληνπίδνπλ θαη λα δηαρεηξίδνληαη
πνιιαπιέο εθδφζεηο ελφο κφλν αξρείνπ πεξηερνκέλνπ, λα ην απνζεθεχνπλ ζε κία μερσξηζηή βάζε
δεδνκέλσλ, ελψ ηαπηφρξνλα πξνζθέξνπλ ηελ δπλαηφηεηα επξεηεξίνπ, δηεπθνιχλνληαο ηνλ έιεγρν θαη
ηελ επαλαθνξά παιαηφηεξνπ πιηθνχ ηεο ηζηνζειίδαο. Σν βαζηθφηεξν, φκσο, ραξαθηεξηζηηθφ πνπ
πξνζθέξνπλ είλαη ε δπλαηφηεηα δηαρσξηζκνχ ηνπ πεξηερνκέλνπ απφ ηελ παξνπζίαζε ηεο
ηζηνζειίδαο.
149
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
12.1.1 Ιζηνξηθά ΢ηνηρεηά CMS
Ο όροσ Content Management Systems (CMS) αρχικά χρθςιμοποιικθκε για να δθλώςει τα
ςυςτιματα δθμοςίευςθσ ιςτοςελίδων ςτο Διαδίκτυο γενικότερα, κακώσ επίςθσ και για τα
προγράμματα διαχείριςθσ περιεχομζνου ευρφτερα. Τα πρώτα Συςτιματα Διαχείριςθσ
Περιεχομζνου αναπτφςςονταν εςωτερικά ςτουσ οργανιςμοφσ από το τεχνικό τουσ τμιμα, κακώσ
ιταν απαραίτθτα για τθν δθμοςιοποίθςθ ενόσ μεγάλου όγκου υλικοφ, από θλεκτρονικά περιοδικά
και εφθμερίδεσ των επιχειριςεων μζχρι τθν δθμοςίευςθ και αποςτολι των εταιρικών
newsletters. Το 1995, θ εταιρεία CNET αποφάςιςε να επεκτείνει το εςωτερικό ςφςτθμα
διαχείριςθσ περιεχομζνου, που χρθςιμοποιοφςε, για τθν δθμοςίευςθ θλεκτρονικοφ υλικοφ και να
δθμιουργιςει τθν ξεχωριςτι εταιρεία Vignette. Στόχοσ τθσ ιταν να εκμεταλλευτεί εμπορικά τα
CMS. Στθν διάρκεια τθσ δεκαετίασ που ακολοφκθςε θ αγορά εξελίχτθκε και ςιμερα υπολογίηεται
ότι υπάρχουν περί τισ 500 εφαρμογζσ CMS κάκε είδουσ. Η αγορά εξελίςςεται ςυνεχώσ
αναγκάηοντασ τουσ οργανιςμοφσ να ενθμερώνονται ςυνεχώσ για τισ εξελίξεισ και να
μετακινοφνται ςτα ςυςτιματα, που πλζον καλφπτουν ακόμθ περιςςότερο τισ ανάγκεσ τουσ.
12.1.2 Ση είλαη ην ζύζηεκα δηαρείξηζεο πεξηερνκέλνπ CMS
Σν CMS είλαη αθξσλχκην γηα ην Content Management System (΢χζηεκα δηαρείξηζεο
Πεξηερνκέλνπ). Ο φξνο Content Management Systems (CMS, ΢πζηήκαηα δηαρείξηζεο Πεξηερνκέλνπ)
αλαθέξεηαη ζηηο εθαξκνγέο πνπ επηηξέπνπλ ζηνλ πειάηε λα δηαρεηξίδεηαη ην δηθηπαθφ ηνπ
πεξηερφκελν, φπσο θείκελα, εηθφλεο, πίλαθεο θιπ., κε εχθνιν ηξφπν, ζπλήζσο παξφκνην κε απηφλ ηεο
ρξήζεο ελφο θεηκελνγξάθνπ. Οη εθαξκνγέο δηαρείξηζεο πεξηερνκέλνπ επηηξέπνπλ ηελ αιιαγή ηνπ
πεξηερφκελνπ ρσξίο λα είλαη απαξαίηεηεο εηδηθέο γλψζεηο ζρεηηθέο κε ηε δεκηνπξγία ηζηνζειίδσλ ή
γξαθηθψλ, θαζψο ζπλήζσο ηα θείκελα γξάθνληαη κέζσ θάπνησλ online WYSIWYG ("What You See
Is What You Get") html editors, εηδηθψλ δειαδή θεηκελνγξάθσλ, παξφκνησλ κε ην MS Word, πνπ
επηηξέπνπλ ηε κνξθνπνίεζε ησλ θεηκέλσλ φπνηε ππάξρεη αλάγθε. Οη αιιαγέο ηνπ site κπνξνχλ λα
γίλνπλ απφ νπνηνλδήπνηε ππνινγηζηή πνπ είλαη ζπλδεδεκέλνο ζην δηαδίθηπν, ρσξίο λα ρξεηάδεηαη λα
έρεη εγθαηεζηεκέλα εηδηθά πξνγξάκκαηα επεμεξγαζίαο ηζηνζειίδσλ, γξαθηθψλ θιπ. Μέζσ ελφο
απινχ θπιινκεηξεηή ηζηνζειίδσλ (browser), ν ρξήζηεο κπνξεί λα ζπληάμεη έλα θείκελν θαη λα
ελεκεξψζεη άκεζα ην δηθηπαθφ ηνπ ηφπν. Με άιια ιφγηα είλαη έλα «αληηθείκελν» πςειήο
ζπκπεξίιεςεο. Τινπνηείηαη κε ηελ ινγηθή ηνπ κνληέινπ «WYSIWYG»(What You See Is What You
Get – Όηη βιέπεηο είλαη φηη παίξλεηο), δειαδή κηα αληηθεηκελνζηξαθή ινγηθή φπνπ ην «αληηθείκελν»
είλαη ζην πςειφηεξν επίπεδν. Καη φπνπ ε πινπνίεζε είλαη κηα εηθνληθή ινγηθή. Με έλα CMS, είλαη
πνιχ εχθνιε ε ιεηηνπξγία δεκνςεθηζκάησλ κέζσ ηνπ website, ην ζηήζηκν ελφο forum, ε δεκηνπξγία
ελφο blog, ε ρξήζε news feeds, ε δεκηνπξγία βάζεο δεδνκέλσλ κε εηθφλεο, αξρεία, θηι. Αλ ινηπφλ ν
ρξήζηεο ζέιεη λα δεκηνπξγήζεη έλα δπλακηθφ, εχθνια αλαβαζκίζηκν θαη κνληέξλν website, ε εχθνιε
θαη ζίγνπξε ιχζε είλαη έλα πξφγξακκα CMS.
12.1.3 Σα δηαζέζηκα Web CMS
Σα δηαζέζηκα Web CMS ρσξίδνληαη ζε 3 θαηεγνξίεο:

CMS θιεηζηνχ θψδηθα.

CMS αλνηρηνχ θψδηθα.

Παξακεηξνπνηεκέλα CMS βαζηζκέλα ζε πιαίζηα αλνηρηνχ θψδηθα.
150
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
12.1.4 CMS αλνηθηνύ θώδηθα
Έλαο παξάγνληαο πνπ έρεη ζπκβάιιεη απνθαζίζηεθα ζηελ άλνδν ηεο δεκνηηθφηεηαο θαη ηεο
επρξεζηίαο ησλ CMS είλαη ε πξφνδνο πνπ ζεκεηψλεηαη ηα ηειεπηαία ρξφληα ζην θίλεκα αλάπηπμεο
ινγηζκηθνχ αλνηρηνχ θψδηθα
Σν 1998, ε εηαηξία Netscape αληηηάρζεθε γηα πξψηε θνξά ζηελ θαζηεξσκέλε πξαθηηθή ηεο
αλάπηπμεο ινγηζκηθνχ, θαζηζηψληαο ηνλ πεγαίν θψδηθα ηεο δηθήο ηεο εθαξκνγήο πεξηήγεζεο
ειεχζεξα δηαζέζηκν ζηνπο πάληεο. Απηή ε ελέξγεηα απνηέιεζε νξφζεκν ζηελ εμέιημε ηνπ ινγηζκηθνχ,
δεκηνπξγψληαο έλα θηινζνθηθφ θίλεκα, βάζεη ηνπ νπνίνπ κηα εθαξκνγή ινγηζκηθνχ αλαπηχζζεηαη
απφ κηα κεγάιε θνηλφηεηα δεκηνπξγψλ θαη δηαηίζεηαη ειεχζεξα ζε φιν ηνλ θφζκν. Σν ζχλνιν ησλ
ζεκαληηθφηεξσλ ινγηζκηθψλ αλνηρηνχ θψδηθα απνθαιείηαη ζπιινγηθά LAPMP έλα αθξσλχκην πνπ
ζεκαίλεη ηα εμήο :

Linux

Apache

MySQL

Php
΢ηηο εθαξκνγέο αλνηθηνχ θψδηθα επηηξέπεηαη ε πξφζβαζε θαη ε αιιαγή ηνπ πεγαίνπ θψδηθα, πνπ
ζεκαίλεη φηη κπνξνχκε λα επεμεξγαζηνχκε ηνλ θψδηθα θαη λα ηνλ πξνζαξκφζνπκε ζχκθσλα κε ηηο
αλάγθεο καο. Σν θφζηνο ηεο εθαξκνγήο κεηψλεηαη δξακαηηθά θαζψο ζηηο πεξηζζφηεξεο πεξηπηψζεηο
νιφθιεξε ε εθαξκνγή θαζψο θαη πξφζζεηα (plugins) ηα νπνία δεκηνπξγεί θαη πξνζθέξεη ε θνηλφηεηα
ππνζηήξημεο ( πνπ ζπλήζσο ππάξρεη γηα ηα ζπζηήκαηα αλνηθηνχ θψδηθα) βξίζθνληαη ζην δηαδίθηπν.
12.1.5 Σα πην δεκνθηιή CMS αλνηρηνύ θώδηθα
Σν ηειεπηαίν δηάζηεκα δηεμάγεηαη κηα κεγάιε "κάρε" αλάκεζα ζηα ζπζηήκαηα δηαρείξηζεο
πεξηερνκέλνπ (CMS) αλνηρηνχ θψδηθα, κε πνιιέο αμηφινγεο πξνηάζεηο. Η επηινγή δελ είλαη εχθνιε,
θάζε εθαξκνγή έρεη πιενλεθηήκαηα θαη κεηνλεθηήκαηα, ελψ κεγάιν ξφιν ζηελ ηειηθή απφθαζε
παίδνπλ νη απαηηνχκελεο πξνδηαγξαθέο ησλ ππφ θαηαζθεπή ηζηφηνπσλ. ΢χκθσλα κε έξεπλεο ησλ
ηειεπηαίσλ ρξφλσλ ηα ηξία ζπζηήκαηα δηαρείξηζεο πεξηερνκέλνπ πνπ θπξηαξρνχλ ζηελ αγνξά
ζήκεξα είλαη ην Drupal, ην WordPress θαη ην Joomla.
Δκείο ζα αζρνιεζνχκε κε ηελ αλάιπζε κε ζθνπφ ηνλ ζρεδηαζκφ γηα ηε δεκηνπξγία ηζηνζειίδαο κε
ρξήζε ηνπ Drupal.
12.1.6 Γπλαηόηεηεο θαη ραξαθηεξηζηηθά ελόο CMS

Παξέρεη ηε δπλαηφηεηα ηεο δηαρείξηζεο – ζπληήξεζεο ελφο ηζηφηνπνπ απφ απινχο ρεηξηζηέο
ρσξίο ηελ απαίηεζε γηα εκπινθή εηδηθνχ ηερληθνχ πξνζσπηθνχ.

Παξέρεη δειαδή ηελ επθαηξία ν δηαρεηξηζηήο ηνπ λα επηθεληξσζεί ζην πεξηερφκελν θαη φρη
ζηελ ηερλνινγία

Απηνκαηνπνηεί εξγαζίεο ξνπηίλαο π.ρ. εθαξκφδεη ηελ ίδηα κνξθνπνίεζε (layout) ζε φιεο ηηο
ηζηνζειίδεο. Οη επηινγέο (menus) θαη γεληθφηεξα ε πινήγεζε αλαπαξάγεηαη επίζεο απηφκαηα.

Παξέρεη απιά εξγαιεία (επεμεξγαζηέο ζαλ ην Word) γηα ηε δεκηνπξγία ηνπ πεξηερνκέλνπ.

Παξέρεη ηε δπλαηφηεηα δηαρείξηζεο ηεο δνκήο ηνπ ηζηφηνπνπ, ηεο εκθάληζεο ησλ
δεκνζηεπκέλσλ ζειίδσλ θαζψο θαη ηεο πινήγεζεο ζε απηέο.
Σα ραξαθηεξηζηηθά ησλ CMS αθνξνχλ ζηε ζχλζεζε θάζε ηέηνηνπ ηχπνπ ινγηζκηθνχ. Τπάξρνπλ
πνιιαπιά ραξαθηεξηζηηθά ζηα πην απιά παθέηα, ελψ έρνπλ αλαδεηρηεί αθφκε θαη πην πινχζηεο ζε
ραξαθηεξηζηηθά ιχζεηο. ΢εκαληηθφ είλαη ζε απηφ ην ζεκείν λα ηνληζηεί, φηη ηα open-source CMS, ησλ
151
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
νπνίσλ ν θψδηθαο πξνγξακκαηηζκνχ δηαηίζεηαη δσξεάλ ζην δηαδίθηπν, έρνπλ ζεσξεηηθά άπεηξεο
δπλαηφηεηεο βειηίσζεο, ζε ζρέζε κε ηα εκπνξηθά (commercial), ηα νπνία έρνπλ θάπνην θφζηνο θαη ε
βειηίσζε ησλ ραξαθηεξηζηηθψλ ηνπο κπνξεί λα γίλεη κφλν απφ ηελ ίδηα ηελ εηαηξεία δεκηνπξγίαο ηνπο
12.1.7 Πιενλεθηήκαηα ελόο CMS (Content Management System)

Απηνκαηνπνηεκέλα Πξόηππα:
Γεκηνπξγία πξνηχπσλ (templates) ζπλήζσο ζε κνξθή HTML ή XML ηα νπνία κπνξνχλ εχθνια λα
εθαξκνζηνχλ ζε λέα θαη ππάξρνληα πεξηερφκελα, επηηξέπνληαο ζηελ εκθάληζε φινπ ηνπ
πεξηερφκελνπ λα αιιάμεη απφ κηα θεληξηθή ζέζε.

Δύθνια Δπεμεξγάζηκν Πεξηερόκελν:
Δθφζνλ ην πεξηερφκελν είλαη δηαρσξηζκέλν απφ ηελ νπηηθή παξνπζίαζε ηεο ηζηνζειίδαο, ζπλήζσο
γίλεηαη πην εχθνιν λα ην επεμεξγαζηείο θαη λα ην δηαρεηξηζηείο. Σα πεξηζζφηεξα ΢πζηήκαηα
δηαρείξηζεο Πεξηερνκέλνπ γηα sites (WCMS) πεξηιακβάλνπλ εξγαιεία επεμεξγαζίαο WYSIWYG
(What You See Is What You Get) επηηξέπνληαο ζε κε-ηερληθά άηνκα λα δεκηνπξγήζνπλ θαη λα
επεμεξγαζηνχλ πεξηερφκελν.

Υαξαθηεξηζηηθό θιηκαθσηώλ ζπλόισλ:
Σα πεξηζζφηεξα ΢πζηήκαηα δηαρείξηζεο Πεξηερνκέλνπ γηα sites (WCMS) πεξηιακβάλνπλ plug-ins
ή modules (κνλάδεο) ηα νπνία κπνξνχλ εχθνια λα εγθαηαζηαζνχλ γηα λα επεθηείλνπλ ηελ
ιεηηνπξγηθφηεηα ηεο ππάξρνπζαο ηζηνζειίδαο.

Αλαβάζκηζε πξνηύπσλ κέζσ Web:
Έλα ελεξγφ ΢χζηεκα δηαρείξηζεο Πεξηερνκέλνπ γηα sites(WCMS), ζπλήζσο ιακβάλεη ελεκεξψζεηο
νη νπνίεο εκπεξηέρνπλ λέα ραξαθηεξηζηηθά θαη θξαηνχλ ην ζχζηεκα ελεκεξσκέλν ζηα ηξέρνληα
πξφηππα.

Γηαρείξηζε ηεο ξνήο εξγαζίαο(workflow):
Workflow είλαη ε δηαδηθαζία ηεο δεκηνπξγίαο θχθισλ ησλ αιιεινδηαδνρηθψλ ή παξάιιεισλ
έξγσλ πνπ πξέπεη λα εθπιεξσζνχλ ζε έλα ΢χζηεκα δηαρείξηζεο Πεξηερνκέλνπ (CMS). Γηα
παξάδεηγκα έλαο δεκηνπξγφο πεξηερνκέλνπ κπνξεί λα ππνβάιιεη κηα «ηζηνξία»(story), αιιά δελ ζα
δεκνζηεπζεί κέρξη ν ζπληάθηεο αληηγξάθσλ λα ηελ «θαζαξίζεη» θαη ν αξρηζπληάθηεο λα ηελ εγθξίλεη.

Αληηπξνζσπεία:
Μεξηθά ΢πζηήκαηα δηαρείξηζεο Πεξηερνκέλνπ (CMS) επηηξέπνπλ ζε δηάθνξεο νκάδεο ρξεζηψλ λα
έρνπλ πεξηνξηζκέλα δηθαηψκαηα πάλσ ζε ζπγθεθξηκέλα πεξηερφκελα κηαο ηζηνζειίδαο, εμαπιψλνληαο
ηελ επζχλε ηεο δηαρείξηζεο πεξηερνκέλνπ.

Γηαρείξηζε ησλ εγγξάθσλ:
Έλα ΢χζηεκα δηαρείξηζεο Πεξηερνκέλνπ κπνξεί λα παξέρεη έλα κέζν γηα ηελ δηαρείξηζε ηνπ
θχθινπ δσήο ελφο εγγξάθνπ απφ ηελ αξρηθή ζηηγκή δεκηνπξγίαο ηνπ, κέζα απφ ηηο αλαζεσξήζεηο ησλ
εθδφζεσλ, ηε δεκνζίεπζε, ην αξρείν, θαη ηελ θαηαζηξνθή ηνπ εγγξάθνπ.

Virtualization (εηθνληθόηεηα) ηνπ πεξηερνκέλνπ:
Έλα ΢χζηεκα δηαρείξηζεο Πεξηερνκέλνπ κπνξεί λα απνηειέζεη ην κέζν πνπ λα επηηξέπεη ζε θάζε
ρξήζηε λα εξγάδεηαη κέζα ζε έλα εηθνληθφ αληίγξαθν κηαο πιήξνπο ηζηνζειίδαο, ζχλνια εγγξάθσλ
θαη/ή κηαο βάζεο θψδηθα. Απηφ επηηξέπεη ζηηο αιιαγέο ζε πνιινχο αιιεινεμαξηψκελνπο πφξνπο λα
είλαη εκθαλείο θαη/ή λα εθηεινχληαη ζε πιαίζην πξηλ ηελ ππνβνιή ηνπο.
152
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
13 Γεληθή πεξηγξαθή ηνπ Drupal
13.1 Ση είλαη ην Drupal
To Drupal είλαη έλα αξζξσηφ ζχζηεκα δηαρείξηζεο πεξηερνκέλνπ (Content Management System,
CMS) αλνηθηνχ/ειεχζεξνπ ινγηζκηθνχ, γξακκέλν ζηε γιψζζα πξνγξακκαηηζκνχ PHP. Σν Drupal,
φπσο πνιιά ζχγρξνλα CMS, επηηξέπεη ζην δηαρεηξηζηή ζπζηήκαηνο λα νξγαλψλεη ην πεξηερφκελν, λα
πξνζαξκφδεη ηελ παξνπζίαζε, λα απηνκαηνπνηεί δηαρεηξηζηηθέο εξγαζίεο θαη λα δηαρεηξίδεηαη ηνπο
επηζθέπηεο ηνπ ηζηφηνπνπ θαη απηνχο πνπ ζπλεηζθέξνπλ. Παξφιν πνπ ππάξρεη κηα πνιχπινθε
πξνγξακκαηηζηηθή δηεπαθή, νη πεξηζζφηεξεο εξγαζίεο κπνξνχλ λα γίλνπλ κε ιίγν ή θαη θαζφινπ
πξνγξακκαηηζκφ. Σν Drupal νξηζκέλεο θνξέο πεξηγξάθεηαη σο "ππνδνκή γηα εθαξκνγέο ηζηνχ",
θαζψο νη δπλαηφηεηέο ηνπ πξνρσξνχλ παξαπέξα απφ ηε δηαρείξηζε πεξηερνκέλνπ, επηηξέπνληαο έλα
κεγάιν εχξνο ππεξεζηψλ θαη ζπλαιιαγψλ. Σν Drupal κπνξεί λα εθηειεζηεί ζε δηάθνξεο πιαηθφξκεο,
ζπκπεξηιακβαλνκέλσλ ησλ ιεηηνπξγηθψλ ζπζηεκάησλ Windows, Mac OS X, Linux, FreeBSD, ή
νπνηαζδήπνηε πιαηθφξκα πνπ ππνζηεξίδεη είηε ην δηαθνκηζηή ηζηνζειίδσλ Apache HTTP Server
(έθδνζε 1.3+), είηε ην Internet Information Services (έθδνζε IIS5+), θαζψο επίζεο θαη ηε γιψζζα
πξνγξακκαηηζκνχ PHP (έθδνζε 4.3.3+). Σν Drupal απαηηεί κηα βάζε δεδνκέλσλ φπσο ε MySQL θαη
ε PostgreSQL γηα ηελ απνζήθεπζε ηνπ πεξηερνκέλνπ θαη ησλ ξπζκίζεψλ ηνπ.
153
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
13.1.1 Πιενλεθηήκαηα Drupal

Δύθνιν ζηελ ρξήζε θαη ηελ ελεκέξσζε:
Μπνξείηε λα ελεκεξψζεηε ηελ ηζηνζειίδα ζαο φπνηε εζείο ην επηζπκήζεηε, φπνπ ην επηζπκήζεηε,
ρσξίο αλεζπρία. Γελ ρξεηάδεηαη λα δεηήζεηε απφ ηνλ ζρεδηαζηή ηεο ηζηνζειίδαο λα ην θάλεη γηα εζάο.
Υξεζηκνπνηψληαο ην θαηάιιεια ελαξκνληζκέλν editor (ζπληάθηε) WYSIWYG (What You See Is
What You Get) φπσο γηα παξάδεηγκα ηνλ TinyMCE, κπνξείηε αθφκα θαη λα επηθνιιήζεηε θείκελν
απφ ην Word θαη λα αθαηξέζεηε φινπο εθείλνπο ηνπο πεξίεξγνπο ραξαθηήξεο πνπ ζπλήζσο θνιιάλε
απφ ην MS Word.

Μεδεληθό θόζηνο:
Σν Drupal είλαη ινγηζκηθφ αλνηρηνχ θψδηθα, έηζη δελ ρξεηάδεηαη λα θαηαβάιεηε έμνδα νχηε γηα
ρνξήγεζε αδεηψλ αιιά νχηε θαη γηα ηελ αλάπηπμε ηεο ηζηνζειίδαο ζαο.

Αμηόπηζην θαη αζθαιέο:
Σν Drupal έρεη κηα εθηεηακέλε θαη ελεξγή θνηλφηεηα πνπ ην ππνζηεξίδεη. Βειηηψλεηαη ζπλερψο θαη
ππφθεηηαη ζε εθηεηακέλν έιεγρν, έηζη κπνξείηε λα βαζηζηείηε πάλσ ηνπ, είλαη ζηέξεν ζαλ βξάρνο!

Φηιηθό κε κεραλέο αλαδεηήζεηο:
Μπνξεί λα δηακνξθσζεί γηα θηιηθέο δηεπζχλζεηο (URLs). Σν παξαγφκελν πεξηερφκελν ζρεδηάδεηαη
έηζη ψζηε λα ζπκκνξθψλεηαη κε ηνπο θαλνληζκνχο θάηη πνπ δελ βνεζάεη ζηελ ψζεζε ησλ
ηαμηλνκήζεσλ ηεο κεραλήο αλαδήηεζεο αιιά είλαη πξνζηηφ.

Βαζίδεηαη ζε κνλάδεο θαη είλαη επεθηάζηκν:
Μπνξείηε λα πξνζζέζεηε έμηξα ιεηηνπξγίεο φπσο ηα κπινθ, ηα θφξνπκ, ην ειεθηξνληθφ εκπφξην,
αθφκα θαη εκεξνιφγην αλ ην επηζπκείηε. Τπάξρνπλ πιήζε απφ κνλάδεο ηξίησλ (third party) απφ ηηο
νπνίεο κπνξείηε λα επηιέμεηε φζεο ζέιεηε γηα ηελ επέθηαζε ηεο Drupal ηζηνζειίδαο ζαο.

Έιεγρνο πεξηερνκέλνπ :
Μπνξεί θάλεηο λα ξπζκίζεη ην Drupal ψζηε λα απνζεθεχεη θάζε αιιαγή πνπ γίλεηαη ζην
πεξηερφκελν φπνηε απηφο ην επεμεξγάδεηαη. Απηφ ζεκαίλεη φηη κπνξεί λα πάεη θάλεηο βήκαηα πίζσ
γηα λα δεη ή λα επαλέιζεη ζε κηα παιηά έθδνζε ηνπ πεξηερνκέλνπ αλ ζέιεη.

Καηεγνξηνπνίεζε ηνπ πεξηερνκέλνπ :
Σν Drupal έρεη έλα ηζρπξφ ζχζηεκα ηαμηλφκεζεο (θαηεγνξηνπνίεζεο) ηνπ πεξηερνκέλνπ. Κάζε
θαηεγνξία πεξηερνκέλνπ κπνξεί λα πεξηνξίδεηαη ζε νξηζκέλνπο ηχπνπο πεξηερνκέλνπ πνπ
πεξηιακβάλεη.

Γηαρείξηζε ρξεζηώλ:
Σν Drupal έρεη ζρεδηαζηεί γηα ρξήζε απφ θνηλφηεηεο ρξεζηψλ νπφηε θαη έρεη έλα ηζρπξφ ζχζηεκα
θαηαλνκήο θαη δηαρείξηζεο ρξεζηψλ θαη ξφισλ ζ‘ απηνχο.

Πξνζαξκνζκέλν πεξηερόκελν:
Μπνξείηε λα ρξεζηκνπνηήζεηε ην Content Construction Kit (CCK) θαη ηα View Models γηα ηε
δεκηνπξγία λέσλ εηδψλ πεξηερνκέλνπ, ρσξίο λα μέξεηε λα γξάθεηε θψδηθα. Μεξηθά παξαδείγκαηα
ησλ "ηχπσλ πεξηερνκέλνπ" είλαη ηα Blogs, εηδήζεηο, θφξνπκ, νδεγνί ρξήζεσο, κηθξέο αγγειίεο,
podcasts.

Δμαηξεηηθή βνήζεηα θαη Σεθκεξίσζε (documentation):
Πεξηιακβάλεη ηα επίζεκα εγρεηξίδηα, πνιιά tutorials, blogs, videos, θαη podcasts. Τπάξρεη αθφκε
θαη κηα Drupal Dojo θνηλφηεηα φπνπ κπνξείηε λα κάζεηε πψο κπνξείηε λα γίλεηε ninja Drupal.

PHP Template:
Σν Drupal ρξεζηκνπνηεί ηελ PHP Template κεραλή, ε νπνία δελ απαηηεί θακία γλψζε PHP.

Μεγάιε Κνηλόηεηα ρξεζηώλ :
Με ηφζεο ζεκαληηθέο ηνπνζεζίεο ρξεζηψλ ηνπ Drupal, δελ είλαη εχθνιν λα θχγεηο ζχληνκα. Σν
θφξνπκ ηνπ Drupal είλαη πςειήο δξαζηηθφηεηαο θαη είλαη έλα εμαηξεηηθφ κέξνο γηα λα πάξεηε
απαληήζεηο ζηηο εξσηήζεηο ζαο ζρεηηθά κε ην Drupal. Μπνξείηε επίζεο λα βξείηε βνήζεηα γηα ην
154
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Drupal ζε θαλάιηα ζπλνκηιίαο IRC #drupal-support θαη #drupaldojo. Σέινο ππάξρνπλ θαη ηα Drupal
Groups.

Δίλαη εθαξκνγή αλνηθηνχ θψδηθα, δειαδή εθαξκνγή αζθαιήο, δηαξθψο εμειηζζφκελε θαη κε
κεδεληθφ θφζηνο απφθηεζεο.

Έρεη Οκάδα Αλάπηπμεο πνιπβξαβεπκέλε γηα ηα πξντφληα πνπ έρεη παξάμεη ην πξνεγνχκελν
δηάζηεκα.

Έρεη ηε δπλαηφηεηα λα ιεηηνπξγήζεη κε ειιεληθφ πεξηβάιινλ δηαρείξηζεο

Γηαζέηεη κηα πιήξε γθάκα απφ δσξεάλ, αιιά θαη εκπνξηθέο, πξφζζεηεο εθαξκνγέο (addons,
components, modules, bots θιπ), πνπ δίλνπλ ηε δπλαηφηεηα λα δψζνπκε αθξηβψο ην ραξαθηήξα πνπ
ζέινπκε εκείο ζην δηθηπαθφ καο ηφπν.

Πξνζζήθε πεξηερνκέλνπ ζηνλ ηζηφηνπν καο απφ νπνηνλδήπνηε ππνινγηζηή δηαζέηεη ζχλδεζε
ζην δηαδίθηπν.

Τπάξρεη ε δπλαηφηεηα ηεο νκαδηθήο εξγαζίαο αθνχ θάζε κέινο έρεη ηα απαξαίηεηα
δηθαηψκαηα γηα λα επεμεξγάδεηαη ή λα δεκνζηεχεη πεξηερφκελν ζηνλ ηζηφηνπν.

Σν Drupal κπνξεί λα εγθαηαζηαζεί ζε Windows, Linux, , MacOSX, Solaris θ.α.
13.1.2 Μεηνλεθηήκαηα Drupal

Όρη ηφζν θηιηθφ σο πξνο ηνλ ρξήζηε θαη ηνλ designer. Υξεηάδνληαη πξνγξακκαηηζηηθέο
γλψζεηο γηα λα εθκεηαιιεπηείο ηηο εμαηξεηηθέο ηνπ δπλαηφηεηεο.

Σα έηνηκα πξφηππα ζρεδίαζεο ηνπ Drupal πζηεξνχλ απφ αηζζεηηθήο άπνςεο

Η δεκηνπξγία ελφο Drupal website απαηηεί πεξηζζφηεξν ρξφλν
13.1.3 Σα θύξηα ραξαθηεξηζηηθά ηνπ Drupal:

΢πλεξγαηηθό βηβιίν: Απηφ ην ζηνηρείν επηηξέπεη ζηνπο ρξήζηεο λα δεκηνπξγήζνπλ έλα
―βηβιίν‖ θαη ζηε ζπλέρεηα λα εμνπζηνδνηήζνπλ άιια άηνκα ηα νπνία ζα ζπλεηζθέξνπλ ζηελ
πξνζζήθε πεξηερνκέλνπ

Φηιηθά URLs: Σν Drupal εθκεηαιιεχεηαη ηε ιεηηνπξγία mod_rewrite ηνπ Apache γηα ηε
δεκηνπξγία πξνζαξκνζκέλσλ URLs ηα νπνία είλαη θηιηθά ηφζν γηα ην ρξήζηε φζν θαη γηα ηηο κεραλέο
αλαδήηεζεο

Μνλάδεο: Η θνηλφηεηα ηνπ Drupal έρεη δεκηνπξγήζεη πνιιέο κνλάδεο (modules), νη νπνίεο
παξέρνπλ επηπξφζζεηε ιεηηνπξγηθφηεηα ζην ζχζηεκα

Online βνήζεηα: Όπσο ζε πνιιά άιια έξγα αλνηρηνχ ινγηζκηθνχ, έηζη θαη ζην Drupal δελ
κπνξεί λα ππνζηεξίμεη θαλείο φηη ε online βνήζεηα είλαη ηέιεηα. Ωζηφζν ππάξρεη ελζσκαησκέλν ζηελ
πιαηθφξκα έλα ηδηαίηεξα εχρξεζην online ζχζηεκα βνήζεηαο.

Αλνηρηόο θώδηθαο: Ο πεγαίνο θψδηθαο ηνπ Drupal είλαη ειεχζεξα δηαζέζηκνο ππφ ηνπο φξνπο
ηεο άδεηαο ρξήζεο GNU GPL 2. ΢ε αληίζεζε κε ηδηφθηεηα ζπζηήκαηα δηαρείξηζεο πεξηερνκέλνπ
(Content Management Systems, CMS) ή blogs, ην ζχλνιν ησλ ραξαθηεξηζηηθψλ ηνπ Drupal κπνξεί
εχθνια λα πξνζαξκνζηεί ή λα επεθηαζεί ζχκθσλα κε ηηο αλάγθεο ησλ ρξεζηψλ.

Πξνζσπνπνηεκέλν πεξηβάιινλ: Βαζηθφ ζηνηρείν ηνπ ζπζηήκαηνο είλαη έλα ηδηαίηεξα
ρξήζηκν πξνζσπνπνηεκέλν πεξηβάιινλ. Σφζν ην πεξηερφκελν φζν θαη ε παξνπζίαζή ηνπ κπνξεί λα
είλαη δηαθνξεηηθά αλάινγα κε ηηο επηιεγκέλεο ξπζκίζεηο θάζε ρξήζηε.

΢ύζηεκα δηθαησκάησλ κε βάζε ην ξόιν: Οη δηαρεηξηζηέο ηνπ Drupal δελ είλαη
ππνρξεσκέλνη λα αζρνιεζνχλ κε ηελ παξνρή μερσξηζηψλ δηθαησκάησλ ζε θάζε ρξήζηε. Αληηζέησο,
αλαζέηνπλ δηθαηψκαηα ζε ξφινπο θαη ζηε ζπλέρεηα αλαζέηνπλ ηνπο ξφινπο απηνχο ζε νκάδεο
ρξεζηψλ.
155
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

Αλαδήηεζε: Υξεζηκνπνηψληαο ηε κνλάδα αλαδήηεζεο ηνπ Drupal κπνξεί θαλείο λα
δηελεξγήζεη αλαδήηεζε ζε φιν ην ζχζηεκα

Πηζηνπνίεζε ρξήζηε: Οη ρξήζηεο κπνξνχλ λα εγγξαθνχλ θαη λα πηζηνπνηεζνχλ είηε ηνπηθά
είηε ρξεζηκνπνηψληαο θάπνηα εμσηεξηθή πεγή πηζηνπνίεζεο, φπσο ην Jabber, ην Blogger ή ην
LiveJournal. Αλ πξφθεηηαη λα ρξεζηκνπνηεζεί εληφο ελφο ελδνδηθηχνπ, ην Drupal κπνξεί λα
ζπλεξγαζηεί κε εμππεξεηεηή LDAP.

Γεκνζθνπήζεηο: Σν ζχζηεκα δηαζέηεη κνλάδα δεκνζθνπήζεσλ ε νπνία δίλεη ηε δπλαηφηεηα
ζηνπο ρξήζηεο θαη ηνπο δηαρεηξηζηέο λα δηελεξγνχλ δεκνζθνπήζεηο θαη λα ηηο παξνπζηάδνπλ ζε
δηάθνξεο ζειίδεο

Γεκηνπξγία πξνηύπσλ: Σν ζχζηεκα δηαρσξίδεη ην πεξηερφκελν απφ ηελ παξνπζίαζή ηνπ,
επηηξέπνληαο ζην ρξήζηε λα ειέγρεη ηελ εμσηεξηθή εκθάληζε ηνπ δηαδηθηπαθνχ ρψξνπ. Σα πξφηππα
δεκηνπξγνχληαη κε ηε βνήζεηα θψδηθα HTML θαη PHP, θάηη πνπ ζεκαίλεη φηη ν ρξήζηεο δε ρξεηάδεηαη
λα κάζεη θάπνηα ηδηφθηεηε γιψζζα δεκηνπξγίαο πξνηχπσλ

Έιεγρνο εθδόζεσλ: Σν ζχζηεκα εθδφζεσλ ηνπ Drupal θαηαγξάθεη ηηο ιεπηνκέξεηεο ησλ
ελεκεξψζεσλ ηνπ πεξηερνκέλνπ, ιεπηνκέξεηεο φπσο ην ρξήζηε πνπ ηξνπνπνίεζε ην πεξηερφκελν, ηελ
εκεξνκελία θαη ηελ ψξα πνπ νη ηξνπνπνηήζεηο απηέο πξαγκαηνπνηήζεθαλ, θαζψο θαη πνηα ηκήκαηα
ηνπ πεξηερνκέλνπ έρνπλ ηξνπνπνηεζεί. Σν ζχζηεκα ειέγρνπ εθδφζεσλ παξέρεη ηε δπλαηφηεηα ζην
ρξήζηε λα πξνζζέηεη ζρφιηα, θαζψο θαη λα κπνξεί λα επαλαθέξεη ην πεξηερφκελν ζε πξνεγνχκελε
έθδνζή ηνπ

Τπνζηήξημε API γηα Bloggers: Η ΑΡΙ γηα Bloggers επηηξέπεη ζην δηαδηθηπαθφ ρψξν λα
ελεκεξψλεηαη κέζσ πνιιψλ δηαθνξεηηθψλ εξγαιείσλ. ΢ε απηά πεξηιακβάλνληαη εξγαιεία πνπ δελ
είλαη web-based, ηα νπνία παξέρνπλ πινπζηφηεξν πεξηβάιινλ επεμεξγαζίαο.

Γηάζεζε πεξηερνκέλνπ: Σν Drupal έρεη ηε δπλαηφηεηα λα εμάγεη ην πεξηερφκελφ ηνπ ζε
κνξθή RDF/RSS. Απηφ επηηξέπεη ζε φπνηνλ δηαζέηεη έλα ζπιιέθηε εηδήζεσλ λα έρεη πξφζβαζε ζηα
RSS λέα ελφο δηαδηθηπαθνχ ρψξνπ Drupal.

΢πιιέθηεο εηδήζεσλ: Σν Drupal έρεη ελζσκαησκέλν έλαλ εχρξεζην ζπιιέθηε εηδήζεσλ γηα
ηελ αλάγλσζε λέσλ θαη blogs απφ άιινπο δηαδηθηπαθνχο ρψξνπο. Ο ζπιιέθηεο εηδήζεσλ απνζεθεχεη
πξνζσξηλά ηα άξζξα ζε βάζε δεδνκέλσλ MySQL.

Γπλαηόηεηα πνιιαπιώλ γισζζώλ: Σν Drupal έρεη ζρεδηαζηεί κε ηέηνην ηξφπν ψζηε λα
αληαπνθξίλεηαη ζηηο απαηηήζεηο ησλ ρξεζηψλ ηνπ δηεζλψο θαη γηα ην ιφγν απηφ παξέρεη πιήξεο
πεξηβάιινλ εξγαζίαο γηα ηε δεκηνπξγία πνιπγισζζηθψλ δηαδηθηπαθψλ ρψξσλ, blogs θαη εθαξκνγψλ
δηαρείξηζεο πεξηερνκέλνπ. Όιν ην θείκελν κπνξεί λα κεηαθξαζηεί κε ηε βνήζεηα γξαθηθνχ
πεξηβάιινληνο, εηζάγνληαο πθηζηάκελεο κεηαθξάζεηο ή ελζσκαηψλνληαο θάπνην άιιν εξγαιείν,
φπσο ην GNU gettext.

Αλάιπζε, θαηαγξαθή θαη ζηαηηζηηθά: Σν Drupal κπνξεί λα εθηππψζεη αλαθνξέο κε
πιεξνθνξίεο πνπ αθνξνχλ ηε δεκνθηιία ηνπ πεξηερνκέλνπ, θαζψο θαη ηνλ ηξφπν κε ηνλ νπνίν νη
επηζθέπηεο πεξηεγνχληαη ζην δηαδηθηπαθφ ρψξν.

Web-based δηαρείξηζε: Η δηαρείξηζε ηνπ Drupal πξαγκαηνπνηείηαη εμ νινθιήξνπ
ρξεζηκνπνηψληαο θάπνηνλ θπιινκεηξεηή θαη σο εθ ηνχηνπ κπνξεί λα γίλεη απφ νπνηνδήπνηε ζεκείν
ηεο γεο θαη δελ απαηηείηαη ε εγθαηάζηαζε επηπξφζζεηνπ ινγηζκηθνχ.

Forums ζπδήηεζεο: ΢ην Drupal ππάξρεη πιήξεο δπλαηφηεηα ελζσκάησζεο forum
ζπδεηήζεσλ γηα ηε δεκηνπξγία δσληαλψλ, δπλακηθψλ δηαδηθηπαθψλ ρψξσλ.
156
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
13.1.4 Σερλνινγηθή ππνδνκή ηνπ Drupal
Οη ζρεδηαζηηθνί ζηφρνη ηνπ Drupal ζπλδπάδνπλ ηελ ηθαλφηεηα ιεηηνπξγίεο ζε απιέο δηαδηθηπαθέο
εθαξκνγέο θαη ζε δηαδηθηπαθέο πχιεο καδηθήο δηαλνκήο πεξηερνκέλνπ. Ο πξψηνο ζηφρνο
ηθαλνπνηείηαη κε ηελ ρξήζε ησλ πην δηαδεδνκέλσλ ηερλνινγηψλ θαη ν δεχηεξνο κε πξνζεθηηθφ θαη
θαινγξακκέλν θψδηθα. Η ηερλνινγηθή ππνδνκή ηνπ Drupal παξνπζηάδεηαη ζηελ εηθφλα:
Δηθόλα 19: Η ηερλνινγηθή ππνδνκή ηνπ Drupal
Σν Drupal κπνξεί λα ―ηξέμεη‖ ζε νπνηνδήπνηε ιεηηνπξγηθφ ζχζηεκα θαη ζηνπο πεξηζζφηεξνπο
δηαθνκηζηέο (Web Servers) πνπ ππνζηεξίδνπλ ηελ PHP, κε ηνλ πην επξέσο ρξεζηκνπνηνχκελν λα είλαη
ν Apache.
Ο θψδηθαο PHP ηνπ Drupal επηθνηλσλεί κε ην επίπεδν (layer) ηεο βάζεο δεδνκέλσλ δηακέζσ ελφο
επηπέδνπ αθαίξεζεο βάζεο δεδνκέλσλ (database abstraction layer), ην φπνην είλαη ππεχζπλν γηα
απνηξνπή επηζέζεσλ κε ηερληθή SQL injection, θάλνληαο θηιηξάξηζκα (sanitation) ζηα δεδνκέλα πνπ
εηζάγεη έλαο ρξήζηεο κέζσ θνξκψλ, θαη επηπιένλ πξνζθέξεη αλεμαξηεζία ηνπ θψδηθα απφ ην
ζχζηεκα βάζεσλ δεδνκέλσλ, δίλνληαο καο ηε δπλαηφηεηα λα ρξεζηκνπνηνχκε φ,ηη ζχζηεκα ζέινπκε
(MySQL, PostgreSQL, Microsoft SQL Server Oracle) ρσξίο λα ρξεηάδεηαη λα θάλνπκε αιιαγέο ζηνλ
θψδηθα.
Σν sanitation ησλ SQL εξσηεκάησλ γίλεηαη ηνπνζεηψληαο placeholders ζηα queries θαη
αληηθαζηζηψληαο ηα placeholders κε παξακέηξνπο.
Π.ρ. $result = db_query('SELECT name FROM {role} WHERE rid = %d', - ); Η αλεμαξηεζία απφ
ην ζχζηεκα ηεο βάζεο δεδνκέλσλ επηηπγράλεηαη κε ην Database Api ηνπ Drupal ην νπνίν παξέρεη
γεληθέο εληνιέο γηα ρεηξηζκφ ηεο βάζεο, αλεμάξηεηεο απφ ην ζχζηεκα θαη έρνληαο αλαγλσξίζεη ηη
ζχζηεκα θαη πνηα βάζε ρξεζηκνπνηεί θαηά ηελ αξρηθή δηαδηθαζία ηεο εγθαζίδξπζεο (establishing)
ηεο ζχλδεζεο κε ηε βάζε.
Γηα παξάδεηγκα δε ρξεζηκνπνηεί ηηο εληνιέο ηεο PHP, mysql_query() (γηα MySQL βάζε ) ή
pg_query() (γηα Postgress), αιιά κηα γεληθή db_query().
Ο θψδηθαο ηνπ ππξήλα ηνπ Drupal ζπκκνξθψλεηαη κε ηα απζηεξά πξφηππα γξαθήο θψδηθα.
14 Τινπνίεζε
14.1 Μηα κηθξή εηζαγσγή γηα ην ηε θαη πνπ ζα ηα κπνπλ ηα αξρεηα ηνπ Drupal θαη πην θάησ ζα
ηα δνύκε πνην αλαιπηηθά .
Όπσο είπακε, ην Drupal είλαη έλα ζχζηεκα γξακκέλν ζε PHP θαη ζπλεξγάδεηαη κε ηελ MySQL.
Άξα ν Web Server πνπ θηινμελεί ην Drupal site πξέπεη λα είλαη εθνδηαζκέλνο κε ηελ PHP θαη επίζεο
λα ππάξρεη βάζε δεδνκέλσλ έηνηκε λα δερζεί ηα δεδνκέλα. Γηα ηε ζσζηή ιεηηνπξγία ηεο έθδνζεο 6
ηνπ Drupal απαηηνχληαη ν Apache 1.3 ή 2.x ή ελαιιαθηηθά o Web Server IIS 5, IIS 6 ή IIS 7 ηεο
157
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Microsoft, ε MySQL 4.1 ή 5 θαη ε PHP4.4.0 ή κεγαιχηεξε (πξνηεηλφκελε ε 5.2.x.,θαζψο ε PHP
5.3 δε ζπλεξγάδεηαη αθφκα ηέιεηα κε φια ηα modules).
Η έθδνζε ηνπ Drupal ζηελ νπνία πινπνηήζεθε ην site είλαη ε 6.x, πνπ είλαη θαη ε ηειεπηαία, θαζψο
ε έθδνζε 7 βξίζθεηαη ζε δνθηκαζηηθφ ζηάδην. Ωο Web Server επηιέρζεθε ν Apache, θαζψο ε
πιεηνςεθία ησλ Drupal site έρνπλ πινπνηεζεί ζε απηφλ, κε απνηέιεζκα λα ππάξρεη πεξηζζφηεξε
εκπεηξία πάλσ ζηνλ ζπγθεθξηκέλν Web Server ζηελ θνηλφηεηα ηνπ Drupal. Δπίζεο είλαη έλαο απφ
ηνπο δεκνθηιέζηεξνπο Web Server, γηαηί ιεηηνπξγεί ζε δηάθνξεο πιαηθφξκεο φπσο Windows, Linux,
Unix θαη Mac OS X θαη παξάγεηαη θαη δηαλέκεηαη δσξεάλ απφ κηα θνηλφηεηα αλνηρηνχ θψδηθα κε
επηηήξεζε απφ ην Ίδξπκα Λνγηζκηθνχ Apache (Apache Software Foundation).
Σν XAMPP είλαη έλα ειεχζεξν θαη αλνηθηφ crossplatform Web Server package, πνπ απνηειείηαη
θπξίσο απφ ηνλ Apache HTTP Server, ηε MySQL βάζε δεδνκέλσλ θαη ησλ δηεξκελέσλ γηα scripts
γξακκέλα ζε γιψζζεο πξνγξακκαηηζκνχ PHP θαη Perl. Η έθδνζε Xampp 1.7.1 πνπ ρξεζηκνπνηήζακε
δηαζέηεη ηνλ Apache HTTPD 2.2.11 ,ηε MySQL 5.1.33,ηελ PHP 5.2.9 θαη ην εξγαιείν PHPMyAdmin,
ην νπνίν είλαη έλα ινγηζκηθφ γξακκέλν ζε PHP πνπ πξννξίδεηαη γηα ηε δηαρείξηζε ηεο MySQL κέζσ
ηνπ Παγθφζκηνπ Ιζηνχ. Δγθαζηζηψληαο ην παθέην απηφ έρνπκε ηα απαξαίηεηα εξγαιεία ζην
κεράλεκά καο γηα λα ππνδερζεί ην Drupal. ΢ηε ζπλέρεηα θαηεβάδνπκε ηα αξρεία ηνπ Drupal θαη ηα
ηνπνζεηνχκε ζην θάθειν C:\xampp\htdocs. Έηζη, αλ ηψξα πιεθηξνινγήζνπκε ζηνλ browser
http://localhost φηαλ ν web Server βξίζθεηαη ζηνλ ππνινγηζηή καο ή ην domain φλνκα ηνπ site αλ
θηινμελείηαη ζε θάπνηνλ απνκαθξπζκέλν Web Server, αλνίγεη ην αξρείν install.php θαη μεθηλάεη ε
δηαδηθαζία ηεο εγθαηάζηαζεο. ΢πλδένπκε ηε βάζε ηελ νπνία έρνπκε πξνεγνπκέλσο δεκηνπξγήζεη
κέζσ ηνπ PHPMyAdmin, δεκηνπξγνχκε ην ινγαξηαζκφ γηα ην δηαρεηξηζηή ηνπ site θαη ξπζκίδνπκε
ηδηφηεηεο ηνπ site, φπσο ην φλνκα, ην email θαη ηελ εκεξνκελία. Καηά ηε δηάξθεηα ηεο εγθαηάζηαζεο
καο δεηάεη λα κεηνλνκάζνπκε ην αξρείν default.settings.php, πνπ βξίζθεηαη ζην
C:\xampp\htdocs\sites\default, ζε settings.php θαη λα απνζεθεχζεη ζε απηφ θάπνηεο ηδηφηεηεο ζρεηηθά
κε ηε ζχλδεζε ηεο βάζεο δεδνκέλσλ
($db_url = 'mysql://username:password@localhost/databasename'). Όηαλ ε εγθαηάζηαζε ηειεηψζεη,
πιεθηξνινγψληαο http://localhost ή ην domain name ηνπ site ην Drupal βιέπεη ην αξρείν settings.php
θαη κε βάζε απηφ καο θαηεπζχλεη ζηελ αξρηθή ζειίδα ηνπ site. Σν αξρείν settings.php είλαη πνιχ
ζεκαληηθφ θαζψο είλαη ππεχζπλν γηα ηε ζχλδεζε ηεο βάζεο δεδνκέλσλ κε ην Drupal . Μπνξνχκε λα
αιιάμνπκε ην αξρείν απηφ, φπσο γηα παξάδεηγκα ηε ξχζκηζε ηεο βάζεο δεδνκέλσλ ηεο Drupal
εγθαηάζηαζεο ή λα μαλαθάλνπκε ηελ εγθαηάζηαζε ζβήλνληάο ην θαη αθήλνληαο κφλν ην αξρηθφ
default.settings.php. Σα modules θαη ηα template themes πνπ θαηεβάδνπκε πξέπεη λα ηνπνζεηεζνχλ
θάησ απφ ην θάθειν \htdocs\modules θαη \htdocs\themes είηε θάησ απφ ην θάθειν sites/all/modules
θαη sites/all/themes.
14.1.1 Πνιιαπιά site κε κία εγθαηάζηαζε Drupal
Έλα κεγάιν πιενλέθηεκα ηνπ Drupal, είλαη ε δπλαηφηεηα γηα πνιιαπιά site κε κία εγθαηάζηαζε
Drupal. Γηα λα γίλεη απηφ, δεκηνπξγνχκε θαθέινπο (πρ site1 θαη site2) θάησ απφ ην θάθειν
\htdocs\sites θαη αληηγξάθνπκε κέζα ζηνπο ππνθαθέινπο ην default.settings.php γηα λα γίλεη
μερσξηζηή εγθαηάζηαζε γηα ην θάζε site. Αλ ζέινπκε λα έρνπκε δηαθνξεηηθά themes, modules ή
αξρεία γηα ην θάζε site ηφηε ηνπνζεηνχκε ηα αξρεία απηά κέζα ζηνλ θάθειν ηνπ θάζε site θαη φρη ζην
sites/all πνπ ζα είλαη γηα φια ηα sites. Οη επηπιένλ ξπζκίζεηο πνπ πξέπεη λα γίλνπλ είλαη ζην αξρείν
hosts θαη πξέπεη λα δειψζνπκε φηη ζηε localhost IP address θαη ηα url site1 θαη site2.
Σψξα πιεθηξνινγψληαο ζην browser είηε localhost, είηε site1, είηε site2 ζα βιέπεη ην αξρείν
settings.php. Άξα ζα πξέπεη λα πνχκε ζην Server λα θνηηάεη ζηνπο ππνθαθέινπο site1 θαη site2 θαη λα
ηνπο αληηκεησπίδεη ζαλ μερσξηζηά sites .Απηφ ην ξπζκίδνπκε ζην αξρείν httpdvhosts πνπ βξίζθεηαη
ζην θάθειν \xampp\apache\conf\extra θαη δειψλνπκε πνιινχο δηαθνξεηηθνχο εηθνληθνχο
δηαθνκηζηέο.
158
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
<VirtualHost *.80>
DocumentRoot C:/xampp/htdocs
ServerName localhost
</VirtualHost>
<VirtualHost test1>
DocumentRoot C:/xampp/htdocs
ServerName test1
</VirtualHost>
<VirtualHost test2>
DocumentRoot C:/xampp/htdocs
ServerName test2
</VirtualHost>
΢ηε ζπλέρεηα αξθεί λα θάλνπκε επαλεθθίλεζε ζηνλ Server. Έηζη ηψξα πιεθηξνινγψληαο ζην url ην
http://site.
14.2 Δγθαηάζηαζε ηνπ απαξαίηεηνπ ινγηζκηθνύ
Όπσο αλαθέξακε θαη πνην πάλσ πξνθεηκέλνπ λα είλαη δπλαηή ε εγθαηάζηαζε ηνπ Drupal θαη θαηά
επέθηαζε ε πινπνίεζε απηήο ηεο ηζηνζειίδαο ζα ρξεηαζηεί πξψηα εγθαηαζηήζνπκε θάπνην
ινγηζκηθφ. Πξψηε θαη βαζηθή πξνυπφζεζε είλαη ε χπαξμε ελφο web server. Μεηά λα έρνπκε
εγθαηαζηήζεη ηα απαξαίηεηα εξγαιεία φπσο WampServer θαη ηηο ξπζκίζεηο πνπ ρξίδνληαη, Καη κε ηε
ζεηξά ηνπο ηεο Αθνχ εγθαηάζηαζεο ηνπ Apache ,ηελ PHP θαη ηελ MySQL κε ηελ ρξήζε ηνπ
παθέηνπ XAMPP, εθφζνλ έρνπκε θάλεη φιεο απηέο ηεο παξαπάλσ εγθαηαζηήζεηο ήξζε ε ψξα γηα ηελ
εγθαηάζηαζε ηνπ Drupal . Πάκε ινηπφλ λα δνχκε πψο λα θηηάμνπκε ην site καο κε drupal γξήγνξα θαη
εχθνια. Απηφ πνπ φκσο καο ελδηαθέξεη είλαη λα δνχκε πσο ιεηηνπξγεί θαη πνηα είλαη ηα βήκαηα πνπ
πινπνηείηαη ην drupal. Αθνχ έρνπκε έηνηκν ηνλ server καο πεγαίλνπκε ζηελ ζειίδα ηνπ
www.drupal.org θαη θαηεβάδνπκε ην ζχλνιν απφ ην file ηνπ Drupal ζηνλ Τπνινγηζηή καο ηελ πην
πξφζθαηε έθδνζε. ΢ηελ πεξίπησζε καο ηελ 6.
159
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Μεηά ηελ νινθιήξσζε ηεο δηαδηθαζίαο ην απνζπκπηέζακε κέζα ζην root ηνπ server καο . Έηζη είρακε
απηά ηα αξρεία:
Δηθόλα 20: Σα αξρεία ηνπ Drupal .
Παξαθάησ δίλνληαη θάπνηεο πιεξνθνξίεο ζρεηηθά κε ηνπο πην ζεκαληηθνχο θαθέινπο θαη αξρεία:
ΦΑΚΔΛΟΙ
ΠΔΡΙΓΡΑΦΗ
Πεξηέρεη βηβιηνζήθεο ζπλαξηήζεσλ ηνπ
Includes:
Drupal.
Πεξηέρεη ηα modules ηνπ ππξήλα, ελψ ηα
Modules:
επηπιένλ modules πνπ ζα πξνζηεζνχλ
πξέπεη λα κπνπλ θάησ απφ ην θάθειν
sites/all/modules.
Themes πεξηέρεη ηα default themes ηνπ
Themes:
Drupal θαη ηα template engines, ελψ ηα
επηπιένλ themes πνπ ζα πξνζηεζνχλ πξέπεη
λα κπνπλ θάησ απφ ην θάθειν
sites/all/themes.
Πεξηέρεη ηηο αιιαγέο πνπ θάλνπκε ζην
Sites:
Drupal φζνλ αθνξά ξπζκίζεηο (settings),
modules θαη themes. ΢ηνλ ππνθάθειν
sites/default βξίζθεηαη ην πξνθαζνξηζκέλν
αξρείν ξπζκίζεσλ (default configuration
file)
γηα
ην
Drupal
site,
ην
default.settings.php, ην νπνίν ν installer ηνπ
Drupal ζα αιιάμεη ζχκθσλα κε ηηο
πιεξνθνξίεο πνπ ζα δψζνπκε θαηά ηελ
εγθαηάζηαζε θαη ζα ηηο θαηαγξάςεη ζην
160
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
setting.php.
ΑΡΥΔΙΟ
ΠΔΡΙΓΡΑΦΗ
cron.php:
Σν cron.php ρξεζηκνπνηείηαη γηα ηελ
εθηέιεζε πεξηνδηθψλ εξγαζηψλ, ηεο
μεθαζάξηζκα πηλάθσλ ηεο βάζεο δεδνκέλσλ
θαη ζπιινγή ζηαηηζηηθψλ.
Index.php:
Σν index.php είλαη ην θχξην ζεκείν φισλ
ησλ αηηήζεσλ εμππεξέηεζεο.
Σν install.php είλαη ην θχξην αξρείν γηα ηελ
εγθαηάζηαζε ηνπ Drupal.
Σν update.php αλαλεψλεη ην ζρήκα ηεο
βάζεο κεηά απφ κηα αλαβάζκηζε ηεο
έθδνζεο ηνπ Drupal.
install.php:
Update.php:
Έπεηηα θηηάμακε ηελ βάζε δεδνκέλσλ καο. Πήγακε ζηνλ browser θαη γξάςακε
http://localhost/phpmyadmin (κε wamp είλαη 100% απηφ). Μαο δήηεζε θσδηθφ,δψζακε ηα
ζηνηρεία καο θαη παηήζακε εθηέιεζε.
Γπξίζακε πάιη ζην localhost /drupal πνπ έρνπκε ηα αξρεία καο. Δίδακε απηφ:
Δηθόλα 21: Σν localhost/drupal ηνπ Drupal .
161
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Γηαιέγνπκε ην install Drupal in English -> παηάκε try again: Γηα λα ζπλερίζεη ε εγθαηάζηαζε
πήγακε ινηπφλ ζηνλ θάθειν κε ηα αξρεία ηνπ drupal θαη κπήθακε ζηνλ θάθειν sites- default. Δθεί
είδακε έλα αξρείν κε φλνκα default.settings.php. Απηφ πνπ θάλακε ήηαλ copy paste ζηνλ ίδην θάθειν,
καο έβγαιε έλα αξρείν κε φλνκα Αληίγξαθν απφ default.settings θάλακε κεηνλνκαζία θαη ην θάλακε
settings.
Μεηά απφ απηή ηελ δηαδηθαζία πήγακε πάιη ζηνλ browser θαη παηήζακε try again. Καη βιέπνπκε πσο
ε εγθαηάζηαζε ηψξα πξνρσξνχζε.
Δηθόλα 22: Σν database ηνπ Drupal .
Γψζακε ην φλνκα ηεο βάζεο (drupal) ην username ηνπ phpmyadmin θαη ηνλ θσδηθφ.
Μεηά παηήζακε Save and continue.
162
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Δηθόλα 23: Γίλεηε εγθαηάζηαζε ηνπ Drupal.
Μεηά απφ απηφ ην ζηάδην πξέπεη λα νξίζνπκε θάπνηεο ξπζκίζεηο ηεο ηζηνζειίδαο καο. ΢ηελ
ζπλέρεηα εηζάγνπκε θάπνηα ζηνηρεία φζνλ αθνξά ηνλ ινγαξηαζκφ ηνλ δηαρεηξηζηή ηεο ηζηνζειίδαο ην
username, ηελ δηεχζπλζε ειεθηξνληθνχ ηαρπδξνκείνπ θαη ηνλ θσδηθφ πξφζβαζεο
Δηθόλα 24: Η δηαρεηξηζηή ηεο ηζηνζειίδαο ηνπ Drupal.
163
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
14.3 Οινθιήξσζε ηεο εγθαηάζηαζεο ηνπ Drupal
Έρνπκε πιένλ νινθιεξψζεη ηελ εγθαηάζηαζε ηνπ Drupal. ΢ην παξαπάλσ ζηηγκηφηππν νζφλεο
κπνξνχκε λα δνχκε ηελ αξρηθή ζειίδα ηνπ Drupal. Δθ ησλ αξηζηεξψλ βξίζθεηαη ην βαζηθφ κελνχ
πινήγεζεο κέζσ ηνπ νπνίνπ κπνξνχκε λα πινεγεζνχκε ζηηο δηάθνξεο πεξηνρέο ηεο δηεπαθήο
δηαρείξηζεο.
Γλσξηκία κε ην πεξηβάιινλ εξγαζίαο
Δθφζνλ έρνπκε θαηεβάζεη ζα δνχκε πξψηα ην πεξηβάιινλ εξγαζίαο θαη ηα κελνχ δηαρείξηζεο ηνπ
Drupal.
Σν βαζηθφ κελνχ δηαρείξηζεο ηνπ Drupal απνηειείηαη απφ ηέζζεξα αληηθείκελα:
 My Account : Όηαλ είκαζηε κέζα ζην My Account καο πεγαίλεη ζηνλ ινγαξηαζκφ ηνπ
ρξήζηε πνπ είλαη ζπλδεδεκέλνο ζην πεξηβάιινλ δηαρείξηζεο θαη ζηελ πξνθεηκέλε πεξίπησζε,
ζηνλ ινγαξηαζκφ ηνπ δηαρεηξηζηή.
 Create content : Σν αληηθείκελν Create content αθνξά ηελ δεκηνπξγία λένπ πεξηερνκέλνπ
θαη επηιέγνληαο ην καο εκθαλίδεη κία ιίζηα κε ηνπο δηάθνξνπο ηχπνπο πεξηερνκέλνπ απφ ηνπο
νπνίνπο κπνξνχκε λα επηιέμνπκε γηα ηελ δεκηνπξγία ηνπ αληίζηνηρνπ πεξηερνκέλνπ.
 Administer θαη : Σν αληηθείκελν Administer απνηειείηαη απφ άιια ππνκελνχ θαη απφ εδψ
γίλνληαη φιεο νη ξπζκίζεηο ηηο ηζηνζειίδαο.
 Log out : Σν Log out ρξεζηκνπνηείηαη γηα ηελ έμνδν καο απφ ην πεξηβάιινλ δηαρείξηζεο.
Σα επφκελνπ ηεο δηαρείξηζεο ηνπ Drupal είλαη ρσξηζκέλε (απφ πξνεπηινγή) ζε 5 θχξηεο θαηεγνξίεο
θαη έλαλ ηνκέα βνήζεηαο. Απηέο νη θαηεγνξίεο είλαη:
Δηθόλα 25:Administration menu
164
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

Content management: Απφ εδψ γίλεηαη ε δηαρείξηζε ηνπ πεξηερνκέλνπ ηεο ηζηνζειίδαο.

Site building: Έιεγρνο ηεο φςεο θαη δνκήο ηεο ηζηνζειίδαο, θαζψο θαη δηαρείξηζε ησλ κελνχ
θαη ησλ modules.

User management: Γηαρείξηζε ησλ ρξεζηψλ, ησλ νκάδσλ θαη ησλ δηθαησκάησλ πξφζβαζεο.

Site configuration: Έιεγρνο ησλ βαζηθψλ ξπζκίζεσλ ηεο ηζηνζειίδαο.

Reports: Αλαθνξέο πνπ δεκηνπξγνχληαη απφ δηάθνξεο θαηαγξαθέο ζπκβάλησλ ηνπ
ζπζηήκαηνο.

Help: ην νπνίν είλαη ε βνήζεηα
14.3.1 Content management
Σα εξγαιεία ηνπ ηνκέα Content management καο επηηξέπνπλ λα δηαρεηξηζηνχκε ην πεξηερφκελν ηεο
ηζηνζειίδαο θαη ζπλεπψο είλαη έλαο απφ ηνπο πην ζεκαληηθνχο ηνκείο δηαρείξηζεο ηνπ Drupal. Σα
εξγαιεία απηά καο παξέρνπλ ηελ δπλαηφηεηα ξπζκίζεσλ πνπ αθνξνχλ ηα:

Comments (΢ρόιηα) : Οη ρξήζηεο ηηο ηζηνζειίδαο έρνπλ ηελ δπλαηφηεηα λα θαηαρσξνχλ
ζρφιηα πνπ αθνξνχλ ην πεξηερφκελν πνπ πξνβάιιεηαη. Σν κελνχ comments είλαη ην κέξνο πνπ ν
δηαρεηξηζηήο κπνξεί λα έρεη κηα γεληθή εηθφλα γηα ηα ζρφιηα πνπ ππνβάιινληαη ζηελ ηζηνζειίδα θαη
λα πξνβεί ζε δηαθνξέο δηαζέζηκεο ελέξγεηεο. Σα ζρφιηα κπνξνχλ λα έρνπλ δχν θαηαζηάζεηο. Δίηε
published, πνπ ζεκαίλεη φηη είλαη νξαηά ζηελ ηζηνζειίδα, είηε unpublished πνπ ζεκαίλεη φηη κπνξνχλ
λα ηα δνπλ κφλν νη δηαρεηξηζηέο ηεο ηζηνζειίδαο.

Content (Πεξηερόκελν) : Μπνξνχκε λα δνχκε, λα ηξνπνπνηήζνπκε θαη λα δηαγξάςνπκε
φπνην πεξηερφκελν έρνπκε δεκηνπξγήζεη εκείο σο δηαρεηξηζηήο ή θάπνηνο άιινο ρξήζηεο.

Content types (Σχπνπο πεξηερνκέλσλ) :

Post settings (Ρπζκίζεηο θαηαρσξήζεσλ)

RSS publishing: Αθνξά θάπνηεο ξπζκίζεηο ζρεηηθά κε ηελ ηξνθνδνζία δεδνκέλσλ απφ
εμσηεξηθέο πεγέο. Αθνξά θάπνηεο ξπζκίζεηο ζρεηηθά κε ηελ ηξνθνδνζία δεδνκέλσλ απφ εμσηεξηθέο
πεγέο.

Taxonomy (Σαμηλφκεζε) : Απφ εδψ κπνξνχκε λα δηαρεηξηζηνχκε ηελ ηαμηλφκεζε, ηελ
θαηεγνξηνπνίεζε θαη ηηο εηηθέηεο ηνπ πεξηερνκέλνπ καο.
Απφ ην κελνχ Site building κπνξνχκε κπνξνχκε λα ειέγμνπκε ηελ δηαξξχζκηζε θαη ηελ εκθάληζε
ηεο ηζηνζειίδαο καο.

Blocks: ΢ε γεληθέο γξακκέο νη ηζηνζειίδεο ρσξίδνληαη ζε δηάθνξεο πεξηνρέο. Απφ εδψ
κπνξνχκε λα ξπζκίζνπκε ζε πνηεο πεξηνρέο ζα εκθαλίδνληαη ηα δηάθνξα blocks πεξηερνκέλνπ

Menus: Μπνξνχκε λα ειέγμνπκε ηα κελνχ ηεο ηζηνζειίδαο φπσο ην κελνχ πινήγεζεο,
πξσηεπφλησλ θαη δεπηεξεπφλησλ ζπλδέζκσλ, θαζψο θαη άιισλ κελνχ πνπ κπνξνχκε λα
δεκηνπξγήζνπκε εκείο νη ίδηνη. Δπίζεο κπνξνχκε λα πξνζζέζνπκε λέα κελνχ ή λα επεμεξγαζηνχκε ηα
ήδε ππάξρνληα.

Modules: Αθνξά ηελ πεξηνρή απφ ηελ νπνία κπνξνχκε λα ελεξγνπνηήζνπκε ή λα
απελεξγνπνηήζνπκε ηα δηάθνξα επηπξφζζεηα modules (ελφηεηεο).

Themes: Απφ εδψ κπνξνχκε λα νξίζνπκε είηε εκείο είηε νη ρξήζηεο έλα theme (ζέκα) ηεο
πξνηίκεζεο καο.
165
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
΢ε απηήλ ηελ θαηεγνξία Site configuration πξνζαξκφδνπκε ηηο βαζηθέο ξπζκίζεηο θαη επηινγέο γηα
ηελ ηζηνζειίδα καο.

Actions: Σα actions (ελέξγεηεο) είλαη κεκνλσκέλεο εξγαζίεο πνπ κπνξεί λα θάλεη ην ζχζηεκα
φπσο ή θαηάξγεζε δεκνζίεπζεο ελφο πεξηερνκέλνπ ή ε απαγφξεπζε ελφο ρξήζηε. Τπάξρνπλ θάπνηα
modules φπσο ην trigger module πνπ ελεξγνπνηνχλ απηέο ηηο ελέξγεηεο φηαλ νξηζκέλα γεγνλφηα ηνπ
ζπζηήκαηνο ζπκβνχλ. Τπάξρνπλ δχν είδε ελεξγεηψλ, νη απιέο (simple) θαη νη πξνρσξεκέλεο
(advanced).

Administration theme: Απφ εδψ κπνξνχκε λα νξίζνπκε πνην theme ζα εκθαλίδεηαη ζηηο
ζειίδεο δηαρείξηζεο.

Clean URLs: Μπνξνχκε λα ελεξγνπνηήζνπκε ή λα απελεξγνπνηήζνπκε απηή ηελ επηινγή.

Date and time: Ρπζκίζεηο γηα ην πψο εκθαλίδεηαη ε εκεξνκελία θαη ε ψξα ζην Drupal θαζψο
θαη γηα ηελ δψλε ψξαο ηνπ ζπζηήκαηνο.

Error reporting: Απφ εδψ ειέγμνπκε πσο ζα εκθαλίδνληαη ε ζειίδεο ιάζνπο 403/404
(Access denied/not found) θαζψο θαη λα ξπζκίζνπκε πσο ζα εκθαλίδνληαη ε αλαθνξέο ιάζνπο.

File system: Οξίδνπκε πνπ απνζεθεχνληαη ηα αξρεία καο θαη ηνλ ηξφπν πξφζβαζεο ζε απηά.

Image toolkits: Απφ εδψ επηιέγνπκε πνην εξγαιείν επεμεξγαζίαο εηθφλσλ ζα
ρξεζηκνπνηήζνπκε. Έρνπκε ηελ δπλαηφηεηα λα πξνζζέζνπκε θάπνην εξγαιείν ηεο αξεζθείαο καο.

Input formats: Αθνξά ηηο ξπζκίζεηο θηιηξαξίζκαηνο γηα ην πεξηερφκελν πνπ δεκηνπξγνχλ νη
ρξήζηεο ζπκπεξηιακβάλνληαο ηα html tags. Δπίζεο επηηξέπεηαη ε ελεξγνπνίεζε θίιηξσλ πνπ
παξέρνληαη απφ άιια modules.

Logging and alerts: Ρπζκίζεηο γηα modules ζρεηηθά κε ηηο ζπλδέζεηο θαη ηηο εηδνπνηήζεηο.

Performance: Δλεξγνπνίεζε ή απελεξγνπνίεζε ηεο επηινγήο cache ησλ ζειίδσλ γηα ηνπο
αλψλπκνπο ρξήζηεο θαη ξπζκίζεηο γηα CSS θαη Javascript πνπ απνζθνπεί ζηελ βειηηζηνπνίεζε
ρξήζεο ηνπ εχξνπο δψλεο.

Site information: Απφ εδψ κπνξνχκε λα ξπζκίζνπκε βαζηθέο πιεξνθνξίεο ηεο ηζηνζειίδαο
καο φπσο ηελ νλνκαζία ηεο, ην ζιφγθαλ, ηελ δηεχζπλζε ειεθηξνληθνχ ηαρπδξνκείνπ,ηνλ ζθνπφ, ηελ
αξρηθή ζειίδα θαη άιια.

Site maintenance: Θέηνπκε ηελ ηζηνζειίδα καο offline γηα ζπληήξεζε ή ηελ επαλαθέξνπκε
online.
Απφ ην User management Απφ απηή ηελ θαηεγνξία κπνξνχκε λα δηαρεηξηζηνχκε ηνπο ρξήζηεο θαη ηα
γθξνππ ηεο ηζηνζειίδαο καο. Δπίζεο έρνπκε πξφζβαζε ζε επηινγέο ηεο ηζηνζειίδαο. Δπίζεο απφ ηεο
επηινγέο απηέο άιιεο πιεξνθνξίεο θαηάζηαζεο.
 Access rules: Έρνπκε ηελ δπλαηφηεηα λα νξίζνπκε θαλφλεο γηα λα κελ επηηξέςνπκε θάπνηα
usernames, δηεπζχλζεηο ειεθηξνληθνχ ηαρπδξνκείνπ θαη δηεπζχλζεηο IP.
 Permissions: Καζνξηζκφο πξφζβαζεο ζε ραξαθηεξηζηηθά ηεο ηζηνζειίδαο επηιέγνληαο
δηθαηψκαηα γηα ηνπο ξφινπο ρξεζηψλ.
 Roles: Απφ εδψ κπνξνχκε λα δνχκε, λα επεμεξγαζηνχκε θαη λα πξνζζέζνπκε ξφινπο
ρξεζηψλ.
 User settings: Αθνξά ηηο ξπζκίζεηο ηεο πξνεπηιεγκέλεο «ζπκπεξηθνξάο» ησλ ρξεζηψλ
ζπκπεξηιακβαλνκέλνπ ησλ απαηηήζεσλ εγγξαθήο, δηεπζχλζεσλ ειεθηξνληθνχ ηαρπδξνκείνπ
θαη θσηνγξαθηψλ ησλ ρξεζηψλ.
 Users: απφ εδψ κπνξνχκε λα δνχκε ηελ ιίζηα κε ηνπο ρξήζηεο καο θαη λα πξνζζέζνπκε
θάπνηνπο ή λα επεμεξγαζηνχκε ηνπο ήδε ππάξρνληεο.
166
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Τπάξρεη θαη κηα ππνθαηεγνξία πνπ ιέγεηαη Reports θαη απφ απηέο ηηο επηινγέο κπνξνχκε λα δνχκε
αλαθνξέο απφ ηα αξρεία θαηαγξαθήο ηνπ ζπζηήκαηνο θαη άιιεο πιεξνθνξίεο θαηάζηαζεο:
 Recent log entries: Πξνβνιή γεγνλφησλ πνπ πξφζθαηα θαηαγξάθεθαλ.
 Top acces denied errors (403s): Απφ εδψ κπνξνχκε λα δνχκε
ηηο ζρεηηθέο εγγξαθέο απφ ηα αξρεία θαηαγξαθήο ηνπ ζπζηήκαηνο.
 Top page not found errors (404s): Απφ εδψ κπνξνχκε λα δνχκε ηηο ζρεηηθέο εγγξαθέο απφ
ηα αξρεία θαηαγξαθήο ηνπ ζπζηήκαηνο.
 Available updates: Μαο ελεκεξψλεη ην ζχζηεκα κε κία αλαθνξά θαηάζηαζεο, γηα ηηο
δηαζέζηκεο ελεκεξψζεηο ησλ εγθαηεζηεκέλσλ modules, themes θαζψο θαη γηα ηνλ ππξήλα ηνπ
Drupal.
 Status report: Σν ζχζηεκα παξάγεη κία αλαθνξά θαηάζηαζεο, ηελ νπνία κπνξνχκε λα δνχκε
απφ εδψ, ζρεηηθά κε ηηο ιεηηνπξγίεο ηεο ηζηνζειίδαο θαη δηεγλσζκέλσλ πξνβιεκάησλ.
14.4 Αζθάιεηα
΢ην δηαδίθηπν, ε αζθάιεηα είλαη κηα ηαρέσο εμειηζζφκελε θαη πάληα παξνχζα πξφθιεζε. Γελ
ππάξρεη έλαο ζπγθεθξηκέλνο ηξφπνο γηα λα εμαζθαιίζνπκε ηελ αθεξαηφηεηα ελφο ηζηφηνπνπ, θαζψο
νη θίλδπλνη είλαη πνιινί θαη νη κέζνδνη αζθαιείαο αλαζεσξνχληαη θαη απαμηψλνληαη αλά πάζα
ζηηγκή. Κάπνηνη απφ ηνπο θηλδχλνπο πνπ απεηινχλ έλα site είλαη νη επηζέζεηο DoS (DenialofService),
νη SQL injections, ην CrossSite Scripting (XSS) ην Phising θαη ην Packet Sniffer. Πην ζπγθεθξηκέλα,
φηαλ κηιάκε γηα DoS επηζέζεηο ελλννχκε ηερληθέο, κε ζπλεζέζηεξε ηελ απνζηνιή ζπλερφκελσλ
αηηήζεσλ επηθνηλσλίαο, κε ζηφρν ηελ θαηαλάισζε ησλ πφξσλ ηνπ ζπζηήκαηνο ζχκαηνο, έηζη ψζηε λα
κελ κπνξεί λα αληαπνθξηζεί ζηηο απαηηήζεηο ηεο λφκηκεο θπθινθνξίαο ή λα αληαπνθξίλεηαη ηφζν
αξγά ψζηε λα θαηαζηεί απνδνηηθά κε δηαζέζηκν. Οη SQL Injections απφ ηε κεξηά ηνπο είλαη επηζέζεηο
κε ζηφρν ηελ πξφζβαζε ζηελ βάζε δεδνκέλσλ θαη ηε ζπγθέληξσζε πξνζσπηθψλ πιεξνθνξηψλ, φπσο
νλφκαηα ρξεζηψλ θαη θσδηθνχο πξφζβαζεο ή απιά ηελ θαηαζηξνθή θάπνησλ πηλάθσλ ηεο βάζεο. Η
δηαδηθαζία κίαο Injection ιεηηνπξγεί κε ηελ εηζαγσγή θαθφβνπισλ θνκκαηηψλ θψδηθα κέζα ζε strings
ηα νπνία ζα πεξάζνπλ ζηνλ Server ηεο SQL γηα κεηαγιψηηηζε θαη εθηέιεζε κε απνηέιεζκα λα
νινθιεξσζεί πξφσξα κηα ζεηξά θεηκέλσλ strings θαη λα επηζπλαθζεί κηα λέα εληνιή sql. Δπηπρψο,
ππάξρνπλ πνιιέο θαιά θαζηεξσκέλεο αξρέο πνπ κπνξνχλ λα βνεζήζνπλ ηνλ ηζηφηνπν πνπ
πινπνηήζακε λα παξακέλεη αζθαιήο, φπσο ν πεξηνξηζκφο ησλ δηθαησκάησλ πάλσ ζε θξίζηκα αξρεία
ηνπ ζπζηήκαηνο ή ε απνηξνπή εθηέιεζεο PHP θψδηθα, εηζαγσγή επηθίλδπλσλ html tags θαη upload
επηθίλδπλσλ αξρείσλ απφ κε εμνπζηνδνηεκέλνπο ρξήζηεο.
14.5 Οη Μνλάδεο
Οη κνλάδεο πνπ ρξεζηκνπνηήζεθαλ θαζψο θαη ε πεξηγξαθή ηεο ιεηηνπξγηθφηεηαο ηνπο εκθαλίδνληαη
παξαθάησ:
167
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
14.5.1 Γηαρείξηζε:
Administration menu:
Παξέρεη έλα αλεμάξηεην ζέκα δηεπαθήο ηεο
δηνίθεζεο γηα ην Drupal. Δίλαη έλαο βνεζφο
γηα ηνπο λένπο ρξήζηεο ηνπ Drupal πνπ
πξνέξρνληαη απφ άιια CMS, έλα πξαγκαηηθφ
εξγαιείν γηα ηελ πξνθχιαμε ησλ
δηαρεηξηζηψλ ηεο ηζηνζειίδαο ηνπ Drupal θαη
ζίγνπξα αλαγθαίν γηα ηνπο πξνγξακκαηηζηέο
θαη ηνπο θαηαζθεπαζηέο ηνπ Drupal site.
Αdministration menu toolbar style:
Μηα θαιχηεξε εξγαιεηνζήθε.
Administration views:
Αληηθαζηζηά φιεο ηηο ζειίδεο δηαρείξηζεο ηνπ
ζπζηήκαηνο αληηθείκελν ζην Drupal
ππξήλσλ κε πξαγκαηηθά views
14.5.2 Content Construction Kit (CCK):
΢ε απηή ηελ θαηεγνξία έρεη γίλεη ρξήζε ησλ πξνεπηιεγκέλσλ απφ ηελ εγθαηάζηαζε, modules εθηφο
απφ κεξηθά πνπ απελεξγνπνηήζεθαλ. Πην ζπγθεθξηκέλα ηα modules πνπ είλαη ελεξγνπνηεκέλα
αλαθέξνληαη παξαθάησ.
Content :
Δπηηξέπεη ηελ πξνζσπηθή επηθνηλσλία θαζψο
θαη ηελ επηθνηλσλία κε ρξήζε γεληθήο
θφξκαο ηεο ηζηνζειίδαο.
Content Copy :
Δπηηξέπεη ηελ δπλαηφηεηα εηζαγσγήο /
εμαγσγήο ηνπ πξνζδηνξηζκνχ ησλ πεδίσλ
πεξηερνκέλνπ.
Content Permissions:
Οξίδεη ηα επίπεδα δηθαησκάησλ γηα ηα πεδηα
CCK.
Taxonomy:
Δλεξγνπνηεί ηελ θαηεγνξηνπνίεζε ηνπ
πεξηερνκέλνπ
FileField :
Οξίδεη ηνλ ηχπν αξρείνπ file.
FileField Meta:
Πξνζζέηεη κεηαδεδνκέλα ζπιινγήο θαη
απνζήθεπζεο γηα ην FileField.
ImageField:
Οξίδεη ηνλ ηχπν αξρείνπ image.
Location CCK:
Οξίδεη έλα ηχπν πεδίνπ κε ηίηιν ηνπνζεζία.
Node Reference:
Οξίδεη έλα ηχπν πεδίνπ γηα ηελ αλαθνξά ελφο
168
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
θφκβνπ απφ έλαλ άιιν.
Γείρλεη πεδία nodereference
ρξεζηκνπνηψληαο έλα view.
Node reference views:
FileField ImageCache :
Τπνζηήξημε γηα ηηο εηθφλεο ησλ πεδίσλ ησλ
αξρείσλ ηνπ CCK.
Number:
Καζνξίδεη ηνπο ηχπνπο αξηζκεηηθψλ πεδίσλ.
Option Widgets:
Οξίδεη ηελ επηινγή, ην check box θαη ην radio
button γηα θείκελν θαη αξηζκεηηθά πεδία.
Text :
Οξίδεη ηνλ ηχπν αξρείνπ απινχ θεηκέλνπ.
User Reference:
Οξίδεη έλα ηχπν πεδίνπ γηα ηελ αλαθνξά ελφο
ρξήζηε απφ έλα θφκβν.
14.5.3 Καη ζε απηή ηελ θαηεγνξία έρεη γίλεη ρξήζε ησλ πξνεπηιεγκέλσλ modules θαη ζε θακία
πεξίπησζε δελ πξέπεη λα απελεξγνπνηεζεί θάπνην απφ απηά. ΢πγθεθξηκέλα αλαθεξφκαζηε ζηα
modules πνπ αθνινπζνχλ.
Block :
Διέγρεη ηα πιαίζηα πξφζζεηεο χιεο πνπ
εκθαλίδνληαη γχξσ απφ ηελ θχξηα χιε.
Filter :
Υεηξίδεηαη ην θηιηξάξηζκα ηεο χιεο θαηά ηελ
πξνεηνηκαζία γηα παξνπζίαζε.
System :
Υεηξίδεηαη ηηο γεληθέο ξπζκίζεηο ηνπ
ηζηφηνπνπ γηα ηνπο δηαρεηξηζηέο.
User :
Γηαρεηξίδεηαη ην ζχζηεκα εγγξαθήο θαη
εηζφδνπ ρξεζηψλ.
Block translation :
Δπηηξέπεη ηα πνιχγισζζα κπινθ θαη ηε
κεηάθξαζε ησλ κπινθ.
14.5.4 Views:
Views:
Views Bulk Operations:
Views exporter:
Γεκηνπξγεί πξνζαξκνζκέλεο ιίζηεο θαη
εξσηήκαηα απφ ηε βάζε δεδνκέλσλ καο.
Δθζέηεη λέν ζηπι Πξνβνιέο «Μαδηθή
εθκεηάιιεπζεο» γηα ηελ επηινγή
πνιιαπινχο θφκβνπο θαη ηελ εθαξκνγή
δξάζεσλ ζρεηηθά κε απηέο.
Δπηηξέπεη ηελ εμαγσγή πνιιαπιέο
εκθαλίζεηο κε ηε κία. Views Test: Σεζη
169
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Views UI:
ελφηεηαο γηα πξνβνιέο.
Γηνηθεηηθή δηαζχλδεζε ζηηο απφςεηο. Υσξίο
απηφ ην module δελ ζα κπνξνχζακε λα
δεκηνπξγήζνπκε ή λα επεμεξγαζηνχκε ηηο
απφςεηο καο.
Άιιεο κνλάδεο:
Blog :
Blog API :
Book :
Contact :
Menu :
Update status :
Δπηηξέπεη ηελ εχθνιε θαη ηαθηηθή
ελεκέξσζε ηζηνζειίδσλ ή ησλ ηζηνινγηψλ
ησλ ρξεζηψλ.
Δπηηξέπεη ζηνπο ρξήζηεο λα ππνβάιινπλ χιε
ρξεζηκνπνηψληαο εθαξκνγέο πνπ
ππνζηεξίδνπλ API ηζηνινγηψλ XML-RPC.
Δπηηξέπεη ζηνπο ρξήζηεο λα δνκνχλ ηηο
ηζηνζειίδεο ηεξαξρηθά ή πεξηιεπηηθά.
Δπηηξέπεη λα ρξεζηκνπνηνχληαη θφξκεο
επηθνηλσλίαο, πξνζσπηθέο ή θεληξηθέο, γηα
νιφθιεξν ηνλ ηζηφηνπν.
Δπηηξέπεη
ζηνπο
δηαρεηξηζηέο
λα
πξνζαξκφδνπλ ην κελνχ πινήγεζεο ηνπ
ηζηφηνπνπ
Διέγρεη ηελ θαηάζηαζε ιεηηνπξγίαο γηα
δηαζέζηκεο αλαβαζκίζεηο ηνπ Drupal θαη ησλ
εγθαηεζηεκέλσλ κνλάδσλ θαη ζεκαηηθψλ
παξαιιαγψλ.
15 .Σν δηαρεηξηζηηθό πεξηβάιινλ ηνπ Drupal:
Γεκηνπξγία θφκβνπ ηχπνπ χιεο Page:
Δηθόλα 26 : Γεκηνπξγία θόκβνπ ηύπνπ ύιεο Page.
170
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Παξφιν, πνπ φπσο είπακε, κε ην Drupal ζέινπκε λα δηεπθνιχλνπκε ηελ εηζαγσγή πεξηερνκέλνπ
απφ έλαλ αλεηδίθεπην ρξήζηε, κε ηελ βαζηθή εγθαηάζηαζε ηνπ Drupal, ρξεηάδεηαη γλψζε html γηα λα
εηζάγνπκε ην θπξίσο ζψκα ηνπ πεξηερνκέλνπ. Γηα λα επηηχρνπκε ην ζθνπφ καο, δειαδή ε εηζαγσγή
πεξηερνκέλνπ λα δηεπθνιπλζεί, πξνζζέηνπκε έλα module θαηεγνξίαο user interface, ην wysiwyg
(what you see is what you get) θαη δηαιέγνληαο έλαλ client side editor φπσο ηνλ Fckeditor ή TinyMce
ε εηζαγσγή πεξηερνκέλνπ γίλεηαη ζαλ λα δεκηνπξγνχκε έγγξαθν ηνπ word δίλνληαο καο πνιιέο
επηινγέο φπσο εηζαγσγή εηθφλαο, επηινγή ηδηνηήησλ γηα ηα γξάκκαηα (γξακκαηνζεηξά, κέγεζνο,
ρξψκα) θηι.
Γεκηνπξγία θφκβνπ ηχπνπ χιεο Page κε WYSIWYG editor
Δηθόλα 27 : WYSIWYG editor
Μέζα ζην WYSIWYG editor ν θσδηθαο πνπ έρεη είλαη :
function hook_ckeditor_plugin() {
return array(
'plugin_name' => array(
// Name of the plugin used to write it.
'name' => 'plugin_name',
// Description of the plugin - it would be displayed in the plugins management section of profile
settings.
'desc' => t('Plugin description'),
// The full path to the CKEditor plugins directory, with the trailing slash.
171
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
'path' => drupal_get_path('module', 'my_module') . '/plugin_dir/',
'buttons' => array(
'button_name' => array(
'icon' => 'path to button icon',
'label' => 'Button Label',
)
)
)
);
}
?>
15.1 Σν πξόηππν ζρεδίαζεο (Theme template)
Τπάξρνπλ πνιιά έηνηκα ζεκαηηθά πξφηππα ζρεδηαζκέλα απφ κέιε ηεο Drupal θνηλφηεηαο πνπ
κπνξεί θάπνηνο λα ρξεζηκνπνηήζεη Αξρηθά δεκηνπξγήζεθε ην αξρείν info κε ηηο απαξαίηεηεο
πιεξνθνξίεο γηα ην ζεκαηηθφ πξφηππν ηεο ηζηνζειίδαο καο θαη ζηε ζπλέρεηα έγηλαλ Override ηα
ζεκαληηθφηεξα templates ησλ module αληηγξάθνληαο ηα ζην θάθειν ηνπ ζεκαηηθνχ καο πξνηχπνπ
καο θαη ηξνπνπνηψληαο ηα αλάινγα κε ηηο επηζπκίεο καο. Έηζη, ζην θάθειν ηνπ πξνηχπνπ καο
εηζήρζεζαλ αξρηθά ηα page.tpl, ην node.tpl, ην block.tpl θαη ην View.tpl.
Μπνξνχλ λα επηιέμνπλ έλα theme γηα ηελ ηζηνζειίδα (κεηαβαίλνπκε ζε απηή ηελ ζειίδα επηιέγνληαο
απφ ην κελνχ πινήγεζεο Administer->Site building->Themes).
Δηθόλα 28: Σν πξόηππν ζρεδίαζεο (Theme template)
172
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Με ηελ επηινγή configure δίπια ζην θάζε ζέκα, κπνξνχκε λα κεηαβάιινπκε θάπνηα
ραξαθηεξηζηηθά φπσο ην ρξψκα, ηηο default εηθφλεο θαη logos, θαζψο θαη λα θαζνξίζνπκε πνηα
ζηνηρεία ηεο ηζηνζειίδαο (πρ primary links menu) ζα είλαη νξαηά θιπ.
΢ην drupal 6 ε ζεκαηηθή παξαιιαγή πεξηέρεη ηα αθφινπζα αξρεία:
΋λνκα.info :
Page.tpl.php
Page.tpl.php,style:
Node.tpl.php :
Page.tpl.php :.
Comment.tpl.php :
Logo.png :
Screenshot.png
Έλα απαξαίηεην αξρείν πνπ είλαη λέν ζην Drupal 6, ην νπνίν παξέρεη
πιεξνθνξίεο ζρεηηθά κε ηε ζεκαηηθή παξαιιαγή.
Σν θχξην πξφηππν πνπ θαζνξίδεη ην πεξηερφκελν ζην κεγαιχηεξν
κέξνο ηεο ζειίδαο.
To CSS αξρείν πνπ νξίδεη θαλφλεο CSS γηα ην πξφηππν.
Σν αξρείν απηφ θαζνξίδεη ην πεξηερφκελν ησλ θφκβσλ.
Πξνζδηνξίδεη ην πεξηερφκελν ηνπ κπινθ
Πξνζδηνξίδεη ην πεξηερφκελν ησλ ζρνιίσλ.
Tν ινγφηππφ ζαο, αλ ρξεζηκνπνηείηε έλα.
Απηή είλαη κηα εηθφλα κε ην ζέκα ζαο πνπ ρξεζηκνπνηείηαη ζην admin
panel θαη ζηηο ξπζκίζεηο ηνπ ινγαξηαζκνχ ρξήζηε, αλ έρεηε
ελεξγνπνηήζεη πεξηζζφηεξνπο απφ έλαλ ζέκα έηζη ψζηε νη επηζθέπηεο
κπνξνχλ λα επηιέμνπλ πνην ζέκα ζέινπλ λα ρξεζηκνπνηήζνπλ.
173
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
λα απαξαίηεην αξρείν πνπ είλαη λέν ζην Drupal 6, ην νπνίν παξέρεη πιεξνθνξίεο ζρεηηθά κε ηε
ζεκαηηθή παξαιιαγή, φπνπ είλαη ην bluemarine θαη απηφ έρεη κέζα ηα παξαθάησ αξρεία πνπ
πεξηιακβάλνπλ ηνπο θψδηθεο κε ην φπνην ηα Themes κπνξνχλ λα ιεηηνπξγήζνπλ ζσζηά κέζα ζην
drupal .Αθνινπζνχλ νη θψδηθεο πνπ πεξηέρεη κέζα ηα Themes
Δηθόλα 29 : To bluemarine.
Μέζα ζην θάθειν bluemarine έρνπκε έλα Screenshot.png φπνπ καο παξέρεη έλα αξρείν φπνπ ζα
είλαη ην ινγφηππν καο (ην νπνίν ρξεζηκνπνηείηαη απφ ην Drupal γηα λα πξνζδηνξίζεη ην ζέκα ζηελ
ζειίδα καο πνπ ζα είλαη ην ζέκα επηινγήο) κε ζηπι φπνπ ζα έρνπκε πέληε αξρεία πξνηχπσλ php.
 block.tpl.php: ειέγρεη πψο θαίλνληαη ην κπινθ.
 comment.tpl.php: ΢ρνιηάδεη.
 Box.tpl.php: Διέγρεη ηα πιαίζηα γχξσ απφ ηα ζηνηρείν, ην πην ζπλεζηζκέλν παξάδεηγκα είλαη
γχξσ απφ ηηο κνξθέο ζρφιηνλ.
 Node.tpl.php : Διέγρεη ην πξαγκαηηθφ πεξηερφκελν κηαο ζειίδαο, ην ίδην θφκβν.
 Page.tpl.php: Σν θχξην πξφηππν πνπ θαζνξίδεη ην πεξηερφκελν ζην κεγαιχηεξν κέξνο ηεο
ζειίδαο.
Απηφο είλαη ν ζθειεηφο ηνπ site καο
Σν θύξην πξόηππν πνπ θαζνξίδεη ην πεξηερόκελν ζην κεγαιύηεξν κέξνο ηεο ζειίδαο
δει.Η βαζηθε Page.tpl.php εηλαη:
<?php
// $Id: page.tpl.php,v 1.28.2.1 2009/04/30 00:13:31 goba Exp $
?><!DOCTYPE
html
PUBLIC
"-//W3C//DTD
XHTML
1.0
Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php print $language->language ?>"
xml:lang="<?php print $language->language ?>" dir="<?php print $language->dir ?>">
<head>
<?php print $head ?>
<title><?php print $head_title ?></title>
<?php print $styles ?>
<?php print $scripts ?>
174
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
<script type="text/javascript"><?php
/ ?> </script>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" id="header">
<tr>
<td id="logo">
<?php if ($logo) { ?><a href="<?php print $front_page ?>" title="<?php print t('Home')
?>"><img src="<?php print $logo ?>" alt="<?php print t('Home') ?>" /></a><?php } ?>
<?php if ($site_name) { ?><h1 class='site-name'><a href="<?php print $front_page ?>"
title="<?php print t('Home') ?>"><?php print $site_name ?></a></h1><?php } ?>
<?php if ($site_slogan) { ?><div class='site-slogan'><?php print $site_slogan
?></div><?php } ?>
</td>
<td id="menu">
<?php if (isset($secondary_links)) { ?><?php print theme('links', $secondary_links,
array('class' => 'links', 'id' => 'subnavlist')) ?><?php } ?>
<?php if (isset($primary_links)) { ?><?php print theme('links', $primary_links,
array('class' => 'links', 'id' => 'navlist')) ?><?php } ?>
<?php print $search_box ?>
</td>
</tr>
<tr>
<td colspan="2"><div><?php print $header ?></div></td>
</tr>
</table>
<table border="0" cellpadding="0" cellspacing="0" id="content">
<tr>
<?php if ($left) { ?><td id="sidebar-left">
<?php print $left ?>
</td><?php } ?>
<td valign="top">
<?php if ($mission) { ?><div id="mission"><?php print $mission ?></div><?php } ?>
<div id="main">
<?php print $breadcrumb ?>
<h1 class="title"><?php print $title ?></h1>
<div class="tabs"><?php print $tabs ?></div>
<?php if ($show_messages) { print $messages; } ?>
<?php print $help ?>
<?php print $content; ?>
<?php print $feed_icons; ?>
</div>
</td>
<?php if ($right) { ?><td id="sidebar-right">
<?php print $right ?>
175
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
</td><?php } ?>
</tr>
</table>
<div id="footer">
<?php print $footer_message ?>
<?php print $footer ?>
</div>
<?php print $closure ?>
</body>
</html>
Σν αξρείν απηό θαζνξίδεη ην πεξηερόκελν ησλ θόκβσλ .Node.tpl.php :.
<?php
// $Id: node.tpl.php,v 1.7 2007/08/07 08:39:36 goba Exp $
?>
<div class="node<?php if ($sticky) { print " sticky"; } ?><?php if (!$status) { print "
node-unpublished"; } ?>">
<?php if ($picture) {
print $picture;
}?>
<?php if ($page == 0) { ?><h2 class="title"><a href="<?php print $node_url?>"><?php
print $title?></a></h2><?php }; ?>
<span class="submitted"><?php print $submitted?></span>
<div class="taxonomy"><?php print $terms?></div>
<div class="content"><?php print $content?></div>
<?php if ($links) { ?><div class="links">&raquo; <?php print $links?></div><?php };
?>
</div>
176
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Πξνζδηνξίδεη ην πεξηερόκελν ησλ ζρνιίσλ. comment.tpl.php εηλαη:
<?php
// $Id: comment.tpl.php,v 1.7 2008/01/04 19:24:23 goba Exp $
?>
<div class="comment<?php print ' '. $status; ?>">
<?php if ($picture) {
print $picture;
} ?>
<h3 class="title"><?php print $title; ?></h3><?php if
class="new"><?php print $new; ?></span><?php } ?>
<div class="submitted"><?php print $submitted; ?></div>
<div class="content">
<?php print $content; ?>
<?php if ($signature): ?>
<div class="clear-block">
<div>—</div>
<?php print $signature ?>
</div>
<?php endif; ?>
</div>
<div class="links">&raquo; <?php print $links; ?></div>
</div>
($new
!=
'')
{
?><span
15.2 Modules
Οη κνλάδεο ηνπ Drupal είλαη plugins πνπ κπνξνχλ λα εγθαηαζηαζνχλ ζην site ηεο βάζεο ηνπ Drupal
γηα λα βνεζήζνπλ ηελ επέθηαζε ή ηελ ελίζρπζε ηεο ιεηηνπξγηθφηεηαο ηνπ πξνγξάκκαηνο ηνπ ππξήλα
ηνπ Drupal. Σα modules είλαη ειεχζεξα λα ηα θαηεβάζεη θάπνηνο θαη απαηηνχλ θάπνηα δηακφξθσζε,
αιιά είλαη άξηζηα εξγαιεία ζρεδηαζκέλα γηα λα καο βνεζήζνπλ λα επηηχρνπκε ηα απνηειέζκαηα πνπ
ζέινπκε απφ ην δηθηπαθφ καο ηφπν κε ρξήζε ηνπ Drupal. Δπίζεο ε εγθαηάζηαζε ησλ επηπξφζζεησλ
modules πξαγκαηνπνηείηαη αθξηβψο κε ηνλ ίδην ηξφπν φπσο θαη ζηα Themes. Δθφζνλ θαηαιήμνπκε
ζην module πνπ επηζπκνχκε λα εγθαηαζηήζνπκε, πξαγκαηνπνηνχκε ιήςε ηνπ. Έπεηηα
απνζπκπηέδνπκε ην αξρείν θαη ην αληηγξάθνπκε ζηνλ θάθειν public_html/sites/all/modules. ηνλ
νπνίν έρνπκε δεκηνπξγήζεη. Έπεηηα κεηαβαίλνπκε ζηελ ζειίδα ησλ modules (Asministrator Menu –
Site Bulding –Modules – List θαη ην ελεξγνπνηνχκε ηζεθάξνληαο ην αληίζηνηρν θνπηάθη θαη θάλνληαο
θιηθ ζην θνπκπί Save configuration.
Έλα Module έρεη έλα ππν-θάθεινπο φπνπ εθεί βάδεη ηνλ θψδηθα PHP φπνπ είλαη :
 php.info : Σν αξρείν ηνπ .info είλαη έλα απιφ αξρείν θεηκέλσλ πνπ δίλεη ηηο αλαγθαίεο
πιεξνθνξίεο ζην ππξήλα Drupal γηα ηελ ελφηεηα καο.
 php.module: Σν .module πεξηέρεη ηνλ θψδηθα php πνπ ν ππξήλαο Drupal ζα θνξηψζεη θαη
ζα εθηειέζεη.
 Τπάξρεη θαη ην Hooks: Έλα απφ ηα ηζρπξά ραξαθηεξηζηηθά γλσξίζκαηα ηεο αξρηηεθηνληθήο
ηνπ Drupal είλαη νη εηδηθά νλνκαζκέλεο ιεηηνπξγίεο πνπ επηηξέπνπλ ζηελ ελφηεηα καο γηα λα
177
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
αιιειεπηδξά κε ηνλ ππξήλα Drupal. Απηέο νη εηδηθέο ιεηηνπξγίεο αλαθέξνληαη σο Hooks επεηδή
αθήλνπλ ηελ ελφηεηα καο θνιιάεη ζηνλ ππφινηπν ηνπ ππξήλα Drupal.
15.2.1 Σα Drupal Hooks
Drupal Hooks: Σα hooks επηηξέπνπλ ηα modules λα αιιειεπηδξνχλ κε ηνλ ππξήλα ηνπ Drupal
(Drupal core).Σν ζχζηεκα ησλ module ηνπ Drupal βαζίδεηαη ζηελ γεληθή ηδέα ησλ ―hooks‖
(άγθηζηξα). To hook είλαη κία PHP ιεηηνπξγία (function) ε νπνία νλνκάδεηαη foo_bar(), φπνπ ―foo‖
είλαη ην φλνκα ηνπ module (ηνπ νπνίνπ ην φλνκα αξρείνπ είλαη foo.module) θαη ―bar‖ είλαη ην φλνκα
ηνπ hook. Σν θάζε hook έρεη έλα θαζνξηζκέλν ζχλνιν απφ παξακέηξνπο θη έλα θαζνξηζκέλν ηχπν
απνηειεζκάησλ.
Γηα λα επεθηαζεί ην Drupal, ζα πξέπεη απιά λα εθαξκνζηεί έλα hook απφ έλα module. Όηαλ ην
Drupal επηζπκεί λα επηηξέςεη κεζνιάβεζε απφ ηα modules, θαζνξίδεη ην πνηα modules εθαξκφδνπλ
θάπνην hook θαη θαιεί απηφ ην hook ζε φια ηα ελεξγνπνηεκέλα modules πνπ ην εθαξκφδνπλ.
Λεηηνπξγίεο θαη Μέζνδνη
΋λνκα
Πεξηγξαθή
custom_url_rewrite_inbound:
hook_boot:
Γελ είλαη hook, είλαη έλα function πνπ
κπνξνχκε
λα
πξνζζέζνπκε
ζην
settings.php γηα λα κεηαβάιινπκε ηα
εηζεξρφκελα αηηήκαηα έηζη ψζηε λα
δείμνπλ ζην path ηνπ Drupal. Απηφ ην
function θαιείηαη πξηλ θνξησζνχλ ηα
modules θαη ην ζχζηεκα ηνπ κελνχ
αξρηθνπνηείηαη θαη αιιάδεη.
Γελ είλαη hook, είλαη κία function πνπ
κπνξνχκε
λα
πξνζζέζνπκε
ζην
settings.php γηα λα κεηαβάιινπκε φινπο
ηνπο ζπλδέζκνπο πνπ έρνπλ παξαρζεί απφ
ην Drupal. Απηφ ην function θαιείηαη απφ
ην url().
Οξίδεη ηνπο πεξηνξηζκνχο ζηελ πξφζβαζε.
Δθηειεί θψδηθά κεηά απφ ηε δηαγξαθή
ελφο action.
Γειψλεη πιεξνθνξίεο ζρεηηθά κε ηα
actions.
Σξνπνπνηεί ηα actions πνπ δειψζεθαλ απφ
έλα άιιν module.
Γειψλεη έλα κπινθ ή έλα ζχλνιν απφ
κπινθ.
Δθηειεί εξγαζίεο εγθαηάζηαζεο.
hook_comment:
Αληαπνθξίλεηαη ζηηο ελέξγεηεο ησλ ρνιίσλ.
custom_url_rewrite_outbound:
hook_access:
hook_actions_delete:
hook_action_info:
hook_action_info_alter:
hook_block:
178
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
hook_cron:
hook_db_rewrite_sql:
hook_delete:
hook_disable:
hook_elements:
Hook_enable:
Δθηειεί πεξηνδηθέο ελέξγεηεο.
Δπαλαγξάθεη εξσηήκαηα ηεο βάζεο
δεδνκέλσλ. ΢πλήζσο γηα έιεγρν ηεο
πξφζβαζεο.
Αληαπνθξίλεηαη ζηε δηαγξαθή θφκβνπ.
Δθηειεί ηηο απαξαίηεηεο ελέξγεηεο πξηλ
απελεξγνπνηεζεί ην module.
Δπηηξέπεη ηα modules λα δειψζνπλ ηηο
δηθνχο ηνπο ηχπνπο ησλ ζηνηρείσλ ησλ
Forms API θαη λα θαζνξίζνπλ ηηο
πξνθαζνξηζκέλεο ηηκέο.
Γηελεξγεί ηηο απαξαίηεηεο ελέξγεηεο κεηά
απφ ηελ ελεξγνπνίεζε ηνπ module.
hook_exit:
Γηελεξγεί δηεξγαζίεο θαζαξηζκνχ.
hook_file_download:
Διέγρεη ηελ πξφζβαζε ζηε ιήςε
ηδησηηθψλ αξρείσλ θαη θαζνξίδεη ηηο HTTP
θεθαιίδεο.
Οξίδεη ηα θίιηξα πεξηερνκέλνπ.
hook_filter:
hook_filter_tips:
hook_flush_caches:
hook_footer:
hook_form:
hook_forms:
hook_form_alter:
hook_form_FORM_ID_alter:
hook_help:
hook_hook_info:
Παξέρεη ζπκβνπιέο γηα ηε ρξήζηε ησλ
θίιηξσλ.
Πξνζζέηεη κία ιίζηα απφ πίλαθεο πνπ
βξίζθνληαη ζηε κλήκε cache γηα λα
εθθαζαξηζηνχλ.
Δηζάγεη ην θιείζηκν ζε HTML.
Πξνβάιεη κία θφξκα επεμεξγαζίαο ελφο
θφκβνπ.
Καζνξίδεη ηηο form_ids ζηηο builder
functions.
Δθηειεί ηξνπνπνηήζεηο πξηλ ε θφξκα
θαηαζηεί.
Παξέρεη κία ζπγθεθξηκέλε ηξνπνπνίεζε
ηεο
θφξκαο
αληί
γηα
ην
globalhook_form_alter().
Παξέρεη βνήζεηα ζην ρξήζηε ζε απεπζείαο
ζχλδεζε.
Δθζέηεη κία ιίζηα απφ γεγνλφηα ζηα νπνία
νη ρξήζηεο κπνξνχλ λα αλαζέζνπλ
ελέξγεηεο.
hook_init:
Δθηειεί εξγαζίεο εγθαηάζηαζεο.
hook_insert:
Αληαπνθξίλεηαη ζηελ εηζαγσγή θφκβνπ.
179
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
hook_install:
hook_link:
hook_link_alter:
hook_load:
hook_locale:
hook_mail:
hook_mail_alter:
hook_menu:
hook_menu_alter:
hook_menu_link_alter:
hook_nodeapi:
hook_node_access_records:
hook_node_grants:
Δγθαζηζηά ηελ ηξέρνπζα έθδνζε ηνπ
ζρήκαηνο ηεο βάζεο δεδνκέλσλ, θαη φηη
άιιεο δηεξγαζίεο εγθαηάζηαζεο ππάξρνπλ.
Οξίδεη ηνπο εζσηεξηθνχο ζπλδέζκνπο ηνπ
Drupal.
Γηελεξγεί
ηξνπνπνηήζεηο
πξηλ
λα
παξαζρεζνχλ νη ζχλδεζκνη ζε έλαλ θφκβν
ή ηα ζρφιηα.
Φνξηψλεη πιεξνθνξίεο ζπγθεθξηκέλσλ
ηχπσλ θφκβσλ.
Δπηηξέπεη ζηα modules λα νξίζνπλ ηηο
δηθέο ηνπο νκάδεο θεηκέλνπ φπνπ κπνξνχλ
λα κεηαθξαζηνχλ.
Πξνεηνηκάδεη έλα κήλπκα βαζηζκέλν ζε
παξακέηξνπο, ην νπνίν θαιείηαη απφ ην
drupal_mail().
Σξνπνπνηεί νπνηαδήπνηε φςε ησλ email
πνπ απνζηέιινληαη απφ ην Drupal.
Οξίδεη ηα αληηθείκελα ησλ κελνχ θαη ηηο
επαλαθιήζεηο ησλ ζειίδσλ.
Σξνπνπνηεί ηα δεδνκέλα πνπ έρνπλ
απνζεθεπηεί ζηνλ πίλαθα {menu_router}
αθνπ επηθαιεζζεί ην after hook_menu.
Σξνπνπνηεί ηα δεδνκέλα πνπ έρνπλ
απνζεθεπηεί ζηνλ πίλαθα {menu_links}
απφ ην menu_link_save().
Δλεξγεί ζηνπο θφκβνπο πνπ έρνπλ νξηζηεί
απφ άιια modules.
Θέηεη ηηο άδεηεο πνπ ζα γξαθηνχλ ζηελ
βάζε δεδνκέλσλ γηα έλαλ θφκβν.
Δλεκεξψλεη ην ζχζηεκα πξφζβαζεο ηνπ
θφκβνπ γηα ην ηη άδεηεο έρεη έλαο ρξήζηεο.
hook_node_info:
Οξίδεη ηνπο ηχπνπο
παξέρνληαη απφ module.
θφκβνπ
πνπ
hook_node_operations:
Πξνζζέηεη καδηθέο ιεηηνπξγίεο θφκβνπ.
hook_node_type:
Δλεξγεί ζηηο αιιαγέο ηνπ ηχπνπ θφκβνπ.
hook_openid:
Δπηηξέπεη ζηα modules λα ηξνπνπνηήζνπλ
ηηο παξακέηξνπο ησλ αηηεκάησλ OpenID.
hook_perm:
Οξίδεη ηηο άδεηεο ηνπ ρξήζηε.
180
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
hook_ping:
hook_prepare:
hook_preprocess:
hook_preprocess_HOOK:
Δθηειεί ηε ιεηηνπξγία ping ζε έλαλ άιιν
δηαθνκηζηή.
Απηφ είλαη έλα hook ην νπνίν
ρξεζηκνπνηείηαη απφ modules θφκβσλ.
Καιείηαη κεηά ηε θφξησζε αιιά πξηλ ηελ
εκθάληζε ηνπ θφκβνπ ζηε θφξκα
πξνζζήθεο/επεμεξγαζίαο.
Πξνεπεμεξγάδεηαη ηηο κεηαβιεηέο ηνπ
ζέκαηνο γηα ηα αξρεία πξνηχπσλ.
Πξνεπεμεξγάδεηαη ηηο κεηαβιεηέο ηνπ
ζέκαηνο γηα έλα ζπγθεθξηκέλν hook
ζέκαηνο.
hook_profile_alter:
Σξνπνπνηεί ηα αληηθείκελα πξνθίι πξηλ
απηά απνδνζνχλ.
hook_requirements:
Διέγρεη ηηο απαηηήζεηο ηηο εγθαηάζηαζεο
θαη θάλεη αλαθνξά θαηάζηαζεο.
hook_schema:
hook_schema_alter:
hook_search:
hook_search_page:
hook_search_preprocess:
hook_system_info_alter:
hook_taxonomy:
hook_term_path:
hook_theme:
hook_theme_registry_alter:
hook_translated_menu_link_alter:
hook_translation_link_alter:
Οξίδεη ηελ ηξέρνπζα έθδνζε ηνπ ζρήκαηνο
ηεο βάζεο δεδνκέλσλ.
Γηελεξγεί ηξνπνπνηήζεηο ζε πθηζηάκελα
ζρήκαηα βάζεο δεδνκέλσλ.
Οξίδεη κία πξνζαξκνζκέλε ξνπηίλα
αλαδήηεζεο.
Παξαθάκπηεη
ηελ
απφδνζε
ησλ
απνηειεζκάησλ αλαδήηεζεο.
Πξνεπεμεξγάδεηαη
θείκελν
γηα
ην
επξεηήξην αλαδήηεζεο.
Σξνπνπνηεί
ηελ
πιεξνθνξία
πνπ
αλαιχζεθε απφ ηα αξρεία πιεξνθνξίαο
ηνπ module θαη ηνπ ζέκαηνο.
Δλεξγεί ζηηο αιιαγέο ηαμηλφκεζεο.
Δπηηξέπεη ζηα modules λα παξέρνπλ έλα
ελαιιαθηηθφ path γηα ηνπο φξνπο ηνπο
νπνίνπο δηαρεηξίδεηαη.
Καηαρσξεί ηηο εθηειέζεηο ηνπ ζέκαηνο
ελφο module ή ελφο ζέκαηνο.
Σξνπνπνηεί ηηο πιεξνθνξίεο ηνπ κεηξψνπ
ηνπ ζέκαηνο πνπ επηζηξάθεθαλ απφ ην
hook_theme().
Σξνπνπνηεί έλαλ ζχλδεζκν κελνχ αθνχ
κεηαθξαζηεί θαη πξηλ απνδνζεί.
Γηελεξγεί ηξνπνπνηήζεηο ζε ζπλδέζκνπο
κεηάθξαζεο.
181
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
hook_uninstall:
hook_update:
hook_update_index:
hook_update_last_removed:
hook_update_N:
hook_update_projects_alter:
hook_update_status_alter:
hook_user:
hook_user_operations:
hook_validate:
Αθαηξεί νπνηαδήπνηε πιεξνθνξία ζέηεη ην
module.
Αληαπνθξίλεηαη ζηελ ελεκέξσζε ηνπ
θφκβνπ.
Δλεκεξψλεη ην επξεηήξην ηνπ πιήξνπο
θεηκέλνπ ηνπ Drupal γη απηφ ην module.
Δπηζηξέθεη έλαλ αξηζκφ ν νπνίνο δελ είλαη
πιένλ
δηαζέζηκνο,
φπσο
ην
hook_update_N().
Γηελεξγεί κία κφλν ελεκέξσζε.
Σξνπνπνηεί ηε ιίζηα ησλ project πξηλ
πάξεη δεδνκέλα θαη ζπγθξίλεη ηηο εθδφζεηο.
Σξνπνπνηεί ηηο πιεξνθνξίεο γηα ηηο
δηαζέζηκεο ελεκεξψζεηο γηα ηα projects.
Δλεξγεί ζηηο ελέξγεηεο ηνπ ινγαξηαζκνχ
ρξήζηε.
Πξνζζέηεη καδηθέο ιεηηνπξγίεο ηνπ
ρξήζηε.
Δπαιεζεχεη ηε θφξκα επεμεξγαζίαο ελφο
θφκβνπ.
hook_view:
Πξνβάιεη έλαλ θφκβν.
hook_watchdog:
Καηαγξάθεη έλα κήλπκα ζπκβάληνο.
hook_xmlrpc:
Δγγξάθεη επαλαθιήζεηο XML-RPC.
module_hook:
module_implements:
module_invoke:
module_invoke_all:
page_cache_fastpath:
Καζνξίδεη ην εάλ θάπνην module
εθαξκφδεη έλα hook.
Καζνξίδεη ην πνηα modules εθαξκφδνπλ
έλα hook.
Δπηθαιείηαη έλα hook ζε ζπγθεθξηκέλν
module.
Δπηθαιείηαη έλα hook ζε φια ηα
ελεξγνπνηεκέλα
modules
πνπ
ην
εθαξκφδνπλ.
Δμάγεη κία απνζεθεπκέλε ζειίδα.
182
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Ο θώδηθαο πνπ έρεη κέζα έλα blog.module είλαη:
<?php
// $Id: blog.module,v 1.297.2.4 2009/02/25 12:21:53 goba Exp $
/**
* @file
* Enables keeping an easily and regularly updated web page or a blog.
*/
/**
* Οξίδεη ηνπο ηχπνπο θφκβνπ πνπ παξέρνληαη απφ module .hook_node_info().
*/
function blog_node_info() {
return array(
'blog' => array(
'name' => t('Blog entry'),
'module' => 'blog',
'description' => t('A <em>blog entry</em> is a single post to an online journal, or
<em>blog</em>.'),
)
);
}
* Οξίδεη ηηο άδεηεο ηνπ ρξήζηε. of hook_perm().
*/
function blog_perm() {
return array('create blog entries', 'delete own blog entries', 'delete any blog entry', 'edit own blog
entries', 'edit any blog entry');
}
/**
* Implementation of hook_access().
*/
function blog_access($op, $node, $account) {
switch ($op) {
case 'create':
// Anonymous users cannot post even if they have the permission.
return user_access('create blog entries', $account) && $account->uid ? TRUE : NULL;
case 'update':
return user_access('edit any blog entry', $account) || (user_access('edit own blog entries',
$account) && ($node->uid == $account->uid)) ? TRUE : NULL;
case 'delete':
return user_access('delete any blog entry', $account) || (user_access('delete own blog entries',
$account) && ($node->uid == $account->uid)) ? TRUE : NULL;
}
}
183
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
/**
* Implementation of hook_user().
*/
function blog_user($type, &$edit, &$user) {
if ($type == 'view' && user_access('create blog entries', $user)) {
$user->content['summary']['blog'] = array(
'#type' => 'user_profile_item',
'#title' => t('Blog'),
// l() escapes the attributes, so we should not escape !username here.
'#value' => l(t('View recent blog entries'), "blog/$user->uid", array('attributes' => array('title' =>
t("Read !username's latest blog entries.", array('!username' => $user->name))))),
'#attributes' => array('class' => 'blog'),
);
}
///.... }
}
Καζνξίδεη from_ids ζηηο builder functions of hook_form().
*/
function blog_form(&$node) {
global $nid;
$iid = isset($_GET['iid']) ? (int)$_GET['iid'] : 0;
$type = node_get_types('type', $node);
if (empty($node->body)) {
// If the user clicked a "blog it" link, we load the data from the
// database and quote it in the blog.
if ($nid && $blog = node_load($nid)) {
$node->body = '<em>'. $blog->body .'</em> ['. l($blog->name, "node/$nid") .']';
}
if ($iid && $item = db_fetch_object(db_query('SELECT i.*, f.title as ftitle, f.link as flink FROM
{aggregator_item} i, {aggregator_feed} f WHERE i.iid = %d AND i.fid = f.fid', $iid))) {
$node->title = $item->title;
// Note: $item->description has been validated on aggregation.
$node->body = '<a href="'. check_url($item->link) .'">'. check_plain($item->title) .'</a> - <em>'.
$item->description .'</em> [<a href="'. check_url($item->flink) .'">'. check_plain($item->ftitle)
."</a>]\n";
}
}
//...
}
184
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
/**
* Implementation of hook_view().
*/
function blog_view($node, $teaser = FALSE, $page = FALSE) {
if ($page) {
// Breadcrumb navigation. l() escapes the title, so we should not escape !name.
drupal_set_breadcrumb(array(l(t('Home'), NULL), l(t('Blogs'), 'blog'), l(t("!name's blog",
array('!name' => $node->name)), 'blog/'. $node->uid)));
}
return node_prepare($node, $teaser);
}
/**
* Implementation of hook_link().
*/
function blog_link($type, $node = NULL, $teaser = FALSE) {
$links = array();
if ($type == 'node' && $node->type == 'blog') {
if (arg(0) != 'blog' || arg(1) != $node->uid) {
// This goes to l() and therefore escapes !username in both the title and attributes.
$links['blog_usernames_blog'] = array(
'title' => t("!username's blog", array('!username' => $node->name)),
'href' => "blog/$node->uid",
'attributes' => array('title' => t("Read !username's latest blog entries.", array('!username' =>
$node->name)))
);
}
}
return $links;
}
/**
* Implementation of hook_menu().
*/
function blog_menu() {
$items['blog'] = array(
'title' => 'Blogs',
'page callback' => 'blog_page_last',
'access arguments' => array('access content'),
'type' => MENU_SUGGESTED_ITEM,
'file' => 'blog.pages.inc',
);
$items['blog/%user_uid_optional'] = array(
'title' => 'My blog',
'page callback' => 'blog_page_user',
'page arguments' => array(1),
185
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
'access callback' => 'blog_page_user_access',
'access arguments' => array(1),
'file' => 'blog.pages.inc',
);
$items['blog/%user/feed'] = array(
'title' => 'Blogs',
'page callback' => 'blog_feed_user',
'page arguments' => array(1),
'access callback' => 'blog_page_user_access',
'access arguments' => array(1),
'type' => MENU_CALLBACK,
'file' => 'blog.pages.inc',
);
$items['blog/feed'] = array(
'title' => 'Blogs',
'page callback' => 'blog_feed_last',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
'file' => 'blog.pages.inc',
);
return $items;
}
/**
* Access callback for user blog pages.
*/
function blog_page_user_access($account) {
// The visitor must be able to access the site's content.
// For a blog to 'exist' the user must either be able to
// create new blog entries, or it must have existing posts.
return $account->uid && user_access('access content') && (user_access('create blog entries',
$account) || _blog_post_exists($account));
}
/**
* Helper function to determine if a user has blog posts already.
*/
function _blog_post_exists($account) {
return (bool)db_result(db_query_range(db_rewrite_sql("SELECT 1 FROM {node} n WHERE
n.type = 'blog' AND n.uid = %d AND n.status = 1"), $account->uid, 0, 1));
}
186
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
/**
* Implementation of hook_block().
*
* Displays the most recent 10 blog titles.
*/
function blog_block($op = 'list', $delta = 0) {
global $user;
if ($op == 'list') {
$block[0]['info'] = t('Recent blog posts');
return $block;
}
else if ($op == 'view') {
if (user_access('access content')) {
$result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title, n.created FROM {node} n
WHERE n.type = 'blog' AND n.status = 1 ORDER BY n.created DESC"), 0, 10);
if ($node_title_list = node_title_list($result)) {
$block['content'] = $node_title_list;
$block['content'] .= theme('more_link', url('blog'), t('Read the latest blog entries.'));
$block['subject'] = t('Recent blog posts');
return $block;
}
}
}
}
187
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
O θσδηθαο πνπ έρεη κέζα έλα php.info είλαη ν παξαθάησ :
; $Id: php.info,v 1.2 2007/06/08 05:50:55 dries Exp $
name = PHP filter
description = Allows embedded PHP code/snippets to be evaluated.
package = Core - optional
version = VERSION
core = 6.x
; Information added by drupal.org packaging script on 2010-06-02
version = "6.17"
project = "drupal"
datestamp = "1275505216"
O θσδηθαο πνπ έρεη κέζα έλα php.install είλαη ν παξαθάησ:
<?php
// $Id: php.install,v 1.1 2007/04/24 10:54:34 dries Exp $
/**
* Implementation of hook_install().
*/
function php_install() {
$format_exists = db_result(db_query("SELECT COUNT(*) FROM {filter_formats} WHERE name
= 'PHP code'"));
// Add a PHP code input format, if it does not exist. Do this only for the
// first install (or if the format has been manually deleted) as there is no
// reliable method to identify the format in an uninstall hook or in
// subsequent clean installs.
if (!$format_exists) {
db_query("INSERT INTO {filter_formats} (name, roles, cache) VALUES ('PHP code', '', 0)");
$format = db_result(db_query("SELECT MAX(format) FROM {filter_formats}"));
// Enable the PHP evaluator filter.
db_query("INSERT INTO {filters} (format, module, delta, weight) VALUES (%d, 'php', 0, 0)",
$format);
drupal_set_message(t('A !php-code input format has been created.', array('!php-code' => l('PHP
code', 'admin/settings/filters/'. $format))));
}
}
188
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
//…
}
* Implementation of hook_filter(). Contains a basic PHP evaluator.
*
* Executes PHP code. Use with care.
*/
function php_filter($op, $delta = 0, $format = -1, $text = '') {
switch ($op) {
case 'list':
return array(0 => t('PHP evaluator'));
case 'no cache':
// No caching for the PHP evaluator.
return $delta == 0;
case 'description':
return t('Executes a piece of PHP code. The usage of this filter
should be restricted to administrators only!');
case 'process':
return drupal_eval($text);
default:
return $text;
}
}
15.3 Γηαδηθαζία αίηεζεο ζειίδαο
Όηαλ ζέινπκε λα επηζθεθζνχκε κηα ζειίδα πνπ έρεη δεκηνπξγεζεί κε Drupal, ν browser ζηέιλεη ην
url ζηνλ Web Server. Σν θνκκάηη ηνπ URL κεηά ην domain name είλαη ην path απφ ην νπνίν ην Drupal
ζα απνθαζίζεη ηη πιεξνθνξίεο ζα ζηείιεη ζηνλ browser κέζσ ελφο ή πεξηζζνηέξσλ εξσηεκάησλ ζηε
βάζε δεδνκέλσλ (db queries) πνπ δεκηνπξγνχληαη απφ ηνλ PHP θψδηθα ησλ modules θαη ηνπ
Πξνηχπνπ ζρεδίαζεο, βάζεη ησλ δηθαησκάησλ ηνπ ρξήζηε θαη αληιψληαο ηα δεδνκέλα απφ ηε βάζε
δεδνκέλσλ. Έηζη, ν Web Server ζα θαηαζθεπάζεη κηα html ζειίδα κε ηα δεδνκέλα πνπ έρεη ζπιιέμεη
θαη ζα ηελ ζηείιεη ζηνλ browser. Πην ζπγθεθξηκέλα, αλ έρνπκε clean url, ην module ηνπ Web Server
πνπ είλαη ππεχζπλν γηα ην rewrite ζα μερσξίζεη ην base url απφ ην path (mod_rewrite ζηνλ apache,
ISAP rewrite ζηνλ IIS).
Σν απνηέιεζκα είλαη ην http://example.com/index.php?q=test/1 απφ ην νπνίν θαηαιαβαίλνπκε φηη
φιεο νη αηηήζεηο πεξλάλε απφ ην index.php αξρείν κε παξάκεηξν ην path. Σν index.php ζε θάζε
αίηεζε θαιεί ην bootstrap.inc γηα λα θάλεη ηηο απαξαίηεηεο αξρηθνπνηήζεηο, φπσο λα θνξηψζεη ην
settings.php, λα ζπλδέζεη ηε βάζε δεδνκέλσλ θαη αλάινγα κε ην ζχζηεκα ηεο βάζεο λα θνξηψζεη ηηο
απαξαίηεηεο βηβιηνζήθεο πνπ ζα ρξεζηκνπνηεζνχλ ζην db.abstraction layer (π.ρ αλ είλαη ΜySQL
θνξηψλεη ην database.mysql.inc) θαη επίζεο λα θνξηψζεη φιεο ηηο βηβιηνζήθεο ζπλαξηήζεσλ ηνπ
Drupal, φια ηα ελεξγνπνηεκέλα modules, ηελ ππνζηήξημε γηα ην theme system θαη ην callback
mapping. ΢ηε θάζε απηή έρνπλ θνξησζεί φια ηα απαξαίηεηα ζηνηρεία θαη είλαη δηαζέζηκα ψζηε λα
γίλεη ην mapping κεηαμχ ηνπ path θαη ησλ ζπλαξηήζεσλ πνπ ζα παξάμνπλ ην βαζηθφ πεξηερφκελν
απηήο ηεο ζειίδαο. Πην ζπγθεθξηκέλα, θαινχληαη φια ηα modules πνπ έρνπλ εθαξκφζεη, δειαδή είλαη
ππεχζπλα γηα ηε δεκηνπξγία κηαο ζειίδαο. Έπεηηα, αλαδεηείηαη ζηνλ πίλαθα ―menu_router‖ ην item κε
πξσηεχνλ θιεηδί ην ζπγθεθξηκέλν path θαη θαιείηαη ε ζπλάξηεζε απηνχ ηνπ item γηα λα παξάγεη ην
απνηέιεζκα, αλ βέβαηα ν ρξήζηεο έρεη ηα απαξαίηεηα δηθαηψκαηα. Σν απνηέιεζκα απηφ
189
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
(πεξηερφκελν ρσξίο κνξθνπνίεζε) πεξλάεη ζηελ index.php ζαλ κεηαβιεηή κε φλνκα ―return‖ θαη
θαιείηαη ε ―theme (page,return)‖ γηα λα ην κνξθνπνηήζεη ζχκθσλα κε ην page.tpl αξρείν. Σν theme
system θάλεη κηα πξνδηεξγαζία γηα ηε δηάηαμε ηεο ζειίδαο θαη ηηο πεξηνρέο (regions) θαη θαιεί ην
―theme(block,regions)‖ ην νπνίν ζα εηζάγεη ηα blocks, πνπ ζα πιαηζηψζνπλ ην βαζηθφ πεξηερφκελν,
ζηα regions θαη εκθαλίδεη ηελ ηειηθή ζειίδα κε ην πεξηερφκελν θαη ηα blocks κνξθνπνηεκέλα
ζχκθσλα κε ηηο θαηάιιειεο ζπλαξηήζεηο ή αξρεία.
Οη θσδηθαο γηα λα εθηειεζηεη ην index.php είλαη:
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$return = menu_execute_active_handler();
// Menu status constants are integers; page content is a string.
if (is_int($return)) {
switch ($return) {
case MENU_NOT_FOUND:
drupal_not_found();
break;
case MENU_ACCESS_DENIED:
drupal_access_denied();
break;
case MENU_SITE_OFFLINE:
drupal_site_offline();
break;
}
}
elseif (isset($return)) {
// Print any value (including an empty string) except NULL or undefined:
print theme('page', $return);
}
drupal_page_footer();
190
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
15.4 Database Abstraction Layer
Δπηηξέπεη ηε ρξήζε δηαθνξεηηθψλ δηαθνκηζηψλ βάζεσλ δεδνκέλσλ (database servers) λα
ρξεζηκνπνηνχλ ηελ ίδηα βάζε θψδηθα.
Σν Drupal παξέρεη έλα ιεπηφ επίπεδν αθαίξεζεο βάζεο δεδνκέλσλ (database abstraction layer) γηα
λα δίλεη ζηνπο πξνγξακκαηηζηέο ηε δπλαηφηεηα λα ππνζηεξίδνπλ πνιιαπινχο δηαθνκηζηέο βάζεσλ
δεδνκέλσλ εχθνια. Η πξφζεζε απηνχ ηνπ επηπέδνπ είλαη λα δηαθπιάηηεη ηε ζχληαμε θαη ηε δχλακε
ηνπ SQL φζν κπνξεί πεξηζζφηεξν, ελψ ηαπηφρξνλα λα επηηξέπεη ζην Drupal λα ειέγρεη ηα θνκκάηηα
απφ εξσηήκαηα (queries) πνπ ρξεηάδνληαη λα γξαθνχλ δηαθνξεηηθά γηα δηαθνξεηηθνχο δηαθνκηζηέο
θαη λα παξέρνπλ βαζηθνχο ειέγρνπο αζθαιείαο.
Σα πεξηζζφηεξα εξσηήκαηα βάζεσλ δεδνκέλσλ ηνπ Drupal εθηεινχληαη απφ κία θιήζε ζην
db_query() ή ζην db_query_range(). Οη ζπληάθηεο ησλ modules ζα πξέπεη λα ιάβνπλ ππ' φςελ ηε
ρξήζε ηνπ pager_query() γηα ηα εξσηήκαηα πνπ επηζηξέθνπλ απνηειέζκαηα ηα νπνία ζα
εκθαλίδνληαη ζε πνιιαπιέο ζειίδεο, θαη ηνπ tablesort_sql() γηα ηε δεκηνπξγία θαηάιιεισλ
εξσηεκάησλ γηα ηαμηλνκεκέλα tables.
Γηα παξάδεηγκα, θάπνηνο κπνξεί λα επηζπκεί λα ιάβεη ηε ιίζηα κε ηνπο 10 πην πξφζθαηνπο θφκβνπο
πνπ έρεη ζπληάμεη θάπνηνο ρξήζηεο. Αληί λα εθδίδνπκε απεπζείαο ην SQL εξψηεκα
SELECT n.nid,. n.tittle, n.created FROM node n WHERE n,uid = $uid LIMIT 0, 10;
ζα κπνξνχζακε λα θαιέζνπκε ηηο functions ηνπ Drupal:
$result = db_query_range('SELECT n.nid, n.title, n.created
FROM {node} n WHERE n.uid = %d', $uid, 0, 10);
while ($node = db_fetch_object($result)) {
// Perform operations on $node->body, etc. here.
}
Λεηηνπξγίεο θαη Μέζνδνη
Όλνκα
db_affected_rows:
db_check_setup:
db_column_exists:
db_connect:
db_decode_blob:
db_distinct_field:
db_encode_blob:
db_error:
db_escape_string:
Πεξηγξαθή
Καζνξίδεη ηνλ αξηζκφ ησλ ζεηξψλ πνπ
άιιαμαλ απφ ην πξνεγνχκελν εξψηεκα.
Δπηβεβαηψλεη ην εάλ ε βάζε δεδνκέλσλ έρεη
δεκηνπξγεζεί ζσζηά.
Διέγρεη εάλ κία ζηήιε ππάξρεη ζην δεδνκέλν
πίλαθα.
Αξρηθνπνηεί κία ζχλδεζε βάζεο δεδνκέλσλ.
Δπηζηξέθεη θείκελν απφ κία ηηκή Binary
Large OBject.
Πξνζζέηεη ηελ ζεκαία (flag) DISTINCT ζην
παξερφκελν εξψηεκα θαη επηζηξέθεη ην
ηξνπνπνηεκέλν εξψηεκα.
Δπηζηξέθεη κηα ζσζηά δηακνξθσκέλε ηηκή
Binary Large OBject.
Πξνζδηνξίδεη ην εάλ ην πξνεγνχκελν
εξψηεκα δεκηνχξγεζε ζθάικα.
Πξνεηνηκάδεη ηε ρξήζε εηζαγσγήο απφ ηνλ
ρξήζηε ζε κία βάζε δεδνκέλσλ, απνηξέπεη
191
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
db_escape_table:
db_fetch_array:
db_fetch_object:
db_is_active:
db_last_insert_id:
db_lock_table:
db_placeholders:
db_prefix_tables:
db_query:
db_query_range:
db_query_temporary:
db_result:
db_rewrite_sql:
db_set_active:
db_status_report:
db_table_exists:
db_unlock_tables:
db_version:
pager_query:
tablesort_sql:
update_sql:
_db_error_page:
_db_query:
_db_query_callback:
_db_rewrite_sql:
επηζέζεηο ηχπνπ SQL injection.
Πεξηνξίδεη έλα δπλακηθφ πίλαθα, ζηήιε, ή
πεξηνξηζκέλν φλνκα, ζε αζθαιή
ραξαθηήξεο.
Πξνζθνκίδεη κία ζεηξά απφ απνηειέζκαηα
απφ πξνεγνχκελν εξψηεκα ζαλ ζπζηνηρία.
Πξνζθνκίδεη κία ζεηξά απφ απνηειέζκαηα
απφ πξνεγνχκελν εξψηεκα ζαλ αληηθείκελν.
Δπηζηξέθεη κία ηηκή boolean ε νπνία
εμαξηάηαη απφ ηελ δηαζεζηκφηεηα ηεο βάζεο
δεδνκέλσλ.
Δπηζηξέθεη ην ηειεπηαίν αλαγλσξηζηηθφ πνπ
εηζήρζε.
Κιεηδψλεη έλαλ πίλαθα.
Παξάγεη δείθηεο γηα έλα array απφ arguments
εξσηεκάησλ ελφο κφλν ηχπνπ.
Δπηζπλάπηεη έλα πξφζεκα βάζεο δεδνκέλσλ
κέζσ εξσηήκαηνο ζε φινπο ηνπο πίλαθεο.
Δθηειεί έλα βαζηθφ εξψηεκα ζηε βάζε
δεδνκέλσλ. active database.
Δθηειεί έλα εξψηεκα πεξηνξηζκέλνπ εχξνπο
ζηελ ελεξγή βάζε δεδνκέλσλ.
Δθηειεί έλα εξψηεκα SELECT θαη
απνζεθεχεη ηα απνηειέζκαηά ηνπ ζε έλαλ
πξνζσξηλφ πίλαθα.
Δπηζηξέθεη έλα αηνκηθφ πεδίν
απνηειεζκάησλ απφ πξνεγνχκελν εξψηεκα.
Δπαλαγξάθεη εξσηήκαηα θφκβνπ,
ηαμηλφκεζεο θαη ζρνιίσλ.
Δλεξγνπνηεί κία βάζε δεδνκέλσλ γηα
κειινληηθά εξσηήκαηα.
Αλαθέξεη ηελ θαηάζηαζε ηεο βάζεο
δεδνκέλσλ.
Διέγρεη εάλ ππάξρεη ν πίλαθαο.
Ξεθιεηδψλεη φινπο ηνπο θιεηδσκέλνπο
πίλαθεο.
Δπηζηξέθεη ηελ έθδνζε ηνπ δηαθνκηζηή ηεο
βάζεο δεδνκέλσλ ε νπνία ρξεζηκνπνηείηαη.
Δθηειεί έλα ζειηδνπνηεκέλν εξψηεκα βάζεο
δεδνκέλσλ.
Γεκηνπξγεί κία SQL ξήηξα ηνπ είδνπο.
Δθηειεί έλα εξψηεκα SQL θαη επηζηξέθεη ην
εάλ ήηαλ επηηπρήο ή φρη.
Βνεζεηηθφ function ην νπνίν δείρλεη κνηξαία
ζθάικαηα ηεο βάζεο δεδνκέλσλ.
Βνεζεηηθφ function γηα ην db_query().
Βνεζεηηθφ function γηα ην db_query().
Βνεζεηηθφ function γηα ην db_rewrite_sql.
192
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
΢ηαζεξέο
΋λνκα
Πεξηγξαθή
DB_QUERY_REGEXP:
Τπνδεηθλχεη ην κέξνο φπνπ ζα πξέπεη λα
αληηθαηαζηαζνχλ
νη
holders
ζην
_db_query_callback().
15.5 Τπνβνιή πεξηερνκέλνπ
Γηα λα εηζάγνπκε εχθνια πεξηερφκελν ζηνλ ηζηφηνπν ρξεηαδφκαζηε κία θφξκα εηζαγσγήο
ζηνηρείσλ θαη ηα ζηνηρεία απηά λα απνζεθεπζνχλ κέζσ ελφο εξσηήκαηνο (db query) ζηε βάζε
δεδνκέλσλ. ΢ην Drupal απηφ γίλεηαη κε ην module ηνπ ππξήλα ―node‖, ην νπνίν παξέρεη κηα ζειίδα
δηαρείξηζεο κε θφξκα εηζαγσγήο ζηνηρείσλ θαζψο θαη ηνλ απαξαίηεην θψδηθα γηα ηελ απνζήθεπζε
ησλ εηζαγφκελσλ ζηνηρείσλ ζε θαηάιιεινπο πίλαθεο. Με ηε δηαδηθαζία απηή δεκηνπξγνχκε έλαλ
θφκβν (node) θαη ηα ζηνηρεία απνζεθεχνληαη ζηνπο πίλαθεο ―node‖ θαη ―node revision‖. ΢ηνλ πίλαθα
―node‖ ηνπνζεηνχληαη θάπνηα βαζηθά meta data ζηνηρεία ηνπ θφκβνπ, φπσο ην nid, ην uid, ν ηχπνο
ηνπ, ε γιψζζα ηνπ θιπ., ελψ ζηνλ πίλαθα ―node_revisions‖ ν ηίηινο ηνπ θφκβνπ θαη ην θπξίσο ζψκα
ηνπ.
Ο θάζε θφκβνο έρεη url «node/nid», φπνπ nid ν κνλαδηθφο αξηζκφο πνπ αληηζηνηρεί ζε θάζε θφκβν,
κε απνηέιεζκα, φηαλ γίλεη κηα αίηεζε (request) ζε path απηήο ηεο κνξθήο, ην menu system λα ςάμεη
λα βξεη ηνλ θφκβν πνπ αληηζηνηρεί ζην path ηεο αίηεζεο (request), λα θαιέζεη ην module ―node‖ κε
φξηζκα ην nid θαη εθεί λα γίλεη έλα εξψηεκα γηα λα αληιεζνχλ απφ ηε βάζε ηα ζηνηρεία πνπ έρνπκε
εηζάγεη. ΢ηε ζπλέρεηα ην απνηέιεζκα κνξθνπνηείηαη κε θιήζε ηεο ζπλάξηεζεο theme_node απφ ην
module node θαη κε βάζε ην node.tpl.php εκθαλίδνληαη ηα επηζπκεηά ζηνηρεία κνξθνπνηεκέλα.
Οη έηνηκνη ηχπνη πεξηερνκέλνπ (content types) πνπ πξνυπάξρνπλ κε ηελ εγθαηάζηαζε είλαη ην
―page‖ θαη ην ―story‖. Όηαλ ζειήζνπκε λα δεκηνπξγήζνπκε κηα ζειίδα (page) ή κηα ηζηνξία (story),
πεγαίλνπκε απφ ην δηαρεηξηζηηθφ πεξηβάιινλ ζηελ επηινγή δεκηνπξγία πεξηερνκέλνπ (create content)
θαη ζπκπιεξψλνπκε θάπνηα πεδία ηνπ ζπγθεθξηκέλνπ ηχπνπ πεξηερνκέλνπ φπσο ηνλ ηίηιν, ην θπξίσο
ζψκα, αλ επηηξέπνληαη ηα ζρφιηα, ηνλ ζπγγξαθέα θαη αλ ζα δεκνζηνπνηεζεί ή αλ ζα βξίζθεηαη ζηελ
αξρηθή ζειίδα.
193
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
O θσδηθαο πνπ έρεη κέζα ην node.tpl.php είλαη :
?>
<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if
(!$status) { print ' node-unpublished'; } ?> clear-block">
<?php print $picture ?>
<?php if (!$page): ?>
<h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
<div class="meta">
<?php if ($submitted): ?>
<span class="submitted"><?php print $submitted ?></span>
<?php endif; ?>
<?php if ($terms): ?>
<div class="terms terms-inline"><?php print $terms ?></div>
<?php endif;?>
</div>
<div class="content">
<?php print $content ?>
</div>
<?php print $links; ?>
</div>
15.6 Σαμηλόκεζε πεξηερνκέλνπ
Γηα λα ηαμηλνκεζεί θάζε αληηθείκελν θάζε κηαο νληφηεηαο ρξεηάδεηαη λα δεκηνπξγεζεί έλαο πίλαθαο
πνπ ζα ζπζρεηίδεη ηνπο θφκβνπο κε ηνπο φξνπο ηαμηλφκεζεο. Απηφ κπνξεί λα γίλεη εχθνια κε ην
module taxonomy ην νπνίν δεκηνπξγεί απηφλ ηνλ πίλαθα ("term_node” table) θαη καο δίλεη πνιιέο
αθφκα επηινγέο κέζα απφ ην δηαρεηξηζηηθφ πεξηβάιινλ. Γεκηνπξγψληαο ηνλ πίλαθα ―vocabulary‖ καο
δίλεη ηε δπλαηφηεηα λα δεκηνπξγήζνπκε θαηεγνξίεο (vocabulary) ζηηο νπνίεο ζα αλήθνπλ νη φξνη, κε
ηνλ πίλαθα ―vocabulary_node_types‖ λα αληηζηνηρίζνπκε ηηο θαηεγνξίεο ζε ζπγθεθξηκέλνπο ηχπνπο
πεξηερνκέλνπ θαη κε ηνλ πίλαθα ―term_data‖ λα πξνζζέζνπκε φξνπο ζηελ θάζε θαηεγνξία. ΢ην
δηαρεηξηζηηθφ πεξηβάιινλ ζηελ ππνβνιή θαη ζηελ επεμεξγαζία ελφο θφκβνπ ππάξρεη απηφ ην επηπιένλ
ζηνηρείν πνπ καο δίλεη ηε δπλαηφηεηα λα θαηαηάμνπκε θάζε θφκβν ζε έλαλ φξν (term). Μηα
ηαμηλφκεζε γηα ηα λέα‐ αλαθνηλψζεηο κε εθπηψζεηο πνπ ζα θάλεη ην καγαδί ην ζαββαηνθχξηαθν ζην
νπνίν αλήθεη θαη κηα ηαμηλφκεζε γηα ηα videos κε φξνπο «εθπηψζεηο» . Με ηνλ ηξφπν απηφ φηαλ
πξνζζέηνπκε πεξηερφκελν ην νπνίν είλαη ηαμηλνκεκέλν, φπσο κηα λέα ―αλαθνίλσζε‖ έρνπκε ηε
δπλαηφηεηα λα ην εληάμνπκε ζε θάπνηα θαηεγνξία. Σν κεγάιν πιενλέθηεκα ηνπ Drupal είλαη, φπσο
έρνπκε πεη, ε επθνιία ζηελ επέθηαζε ησλ δπλαηνηήησλ θαη ιεηηνπξγηψλ ηνπ site θαη απηφ
194
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
αληηθαηνπηξίδεηαη θαη ζηελ ηαμηλφκεζε, θαζψο κπνξνχλ πνιχ εχθνια λα πξνζηεζνχλ λένη φξνη ζε
θάζε θαηεγνξία. Δπίζεο πνιχ εχθνια κπνξνχλ λα πξνζηεζνχλ θαη νιφθιεξεο ηαμηλνκήζεηο
(vocabularies) εθηφο απφ φξνπο, φπσο γηα παξάδεηγκα κηα θαηεγνξηνπνίεζε ησλ έξγσλ ζε Projects.
Κάζε φξνο έρεη έλα id (term id) αλάινγα κε ηε ζεηξά κε ηελ νπνία δεκηνπξγήζεθε, ελψ κε ην url :
../taxonomy/term/term‐ id βιέπνπκε κηα ιίζηα κε φινπο ηνπο θφκβνπο πνπ αλήθνπλ ζην
ζπγθεθξηκέλν φξν κε απηφ ην term id. Έλα module πνπ επεθηείλεη ηηο δπλαηφηεηεο ηνπ ―taxonomy‖
είλαη ην ―taxonomy menu‖ ην νπνίν δεκηνπξγεί menu, κε ηνπο φξνπο ηεο ηαμηλφκεζεο πνπ έρνπκε
θάλεη, απηφκαηα. Σν κεγάιν πιενλέθηεκα ηεο πξνζέγγηζεο απηήο είλαη φηη αληί λα δεκηνπξγνχκε
κελνχ γηα θάζε ηαμηλφκεζε ρεηξνθίλεηα απηφ γίλεηαη απηφκαηα. Έηζη, φηαλ δεκηνπξγήζνπκε γηα
παξάδεηγκα έλα λέν φξν, φπσο γηα παξάδεηγκα έλα λέν ηχπν αλαθνηλψζεσλ (πρ ξεκπέηηθε κνπζηθή ην
΢άββαην) ην ζηνηρείν ζα πξνζηεζεί απηφκαηα ζην κελνχ πξνζθέξνληαο καο αθφκα κεγαιχηεξε
επθνιία θαη ειεπζεξία επέθηαζεο ηνπ πινπνηεκέλνπ ζπζηήκαηνο.
15.7 Γεκηνπξγία ζύλζεησλ ζειίδσλ
Η δεκηνπξγία, φκσο, ελφο θφκβνπ ελφο ζπγθεθξηκέλνπ ηχπνπ πεξηερνκέλνπ έρεη σο απνηέιεζκα λα
εκθαλίδεηαη κφλν απηφο ν ζπγθεθξηκέλνο θφκβνο φηαλ γίλεη request ζηνλ Browser κε ην path ην
node/nid ηνπ θφκβνπ. ΢ηηο απαηηήζεηο, φκσο, ηεο ηζηνζειίδαο καο είλαη λα εκθαλίδνληαη ιίζηεο αλά
θαηεγνξία δειαδή κηα ζχλζεηε εκθάληζε ζηνηρείσλ πνιιψλ θφκβσλ θηιηξαξηζκέλα βάζεη θάπνησλ
παξακέηξσλ, φπσο γηα παξάδεηγκα ε ιίζηα ηεο επηθνηλσλίαο Γηα λα επηηεπρζεί απηφ ζα πξέπεη λα
γίλεη query ζηε βάζε πνπ ζα αληιεί δεδνκέλα απφ έλα ζπλδπαζκφ πηλάθσλ κε θάπνηεο ζπλζήθεο.
Έλα module ην νπνίν δηεπθνιχλεη ηε δεκηνπξγία εξσηεκάησλ ζηε βάζε δεδνκέλσλ είλαη ην
―views‖ ην νπνίν δίλεη ηε δπλαηφηεηα κε επηινγέο κέζα απφ ην δηαρεηξηζηηθφ πεξηβάιινλ λα
ζπλζέηνληαη queries. Η ζχλζεζε ηνπ εξσηήκαηνο (query), πνπ πεξηγξάθεθε πξνεγνπκέλσο γηα ηε
ιίζηα ησλ εθπηψζεσλ, κπνξεί λα πινπνηεζεί κέζα απφ ην δηαρεηξηζηηθφ πεξηβάιινλ κε κηα view. Οη
ξπζκίζεηο πνπ έρνπκε ηε δπλαηφηεηα λα θάλνπκε αθνξνχλ ηφζν ηε δεκηνπξγία ηνπ query ζηε βάζε,
φζν θαη ζηνλ ηξφπν εκθάληζεο ησλ απνηειεζκάησλ. Όζνλ αθνξά ηε ζχλζεζε ηνπ εξσηήκαηνο, ζην
―fields‖ επηιέγνπκε (select) ηα πεδία πνπ ζέινπκε λα εθπησζεηο‖ θαη ηα ηαμηλνκνχκε θαηά
εκεξνκελία ζεηξά ζην sort criteria (order by). Οη επηινγέο γηα ηνλ ηξφπν εκθάληζεο ηνπ
απνηειέζκαηνο ηνπ εξσηήκαηνο, αθνξνχλ ηελ απεηθφληζε ζε πίλαθα, ζε ζεηξέο ή ρσξίο δηακφξθσζε,
ην πφζα απνηειέζκαηα ζα παξνπζηάδνληαη ζε θάζε ζειίδα θαη αλ ζα ππάξρεη pager γηα αιιαγή
ζειίδαο, αλ ζα ρξεζηκνπνηεζεί ηερληθή Ajax γηα ηελ ελαιιαγή απφ ηε κία ζειίδα ζηελ επφκελε ή ζα
αλαλεψλεηαη νιφθιεξε ε ζειίδα θηι. Γηα θάζε View έρνπκε ηε δπλαηφηεηα λα πξνζζέηνπκε
παξνπζίαζε ζαλ ζειίδα (page display), ζαλ block (block display) ζαλ rss feed θηι. Αλ θαη ε
πξνζέγγηζε απηή εκθαλίδεη ηα επηζπκεηά απνηειέζκαηα καο δεζκεχεη φζνλ αθνξά ηελ
επεθηαζηκφηεηα πνπ ρξεηαδφκαζηε θαη ηε δπλαηφηεηα εχθνιεο θαη γξήγνξεο πξφζζεζεο λέσλ φξσλ
ζηηο ηαμηλνκήζεηο. Πην ζπγθεθξηκέλα, αλ πξνζζέηακε ζην κέιινλ κηα λέα θαηεγνξία πξνζσπηθνχ π.ρ.
«επηθνηλσλία » ζα έπξεπε λα δεκηνπξγεζεί έλα λέν page display απηήο ηεο view κε θίιηξν ηνλ λέν
απηφ φξν, φπσο θάλακε θαη πξνεγνπκέλσο. Γηα λα μεπεξάζνπκε απηφ ην εκπφδην θαη λα
απηνκαηνπνηεζεί φζν γίλεηαη πεξηζζφηεξν ε δηαδηθαζία έπξεπε λα έρνπκε κηα εληαία view γηα φινπο
ηνπο φξνπο κηαο θαηεγνξίαο θαη ην θίιηξν λα είλαη δπλακηθφ.
΢ην Drupal απηφ επηηπγράλεηαη ζρεηηθά εχθνια κέζα απφ ην δηαρεηξηζηηθφ πεξηβάιινλ ησλ views
κε ηελ επηινγή ησλ arguments ε νπνία θάλεη απηφ αθξηβψο πνπ ρξεηαζηήθακε, νξίδνληαο σο argument
ην term ηνπ θάζε φξνπ, ην νπνίν φπσο είδακε λσξίηεξα είλαη κνλαδηθφ θαη πεξλψληαο ην argument
κέζα απφ ην url . Έηζη ζην url : « .../taxonomy/term/1» ζα εκθαληζηνχλ φινη νη θφκβνη πνπ έρνπκε
επηιέμεη θαηά ηε δεκηνπξγία ηνπο φηη αλήθνπλ ζηνλ φξν ―επηθνηλσλίαο‖, αθνχ ην 1 πεξλάεη ζαλ
φξηζκα θαη θηιηξάξεη δπλακηθά ην απνηέιεζκα.
Σν Taxonomy module κε ηελ εγθαηάζηαζή ηνπ δεκηνπξγεί κηα εληαία view γηα φινπο ηνπο φξνπο
φηαλ ην request είλαη ηεο κνξθήο /taxonomy/term/tid, φπνπ tid ν κνλαδηθφο αξηζκφο ηνπ θάζε φξνπ,
νπφηε θαη κηα εληαία εκθάληζε γηα φινπο ηνπο φξνπο γεληθψο φισλ ησλ θαηεγνξηψλ (vocabularies).
195
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Μπνξνχκε αιιάδνληαο ηελ View απηή λα αιιάμνπκε ηνλ ηξφπν παξνπζίαζεο ησλ φξσλ. Όκσο,
εκείο ρξεηαδφκαζηε άιιν ηξφπν παξνπζίαζεο ησλ αλαθνηλψζεσλ (π.ρ ζε πίλαθα κε ηίηιν θαη
εκεξνκελία ) Σε δπλαηφηεηα λα νξίζνπκε μερσξηζηέο views ζε θάζε φξν (ή γεληθφηεξα ζε έλα
ζπγθεθξηκέλν vocabulary) καο ηε δίλεη ην module ―TVI‖ (Taxonomy Views Integration). Με ηνλ
ηξφπν απηφ κπνξνχκε λα δεκηνπξγνχκε μερσξηζηέο view θαη λα ηηο αληηζηνηρίδνπκε ζε φξνπο ή
θαηεγνξίεο.
15.8 ΢ύζηεκα Μελνύ
Οξίδεη ηα κελνχ πινήγεζεο, θαη ηα ηηο αηηήζεηο ησλ δηαδξνκψλ ησλ ζειίδσλ ζε θψδηθα κε βάζε ηα
URL.Σν ζχζηεκα ηνπ κελνχ ηνπ Drupal νδεγεί ην ζχζηεκα πινήγεζεο απφ ηελ νπηηθή ηνπ ρξήζηε
θαη ην ζχζηεκα επαλάθιεζεο ην νπνίν ρξεζηκνπνηεί ην Drupal γηα ηηο απνθξίζεηο ζηα URL πνπ
πεξάζηεθαλ απφ ηνλ πεξηεγεηή.Σν ζχζηεκα ηνπ κελνχ ηνπ Drupal αθνινπζεί κία απιή ηεξαξρία ε
νπνία νξίδεηαη απφ paths. Οη εθαξκνγέο ηνπ hook_menu() νξίδνπλ ηα αληηθείκελα ηνπ κελνχ θαη ηα
αλαζέηνπλ ζε paths. Σν ζχζηεκα κελνχ ζπγθεληξψλεη απηά ηα αληηθείκελα θαη θαζνξίδεη ηελ ηεξαξρία
ησλ κελνχ απφ ηα paths. Όηαλ αληαπνθξίλεηαη ζε έλα αίηεκα ζειίδαο, ην ζχζηεκα ηνπ κελνχ ςάρλεη
λα βξεη εάλ ην path πνπ δεηήζεθε απφ ηνλ πεξηεγεηή έρεη θαηαρσξεζεί σο ζηνηρείν κελνχ κε
επαλάθιεζε. Δάλ φρη, ην ζχζηεκα ςάρλεη ην δέληξν ηνπ κελνχ γηα πην νινθιεξσκέλε ηαχηηζε πνπ
κπνξεί λα βξεη κε κία επαλάθιεζε.Η επξεζείζα επαλαθαινχκελε function θαιείηαη κε νπνηαδήπνηε
arguments έρνπλ νξηζηεί ζην ραξαθηεξηζηηθφ ―page arguments‖ ηνπ αληηθεηκέλνπ ηνπ. Σν
ραξαθηεξηζηηθφ ζα πξέπεη λα είλαη έλα array. Μεηά απφ απηά ηα arguments, θάζε ελαπνκείλαληα
ζηνηρεία ηνπ path πξνζαξηψληαη σο επηπιένλ arguments.
Η πξφζβαζε ζηα functions επαλάθιεζεο πξνζηαηεχνληαη επίζεο απφ ην ζχζηεκα ηνπ κελνχ. Η
―access callback‖ καδί κε έλα πξναηξεηηθφ ―access argument‖ ηνπ θάζε αληηθεηκέλνπ ηνπ κελνχ,
θαιείηαη πξηλ ε επαλάθιεζε ηεο ζειίδαο πξνρσξήζεη. Δάλ επηζηξέςεη TRUE, ηφηε επηηξέπεηαη ε
πξφζβαζε, ελψ εάλ επηζηξέςεη FALSE, φρη.
196
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Λεηηνπξγίεο θαη Μέζνδνη
Όλνκα
Πεξηγξαθή
drupal_help_arg:
Παξάγεη ζηνηρεία γηα ην $arg array ζην hook ηεο
βνήζεηαο.
menu_cache_clear:
Καζαξίδεη ηα απνζεθεπκέλα δεδνκέλα γηα έλα
νλνκαζκέλν κελνχ.
menu_cache_clear_all:
Καζαξίδεη φια ηα απνζεθεπκέλα δεδνκέλα κελνχ.
menu_execute_active_handler:
Δθηειεί ηελ επαλάθιεζε ζειίδαο ε νπνία ζπλδέεηαη κε
ην ηξέρνλ path.
menu_get_active_breadcrumb:
Παίξλεη ηα ππνιείκκαηα γηα ηελ ηξέρνπζα ζειίδα,
φπσο νξίδεηαη απφ ην ελεξγφ ίρλνο.
menu_get_active_help:
Δπηζηξέθεη ηε βνήζεηα πνπ ζπλδέεηαη κε ην ελεξγφ
ζηνηρείν ηνπ κελνχ.
menu_get_active_menu_name:
Παίξλεη ην ελεξγφ κελνχ γηα ηελ ηξέρνπζα ζειίδα –
νξίδεη ην ελεξγφ ίρλνο.
menu_get_active_title:
Παίξλεη ηνλ ηίηιν ηεο ηξέρνπζαο ζειίδαο, φπσο έρεη
νξηζηεί απφ ην ελεξγφ ίρλνο.
menu_get_active_trail:
Παίξλεη ην ελεξγφ ίρλνο ηεο ηξέρνπζαο ζειίδαο.
menu_get_ancestors:
Δπηζηξέθεη ηα ancestors γηα θάζε δεδνκέλν path.
menu_get_item:
Παίξλεη έλα ζηνηρείν δξνκνινγεηή.
menu_get_names:
Γεκηνπξγεί κία ιίζηα απφ νλνκαζκέλα κελνχ.
menu_get_object:
Παίξλεη έλα θνξησκέλν αληηθείκελν απφ έλα ζηνηρείν
δξνκνινγεηή.
menu_link_children_relative_depth:
Βξίζθεη ην βάζνο ηνπ ―παηδηνχ‖ ελφο αληηθεηκέλνπ ην
νπνίν ζπζρεηίδεηαη κε ην βάζνο απηνχ.
menu_link_maintain:
Δηζάγεη, ελεκεξψλεη ή δηαγξάθεη έλαλ κε
πξνζαξκνζκέλν ζχλδεζκν κελνχ πνπ ζπζρεηίδεηαη κε
έλα module.
menu_link_save:
Απνζεθεχεη έλαλ ζχλδεζκν κελνχ.
menu_list_system_menus:
Δπηζηξέθεη έλα array ην νπνίν πεξηέρεη ηα νλφκαηα ησλ
κελνχ πνπ έρνπλ νξηζηεί απφ ην ζχζηεκα.
menu_local_tasks:
΢πιιέγεη ηηο ηνπηθέο δηεξγαζίεο (θαξηέιεο), ηνπο
ζπλδέζκνπο ελεξγεηψλ, θαη ην root path.
197
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
menu_navigation_links:
menu_path_is_external:
menu_primary_links:
menu_primary_local_tasks:
menu_rebuild:
menu_router_build:
menu_secondary_links:
menu_secondary_local_tasks:
menu_secondary_menu:
menu_set_active_item:
menu_set_active_menu_name:
menu_set_active_trail:
menu_set_item:
menu_tab_root_path:
menu_tail_to_arg:
menu_tree:
menu_tree_all_data:
menu_tree_check_access:
menu_tree_collect_node_links:
menu_tree_data:
menu_tree_output:
menu_tree_page_data:
menu_unserialize:
menu_valid_path:
theme_menu_item:
Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα έλα κελνχ
πινήγεζεο.
Δπηζηξέθεη TRUE εάλ ν ζχλδεζκνο είλαη εμσηεξηθφο.
Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα λα
θαζηζηνχλ σο Πξσηεχνληεο ζχλδεζκνη.
Δπηζηξέθεη ηηο ηνπηθέο δηεξγαζίεο πνπ έρνπλ απνδνζεί
ζην θνξπθαίν επίπεδν.
(Δπαλα) ζπκπιεξψλεη ηνπο πίλαθεο ηεο βάζεο
δεδνκέλσλ νη νπνίνη ρξεζηκνπνηνχληαη απφ δηάθνξα
functions ηνπ κελνχ.
΢πιιέγεη θαη κεηαβάιιεη ηνπο νξηζκνχο ηνπ κελνχ.
Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα λα
θαζηζηνχλ σο Γεπηεξεχνληεο ζχλδεζκνη.
Δπηζηξέθεη ηηο ηνπηθέο δηεξγαζίεο πνπ έρνπλ απνδνζεί
ζην δεχηεξν επίπεδν.
Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα λα
απνδνζνχλ σο δεπηεξεχνληεο ζχλδεζκνη.
Θέηεη ην ελεξγφ path, ην νπνίν νξίδεη ην πνηα ζειίδα ζα
θνξηψζεη.
Θέηεη (ή παίξλεη) ην ελεξγφ κελνχ γηα ηελ ηξέρνπζα
ζειίδα – νξίδεη ην ελεξγφ ίρλνο.
Θέηεη ην ελεξγφ ίρλνο ηεο ηξέρνπζαο ζειίδαο.
Αληηθαζηζηά ην ζηνηρείν πνπ έρεη απνζεθεπηεί ζηαηηθά
γηα έλα ζπγθεθξηκέλν path.
Δπηζηξέθεη ην path ηνπ δξνκνινγεηή, ή ην path ηεο
θαξηέιαο γνλέα κίαο πξνεπηιεγκέλεο ηνπηθήο
εξγαζίαο.
Δπηζηξέθεη ην path ζαλ έλα string απφ ην argument πνπ
βξηζθφκαζηε.
Απνδίδεη έλα δέληξν κελνχ ην νπνίν βαζίδεηαη ζην
ηξέρνλ path.
Παίξλεη ηε δνκή δεδνκέλσλ ε νπνία παξνπζηάδεη έλα
νλνκαζκέλν δέληξν κελνχ.
Διέγρεη ηελ πξφζβαζε θαη δηελεξγεί άιιεο δπλακηθέο
ιεηηνπξγίεο γηα θάζε ζχλδεζκν ζην δέληξν.
Αλαδξνκηθή βνεζεηηθή function – ζπιιέγεη
ζπλδέζκνπο θφκβσλ.
Γεκηνπξγεί ηα δεδνκέλα πνπ παξνπζηάδνπλ έλα δέληξν
κελνχ.
Δπηζηξέθεη έλα απνδνζκέλν δέληξν κελνχ.
Παίξλεη ηε δνκή δεδνκέλσλ πνπ παξνπζηάδεη έλα
νλνκαζκέλν δέληξν κελνχ, βαζηζκέλν ζηελ ηξέρνπζα
ζειίδα.
Απνζεηξηνπνηεί δεδνκέλα κελνχ, θάλνληαο ρξήζε ελφο
ράξηε γηα λα αληηθαηαζηήζεη ηα ζηνηρεία ηνπ path.
Δπηθπξψλεη ην path ελφο ζπλδέζκνπ κελνχ ν νπνίνο
δεκηνπξγείηαη ή επεμεξγάδεηαη.
Δπηζηξέθεη HTML γηα έλα ζηνηρείν κελνχ θαη ππν198
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
theme_menu_item_link:
theme_menu_local_task:
theme_menu_local_tasks:
theme_menu_tree:
menu_check_access:
menu_clear_page_cache:
menu_delete_item:
menu_find_router_path:
menu_item_localize:
menu_link_build:
menu_link_map_translate:
menu_link_move_children:
menu_link_parents_set:
menu_link_translate:
menu_load_objects:
menu_navigation_links_rebuild:
menu_router_build:
menu_router_cache:
menu_set_expanded_menus:
menu_site_is_offline:
menu_translate:
menu_tree_check_access:
κελνχ.
Δπηζηξέθεη HTML γηα έλαλ ζχλδεζκν κελνχ.
Δπηζηξέθεη HTML γία έλαλ ζχλδεζκν ηνπηθήο
εξγαζίαο.
Δπηζηξέθεη HTML γηα πξσηεχνπζεο θαη
δεπηεξεχνπζεο ηνπηθέο δηεξγαζίεο.
Δπηζηξέθεη HTML γηα έλα wrapper γηα ππφ-δεληξν
κελνχ.
Διέγρεη ηελ πξφζβαζε ζε έλα ζηνηρείν κελνχ
ρξεζηκνπνηψληαο επαλάθιεζε πξφζβαζεο.
Βνεζεηηθή function γηα λα θαζαξίζεη ηα απνζεθεπκέλα
δεδνκέλα ησλ ζειίδσλ θαη ησλ κπινθ ην πεξηζζφηεξν
δχν θνξέο αλά θφξησζε ζειίδαο.
Βνεζεηηθή function γηα for menu_link_delete.
Γηαγξάθεη έλαλ ζχλδεζκν κελνχ.
Βξίζθεη ην path ηνπ δξνκνινγεηή πνπ ζα εμππεξεηήζεη
απηφ ην path.
Δληνπίδεη ηνλ ηίηιν ηνπ αληηθεηκέλνπ ηνπ δξνκνινγεηή
ρξεζηκνπνηψληαο ην t() ή άιιε επαλάθιεζε.
Γεκηνπξγεί έλαλ ζχλδεζκν απφ έλα ζηνηρείν
δξνκνινγεηή.
Απηφ ην function κεηαθξάδεη ηα ζηνηρεία path ζηνλ
ράξηε ρξεζηκνπνηψληαο νπνηνδήπνηε βνεζεηηθφ
function to_arg. Απηά ηα functions παίξλνπλ έλα
argument θη επηζηξέθνπλ έλα object.
Δλεκεξψλεη ην παηδί ελφο ζπλδέζκνπ κελνχ φηη
κεηαθηλείηαη.
Βνεζεηηθφ function πνπ ζέηεη ηηο ηηκέο p1..p9 γηα έλαλ
ζχλδεζκν κελνχ πνπ απνζεθεχεηαη.
Απηφ ην function είλαη παξφκνην κε ην
_menu_translate() αιιά θάλεη πξνεηνηκαζία
ζπγθεθξηκέλνπ ζπλδέζκνπ φπσο ηνπ λα θαιεί ζπλέρεηα
to_arg functions.
Φνξηψλεη αληηθείκελα ζηνλ ράξηε φπσο έρνπλ νξηζηεί
ζην $item['load_functions'].
Βνεζεηηθφ function ην νπνίν δεκηνπξγεί ζπλδέζκνπο
γηα ηα αληηθείκελα ζηνλ δξνκνινγεηή κελνχ.
Βνεζεηηθφ function ην νπνίν δεκηνπξγεί ηνλ πίλαθα
ηνπ δξνκνινγεηή βαζηζκέλν ζηα δεδνκέλα ηνπ
hook_menu.
Βνεζεηηθφ function ην νπνίν απνζεθεχεη ην
δξνκνινγεηή ηνπ κελνχ εάλ ππάξρεη ζηε κλήκε.
Βνεζεηηθφ function ην νπνίν ελεκεξψλεη κία ιίζηα
απφ κελνχ κε δηεπξπκέλα αληηθείκελα.
Διέγρεη εάλ ην site βξίζθεηαη ζε θαηάζηαζε
ζπληήξεζεο.
Γηαρεηξίδεηαη κεηαθξάζεηο δπλακηθνχ path θαη έιεγρν
πξφζβαζεο κελνχ.
Αλαδξνκηθφ βνεζεηηθφ function γηα ην
199
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
menu_tree_cid:
menu_tree_data:
menu_update_parental_status:
menu_tree_check_access()
Βνεζεηηθφ function γηα ην menu_tree_check_access().
Αλαδξνκηθφ βνεζεηηθφ function ην νπνίν δεκηνπξγεί
ηα δεδνκέλα πνπ αληηπξνζσπεχνπλ ην δέληξν κελνχ.
Διέγρεη θαη ελεκεξψλεη ηελ θαηάζηαζε ηνπ
has_children γηα ηνλ γνλέα ηνπ ζπλδέζκνπ.
Constants
΋λνκα
Πεξηγξαθή
MENU_ACCESS_DENIED:
Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ –
Απαγνξεχεηαη ε πξφζβαζε ζην ζηνηρείν κελνχ.
MENU_CALLBACK:
MENU_CREATED_BY_ADMIN:
MENU_DEFAULT_LOCAL_TASK:
MENU_FOUND:
MENU_IS_LOCAL_TASK:
MENU_IS_ROOT:
MENU_LINKS_TO_PARENT:
MENU_LOCAL_TASK:
MENU_MAX_DEPTH:
MENU_MAX_PARTS:
MENU_MODIFIED_BY_ADMIN:
MENU_NORMAL_ITEM:
MENU_NOT_FOUND:
MENU_SITE_OFFLINE:
MENU_SUGGESTED_ITEM:
MENU_VISIBLE_IN_BREADCRUMB:
MENU_VISIBLE_IN_TREE:
Σχπνο κελνχ – Μία θξπθή, εζσηεξηθή επαλάθιεζε, ε
νπνία ζπλήζσο ρξεζηκνπνηείηαη γηα θιήζεηο API.
Δζσηεξηθή flag κελνχ – ην ζηνηρείν ηνπ κελνχ
δεκηνπξγήζεθε απφ ηνλ δηαρεηξηζηή.
Σχπνο κελνχ – Η πξνεπηιεγκέλε ηνπηθή εξγαζία, πνπ
είλαη ελεξγή απφ ηελ αξρή.
Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ – Βξέζεθε ην
ζηνηρείν ηνπ κελνχ.
Δζσηεξηθή flag κελνχ – ην ζηνηρείν κελνχ είλαη κία
ηνπηθή εξγαζία.
Δζσηεξηθή flag κελνχ – ην ζηνηρείν κελνχ είλαη ε ξίδα
ηνπ δέληξνπ κελνχ.
Δζσηεξηθή flag κελνχ – ην ζηνηρείν κελνχ δείρλεη πίζσ
ζηνλ γνλέα ηνπ.
Σχπνο κελνχ – Μία εξγαζία γηα ην ζηνηρείν γνλέα.
Σν κέγηζην βάζνο ελφο δέληξνπ ζπλδέζκσλ κελνχ Σαηξηάδεη ηνλ αξηζκφ ησλ p ζηειψλ.
Ο κέγηζηνο αξηζκφο απφ ζηνηρεία path γηα κία
επαλάθιεζε κελνχ.
Δζσηεξηθή flag κελνχ – Σν ζηνηρείν κελνχ κπνξεί λα
ηξνπνπνηεζεί απφ ηνλ δηαρεηξηζηή.
Σχπνο κελνχ – Έλα θαλνληθφ ζηνηρείν κελνχ ην νπνίν
εκθαλίδεηαη ζην κελνχ θαη ζηα ππνιείκκαηα.
Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ –Σν ζηνηρείν
ηνπ κελνχ δελ βξέζεθε.
Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ – Σν ζηνηρείν
ηνπ κελνχ είλαη κε πξνζβάζηκν δηφηη ην site βξίζθεηαη
εθηφο ζχλδεζεο.
Σχπνο κελνχ – Έλα θαλνληθφ ζηνηρείν κελνχ, θξπθφ
κέρξη λα ελεξγνπνηεζεί απφ ηνλ δηαρεηξηζηή.
Δζσηεξηθή flag κελνχ – Σν ζηνηρείν ηνπ κελνχ είλαη
νξαηφ ζηα ππνιείκκαηα.
Δζσηεξηθή flag κελνχ – Σν ζηνηρείν ηνπ κελνχ είλαη
νξαηφ ζην δέληξν ηνπ κελνχ.
200
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Groups
Name
Description
Menu flags:
Flags γηα ρξήζηε ζην ραξαθηεξηζηηθφ
―ηχπνο‖ ησλ ζηνηρείσλ κελνχ.
Menu item types:
Οξηζκνί γηα δηάθνξνπο ηχπνπο ζηνηρείσλ
κελνχ.
Menu status codes:
Κσδηθνί θαηάζηαζεο γηα ηηο επαλαθιήζεηο
ησλ κελνχ.
Menu tree parameters:
Παξάκεηξνη γηα έλα δέληξν κελνχ.
15.9 Blocks
Σα blocks είλαη δηαθξηηά ηκήκαηα ησλ πιεξνθνξηψλ πνπ εκθαλίδνληαη ζηηο πεξηνρέο ησλ ζειίδσλ ηνπ
δηθηπαθνχ ζαο ηφπνπ. Σα blocks κπνξνχλ λα ιάβνπλ ηε κνξθή κελνχ (πνπ αζρνινχληαη κε ηελ
πινήγεζε), εμφδνπ απφ θάπνην ή δπλακηθά θαη ζηαηηθά θνκκάηηα πιεξνθνξηψλ πνπ έρεηε
δεκηνπξγήζεη κφλνη ζαο (γηα παξάδεηγκα, κηα ιίζηα κε πξνζερείο εθδειψζεηο) .Γηα λα εηζάγνπκε ηα
block πεγαίλνπκε ζηελ ππνελφηεηα ―Μπινθ‖ ηεο ελφηεηαο ―Γεκηνπξγία Ιζηνηφπνπ‖ θαη καο
παξνπζηάδεηαη κηα ζειίδα, φπνπ βιέπνπκε ηηο πεξηνρέο (regions) ηνπ ζπγθεθξηκέλνπ ζεκαηηθνχ
πξνηχπνπ θαη ηα δηαζέζηκα block κε δπλαηφηεηα ηνπνζέηεζήο ηνπο ζε θάπνηα πεξηνρή. Σα block απηά
δε ζέινπκε λα εκθαλίδνληαη ζε φιεο ηηο ζειίδεο. Όπσο είπακε πξηλ, ην θάζε ππνκελνχ ζα πξέπεη λα
εκθαλίδεηαη φηαλ έρεη επηιεγεί ε αληίζηνηρε ελφηεηα, ελψ ηα άιια δε ζα πξέπεη λα εκθαλίδνληαη. Γηα
λα επηηεπρζεί απηφ πεγαίλνπκε ζηε ξχζκηζε ηνπ αληίζηνηρνπ block θαη ζηελ θαξηέια ―Page specific
visibility settings‖ κπνξνχκε λα ξπζκίζνπκε ζε πνηεο ζειίδεο ζα εκθαλίδεηαη ην Block κε βάζε ην url
ηεο ζειίδαο. Αθφκα έρνπκε ηε δπλαηφηεηα λα γξάςνπκε θψδηθα ζε PHP θαη φηαλ επηζηξέθεη true λα
εκθαλίδεηαη ην block.
15.10 Γηεπζύλζεηο URL
Οη δηεπζχλζεηο πνπ πξνθαζνξηζκέλα δεκηνπξγεί ην Drupal είλαη ηεο κνξθήο
www.example.com/?q=node/67, ε νπνία κνξθή δελ είλαη θηιηθή νχηε πξνο ηνπο αλζξψπνπο νχηε
πξνο ηηο κεραλέο αλαδήηεζεο. Με ηε δπλαηφηεηα ηνπ Drupal γηα clean urls θη αλ ν web Server ην
ππνζηεξίδεη, ε δηεχζπλζε απηή κπνξεί λα πάξεη ηε κνξθή www.example.com/node/67. Όκσο θαη πάιη
δελ είλαη user friendly θαη δε δίλνπλ ηφζν θαιά απνηειέζκαηα ζηηο κεραλέο αλαδήηεζεο. Γηα λα
αληηκεησπηζζνχλ απηά ηα δεηήκαηα θαη νη δηεπζχλζεηο λα γίλνπλ ηεο κνξθήο
«www.example.com/Αξρηθή ζειηδα» ρξεζηκνπνηνχκε ην core module “Path” κε ην νπνίν κπνξνχκε
λα δεκηνπξγήζνπκε ςεπδψλπκα url. Αλ θαη ε πξνζέγγηζε απηή είλαη πνιχ ρξήζηκε, είλαη επίπνλε θαη
δχζθνια θαηαλνεηή απφ ηνλ δηαρεηξηζηή ηνπ site, αθνχ θάζε θνξά ζα πξέπεη λα πξνζζέηεη καδί κε ηα
απαξαίηεηα ζηνηρεία θάζε θφκβνπ θαη έλα ελαιιαθηηθφ url. Έλα πνιχ ρξήζηκν Module ην νπνίν
δεκηνπξγεί απηφκαηα ςεπδψλπκα url αλάινγα κε ηηο ξπζκίζεηο καο (ην φλνκα ηνπ πεξηερνκέλνπ, ηνλ
ηχπν πεξηερνκέλνπ, ηελ θαηεγνξία ζηελ νπνία αλήθεη θηι) είλαη ην ―path auto‖.
201
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
Καη ν θσδηαθο πνπ απνηειεηηε ην path.module είλαη :
<?php
// $Id: path.module,v 1.138.2.3
* Implementation of hook_help().
*/
function path_help($path, $arg) {
switch ($path) {
case 'admin/help#path':
$output = '<p>'. t('The path module allows you to specify aliases for Drupal URLs. Such aliases
improve readability of URLs for your users and may help internet search engines to index your
content more effectively. More than one alias may be created for a given page.') .'</p>';
$output .= t('<p>Some examples of URL aliases are:</p>
<ul>
<li>user/login =&gt; login</li>
<li>image/tid/16 =&gt; store</li>
<li>taxonomy/term/7+19+20+21 =&gt; store/products/whirlygigs</li>
<li>node/3 =&gt; contact</li>
</ul>
');
///…
return '<p>'. t('Enter the path you wish to create the alias for, followed by the name of the new
alias.') .'</p>';
}
}
/**
* Implementation of hook_menu().
*/
function path_menu() {
$items['admin/build/path'] = array(
'title' => 'URL aliases',
'description' => "Change your site's URL paths by aliasing them.",
'page callback' => 'path_admin_overview',
'access arguments' => array('administer url aliases'),
'file' => 'path.admin.inc',
);
$items['admin/build/path/edit'] = array(
'title' => 'Edit alias',
'page callback' => 'path_admin_edit',
'access arguments' => array('administer url aliases'),
'type' => MENU_CALLBACK,
'file' => 'path.admin.inc',
);
$items['admin/build/path/delete'] = array(
'title' => 'Delete alias',
'page callback' => 'drupal_get_form',
'page arguments' => array('path_admin_delete_confirm'),
'access arguments' => array('administer url aliases'),
202
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
'type' => MENU_CALLBACK,
'file' => 'path.admin.inc',
);
$items['admin/build/path/list'] = array(
'title' => 'List',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items['admin/build/path/add'] = array(
'title' => 'Add alias',
'page callback' => 'path_admin_edit',
'access arguments' => array('administer url aliases'),
'type' => MENU_LOCAL_TASK,
'file' => 'path.admin.inc',
);
return $items;
}
/**
* Post-confirmation; delete an URL alias.
*/
function path_admin_delete($pid = 0) {
db_query('DELETE FROM {url_alias} WHERE pid = %d', $pid);
drupal_set_message(t('The alias has been deleted.'));
}
/**
* Set an aliased path for a given Drupal path, preventing duplicates.
*/
function path_set_alias($path = NULL, $alias = NULL, $pid = NULL, $language = '') {
$path = urldecode($path);
$alias = urldecode($alias);
// First we check if we deal with an existing alias and delete or modify it based on pid.
if ($pid) {
// An existing alias.
if (!$path || !$alias) {
// Delete the alias based on pid.
db_query('DELETE FROM {url_alias} WHERE pid = %d', $pid);
}
else {
// Update the existing alias.
db_query("UPDATE {url_alias} SET src = '%s', dst = '%s', language = '%s' WHERE pid = %d",
$path, $alias, $language, $pid);
}
}
else if ($path && $alias) {
// Check for existing aliases.
203
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
if ($alias == drupal_get_path_alias($path, $language)) {
// There is already such an alias, neutral or in this language.
// Update the alias based on alias; setting the language if not yet done.
db_query("UPDATE {url_alias} SET src = '%s', dst = '%s', language = '%s' WHERE dst =
'%s'", $path, $alias, $language, $alias);
}
else {
// A new alias. Add it to the database.
db_query("INSERT INTO {url_alias} (src, dst, language) VALUES ('%s', '%s', '%s')", $path,
$alias, $language);
}
}
else {
// Delete the alias.
if ($alias) {
db_query("DELETE FROM {url_alias} WHERE dst = '%s'", $alias);
}
else {
db_query("DELETE FROM {url_alias} WHERE src = '%s'", $path);
}
}
drupal_clear_path_cache();
}
/**
* Implementation of hook_nodeapi().
*
* Allows URL aliases for nodes to be specified at node edit time rather
* than through the administrative interface.
*/
function path_nodeapi(&$node, $op, $arg) {
// Permissions are required for everything except node loading.
if (user_access('create url aliases') || user_access('administer url aliases') || ($op == 'load')) {
$language = isset($node->language) ? $node->language : '';
switch ($op) {
case 'validate':
if (isset($node->path)) {
$node->path = trim($node->path);
if (db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE dst = '%s' AND
src != '%s' AND language = '%s'", $node->path, "node/$node->nid", $language))) {
form_set_error('path', t('The path is already in use.'));
}
}
break;
case 'load':
$path = 'node/'. $node->nid;
204
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
$alias = drupal_get_path_alias($path, $language);
if ($path != $alias) {
$node->path = $alias;
}
break;
case 'insert':
// Don't try to insert if path is NULL. We may have already set
// the alias ahead of time.
if (isset($node->path)) {
path_set_alias('node/'. $node->nid, $node->path, NULL, $language);
}
break;
case 'update':
path_set_alias('node/'. $node->nid, isset($node->path) ? $node->path : NULL, isset($node>pid) ? $node->pid : NULL, $language);
break;
case 'delete':
$path = 'node/'. $node->nid;
if (drupal_get_path_alias($path) != $path) {
path_set_alias($path);
}
break;
}
}
}
/**
* Implementation of hook_form_alter().
*/
function path_form_alter(&$form, $form_state, $form_id) {
if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] .'_node_form' ==
$form_id) {
$path = isset($form['#node']->path) ? $form['#node']->path : NULL;
$form['path'] = array(
'#type' => 'fieldset',
'#title' => t('URL path settings'),
'#collapsible' => TRUE,
'#collapsed' => empty($path),
'#access' => user_access('create url aliases'),
'#weight' => 30,
);
$form['path']['path'] = array(
'#type' => 'textfield',
'#default_value' => $path,
'#maxlength' => 128,
'#collapsible' => TRUE,
205
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
'#collapsed' => TRUE,
'#description' => t('Optionally specify an alternative URL by which this node can be accessed.
For example, type "about" when writing an about page. Use a relative path and don\'t add a trailing
slash or the URL alias won\'t work.'),
);
if ($path) {
$form['path']['pid'] = array(
'#type' => 'value',
'#value' => db_result(db_query("SELECT pid FROM {url_alias} WHERE dst = '%s' AND
language = '%s'", $path, $form['#node']->language))
);
}
}
}
* Implementation of hook_perm().
*/
function path_perm() {
return array('create url aliases', 'administer url aliases');
}
* Fetch a specific URL alias from the database.
*/
function path_load($pid) {
return db_fetch_array(db_query('SELECT * FROM {url_alias} WHERE pid = %d', $pid));
}
15.11 Η δνκή ηεο ηζηνζειίδαο καο
΢ηελ αξρηθή καο ζειίδα, ζην πάλσ κέξνο ηεο ζα βξνχκε ην θχξηνο κελνχ, πνπ κε ηεο θαηεγνξίεο ηνπ
ζα καο βνεζήζεη λα δεκηνπξγήζνπκε κηα νινθιεξσκέλε εηθφλα φζσλ ππεξεζηψλ πξνζθέξνληαη.
Αξηζηεξά ζην πάλσ κέξνο αθξηβψο κεηά ην θαισζφξηζκα, βιέπνπκε έλα θείκελν ηεο ηζηνξίαο ηνπ
θαηαζηήκαηνο. Αθνινπζνχλ πιεξνθνξίεο γηα ην κνπζηθφ πξόγξακκα. Δλ ζπλερεία έρνπκε ηελ
παξνπζίαζε ηνπ γαζηξνλνκηθνχ κελνύ θαη ησλ αλαιφγσλ ηηκψλ. Πξηλ ηελ νινθιήξσζε ηεο
ηζηνζειίδαο καο παξνπζηάζεηε έλα αξρείν κε θσηνγξαθίεο ησλ ρψξσλ ηνπ θαηαζηήκαηνο θαη γίλεηε
κηα αλαθνξά ησλ ζεκαληηθψλ δξαζηεξηνηήησλ πνπ έρνπλ ιάβεη κέξνο ζην ζπγθεθξηκέλν ρψξν. Η
ηζηνζειίδα θιείλεη κε Δπηθνηλσλία ,ηειεθσληθνχο αξηζκνχο, ειεθηξνληθή δηήζεζε (e-mail), ψξεο
θαη κέξεο ιεηηνπξγίεο.
15.11 Γεκηνπξγία θαη επεμεξγαζία ζειίδαο
΢ηε πεξηνρή Τπνβνιή χιεο/΢ειίδα δεκηνπξγήζακε ηηο ζειίδεο πνπ ρξεζηκνπνηήζακε ζην site καο.
Βάδνληαο ηίηιν κνξθφηππν εηζφδνπ θαη δηαδξνκή URL πνπ επηζπκνχζακε. ΢ηε ζπλέρεηα κε ηε ρξήζε
ηνπ FCKeditor θαη ησλ εξγαιείσλ ηνπ θάλακε εηζαγσγή ησλ θεηκέλσλ θαη ηνλ εηθφλσλ καο. Η
επεμεξγαζία ζειίδαο γηλφηαλ ζηε πεξηνρή Γηαρείξηζε/Πεξηερφκελα.
206
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
15.12 Γεκηνπξγία κπινθ
Σα κπινθ ζην Drupal, δεκηνπξγνχληαη απηφκαηα απφ ηηο εγθαηεζηεκέλεο κνλάδεο (modules).
Δίλαη κπινθ πιεξνθνξηψλ, ηα νπνία ηνπνζεηνχληαη ζε δηάθνξεο ζέζεηο ηεο ζειίδαο καο, νη νπνίεο
εμαξηψληαη απφ ηηο ζεκαηηθέο παξαιιαγέο. ΢ηε πεξηνρή δηαρείξηζε/Μπινθ/Πξνζζήθε κπινθ
δεκηνπξγήζακε ηα κπινθ φπνπ ρξεζηκνπνηήζακε. Βάδνληαο πεξηγξαθή ηνπ κπινθ, ηίηινο ηνπ κπινθ
θαη ην ζψκα πνπ ζέινπκε λα έρεη. Μεηά απφ ξπζκίζεηο νξαηφηεηαο ζειίδαο ξπζκίζακε ην θάζε κπινθ
ζε πνηεο ζειίδεο ζα είλαη νξαηφ θ ζε πνηεο φρη. Μεηά απφ ηε πεξηνρή Γηαρείξηζε/Μπινθ/Λίζηα
θαηαηάμακε ηα κπινθ θαη ηα ηνπνζεηήζακε ζηηο πεξηνρέο πνπ επηζπκνχζακε. Τπάξρεη επίζεο ε
δπλαηφηεηα ξχζκηζεο ζπγθεθξηκέλσλ επηινγψλ ζε
απηή ηελ πεξηνρή.
Δηθόλα 30: Η Αξρηθή ζειίδα ηνπ Drupal
15.13 Αξρηθή ζειίδα
΢ηελ Αξρηθή ζειίδα πνπ είλαη θαη νη πξψηε πνπ βιέπεη έλαο ρξήζηεο κφιηο κπεη ζηελ ηζηνζειίδα καο,
βιέπνπκε πάλσ πάλσ Σαβέξλα - Ρεκπεηάδηθν: ‗Καιψο νξίζαηε‘ Πνην θάησ βιέπνπκε κηα κηθξή
εηζαγσγή θαη ελεκέξσζε γηα ηη ζα βξεη θάπνηνο πνπ ζα επηζθεθζεί ην Ρεκπεηάδηθν.
Οη θαηεγνξίεο είλαη νη εμήο:
1. Πξφγξακκα
2. Μελνχ
3. Αξρείν
4. Γηνξγάλσζε εθδειψζεσλ
5. Δπηθνηλσλία
207
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
16. Πίλαθαο ζύγθξηζεο ηνπ Framework Symfony κε ην Drupal
Σν Symfony θαζψο θαη ην Drupal είλαη δχν πνιχ γλσζηά εξγαιεία, κεδεληθνχ θφζηνπο, γηα ηνλ
ζρεδηαζκφ θαη ηελ αλάπηπμε ηζηνζειίδσλ.
Σν Drupal είλαη έλα Content Management System ή απιά CMS, ην νπνίν παξέρεη έηνηκα script
πνπ επηηξέπνπλ ζηνλ ρξήζηε λα δεκηνπξγήζεη εχθνια θαη γξήγνξα έλα site. Γηα λα
ρξεζηκνπνηήζεη θαλείο θάπνην CMS, δελ απαηηείηαη ε γλψζε θάπνηαο γιψζζαο (php, HTML
θιπ), κηαο θαη είλαη έηνηκν γηα λα ηξέμεη, ζε αληίζεζε κε ην Symfony, ην νπνίν είλαη έλα PHP 5
Framework, ην νπνίν παξέρεη κηα αξρηηεθηνληθή, ζηνηρεία θαη εξγαιεία ζηνπο πξνγξακκαηηζηέο
γηα ηελ αλάπηπμε ζχλζεησλ εθαξκνγψλ δηαδηθηχνπ γξήγνξα.
Λεπηνκέξεηεο:
΋λνκα Πξντόληνο
Drupal
Symfony
Δηαηξεία /
Πξνγξακκαηηζηέο
Dries Buytaert
Symfony Team
Σειεπηαίεο ΢ηαζεξέο
Δθδόζεηο
Drupal 7.1
Symfony 2.2.5
Server Δθαξκνγήο
Apache / IIS
Apache
Κόζηνο
0€
0€
Λεηηνπξγηθό
΢ύζηεκα
Αλεμαξηήησλ Πιαηθνξκψλ
Αλεμαξηήησλ Πιαηθνξκψλ
Άδεηα Υξήζεο
GPL
MIT
Γιώζζα
Πξνγξακκαηηζκνύ
PHP
PHP
Βάζε Γεδνκέλσλ
MySQL / PosgreSQL / SQLite
MySQL
Ιζηνζειίδα
drupal.org
www.symfony-project.org/
Root Πξόζβαζε
Όρη
Ναη
Shell Πξόζβαζε
Όρη
Όρη
Σύπνο Πηζηνπνίεζεο
Ναη, Με Γπλαηφηεηα ΢χλδεζεο
Ναη, Με Γπλαηφηεηα ΢χλδεζεο
Page Caching
Ναη
Ναη
Αλαπαξαγσγή Βάζεο
Γεδνκέλσλ
Πεξηνξηζκέλε
Πεξηνξηζκέλε
Τπνζηήξημε FTP
Πεξηνξηζκέλε
Πεξηνξηζκέλε
Υαξαθηεξηζηηθά
208
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
΢πκβαηό κε XHTML
Ναη
Ναη
Τπνζηήξημε UTF-8
Ναη
Ναη
Αλαθνξέο Βάζεο
Γεδνκέλσλ
Ναη
Γσξεάλ Πξφζζεην
Metadata
Ναη
Ναη
Φηιηθά URL
Ναη
Ναη
Δπαλεγγξαθή URL
Ναη
Ναη
Δγγξηζε
Πεξηερνκέλνπ
Ναη
Γσξεάλ Πξφζζεην
Ιζηνξηθό Δθδόζεσλ
Ναη
Γσξεάλ Πξφζζεην
Δκπνξηθή
Τπνζηήξημε /
Δθπαίδεπζε
Ναη
Ναη
Μεηαθνξά θαη
Απόζεζε
Πεξηερνκέλνπ
Γσξεάλ Πξφζζεην
Όρη
΢πλδξνκέο
Γσξεάλ Πξφζζεην
Όρη
Δμηζνξξόπεζε
Φνξηίνπ
Ναη
Όρη
΢ηαηηζηηθά Web
Ναη
Όρη
Τπεξεζίεο Web
Πξνζθελίνπ
Πεξηνξηζκέλεο
Πεξηνξηζκέλεο
RSS
Ναη
Ναη
Άιια Υαξαθηεξηζηηθά
209
Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων
ΒΙΒΛΙΟΓΡΑΦΙΑ
[1] www.symfony-project.org/
[2] http://symfony.com/about
[3] www.symfony-project.org/jobeet/1_2/Propel/en/
[4] www.youtube.com/ symphony
[5] http://en.wikipedia.org/wiki/Symfony
[6] Drupal - http://drupal.org/
[7] Drupal Gr - http://mydrupal.gr/
[8] Drupal - http://www.drupalove.com/
[9] Edutorials - http://edutorials.gr/node/216
[10] Wikipedia Gr - http://el.wikipedia.org
[11] Youtube - http://www.youtube.com/
[12] Google - http://www.google.gr/
[13]Go-Online - http://www.go-online.gr/ebusiness/specials/article.html?article_id=1042
[14] GNU - http://www.gnu.org/philosophy/free-sw.el.html
[15] WAMP - http://www.wampserver.com/en/presentation.php
[16] Drupal - http://drupal.org/node/
[17] Google - http://www.google.com
[18] Wikipedia - http://www.wikipedia.com
[19] Edutorials - http://www.edutorials.gr/book/export/html
210
Fly UP