Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... ·...

210
Σερλνινγηθό Δθπαηδεπηηθό Ίδξπκα Κξήηεο ρνιή Σερλνινγηθώλ Δθαξκνγώλ Σκήκα Δθαξκνζκέλεο Πιεξνθνξηθήο & Πνιπκέζσλ Πηπρηαθή Δξγαζία Σίηινο: ρεδίαζε- Δεκηνπξγία Ιζηνζειίδσλ θαη ε αλάδεημ ε ηεο δηαθνξάο κεηαμύ Symfony θαη Drupal ΝΔΡΣΙΛΑ ΟΝΙΔΑ (ΑΜ: 1789) Δπηβιέπσλ Καζεγεηήο: ΠΑΠΑΓΟΤΡΑΚΗ ΓΔΩΡΓΙΟ Δπηηξνπή Παξνπζίαζεο: Ηκεξνκελία Παξνπζίαζεο: 00/00/0000

Transcript of Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... ·...

Page 1: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Σερλνινγηθό Δθπαηδεπηηθό Ίδξπκα Κξήηεο

ρνιή Σερλνινγηθώλ Δθαξκνγώλ Σκήκα Δθαξκνζκέλεο Πιεξνθνξηθήο & Πνιπκέζσλ

Πηπρηαθή Δξγαζία

Σίηινο:

ρεδίαζε- Δεκηνπξγία Ιζηνζειίδσλ θαη

ε αλάδεημε ηεο δηαθνξάο κεηαμύ Symfony θαη Drupal

ΝΔΡΣΙΛΑ ΟΝΙΔΑ (ΑΜ: 1789)

Δπηβιέπσλ Καζεγεηήο: ΠΑΠΑΓΟΤΡΑΚΗ ΓΔΩΡΓΙΟ

Δπηηξνπή Παξνπζίαζεο: Ηκεξνκελία Παξνπζίαζεο: 00/00/0000

Page 2: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

2

Δπραξηζηίεο Αηζζάλνκαη ππφρξεε θαη ληψζσ φηη πξέπεη λα επραξηζηήζσ ηδηαηηέξσο ηνλ θαζεγεηή κνπ ηνλ Γξ.

Παπαδνπξάθε Γεψξγην ν φπνηνο κνπ αλάζεζε ην ζέκα απηφ θαη κε βνήζεζε ζηελ ζπλερεία γηα ηελ

νινθιήξσζε ηνπ. Δπίζεο επραξηζηψ ηνλ Γηάλλε ηεθαλή ν φπνηνο κε ηελ ζεηξά ηνπ έγηλε πνιχηηκε

πεγή πιεξνθνξηψλ θαη βαζηθψλ αξρψλ ηνπ Drupal θαη Symfony αλάινγα .

Page 3: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

3

ύλνςε

Απηή ε πηπρηαθή εξγαζία αλαθέξεηαη ζηελ εθκάζεζε ηνπ Symfony (open source framework) θαη ηνπ

Drupal (CMS) νη νπνίεο είλαη γιψζζεο πνπ ρξεζηκνπνηνχληαη γηα ηελ δεκηνπξγία ηζηνζειίδσλ, θαη

εζηηάδεηαη ζε θάπνηα ζεκεία φπσο αθνινπζεί παξαθάησ : ηελ πιήξε παξνπζίαζε ησλ γισζζψλ

Symfony & Drupal θαη ησλ ιεηηνπξγηψλ ηεο.Δπίζεο ζηελ αλάιπζε ηνπ πεξηβάιινληνο ηνπο, θαη ζηελ αμηνπνίεζε ελφο ειεθηξνληθνχ ηζηνχ κηθξήο θιίκαθαο, γξακκέλνπ θαη ζηεο δπν γιψζζεο απηέο

μερσξηζηά ( Symfony & Drupal ). Σν φιν εγρείξεκα απνηειεί έλα εχθνιν νδεγφ ν φπνηνο ζα

βνεζήζεη γηα κηα θαιή αξρή αθνκνίσζεο γηα φπνηνλ επηζπκεί λα κάζεη Symfony & Drupal. Απηφο ν νδεγφο ζα δηεπθνιχλεη ηελ θξίζε ηνπ ρξήζηε ψζηε εθείλνο λα δηαιέμεη πνηα γισζζά ζα

ρξεζηκνπνηήζεη σο εξγαιείν γηα ηελ απνπεξάησζε ηεο εξγαζίαο ηνπ.

Page 4: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

4

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.

Page 5: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

5

Πεξηερόκελα

1. Δηζαγσγή.....................................................................................................................................-15-

1.1. Πεξίιεςε................................................................................................................................-15-

1.2. Κίλεηξν γηα δηεμαγσγή ηεο εξγαζίαο.....................................................................................-15-

1.3. θνπφο θαη ηφρνη εξγαζίαο...................................................................................................-15-

1.4. Γνκή εξγαζίαο (Symfony & Drupal).....................................................................................-16-

2. Μεζνδνινγία Τινπνίεζεο.............................................................................. ...........................-17-

2.1. Μέζνδνο αλάιπζεο θαη αλάπηπμεο πηπρηαθήο.......................................................................-17-

2.2. Σερλνινγίεο θαη εξγαιεία γηα ηελ αλάπηπμε ησλ ηζηνζειίδσλ (ΘΔΩΡΙΔ)..........................-17-

2.2.1. Symfon..........................................................................................................................-17-

2.2.2. Η Αξρηηεθηνληθή ηνπ Symfony.....................................................................................-17-

2.2.3. Mode.............................................................................................................................-19-

2.2.4. View...............................................................................................................................-19-

2.2.5. Controller......................................................................................................................-20-

2.3. ORM.......................................................................................................................................-21-

2.3.1. Object-Relational Mapping (ORM) εξγαιεία:..............................................................-21-

2.3.2. Ση είλαη ηα ORM ζπζηήκαηα.........................................................................................-22-

2.3.3. Ωο αληηθεηκελν-ζρεζηαθή απεηθφληζε (Object-Relational Mapping ή ORM)..............-22-

2.3.4. Υαξαθηεξηζηηθά ησλ ORM ζπζηεκάησλ.....................................................................-23-

2.4. PHP framework......................................................................................................................-24-

2.4.1. Σαρχηεηα.......................................................................................................................-25-

2.4.2. Πνηφηεηα θψδηθα...........................................................................................................-26-

2.5. Η ηερλνινγία AJAX....................................................................................................................................-26-

2.5.1. Γεληθά............................................................................................................................-26-

2.5.2. Σαπηφηεηα.....................................................................................................................-27-

Page 6: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

6

2.5.3. Βηβιηνζήθεο...................................................................................................................-29-

2.5.4. Σν AJAX ζην symfony..................................................................................................-29-

2.6. Ση εηλαη Drupal........................................................................................................................-30-

2.6.1. Modules (Δλφηεηεο)......................................................................................................-31-

2.6.2. Themes (Θεκαηηθέο παξαιιαγέο).................................................................................-31-

2.6.3. CMS..............................................................................................................................-31-

2.6.4. XAAMP.........................................................................................................................-31-

2.6.5. Αξρηηεθηνληθή...............................................................................................................-32-

2.6.6. Απαηηήζεηο θαη ραξαθηεξηζηηθά....................................................................................-32-

2.7. Apache....................................................................................................................................-32-

2.8. MySQL...................................................................................................................................-33-

2.8.1. Πιενλεθηήκαηα ηεο Mysql............................................................................................-35-

2.9. PhpMyAdmin........................................................................................................................-35-

2.10. εµαληηθνί ζηφρνη γηα ηελ νινθιήξσζε ηεο πηπρηαθήο......................................................-36-

2.10.1. Υξνλνδηάγξαµµα.......................................................................................................-36-

3. ρέδην Γξάζεο γηα εθπόλεζε ηεο πηπρηαθήο εξγαζίαο...........................................................-37-

3.1. State of the art.........................................................................................................................-37-

3.1.1. Δηζαγσγή ζην symfony framework..............................................................................-37-

3.1.2. Υαξαθηεξηζηηθά ηνπ Symfony......................................................................................-37-

3.2. Πξναπαηηήζεηο πζηήκαηνο...................................................................................................-38-

3.3. Ρπζκίζεηο Παξακέηξσλ PHP..................................................................................................-38-

3.4. Δγθαηάζηαζε ηνπ Symfony....................................................................................................-38-

3.4.1. Δπηβεβαίσζε ηεο Δγθαηάζηαζεο..................................................................................-39-

3.5. Project Setup...........................................................................................................................-40-

3.5.1. Γεκηνπξγία Project........................................................................................................-40

3.6. Γεκηνπξγία Δθαξκνγήο..........................................................................................................-41-

Page 7: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

7

3.6.1. Γηθαηψκαηα ζηηο Γνκέο ησλ Φαθέισλ..........................................................................-41-

3.7. Ρπζκίζεηο Παξακέηξσλ ηνπ Web Server: O Αζθαιήο Σξφπνο..............................................-41-

3.7.1. Ρπζκίζεηο Παξακέηξσλ ηνπ Web Server.......................................................................-42-

3.7.2. Έιεγρνο ησλ θαηλνχξησλ Ρπζκίζεσλ............................................................................-43-

3.8. Σα πεξηβάιινληα....................................................................................................................-44-

3.9. Σν Project................................................................................................................................-46-

3.9.1. Ιζηνξίεο F......................................................................................................................-47-

3.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......................................................................................................................-52-

3.9.2.1. Ιζηνξία B1....................................................................................................-52-

3.9.2.2. Ιζηνξία B2....................................................................................................-52-

3.9.2.3. Ιζηνξία B3....................................................................................................-52-

4. Σν Μνληέιν Γεδνκέλσλ..............................................................................................................-53-

4.1. Σν ρεζηαθφ Μνληέιν............................................................................................................-53-

4.2. Σν ζρέδην (schema).................................................................................................................-53-

4.3. Σν ORM..................................................................................................................................-53-

4.4. Η Βάζε Γεδνκέλσλ................................................................................................................-56-

4.5. Σα Αξρηθά Γεδνκέλα...............................................................................................................-58-

4.6. ηελ Πξάμε ζηνλ Browser......................................................................................................-61-

5. Η Αξρηηεθηνληθή MVC..............................................................................................................-64-

Page 8: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

8

5.1. Σν Layout................................................................................................................................-65-

5.2. Σα Stylesheet, νη Δηθφλεο θαη ηα Java Scripts.........................................................................-67-

5.3. Η Αξρηθή ειίδα ―Job............................................................................................................-68-

5.4. Η Γξάζε (action)....................................................................................................................-68-

5.5. Σν πξφηππν Templates............................................................................................................-69-

5.6. To Template ηεο Ιζηνζειίδαο―Job..........................................................................................-70-

5.7. Slots........................................................................................................................................-72-

5.8. Η Γξάζε ηεο Ιζηνζειίδαο ―Job..............................................................................................-74-

5.9. Σν Αίηεκα θαη ε Απάληεζε (request / respond).....................................................................-74-

5.9.1. Request..........................................................................................................................-75-

5.9.2. Respond.........................................................................................................................-76-

6. H Γξνκνιόγεζε (Routing).........................................................................................................-76-

6.1. URLs......................................................................................................................................-76-

6.2. Ρχζκηζε Παξακέηξσλ ηνπ Routing........................................................................................-77-

6.3. Πξνζαξκνγέο ησλ Γηαδξνκψλ (route customizations)...........................................................-78-

6.4. Απαηηήζεηο..............................................................................................................................-79-

6.5. Route Class.............................................................................................................................-80-

6.6. Object Route Class.................................................................................................................-80-

6.7. Routing ζε Actions θαη ζε Templates.....................................................................................-84-

6.8. πιινγή Route Class..............................................................................................................-85-

6.9. Απνζθαικάησζε ηνπ Route (Debugging).............................................................................-88-

6.10. Default Route.......................................................................................................................-89-

7. Σν Doctrine Query Object.........................................................................................................-89-

7.1. Απνζθαικαηψλνληαο SQL πνπ Γεκηνπξγήζεθε απφ Doctrine..............................................-90-

7.2. Object Serialization................................................................................................................-91-

7.3. Πεξηζζφηεξα κε ηα Fixtures...................................................................................................-92-

Page 9: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

9

7.4. Custom Configuration............................................................................................................-93-

7.5. Refactoring.............................................................................................................................-94-

7.6. Καηεγνξίεο ζηελ Αξρηθή ειίδα............................................................................................-95-

7.7. Πεξηνξίδνληαο ηα Απνηειέζκαηα...........................................................................................-98-

7.8. Γπλακηθά Fixtures..................................................................................................................-99-

7.9. Αζθαιίδνληαο ηε ειίδα ―Θέζε Δξγαζίαο..........................................................................-100-

8. Η Καηεγνξία Route..................................................................................................................-101-

8.1. Ο χλδεζκνο ηεο Καηεγνξίαο..............................................................................................-102-

8.2. Γεκηνπξγία Category Module ηεο ―Θέζεο Δξγαζίαο‖.........................................................-104-

8.3. Δλεκέξσζε ηεο Βάζεο Γεδνκέλσλ......................................................................................-104-

8.4. Partials..................................................................................................................................-107-

8.5. ειηδνπνίεζε ηεο Λίζηαο.....................................................................................................-108-

9. Έιεγρνη ζην Symfony...............................................................................................................-113-

9.1. Έιεγρνη Μνλάδαο.................................................................................................................-113-

9.2. Σν Lime Testing Framework.................................................................................................-114-

9.3. Δθηειψληαο Διέγρνπο Μνλάδαο...........................................................................................-115-

9.4. Διέγρνληαο ην Slugify..........................................................................................................-115-

9.5. Πξνζζέηνληαο Διέγρνπο γηα Καηλνχξηα Υαξαθηεξηζηηθά...................................................-116-

9.6. Έιεγρνο Doctrine Μνλάδαο..................................................................................................-117-

9.6.1. Ρχζκηζε Παξακέηξσλ ηεο Βάζεο Γεδνκέλσλ............................................................-117-

9.7. Έιεγρνο Γεδνκέλσλ..............................................................................................................-117-

9.8. Διέγρνληαο ην JobeetJob......................................................................................................-118-

9.9. Harness Διέγρσλ Μνλάδαο..................................................................................................-120-

10. Λεηηνπξγηθνί Έιεγρνη...............................................................................................................-120-

10.1. Σν sfBrowser......................................................................................................................-121-

10.2. Η θιάζε sfTestFunctional..................................................................................................-122-

Page 10: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

10

10.3. Ο Διεγθηήο ηνπ Αηηήκαηνο (Request Tester).....................................................................-124-

10.4. Ο Διεγθηήο ηεο Απάληεζεο (Response Tester...................................................................-124-

10.5. Δθηειψληαο Λεηηνπξγηθνχο Διέγρνπο................................................................................-126-

10.6. Έιεγρνο Γεδνκέλσλ...........................................................................................................-126-

10.7. Γξάθνληαο Λεηηνπξγηθνχο Διέγρνπο (functional).............................................................-127-

10.8. Με εκθάληζε ησλ ιεγκέλσλ εξγαζηψλ.............................................................................-127-

10.9. Δκθάληζε κφλν n Θέζεηο Δξγαζίαο γηα κηα θαηεγνξία.....................................................-128-

10.10. Μηα Καηεγνξία έρεη έλαλ χλδεζκν ζηελ ειίδα Καηεγνξηψλ Μφλν φηαλ ππάξρνπλ πνιιέο Θέζεηο Δξγαζίαο.....................................................................................................-128-

10.11. Οη Θέζεηο Δξγαζίαο ηαμηλνκνχληαη αλά Ηκεξνκελία.....................................................-129-

10.12. Κάζε Θέζε Δξγαζίαο ζηελ Αξρηθή ειίδα κπνξεί λα παηεζεί.......................................-130-

10.13. Απνζθαικάησζε Λεηηνπξγηθψλ Διέγρσλ.......................................................................-134-

10.14. Harness Λεηηνπξγηθψλ Διέγρσλ......................................................................................-134-

10.15. Harness Έιεγρνη..............................................................................................................-134-

11. Σν Form Framework................................................................................................................-134-

11.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........................................................................................................................................-153-

12.1. πζηήκαηα δηαρείξηζεο Πεξηερνκέλνπ – Drupal.............................................................-153-

12.1.1. Δηζαγσγή ζην χζηεκα Γηαρείξηζεο Πεξηερνκέλνπ (Content Management System – CMS)...........................................................................................................................-154-

Page 11: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

11

12.1.2. Ιζηνξηθά ηνηρεηά CMS...........................................................................................-154-

12.1.3. Ση είλαη ην ζχζηεκα δηαρείξηζεο πεξηερνκέλνπ CMS..............................................-154-

12.1.4. Σα δηαζέζηκα Web CMS..........................................................................................-154-

12.1.5. CMS αλνηθηνχ θψδηθα............................................................................................-155-

12.1.6. Σα πην δεκνθηιή CMS αλνηρηνχ θψδηθα.................................................................-155-

12.1.7. Γπλαηφηεηεο θαη ραξαθηεξηζηηθά ελφο CMS ............................................... ....-155-

12.1.8. Πιενλεθηήκαηα ελφο CMS (Content Management System)...................................-156-

13. Γεληθή πεξηγξαθή ηνπ Drupal.................................................................................................-157-

13.1. Ση είλαη Drupal.................................................................................................................-157-

13.1.1. Πιενλεθηήκαηα Drupal...........................................................................................-158-

13.1.2. Μεηνλεθηήκαηα Drupal............................................................................................-159-

13.1.3. Σα θχξηα ραξαθηεξηζηηθά ηνπ Drupal.....................................................................-159-

13.1.4. Σερλνινγηθή ππνδνκή ηνπ Drupal...........................................................................-161-

14. Τινπνίεζε.................................................................................................................................-161-

14.1. Πνιιαπιά site κε κία εγθαηάζηαζε Drupal....................................................................-161-

14.2. Δγθαηάζηαζε απαξαίηεηνπ ινγηζκηθνχ..........................................................................-162-

14.3. Οινθιήξσζε ηεο εγθαηάζηαζεο ηνπ Drupal..................................................................-168-

14.4. Γλσξηκία κε ην πεξηβάιινλ εξγαζίαο.............................................................................-168-

14.4.1. Content management...............................................................................................-169-

14.5. Αζθάιεηα.........................................................................................................................-171-

14.6. Οη Μνλάδεο.....................................................................................................................-171-

14.6.1. Γηαρείξηζε................................................................................................................-172-

14.6.2. Content Construction Kit (CCK).............................................................................-172-

14.6.3. Views.......................................................................................................................-173-

14.7. Σν δηαρεηξηζηηθφ πεξηβάιινλ ηνπ Drupal.....................................................................-174-

14.8. Σν πξφηππν ζρεδίαζεο (Theme template)....................................................................-176-

Page 12: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

12

14.9. Modules........................................................................................................................-181-

14.10. Σα Drupal Hooks...........................................................................................................-182-

14.11. Γηαδηθαζία αίηεζεο ζειίδαο.........................................................................................-193-

14.12. Database Abstraction Layer..........................................................................................-195-

14.13. Τπνβνιή πεξηερνκέλνπ.................................................................................................-197-

14.14. Σαμηλφκεζε πεξηερνκέλνπ............................................................................................-198-

14.15. Γεκηνπξγία ζχλζεησλ ζειίδσλ.....................................................................................-199-

14.16. χζηεκα Μελνχ............................................................................................................-200-

14.17. Blocks...........................................................................................................................-205-

14.18. Γηεπζχλζεηο URL..........................................................................................................-205-

14.19. Η δνκή ηεο ηζηνζειίδαο καο.........................................................................................-210-

14.20. Γεκηνπξγία θαη επεμεξγαζία ζειίδαο...........................................................................-210-

14.20.1. Γεκηνπξγία κπινθ.................................................................................................-211-

14.20.2. Αξρηθή ζειίδα.......................................................................................................-211-

15. Πίλαθαο ζύγθξηζεο ηνπ Framework Symfony κε ην Drupal................................................-212-

Page 13: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

13

Πίλαθαο εηθόλσλ:

Αξηζκόο

Δηθόλαο

ειίδα Πεξηγξαθή

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

Page 14: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

14

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

Page 15: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

15

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) πνπ απαηηνχληαη γηα ηελ δεκηνπξγία ηζηνζειίδσλ. Μέζα απφ ηελ αλάιπζε ζα

Page 16: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

16

γίλεη θαηαλνεηή ε δνκή ηνπο, ε ηεξαξρία θαη ην ζχζηεκα αξρείσλ ηνπο, πξνθεηκέλνπ λα ρεηξηζηνχλ απνδνηηθά θαη λα βνεζήζνπλ ζηελ απνπεξάησζε ηνπ θάζε έξγνπ αλάινγα κε ηελ πεξίπησζε.

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 ζε ελαλ

πηλαθα .

Page 17: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

17

2.Μεζνδνινγία Τινπνίεζεο

Πεξηγξαθή ησλ παξαδνρψλ θαη ηεο κεζνδνινγίεο πινπνίεζεο ηεο εξγαζίαο.

2.1 Μέζνδνο αλάιπζεο θαη αλάπηπμεο πηπρηαθήο

ηελ ππνθαηεγνξία απηή ζα αζρνιεζνχκε κε ηελ παξαηήξεζε θαη πξαθηηθή αλάιπζε φισλ ησλ

βεκάησλ πνπ ζα αθνινπζήζνπκε γηα ηελ νινθιήξσζε ησλ ηζηνζειίδσλ κε ηελ βνήζεηα ηνπ Symfony θαη Drupal αλάινγα. Η αθνκνίσζε ησλ μερσξηζηψλ ζηνηρείσλ ηνπο, ζα καο βνεζήζεη λα θηλεζνχκε

ζε επίπεδα βαηά θαη πξνζηηά ζε καο.

ΜΔΘΟΓΟΛΟΓΙΑ ΑΝΑΦΟΡΑ ΣΗΝ ΒΙΒΛΙΟΓΡΑΦΙΑ

Symfony www.symfony-project.org/

MVC www.wikipedia.org/wiki/MVC

ORM en.wikipedia.org/wiki/Object- relational_mapping

Framework en.wikipedia.org/wiki/Framework

Drupal http://drupal.org/ Modules(Δλόηεηεο) http://drupal.org/project/Modules

Themes http://drupal.org/project/Themes

PHP http://en.wikipedia.org/wiki/PHP,

http://www.php.net/

SQL http://www.sqlcourse.com,

http://en.wikipedia.org/wiki/SQL

Javascript http://en.wikipedia.org/wiki/Javascript Css http://en.wikipedia.org/wiki/CSS

Πίλαθαο 1 - ρεηηθέο Μεζνδνινγίεο Αλάπηπμεο

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.

Page 18: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

18

Σν ζπγθεθξηκέλν αξρηηεθηνληθφ πξφηππν επηηξέπεη ην δηαρσξηζκφ ηεο ινγηθήο απφ ηελ παξνπζίαζε ζην ππφ αλάπηπμε ζχζηεκα κε απνηέιεζκα λα πξνζθέξεη κεγαιχηεξε επειημία ζηελ αλάπηπμε θαη

ζηε ζπληήξεζε ηνπ ζπζηήκαηνο θαη επθνιφηεξν έιεγρν ησλ επηκέξνπο ππνζπζηεκάησλ. Μία

εθαξκνγή πνπ αλαπηχζζεηαη αθνινπζψληαο ηε ζπγθεθξηκέλε ηερλνηξνπία απαξηίδεηαη απφ

μερσξηζηέο δνκηθέο κνλάδεο πνπ πινπνηνχλ ηνπο ηξεηο δηαθξηηνχο ξφινπο πνπ νξίδνληαη απφ ηε ζπγθεθξηκέλε αξρηηεθηνληθή. Σα κνληέια είλαη θνκκάηηα θψδηθα πνπ αλαπαξηζηνχλ ηα δεδνκέλα ηεο

εθαξκνγήο. Οη φςεηο (views) είλαη θνκκάηηα θψδηθα πνπ αλαιακβάλνπλ λα παξνπζηάζνπλ ην

απνηέιεζκα ηνπ ζπζηήκαηνο ζην ρξήζηε. Οη ειεγθηέο είλαη ηκήκαηα θψδηθα πνπ δέρνληαη θαη δηεθπεξαηψλνπλ ηηο εληνιέο ηνπ ρξήζηε. ηε ζχγρξνλε αλάπηπμε δηθηπαθψλ εθαξκνγψλ ην

αξρηηεθηνληθφ πξφηππν Model – View – Controller βξίζθεη ηδηαίηεξε εθαξκνγή θαη απνδεηθλχεηαη

ζηαδηαθά σο ηδαληθή ιχζε γηα ηελ αλάπηπμε πνιχπινθσλ εθαξκνγψλ κηαο θαη ην κνληέιν αλάπηπμεο

δηθηπαθψλ ζπζηεκάησλ επηβάιιεη εγγελψο ην δηαρσξηζκφ ηεο παξνπζίαζεο, ε νπνία γίλεηαη κέζσ HTML, θαη ηεο ινγηθήο, ε νπνία πξαγκαηνπνηείηαη ζην δηαθνκηζηή ηεο εθαξκνγήο. ε απηφ ην

πιαίζην ηαηξηάδεη απφιπηα ε ινγηθή ηεο ιεηηνπξγίαο ηνπ ζπγθεθξηκέλνπ αξρηηεθηνληθνχ πξνηχπνπ.

ην ζρήκα πνπ αθνινπζεί παξνπζηάδνληαη δηαγξακκαηηθά ηα επηκέξνπο ζηνηρεία ηεο αξρηηεθηνληθήο θαη αλαπαξίζηαληαη νη ζπζρεηίζεηο κεηαμχ απηψλ. Δπηγξακκαηηθά, αμίδεη λα αλαθεξζεί φηη ν ειεγθηήο

έρεη πξφζβαζε ηφζν ζηηο φςεηο, ηηο νπνίεο δίλεη πξνο απεηθφληζε, φζν θαη ζηα κνληέια, απφ ηα νπνία

αληιεί πιεξνθνξίεο ελψ θαη νη φςεηο, κε ηε ζεηξά ηνπο, έρνπλ ηε δπλαηφηεηα άληιεζεο πιεξνθνξηψλ απφ ηα κνληέια. ηε ζπλέρεηα αθνινπζεί ε ελδειερήο αλάιπζε ηνπ αξρηηεθηνληθνχ πξνηχπνπ Model

– View – Controller ζηα επηκέξνπο ηκήκαηα πνπ ην απνηεινχλ.

Δηθόλα 1 : ρεκαηηθό δηάγξακκα ηνπ αξρηηεθηνληθνύ κνληέινπ Model – View – Controller θαη

ησλ ζρέζεσλ κεηαμύ ησλ ηκεκάησλ ηνπ.

Με κία πξψηε κάηηα ηεο εηθφλαο κπνξεί θάπνηνο λα θαηαιάβεη φηη ππάξρεη επηθνηλσλία κεηαμχ ηνπ

Διηθηή ηεο Πξνβνιήο θαη ηνπ Μνληέινπ. Όηαλ ν ρξήζηεο (browser) αηηεζεί κηα ελέξγεηα, ηφηε απηή

πεγαίλεη ζηνλ Διεγθηή. Απηφο κε ηε ζεηξά ηνπ, αλαιφγσο ην αίηεκα, αλνίγεη κηα επηθνηλσλία κε ην Μνληέιν απφ ην νπνίν αηηείηαη θάπνηα δεδνκέλα εθφζνλ ηα δεδνκέλα πνπ δεηήζεθαλ είλαη

Page 19: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

19

απνζεθεπκέλα ζε βάζε. Δάλ βξίζθνληαη ζηε βάζε, ην Μνληέιν απαληάεη, ζηέιλνληαο ηα απνηειέζκαηα πίζσ ζηνλ Διεγθηή. Αθνχ ηα ιάβεη, θαιεί ηελ αληίζηνηρε πξνβνιή πνπ ζα αλαιάβεη λα

εκθαληζηεί ηα απνηειέζκαηα. Όηαλ βξεζεί ε απαξαίηεηε πξνβνιή, ηα απνηειέζκαηα ζηέιλνληαη πάιη

πίζσ ζηνλ ειεγθηή ν φπνηνο θαη ζέζσ ηνπ δηαθνκηζηεί παξνπζηάδεη ηα ζηνηρεηά ζηνλ ρξεζηή. ηελ

ζπλέρεηα ηεο ελφηεηαο, αθνινπζεί ε εθηελή αλάιπζε ησλ ηξηψλ βηβιηνζεθψλ βάζε ησλ νπνίσλ

πινπνηείηαη ην MVC ζε κηα Symfony εθαξκνγή.

2.2.3 Model

Έλα Μνληέιν αληηπξνζσπεχεη ηηο πιεξνθνξηεο (δεδνκελα) κηαο εθξακνγεο θαη ηνπο θαλνλεο πνπ ρξεηαδεηαη γηα ην ρεηξηζκφ απησλ ησλ δεδνκέλσλ. ηελ πεξίπησζε ηνπ Symfony, ηα

κνληεια ρξεζηκνπνηνχληαη θπξησο γηα ηε δηαρεηξηζε ησλ θαλφλσλ αιιειεπίδξαζεο κε ηελ

αληηζηνηρε βάζε δεδνκέλσλ. ηηο πεξηζζνηεξεο πεξηπησζεηο, ελαο πηλαθαο ηεο βαζεο δεδνκελσλ ζαο ζα αληηζηνηρεη ζε ελα κνληειν δει. Απνηειεί ηελ αλαπαξάζηαζε ησλ

δεδνκέλσλ ηα νπνία ρξεζηκνπνηεί θαη επεμεξγάδεηαη ε εθαξκνγή. Σα κνληέια πξνζζέηνπλ

ινγηθή ζηελ πιεξνθνξία ησλ εθάζηνηε δεδνκέλσλ, π.ρ. ππνινγίδνληαο αλ ζήκεξα είλαη ε

κέξα γελεζιίσλ ελφο ρξήζηε ηνπ ζπζηήκαηνο. Όηαλ έλα κνληέιν κεηαβάιιεη ηελ θαηάζηαζή

ηνπ ελεκεξψλεη ηα views πνπ ζρεηίδνληαη κε απηφ ψζηε λα αλαλεσζνχλ κε ηε λέα θαηάζηαζε. Σα πεξηζζφηεξα ζπζηήκαηα ρξεζηκνπνηνχλ έλα κεραληζκφ κφληκεο απνζήθεπζεο, π.ρ. κία

ζρεζηαθή βάζε δεδνκέλσλ, γηα ηελ απνζήθεπζε ησλ δεδνκέλσλ. Σα κνληέια δελ είλαη

απαξαίηεην λα γλσξίδνπλ γηα ην κέζν απνζήθεπζεο ηεο πιεξνθνξίαο. Παξφια απηά είλαη

πνιχ βνιηθφ αλ ην εθάζηνηε κνληέιν γλσξίδεη πψο λα αλαγλψζεη θαη λα απνζεθεχζεη ηνλ

εαπηφ ηνπ ζην κέζν κφληκεο απνζήθεπζεο ηεο εθαξκνγήο. Μία πινπνίεζε ηεο

ζπγθεθξηκέλεο ηδέαο επηηπγράλεηαη κε ην πξφηππν ζρεδίαζεο Active Record.

2.2.4 View

Πξνβάιεη έλα κνληέιν ζε κνξθή θαηαλνεηή από ην ρξήζηε θαη πξνζαξκνζκέλε ζην κέζν πεηθόληζεο. Σπλήζσο, παξέρνληαη δηαθνξεηηθά views γηα θάζε κνληέιν ηα νπνία ρξεζηκνπνηνύληαη αλάινγα ηελ εθάζηνηε αλάγθε παξνπζίαζεο ηεο πιεξνθνξίαο ηνπ κνληέινπ. Σπλεζηζκέλν παξάδεηγκα είλαη ε ύπαξμε ελόο view κε ζπλνπηηθέο πιεξνθνξίεο γηα ην κνληέιν θαη ελόο δεύηεξνπ view, ην νπνίν απεηθνλίδεη αλαιπηηθά όια ηα ζηνηρεία ηνπ κνληέινπ. Εθηόο από ηε δηάθξηζε ζηνλ ηξόπν κε ηνλ νπνίν απεηθνλίδεηαη ην κνληέιν, ηα views δηαθξίλνληαη θαη κε βάζε ην κέζν ζην νπνίν είλαη ζρεδηαζκέλα λα πξνβάιινληαη. Πνιιέο θνξέο έλα κεγάιν ζύζηεκα παξέρεη ζηνπο ρξήζηεο ηνπ πνιιαπιέο δπλαηόηεηεο πξόζβαζεο θαη απεηθόληζεο ηεο πιεξνθνξίαο, π.ρ. κέζσ ηνπ web browser, κέζσ κίαο αλεμάξηεηεο γξαθηθήο εθαξκνγήο, κέζσ κίαο αλεμάξηεηεο εθαξκνγήο θεηκέλνπ ή κέζσ εθηππσκέλεο πιεξνθνξίαο. Σε θάζε δηαθνξεηηθό κέζν απεηθόληζεο αληηζηνηρεί θαη έλα δηαθνξεηηθό view, ην νπνίν ιακβάλεη ππόςε ηνπ ηηο ηδηαηηεξόηεηεο ηνπ κέζνπ ώζηε λα εκθαλίζεη κε ην βέιηηζην δπλαηό ηξόπν ηα ζηνηρεία ηνπ κνληέινπ, π.ρ. ε πξνβνιή ελόο γξαθήκαηνο ζηελ θνλζόια ηνπ ζπζηήκαηνο ή πξνβνιή κίαο έγρξσκεο εηθόλαο ζε κία αζπξόκαπξε εθηύπσζε είλαη πεξηπηώζεηο πνπ απαηηνύλ ηδηαίηεξν ρεηξηζκό από ην αληίζηνηρν view.

Page 20: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

20

2.2.5 Controller

Λακβάλεη ηα κελύκαηα θαη ηηο εληνιέο εηζόδνπ από ην ρξήζηε θαη απνθξίλεηαη ελεξγώληαο πάλσ ζηα κνληέια ή / θαη εκθαλίδνληαο θάπνην ζπγθεθξηκέλν view. Ο ειεγθηήο απνηειεί ην ζπλδεηηθό θξίθν ηνπ ζπζηήκαηνο θαη είλαη ππεύζπλνο γηα ηε δηεθπεξαίσζε ησλ εληνιώλ ηνπ ρξήζηε ηεο εθαξκνγήο. Η ζπλήζεο ιεηηνπξγία ηνπ είλαη ε αλαγλώξηζε ησλ εληνιώλ ηνπ ρξήζηε, ε άληιεζε θαη επεμεξγαζία ηεο πιεξνθνξίαο από ηα κνληέια βάζεη ησλ εληνιώλ ηνπ ρξήζηε θαη ε παξνπζίαζε ηεο δεηνύκελεο πιεξνθνξίαο κέζσ ηνπ θαηάιιεινπ view.

Δηθόλα 2 : Η επηθνηλσλία κεηαμύ ησλ ηκεκάησλ Model – View – Controller.

Page 21: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

21

Η αρχι τθσ αρχιτεκτονικισ του 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).

Page 22: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

22

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 απμνκεηψλεηαη ζηε κλήκε.

Page 23: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

23

Σν πξφβιεκα ηεο ηαπηφηεηαο. Δλψ ζηηο ζρεζηαθέο βάζεηο δεδνκέλσλ ε ηαπηφηεηα κηαο

γξακκήο εθθξάδεηαη απφ ηελ ηηκή ηνπ πξσηεχνληνο θιεηδηνχ (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 ερωτιματα.

Page 24: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

24

Γηαθαλήο πινήγεζε κεηαμχ ησλ ζρεηηδφκελσλ αληηθεηκέλσλ (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 αλαιχνληαη πεξαηηέξσ ζε

μερσξηζηά δηαγξάκκαηα πνπ αθνινπζνχλ.

Page 25: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

25

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.

Page 26: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

26

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 Γεληθά

Παξά ηελ ηξνκεξή ηερλνινγηθή αλάπηπμε ηνπ δηαδηθηχνπ ηελ πεξαζκέλε δεθαεηία ε επρξεζηία ησλ

εθαξκνγψλ ηνπ παγθφζκηνπ ηζηνχ πζηεξεί ζε ζχγθξηζε κε απηή ησλ εθαξκνγψλ πνπ εθηεινχληαη ζην πεξηβάιινλ ηνπ θάζε ππνινγηζηή, ηηο ιεγφκελεο θαη σο εθαξκνγέο επηθάλεηαο εξγαζίαο. Κάζε

ζεκαληηθή αιιειεπίδξαζε ζε κηα εθαξκνγή παγθφζκηνπ ηζηνχ ζπλεπάγεηαη έλα δηάζηεκα αλακνλήο

γηα ηελ απφθξηζή ηεο, κέρξη απηή λα επηθνηλσλήζεη κέζσ δηαδηθηχνπ κε ηνλ δηαθνκηζηή πνπ ηελ εμππεξεηεί. Οη Γηαδηθηπαθέο Δθαξκνγέο Δκπινπηηζκέλσλ κέζσλ είλαη εθαξκνγέο ηνπ παγθφζκηνπ

ηζηνχ νη νπνίεο πξνζεγγίδνπλ ηελ φςε θαη αίζζεζε ησλ εθαξκνγψλ επηθάλεηαο εξγαζίαο. Οη

εκπινπηηζκέλεο δηαδηθηπαθέο εθαξκνγέο έρνπλ δχν βαζηθά ραξαθηεξηζηηθά, ηελ απνδνηηθφηεηα θαη ηε δηαινγηθή γξαθηθή δηεπαθή ρξήζηε.

Page 27: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

27

Δηθόλα 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 ρξεζηκνπνηεί ηηο αθφινπζεο γηα λα

πεηχρεη ην ζθνπφ ηεο:

Page 28: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

28

Σηο γιψζζεο, επηζήκαλζεο ηζηνζειίδσλ 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 .

Page 29: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

29

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

Page 30: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

30

Σν 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.

Page 31: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

31

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 νη νπνίνη ήηαλ

γλσζηνί γηα ηελ αληνρή θαη ηηο ηθαλφηεηεο ηνπο ζηελ κάρε. Παξ‘ φια απηά, θαηά ηελ πεξίνδν 1996-

2001, ε επεμήγεζε πνπ έδηλε ε ηζηνζειίδα ηνπ 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, δηαρείξηζε πεξηερνκέλνπ θαη ππνζηήξημε δηαθφξσλ

Page 32: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

32

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 βάζε δεδνκέλσλ θαη έηζη νη ζειίδεο καο λα

απνθηήζνπλ πνιιέο άιιεο δπλαηφηεηεο πνπ απαηηνχλ νη ζχγρξνλεο απαηηήζεηο ησλ ρξεζηψλ δειαδή

Page 33: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

33

λα γίλνπλ δπλακηθέο, ειθπζηηθέο θαη αληαγσληζηηθέο. Μηα ηππηθή δηαδηθηπαθή ζπλαιιαγή βάζεσλ δεδνκέλσλ απνηειείηαη απφ ηηο παξαθάησ θάζεηο:

Ο 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 πηλάθσλ

Page 34: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

34

Γεκηνπξγεί PDF γξαθηθψλ ηνπ layout ηεο βάζεο δεδνκέλσλ

Δθηειεί αλαδεηήζεηο ζε φιε ηε βάζε ή κέξνο απηήο

Τπνζηεξίδεη πίλαθεο InnoDB θαη μέλα θιεηδηά

Τπνζηεξίδεη MySQLi, κηα βειηησκέλε επέθηαζε ηεο MySQL

2.10 εµαληηθνί ζηόρνη γηα ηελ νινθιήξσζε ηεο πηπρηαθήο

Χρονοδιάγραµµα ΗΜΕΡΕ

state of the art 30

Αλάιπζεο ηνπ πξνβιήµαηνο 30

ρεδηαζµνχ & αλάπηπμεο ηεο πηπρηαθήο 30

Τινπνίεζε ηεο ηζηνζειίδαο Symfony 90

Τινπνίεζε ηεο ηζηνζειίδαο Drupal 30

Λεηηνπξγίαο ηεο ηζηνζειίδαο Symfony 9

Λεηηνπξγίαο ηεο ηζηνζειίδαο Drupal 5

πγγξαθή αλαθνξάο εξγαζίαο Symfony 110

πγγξαθή αλαθνξάο εξγαζίαο Druapl 30

Aίηεζεο αμηνιφγεζεο εξγαζίαο 1

Πενεηνηµαζία παξνπζίαζεο αλαθνξάο 1

Παξνπζίαζε αλαθνξάο 1

Page 35: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

35

2.10.1 Υξνλνδηάγξαµµα

Δηθόλα 6 :Σν ρξνλνδηάγξακκα πνπ ρξεηαζηεηθε γηα ηελ πινπνηεζε ηεο πηπρηαθεο

Page 36: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

36

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, για εφκολθ ςυντιρθςθ Εφκολο ςτο να επεκτακεί, επιτρζποντασ τθν ζνταξθ με άλλεσ βιβλιοκικεσ καταςκευαςτών.

Page 37: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

37

Δδψ ζα πεξηγξάςνπκε ηε δεκηνπξγία κηαο εθαξκνγήο γηα ην δηαδίθηπν κε ρξήζε ηνπ symfony

framework, βήκα-βήκα, απφ ηηο πξνδηαγξαθέο κέρξη θαη ηελ εθηέιεζε. θνπφο καο είλαη λα δείμνπκε

φηη ην symfony κπνξεί λα ρξεζηκνπνηεζεί γηα λα αλαπηχμνπκε επαγγεικαηηθέο εθαξκνγέο κε ζηπι θαη

κε ιίγε πξνζπάζεηα. Με απηφλ ηνλ ηξφπν ζα κάζνπκε λα δεκηνπξγνχκε πξαγκαηηθέο ηζηνζειίδεο απφ ηελ αξρή κέρξη ην ηέινο θάλνληαο ρξήζε ηνπ symfony.

3.2 Πξναπαηηήζεηο ζπζηήκαηνο.1

Πξηλ εγθαηαζηήζνπκε ην symfony ζα πξέπεη λα ειέγμνπκε φηη ην ινγηζκηθφ πνπ πξναπαηηείηαη γηα

ηελ ζσζηή ιεηηνπξγία ηνπ, είλαη εγθαηεζηεκέλν ζηνλ ππνινγηζηή θαη έρεη ξπζκηζηεί αλάινγα. Θα

πξέπεη λα ππάξρεη θηιηθφ εξγαζηαθφ πεξηβάιινλ γηα web development. Δπίζεο ρξεηάδεηαη λα είλαη

εγθαηεζηεκέλα, έλαο web server (π.ρ. Apache), κία κεραλή βάζεο δεδνκέλσλ, (MySQL, PostgreSQL, SQLite ή νπνηαδήπνηε ζπκβαηή κε PDO

2 κεραλή βάζεο δεδνκέλσλ), θαη ε 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 Λειτουργικοφ Συςτιματοσ για λόγουσ αςφαλείασ και γριγορθσ εκτζλεςθσ.

Page 38: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

38

$ 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

Page 39: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

39

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/: Σνλ web root θάθειν

Page 40: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

40

Η δηεξγαζία 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

Page 41: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

41

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/

Page 42: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

42

Η port 8080 κπνξεί λα αιιαρζεί ζε νπνηνλδήπνηε αξηζκφ κεγαιχηεξν ηνπ 1024 θαζψο νη αξηζκνί

απηνί δελ ρξεηάδνληαη δηθαηψκαηα δηαρεηξηζηή.

3.7.2 Διέγρνπκε ηηο θαηλνύξηεο ξπζκίζεηο

Δπαλεθθηλνχκε ηνλ Apache θη ειέγρνπκε εάλ κπνξνχκε λα έρνπκε πξφζβαζε ζηελ θαηλνχξηα

εθαξκνγή αλνίγνληαο έλαλ browser θαη πιεθηξνινγψληαο http://localhost:8080/index.php, ή http://www.jobeet.com.localhost/index.php/ αλάινγα κε ηηο ξπζκίζεηο πνπ επηιέμακε.

Δηθόλα 7: Πξώηε ζειίδα εγθαηάζηαζεο ηνπ Symfony

Μπνξνχκε επίζεο λα δνθηκάζνπκε λα απνθηήζνπκε πξφζβαζε ζηελ εθαξκνγή ζην πεξηβάιινλ ηεο

αλάπηπμεο:

Page 43: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

43

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:

Page 44: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

44

Δηθόλα 7: Σν πεξηβάιινλ παξαγσγήο ηνπ Symfony πνπ καο δείρλεη ην ζθάικα γηα λα

ελεξγνπνηεζεί

Αιιά ζηνλ πεξηβάιινλ παξαγσγήο (production environment), πξέπεη λα ελεξγνπνηεζεί ην επίπεδν

cache (cache layer) θαη ε εθαξκνγή ζα πξέπεη λα εκθαλίδεη πξνζαξκνζκέλα κελχκαηα ζθαικάησλ

αληί γηα αθαηέξγαζηεο εμαηξέζεηο (raw exceptions). Έηζη, ην πεξηβάιινλ παξαγσγήο ζα πξέπεη λα βειηηζηνπνηεζεί γηα επίδνζε θαη ηελ εκπεηξία ηνπ ρξήζηε.

Page 45: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

45

Δηθόλα 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.

Page 46: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

46

Σν 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: ηελ αξρηθή ζειίδα ν ρξήζηεο βιέπεη ηηο ηειεπηαίεο ελεξγέο ζέζεηο

εξγαζίαο.

Page 47: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

47

3.9.1.2 Ιζηνξία F2: Έλαο ρξήζηεο κπνξεί λα αλαδεηήζεη όιεο ηηο ζέζεηο εξγαζίεο ζε

ζπγθεθξηκέλε θαηεγνξία

Όηαλ ν ρξήζηεο ―παηάεη‖ ζε έλα φλνκα θαηεγνξίαο ή ζε έλα link ―more jobs‖ ζηελ αξρηθή ζειίδα, βιέπεη φιεο ηηο ζέζεηο εξγαζίαο γη απηή ηελ θαηεγνξία ηαμηλνκεκέλεο θαηά εκεξνκελία.

Δηθόλα 9: Ιζηνξία F2: Έλαο ρξήζηεο κπνξεί λα αλαδεηήζεη όιεο ηηο ζέζεηο εξγαζίεο ζε

ζπγθεθξηκέλε θαηεγνξία

3.9.1.3 Ιζηνξία F3: Έλαο ρξήζηεο βειηηώλεη ηα απνηειέζκαηα ηεο ιίζηαο κε θάπνηεο ιέμεηο-

θιεηδηά

Ο ρξήζηεο κπνξεί λα εηζάγεη θάπνηεο ιέμεηο-θιεηδηά γηα λα βειηηψζεη ηελ εχξεζε. Οη ιέμεηο-θιεηδηά

κπνξνχλ λα είλαη ιέμεηο πνπ αλαθέξνληαη ζηελ ηνπνζεζία, ηελ ζέζε, ηελ θαηεγνξία, ή ηα πεδία ηηο

εηαηξείαο.

Page 48: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

48

3.9.1.4 Ιζηνξία F4: Ο ρξήζηεο “παηάεη” πάλσ ζε κηα ζέζε εξγαζίαο γηα λα δεη πην ιεπηνκεξείο

πιεξνθνξίεο

Ο ρξήζηεο κπνξεί λα δηαιέμεη κία ζέζε εξγαζίαο απφ ηε ιίζηα γηα λα δεη πην ιεπηνκεξείο

πιεξνθνξίεο.

Δηθόλα 10: Ιζηνξία F4: Ο ρξήζηεο “παηάεη” πάλσ ζε κηα ζέζε εξγαζίαο γηα λα δεη πην

ιεπηνκεξείο πιεξνθνξίεο

3.9.1.5 Ιζηνξία F5: Ο ρξήζηεο ηνπνζεηεί κία ζέζε εξγαζίαο

Έλαο ρξήζηεο κπνξεί λα ηνπνζεηήζεη κία ζέζε εξγαζίαο. Μηα ζέζε εξγαζίαο απαξηίδεηαη απφ

αξθεηά θνκκάηηα απφ πιεξνθνξίεο:

Δηαηξεία

Σχπνο εξγαζίαο (full-time, part-time, ή αλεμάξηεηε)

Λνγφηππν (πξναηξεηηθά)

URL (πξναηξεηηθά) Θέζε

Page 49: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

49

Σνπνζεζία

Καηεγνξία (Ο ρξήζηεο δηαιέγεη ζε ιίζηα ηηο πηζαλέο θαηεγνξίεο)

Πεξηγξαθή εξγαζίαο (ηα URL θαη ηα email ζπλδένληαη απηφκαηα)

Πσο λα γίλεη ε αίηεζε (ηα URL θαη ηα email ζπλδένληαη απηφκαηα) Email

Γελ ρξεηάδεηαη ε δεκηνπξγία ινγαξηαζκνχ γηα λα ηνπνζεηεζεί κία ζέζε εξγαζίαο.

Η δηαδηθαζία ρξεηάδεηαη κφλν δχν βήκαηα: πξψηα, ν ρξήζηεο ζπκπιεξψλεη ηε θφξκα κε φιεο ηηο

απαξαίηεηεο πιεξνθνξίεο γηα λα πεξηγξάςεη ηε ζέζε εξγαζίαο, κεηά επηβεβαηψλεη ηηο πιεξνθνξίεο θάλνληαο πξν-επηζθφπεζε ηεο ηειηθήο ζειίδαο γηα ηε ζέζε εξγαζίαο.

Αθφκα θη αλ ν ρξήζηεο δελ έρεη ινγαξηαζκφ, κία ζέζε εξγαζίαο κπνξεί λα ηξνπνπνηεζεί θη έπεηηα

απφ ηελ ηνπνζέηεζή ηεο ράξηο ζε έλα ζπγθεθξηκέλν URL.

Κάζε αλαξηεκέλε ζέζε εξγαζίαο παξακέλεη δηαζέζηκε (online) γηα 30 εκέξεο (απηφ ξπζκίδεηαη απφ

ηνλ δηαρεηξηζηή). Έλαο ρξήζηεο κπνξεί λα μαλά ελεξγνπνηήζεη ή λα επεθηείλεη ηελ εγθπξφηεηα κηαο ζέζεο εξγαζίαο γηα αθφκα 30 εκέξεο αιιά κφλν φηαλ ε ζέζε εξγαζίαο ιήγεη ζε ιηγφηεξν απφ 5

εκέξεο.

Page 50: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

50

Δηθόλα 11: Ιζηνξία F5: Ο ρξήζηεο ηνπνζεηεί κία ζέζε εξγαζίαο

3.9.1.6 ζηνξία F6: Έλαο ρξήζηεο θάλεη αίηεζε γηα λα πξνσζήζεη ην site

Έλαο ρξήζηεο ρξεηάδεηαη λα θάλεη αίηεζε θαη λα εγθξηζεί γηα λα κπνξέζεη λα πξνσζήζεη θαη λα

ρξεζηκνπνηήζεη ην Jobeet API. Γηα λα θάλεη ηελ αίηεζε, ζα πξέπεη λα δψζεη ηηο παξαθάησ

πιεξνθνξίεο:

Όλνκα

Email

Website URL

Ο ινγαξηαζκφο ζα πξέπεη λα ελεξγνπνηεζεί απφ ηνλ δηαρεηξηζηή (Ιζηνξία B3).

Page 51: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

51

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

γηα λα ρξεζηκνπνηεζεί απφ ηνλ πξνσζεηή.

Page 52: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

52

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):

είηε κε ην λα απηνεμεηάζνπκε κία ππάξρνπζα βάζε δεδνκέλσλ ή δεκηνπξγψληαο ηελ απφ ηελ αξρή.

Page 53: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

53

Καζψο ε βάζε δεδνκέλσλ δελ ππάξρεη αθφκα ζα δεκηνπξγήζνπκε ην αξρείν ηνπ ζρεδίνπ (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: { type: string(255), notnull: true }

logo: { type: string(255) }

url: { 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:

Page 54: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

54

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 αλ ζέινπκε λα απαηηείηαη ε ζηήιε

Page 55: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

55

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

Page 56: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

56

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();

Page 57: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

57

$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:

Page 58: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

58

name: Administrator

# data/fixtures/jobs.yml

JobeetJob:

job_sensio_labs:

JobeetCategory: programming

type: full-time

company: Sensio Labs

logo: sensio-labs.gif

url: 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

Page 59: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

59

company: Extreme Sensio

logo: extreme-sensio.gif

url: 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 ζα βάιεη ηηο πξνεπηιεγκέλεο ηηκέο, ζε φηη είλαη θελφ, ρξεζηκνπνηψληαο ην ζρέδην ηεο

βάζεο δεδνκέλσλ πνπ έρνπλ νξηζηεί πξνεγνπκέλσο.

Page 60: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

60

Σα αξρηθά δεδνκέλα (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:

Page 61: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

61

λνκα ελέξγεηαο Πεξηγξαθή

Index: Δκθαλίδεη ηηο εγγξαθέο ηνπ table

Show: Δκθαλίδεη ηα πεδία θαη ηηο ηηκέο γηα ζπγθεθξηκέλε εγγξαθή

New: Δκθαλίδεη κία θφξκα γηα ηε δεκηνπξγία κηαο λέαο εγγξαθήο

Create: Γεκηνπξγεί κία θαηλνχξηα εγγξαθή

Edit: Δκθαλίδεη κία θφξκα γηα λα γίλεη επεμεξγαζία ζπγθεθξηκέλεο

εγγξαθήο

Update: Δλεκεξψλεη κία εγγξαθή κε βάζε ηηο ηηκέο πνπ έρεη νξίζεη ν ρξήζηεο

Delete: Γηαγξάθεη κία ζπγθεθξηκέλε εγγξαθή απφ ην table

Σψξα κπνξνχκε λα ειέγμνπκε ην job module ζηνλ browser:

http://www.jobeet.com.localhost/frontend_dev.php/job

Page 62: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

62

Δηθόλα 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();

}

Page 63: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

63

5.Η Αξρηηεθηνληθή MVC

Η αρχι τθσ αρχιτεκτονικισ του MVC είναι να διαχωρίςει τον κώδικα ςε τρία layers, ςφμφωνα με τθ φφςθ του. Ο κώδικασ λογικισ δεδομζνων είναι τοποκετθμζνοσ μζςα ςτο model, ο κώδικασ τθσ παρουςίαςθσ μζςα ςτο view, και θ λογικι τθσ εφαρμογισ μζςα ςτον controller. Άλλα επιπρόςκετα ςχεδιαςτικά πρότυπα μποροφν να κάνουν τθν εμπειρία του προγραμματιςμοφ ακόμα ευκολότερθ. Τα επίπεδα model, view και controller μποροφν να υποδιαιρεκοφν περαιτζρω.

Model : Σα δεδνκέλα καο ή αιιηψο ε επηρεηξεζηαθή ινγηθή ηεο εθαξκνγήο καο

View : Σν επίπεδν παξνπζίαζεο, δειαδή ην πψο εκθαλίδνληαη ηα απνηειέζκαηα /

δεδνκέλα Controller: Η δηεπαθή κε ηνλ ρξήζηε θαη νπζηαζηηθά ε ιεηηνπξγηθφηεηα ηεο

εθαξκνγήο

Εικόνα 14 : Η Αξρηηεθηνληθή MVC.

Page 64: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

64

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"

Page 65: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

65

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.

Page 66: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

66

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

Page 67: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

67

#description: symfony project

#keywords: symfony, project

#language: en

#robots: index, follow

stylesheets: [main.css]

javascripts: []

has_layout: true

layout: 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();

} // ...

}

Page 68: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

68

Η κέζνδνο 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>

Page 69: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

69

ηνλ θψδηθα ηνπ πξνηχπνπ, ην θάζε ζηνηρείν επαλαιακβάλεηαη κέζα απφ ηε ιίζηα ησλ

αληηθεηκέλσλ 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>

Page 70: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

70

</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');

Page 71: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

71

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()))

?>

Page 72: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

72

Δάλ ν ηίηινο είλαη πεξίπινθνο γηα λα παξαρζεί, κπνξεί επίζεο λα ρξεζηκνπνηεζεί ν 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 ζε έλα πξφηππν, ρξεζηκνπνηείηαη απηφ. Δάλ φρη, ηφηε ρξεζηκνπνηείηαη ν

πξνθαζνξηζκέλνο ηίηινο.

Page 73: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

73

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 θαζνιηθέο κεηαβιεηέο.

Page 74: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

74

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']

Page 75: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

75

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 είλαη:

Page 76: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

76

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

Page 77: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

77

Σν 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

Page 78: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

78

Δπεμεξγαδφκαζηε ην αξρείν 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+

Page 79: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

79

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

Page 80: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

80

Η δηαδξνκή 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

{

Page 81: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

81

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:

Page 82: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

82

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) ?>

Page 83: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

83

Παξάγεη ηνλ παξαθάησ θώδηθα 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 }

Page 84: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

84

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 }

Page 85: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

85

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 }

Page 86: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

86

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

Page 87: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

87

Δπίζεο κπνξνχκε λα έρνπκε αξθεηέο πιεξνθνξίεο απνζθαικάησζεο γηα κία 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();

}

// ...

}

Page 88: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

88

Μία ελεξγή εξγαζία είλαη απηή πνπ έρεη αλαξηεζεί ζε ιηγφηεξν απφ 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,

Page 89: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

89

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()));

Page 90: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

90

$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';

Page 91: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

91

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);

}

Page 92: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

92

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 κπνξεί πιένλ λα δνθηκαζηεί ζηε κνλάδα.

Page 93: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

93

Αο θαηαλείκνπκε ηηο εξγαζίεο θαηά ηε ζηήιε 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();

}

}

Page 94: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

94

Αιιάδνπκε ηελ 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">

Page 95: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

95

<?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() γηα λα αλαθηήζεη ηεο ελεξγέο εξγαζίεο ζε ζπγθεθξηκέλε θαηεγνξία.

Page 96: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

96

Όηαλ θαινχκε ηελ 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())

Page 97: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

97

->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

Page 98: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

98

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 }

Page 99: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

99

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()

{

Page 100: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

100

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()

{

Page 101: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

101

$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)

{

Page 102: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

102

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 θαη απηφ ζα ην αλαιάβεη γηα εκάο.

Page 103: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

103

# 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();

}

}

Page 104: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

104

Σν ηειεπηαίν βήκα είλαη λα δεκηνπξγήζνπκε ην 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>

Page 105: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

105

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.

Page 106: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

106

Αληηθαζηζηνύκε ηνλ θώδηθα 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();

}

Page 107: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

107

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();}

Page 108: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

108

Σέινο, αο ελεκεξώζνπκε ην 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; ?>

Page 109: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

109

<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(): Δπηζηξέθεη ηνλ αξηζκφ ηεο ηειεπηαίαο ζειίδαο.

Page 110: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

110

Καζψο ην 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 κε έλα ζχλνιν απφ

πξνθαζνξηζκέλεο εηζφδνπο θαη ζηε ζπλέρεηα κε ηε ζχγθξηζε ησλ απνηειεζκάησλ κε ηελ αλακελφκελε έμνδν. Απηή ε ζχγθξηζε θαζνξίδεη ην εάλ ν έιεγρνο πεξλάεη ε απνηπγράλεη.

Page 111: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

111

Γηα λα δηεπθνιύλνπκε ηε ζύγθξηζε, ην 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.');

Page 112: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

112

Για να ηπέξοςμε ηοςρ ελέγσοςρ, μποπούμε να εκηελέζοςμε ηο απσείο:

$ 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‖ ζα καο εηδνπνηήζεη φηη θάπνηνη έιεγρνη δελ πέξαζαλ θαη ζα

πξέπεη λα ηα δηνξζψζνπκε.

Δάλ απνηχρεη έλαο έιεγρνο, ε έμνδνο ζα καο δψζεη θάπνηεο πιεξνθνξίεο γηα ηνλ ιφγν γηα ηνλ νπνίν

απέηπρε.

Page 113: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

113

Όιεο νη κέζνδνη ησλ 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).

Page 114: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

114

Δπεμεξγαδόκαζηε ηελ 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');

Page 115: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

115

Η κέζνδνο 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);

Page 116: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

116

ηε ζπλέρεηα πξνζζέηνπκε έλαλ έιεγρν ζηε κέζνδν getCompanySlug():

$t->comment('->getCompanySlug()');

$job = Doctrine_Core::getTable('JobeetJob')->createQuery()->fetchOne();

$t->is($job->getCompanySlug(), Jobeet::slugify($job->getCompany()), '->getCompanySlug()

return the slug for the company');

Παξαηεξνχκε φηη ειέγρνπκε κφλν ηε κέζνδν 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();

}

Page 117: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

117

$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.

Page 118: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

118

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))->

Page 119: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

119

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')->

Page 120: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

120

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();

Page 121: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

121

Ο θώδηθαο ειέγρεη εάλ ην 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(): Διέγρεη εάλ ε απάληεζε είλαη θαιά ζπγθξνηεκέλε

Page 122: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

122

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;

}

}

Page 123: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

123

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

επηινγέα.

Page 124: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

124

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()

;

Page 125: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

125

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');

Page 126: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

126

$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();

Page 127: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

127

Παξαθάησ, παξνπζηάδεηαη φινο ν θψδηθαο πνπ ρξεηάδεηαη γηα λα ειέγμεη ηελ εξγαζία θαη ηηο

ζειίδεο ησλ θαηεγνξηψλ:

// 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();

}

}

Page 128: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

128

// 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())->

Page 129: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

129

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')->

Page 130: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

130

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, ...)

Page 131: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

131

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().

Page 132: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

132

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()

{

Page 133: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

133

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();

}

Page 134: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

134

Δίλαη θαιύηεξν πάληα λα πξνζζέηνπκε έλαλ θαηλνύξην 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;

}

// ...

Page 135: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

135

}

Έπεηηα ρξεζηκνπνηνύκε ην 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',

));

Page 136: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

136

Γηα θάζε πεδίν, ην symfony παξάγεη απηόκαηα κία εηηθέηα. Απηό κπνξεί λα αιιαρηεί κε κία

επηινγή εηηθέηαο.

Μπνξνχκε επίζεο λα αιιάμνπκε ηηο εηηθέηεο ζε κία δέζκε κε ηε κέζνδν setLabels() ελφο widget

array:

$this->widgetSchema->setLabels(array(

'category_id' => 'Category',

'is_public' => '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" />

Page 137: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

137

Αο πξνζζέζνπκε έλα βνεζεηηθό κήλπκα γηα ην 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',

));

Page 138: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

138

$this->widgetSchema->setLabels(array(

'category_id' => 'Category',

'is_public' => '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') ?>

Page 139: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

139

<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)

{

Page 140: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

140

$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)

Page 141: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

141

{

$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)

{

// ...

Page 142: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

142

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: sfDoctrineRouteCollection

options: { model: JobeetJob, column: token }

requirements: { token: \w+ }

Page 143: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

143

Πιένλ ε δηαδξνκή γηα λα επεμεξγαζηνύκε κία εξγαζία γίλεηαη από ην παξαθάησ 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 ?>

Page 144: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

144

<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>

Page 145: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

145

Γηα λα θάλνπκε ην 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 πξνβάιεη ηηο δηαθνξεηηθέο ελέξγεηεο βαζηδφκελν ζηελ θαηάζηαζε ηεο εξγαζίαο:

Page 146: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

146

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();

Page 147: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

147

$this->getUser()->setFlash('notice', sprintf('Your job is now online for %s days.',

sfConfig::get('app_active_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;

}

Page 148: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

148

Εικόνα 18 :Η τελικθ ςελιδα του Jobeet.

Page 149: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

149

12 πζηήκαηα δηαρείξηζεο Πεξηερνκέλνπ – Drupal

Παξαθάησ παξνπζηάδεηαη κηα ζχληνκε πεξηγξαθή ηνπ ζπζηήκαηνο δηαρείξηζεο πεξηερνκέλνπ

(Drupal), φπνπ ζα ρξεζηκνπνηεζεί ζην πινπνηεκέλν ζχζηεκα. Πην ζπγθεθξηκέλα παξνπζηάδνληαη νη

ηερλνινγίεο, ε κνξθή ησλ αξρείσλ πνπ πεξηιακβάλεη θαη νη δηάθνξνη ελλνηνινγηθνί φξνη πνπ ρξεζηκνπνηεί ην Drupal. Σέηνηνη φξνη είλαη νη nodes, hooks, blocks θαη themes.

12.1 Δηζαγσγή ζην ύζηεκα Γηαρείξηζεο Πεξηερνκέλνπ (Content Management System -

CMS)

Η απηνκαηνπνίεζε ησλ δηαδηθαζηψλ δεκηνπξγίαο ησλ πιεξνθνξηψλ, πνπ απνηεινχλ ην

πεξηερφκελν ηνπ δηαδηθηχνπ, δεκνζίεπζεο ηνπο θαη παξνπζίαζεο ηνπο ζπληζηά ην επφκελν βήκα ζηηο πξνεγνχκελεο απαηηήζεηο. Ο κεγάινο φγθνο ηεο πιεξνθνξίαο ζε ζπλδπαζκφ κε ηελ απαηηνχκελε

ηερληθή γλψζε δελ επέηξεπε ζηνπο νξγαληζκνχο λα επηηχρνπλ ηελ ηζνξξνπία αλάκεζα ζε έλα

εχρξεζην θαη ειθπζηηθφ πεξηβάιινλ παξνπζίαζεο θαη ζε έλα ζπλερψο αλαλεψζηκν πεξηερφκελν, πνπ ζα ηνπο εμαζθάιηδε κία ζηαζεξή βάζε επηζθεςηκφηεηαο ζηε ηζηνζειίδα ηνπο. Όηαλ δε έκπαηλε θαη ν

παξάγνληαο ηνπ ειέγρνπ ηεο ξνήο ηεο πιεξνθνξίαο απφ πνιιαπιά άηνκα, ε θαηάζηαζε γηλφηαλ

αθφκε πην δχζθνιε. Απνηέιεζκα ήηαλ ε δεκηνπξγία κεγάισλ ηζηνρψξσλ κε θαιή ζρεδίαζε, αιιά μεπεξαζκέλν ρξνληθά πεξηερφκελν, ή κε θαθή ζρεδίαζε ρσξίο κεγάια πεξηζψξηα επειημίαο, αιιά κε

ππέξ-αλαλεσκέλν πεξηερφκελν. Η έιιεηςε ηερληθψλ γλψζεσλ απφ ηα ζηειέρε ηνπ νξγαληζκνχ

νδεγνχζε ηηο επηρεηξήζεηο ζε δεκηνπξγία γξαθείσλ ή ζε εθκίζζσζε εηδηθεπκέλσλ εηαηξηψλ γηα ηελ

δηαηήξεζε ησλ ηζηνζειίδσλ ηνπο. Δθηφο απφ ην θαλεξφ θφζηνο ηεο θίλεζεο απηήο, ε ιχζε ηεο δεκηνπξγίαο ελφο εηδηθνχ γξαθείνπ παξνπζίαδε ζεκαληηθά πξνβιήκαηα. Λίγα άηνκα κε ηερληθέο

γλψζεηο επηκεξίδνληαλ ηνλ ηεξάζηην φγθν ησλ πιεξνθνξηψλ ηνπ ηζηνρψξνπ, ελψ επηκεξίδνληαλ

ηαπηφρξνλα θαη φιεο ηηο ιεηηνπξγίεο, απφ ηελ εχξεζε ηνπ πεξηερνκέλνπ, ηελ επεμεξγαζία ηνπ, ηελ δεκνζίεπζε ηνπ θαη ηελ απνζήθεπζε ηνπ γηα κειινληηθή ρξήζε. πλέπεηα ήηαλ λα κελ κπνξεί ην

γξαθείν πνιιέο θνξέο λα δηαρεηξηζηεί ηνλ ηεξάζηην φγθν ησλ πιεξνθνξηψλ, απηέο λα δεκνζηεχνληαη

κε θαζπζηέξεζε θαη λα κελ ππάξρεη πνιπθσλία θαη πινχηνο πεξηερνκέλνπ. Ιδηαίηεξα, αλ ε ηζηνζειίδα ήηαλ κεγάιε, ηφηε πνιιέο θνξέο ην πεξηερφκελν ηεο δηακνηξάδνληαλ ζε πνιιά γξαθεία,

κε απνηέιεζκα λα έρνπκε έλαλ ηζηφρσξν κε έιιεηςε δηαζχλδεζεο θαη πνιιέο θνξέο ρσξίο θακία

ζπλνρή. Σν ηνπίν ινηπφλ ήηαλ γφληκν γηα ηελ δεκηνπξγία ησλ ειεθηξνληθψλ εξγαιείσλ, πνπ ζα

έδηλαλ ιχζε ζην πξφβιεκα ηεο επηηπρεκέλεο ειεθηξνληθήο παξνπζίαο ησλ νξγαληζκψλ ζην δηαδίθηπν. Σα CMS επηηξέπνπλ ζηνπο νξγαληζκνχο λα δεκηνπξγνχλ, αιιά θαη λα εηζάγνπλ έηνηκν

πνιπκεζηθφ πιηθφ. Να πηζηνπνηνχλ ηνπο ρξήζηεο ηνπ ζπζηήκαηνο θαη λα επηκεξίδνπλ μερσξηζηνχο

ξφινπο ζηνλ θαζέλα ζηνλ θχθιν ηεο ιεηηνπξγίαο ηνπο. Δπίζεο, επηηξέπνπλ ηνλ πξνζδηνξηζκφ εξγαζηψλ ξνήο ηνπ πεξηερνκέλνπ, ζπρλά ζε ζπλδπαζκφ κε ηελ ιεηηνπξγία ησλ εηδνπνηήζεσλ

ζπκβάλησλ, πνπ επηηξέπνπλ ζηνπο δηαρεηξηζηέο ηνπ πεξηερνκέλνπ λα εηδνπνηνχληαη γηα νπνηαδήπνηε

αιιαγή. Σα CMS δίλνπλ αθφκε ζηνπο ρξήζηεο ηελ δπλαηφηεηα λα εληνπίδνπλ θαη λα δηαρεηξίδνληαη

πνιιαπιέο εθδφζεηο ελφο κφλν αξρείνπ πεξηερνκέλνπ, λα ην απνζεθεχνπλ ζε κία μερσξηζηή βάζε δεδνκέλσλ, ελψ ηαπηφρξνλα πξνζθέξνπλ ηελ δπλαηφηεηα επξεηεξίνπ, δηεπθνιχλνληαο ηνλ έιεγρν θαη

ηελ επαλαθνξά παιαηφηεξνπ πιηθνχ ηεο ηζηνζειίδαο. Σν βαζηθφηεξν, φκσο, ραξαθηεξηζηηθφ πνπ

πξνζθέξνπλ είλαη ε δπλαηφηεηα δηαρσξηζκνχ ηνπ πεξηερνκέλνπ απφ ηελ παξνπζίαζε ηεο ηζηνζειίδαο.

Page 150: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

150

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 βαζηζκέλα ζε πιαίζηα αλνηρηνχ θψδηθα.

Page 151: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

151

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, ησλ

Page 152: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

152

νπνίσλ ν θψδηθαο πξνγξακκαηηζκνχ δηαηίζεηαη δσξεάλ ζην δηαδίθηπν, έρνπλ ζεσξεηηθά άπεηξεο δπλαηφηεηεο βειηίσζεο, ζε ζρέζε κε ηα εκπνξηθά (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 (εηθνληθόηεηα) ηνπ πεξηερνκέλνπ:

Έλα χζηεκα δηαρείξηζεο Πεξηερνκέλνπ κπνξεί λα απνηειέζεη ην κέζν πνπ λα επηηξέπεη ζε θάζε ρξήζηε λα εξγάδεηαη κέζα ζε έλα εηθνληθφ αληίγξαθν κηαο πιήξνπο ηζηνζειίδαο, ζχλνια εγγξάθσλ

θαη/ή κηαο βάζεο θψδηθα. Απηφ επηηξέπεη ζηηο αιιαγέο ζε πνιινχο αιιεινεμαξηψκελνπο πφξνπο λα

είλαη εκθαλείο θαη/ή λα εθηεινχληαη ζε πιαίζην πξηλ ηελ ππνβνιή ηνπο.

Page 153: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

153

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 γηα ηελ απνζήθεπζε ηνπ πεξηερνκέλνπ θαη ησλ ξπζκίζεψλ ηνπ.

Page 154: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

154

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. Μπνξείηε επίζεο λα βξείηε βνήζεηα γηα ην

Page 155: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

155

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 δελ είλαη

ππνρξεσκέλνη λα αζρνιεζνχλ κε ηελ παξνρή μερσξηζηψλ δηθαησκάησλ ζε θάζε ρξήζηε. Αληηζέησο,

αλαζέηνπλ δηθαηψκαηα ζε ξφινπο θαη ζηε ζπλέρεηα αλαζέηνπλ ηνπο ξφινπο απηνχο ζε νκάδεο ρξεζηψλ.

Page 156: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

156

Αλαδήηεζε: Υξεζηκνπνηψληαο ηε κνλάδα αλαδήηεζεο ηνπ 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

ζπδεηήζεσλ γηα ηε δεκηνπξγία δσληαλψλ, δπλακηθψλ δηαδηθηπαθψλ ρψξσλ.

Page 157: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

157

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 ηεο

Page 158: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

158

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 θαη δειψλνπκε πνιινχο δηαθνξεηηθνχο εηθνληθνχο

δηαθνκηζηέο.

Page 159: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

159

<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.

Page 160: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

160

Μεηά ηελ νινθιήξσζε ηεο δηαδηθαζίαο ην απνζπκπηέζακε κέζα ζην root ηνπ server καο . Έηζη είρακε

απηά ηα αξρεία:

Δηθόλα 20: Σα αξρεία ηνπ Drupal .

Παξαθάησ δίλνληαη θάπνηεο πιεξνθνξίεο ζρεηηθά κε ηνπο πην ζεκαληηθνχο θαθέινπο θαη αξρεία:

ΦΑΚΔΛΟΙ ΠΔΡΙΓΡΑΦΗ

Includes: Πεξηέρεη βηβιηνζήθεο ζπλαξηήζεσλ ηνπ

Drupal.

Modules: Πεξηέρεη ηα modules ηνπ ππξήλα, ελψ ηα

επηπιένλ modules πνπ ζα πξνζηεζνχλ πξέπεη λα κπνπλ θάησ απφ ην θάθειν

sites/all/modules.

Themes: Themes πεξηέρεη ηα default 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 ζα αιιάμεη ζχκθσλα κε ηηο

πιεξνθνξίεο πνπ ζα δψζνπκε θαηά ηελ

εγθαηάζηαζε θαη ζα ηηο θαηαγξάςεη ζην

Page 161: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

161

setting.php.

ΑΡΥΔΙΟ ΠΔΡΙΓΡΑΦΗ

cron.php: Σν cron.php ρξεζηκνπνηείηαη γηα ηελ

εθηέιεζε πεξηνδηθψλ εξγαζηψλ, ηεο

μεθαζάξηζκα πηλάθσλ ηεο βάζεο δεδνκέλσλ θαη ζπιινγή ζηαηηζηηθψλ.

Index.php: Σν index.php είλαη ην θχξην ζεκείν φισλ

ησλ αηηήζεσλ εμππεξέηεζεο.

install.php: Σν install.php είλαη ην θχξην αξρείν γηα ηελ

εγθαηάζηαζε ηνπ Drupal.

Update.php: Σν update.php αλαλεψλεη ην ζρήκα ηεο

βάζεο κεηά απφ κηα αλαβάζκηζε ηεο έθδνζεο ηνπ Drupal.

Έπεηηα θηηάμακε ηελ βάζε δεδνκέλσλ καο. Πήγακε ζηνλ browser θαη γξάςακε

http://localhost/phpmyadmin (κε wamp είλαη 100% απηφ). Μαο δήηεζε θσδηθφ,δψζακε ηα ζηνηρεία καο θαη παηήζακε εθηέιεζε.

Γπξίζακε πάιη ζην localhost /drupal πνπ έρνπκε ηα αξρεία καο. Δίδακε απηφ:

Δηθόλα 21: Σν localhost/drupal ηνπ Drupal .

Page 162: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

162

Γηαιέγνπκε ην 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.

Page 163: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

163

Δηθόλα 23: Γίλεηε εγθαηάζηαζε ηνπ Drupal.

Μεηά απφ απηφ ην ζηάδην πξέπεη λα νξίζνπκε θάπνηεο ξπζκίζεηο ηεο ηζηνζειίδαο καο. ηελ

ζπλέρεηα εηζάγνπκε θάπνηα ζηνηρεία φζνλ αθνξά ηνλ ινγαξηαζκφ ηνλ δηαρεηξηζηή ηεο ηζηνζειίδαο ην

username, ηελ δηεχζπλζε ειεθηξνληθνχ ηαρπδξνκείνπ θαη ηνλ θσδηθφ πξφζβαζεο

Δηθόλα 24: Η δηαρεηξηζηή ηεο ηζηνζειίδαο ηνπ Drupal.

Page 164: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

164

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

Page 165: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

165

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 (ζέκα) ηεο

πξνηίκεζεο καο.

Page 166: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

166

ε απηήλ ηελ θαηεγνξία 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: απφ εδψ κπνξνχκε λα δνχκε ηελ ιίζηα κε ηνπο ρξήζηεο καο θαη λα πξνζζέζνπκε

θάπνηνπο ή λα επεμεξγαζηνχκε ηνπο ήδε ππάξρνληεο.

Page 167: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

167

Τπάξρεη θαη κηα ππνθαηεγνξία πνπ ιέγεηαη 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 Οη Μνλάδεο

Οη κνλάδεο πνπ ρξεζηκνπνηήζεθαλ θαζψο θαη ε πεξηγξαθή ηεο ιεηηνπξγηθφηεηαο ηνπο εκθαλίδνληαη παξαθάησ:

Page 168: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

168

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: Οξίδεη έλα ηχπν πεδίνπ γηα ηελ αλαθνξά ελφο

Page 169: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

169

θφκβνπ απφ έλαλ άιιν.

Node reference views:

Γείρλεη πεδία nodereference

ρξεζηκνπνηψληαο έλα view.

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: Σεζη

Page 170: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

170

ελφηεηαο γηα πξνβνιέο.

Views UI: Γηνηθεηηθή δηαζχλδεζε ζηηο απφςεηο. Υσξίο

απηφ ην module δελ ζα κπνξνχζακε λα

δεκηνπξγήζνπκε ή λα επεμεξγαζηνχκε ηηο

απφςεηο καο.

Άιιεο κνλάδεο:

Blog : Δπηηξέπεη ηελ εχθνιε θαη ηαθηηθή

ελεκέξσζε ηζηνζειίδσλ ή ησλ ηζηνινγηψλ

ησλ ρξεζηψλ.

Blog API :

Δπηηξέπεη ζηνπο ρξήζηεο λα ππνβάιινπλ χιε

ρξεζηκνπνηψληαο εθαξκνγέο πνπ

ππνζηεξίδνπλ API ηζηνινγηψλ XML-RPC.

Book : Δπηηξέπεη ζηνπο ρξήζηεο λα δνκνχλ ηηο

ηζηνζειίδεο ηεξαξρηθά ή πεξηιεπηηθά.

Contact :

Δπηηξέπεη λα ρξεζηκνπνηνχληαη θφξκεο επηθνηλσλίαο, πξνζσπηθέο ή θεληξηθέο, γηα

νιφθιεξν ηνλ ηζηφηνπν.

Menu : Δπηηξέπεη ζηνπο δηαρεηξηζηέο λα

πξνζαξκφδνπλ ην κελνχ πινήγεζεο ηνπ ηζηφηνπνπ

Update status :

Διέγρεη ηελ θαηάζηαζε ιεηηνπξγίαο γηα

δηαζέζηκεο αλαβαζκίζεηο ηνπ Drupal θαη ησλ εγθαηεζηεκέλσλ κνλάδσλ θαη ζεκαηηθψλ

παξαιιαγψλ.

15 .Σν δηαρεηξηζηηθό πεξηβάιινλ ηνπ Drupal:

Γεκηνπξγία θφκβνπ ηχπνπ χιεο Page:

Δηθόλα 26 : Γεκηνπξγία θόκβνπ ηύπνπ ύιεο Page.

Page 171: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

171

Παξφιν, πνπ φπσο είπακε, κε ην 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.

Page 172: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

172

'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)

Page 173: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

173

Με ηελ επηινγή configure δίπια ζην θάζε ζέκα, κπνξνχκε λα κεηαβάιινπκε θάπνηα

ραξαθηεξηζηηθά φπσο ην ρξψκα, ηηο default εηθφλεο θαη logos, θαζψο θαη λα θαζνξίζνπκε πνηα

ζηνηρεία ηεο ηζηνζειίδαο (πρ primary links menu) ζα είλαη νξαηά θιπ.

ην drupal 6 ε ζεκαηηθή παξαιιαγή πεξηέρεη ηα αθφινπζα αξρεία:

λνκα.info : Έλα απαξαίηεην αξρείν πνπ είλαη λέν ζην Drupal 6, ην νπνίν παξέρεη πιεξνθνξίεο ζρεηηθά κε ηε ζεκαηηθή παξαιιαγή.

Page.tpl.php Σν θχξην πξφηππν πνπ θαζνξίδεη ην πεξηερφκελν ζην κεγαιχηεξν

κέξνο ηεο ζειίδαο.

Page.tpl.php,style: To CSS αξρείν πνπ νξίδεη θαλφλεο CSS γηα ην πξφηππν.

Node.tpl.php : Σν αξρείν απηφ θαζνξίδεη ην πεξηερφκελν ησλ θφκβσλ.

Page.tpl.php :. Πξνζδηνξίδεη ην πεξηερφκελν ηνπ κπινθ

Comment.tpl.php : Πξνζδηνξίδεη ην πεξηερφκελν ησλ ζρνιίσλ.

Logo.png : Tν ινγφηππφ ζαο, αλ ρξεζηκνπνηείηε έλα.

Screenshot.png

Απηή είλαη κηα εηθφλα κε ην ζέκα ζαο πνπ ρξεζηκνπνηείηαη ζην admin panel θαη ζηηο ξπζκίζεηο ηνπ ινγαξηαζκνχ ρξήζηε, αλ έρεηε

ελεξγνπνηήζεη πεξηζζφηεξνπο απφ έλαλ ζέκα έηζη ψζηε νη επηζθέπηεο

κπνξνχλ λα επηιέμνπλ πνην ζέκα ζέινπλ λα ρξεζηκνπνηήζνπλ.

Page 174: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

174

λα απαξαίηεην αξρείν πνπ είλαη λέν ζην 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 ?>

Page 175: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

175

<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 ?>

Page 176: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

176

</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>

Page 177: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

177

Πξνζδηνξίδεη ην πεξηερόκελν ησλ ζρνιίσλ. comment.tpl.php εηλαη:

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 είλαη νη εηδηθά νλνκαζκέλεο ιεηηνπξγίεο πνπ επηηξέπνπλ ζηελ ελφηεηα καο γηα λα

<?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 ($new != '') { ?><span 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>

Page 178: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

178

αιιειεπηδξά κε ηνλ ππξήλα 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, είλαη έλα function πνπ

κπνξνχκε λα πξνζζέζνπκε ζην

settings.php γηα λα κεηαβάιινπκε ηα εηζεξρφκελα αηηήκαηα έηζη ψζηε λα

δείμνπλ ζην path ηνπ Drupal. Απηφ ην

function θαιείηαη πξηλ θνξησζνχλ ηα modules θαη ην ζχζηεκα ηνπ κελνχ

αξρηθνπνηείηαη θαη αιιάδεη.

custom_url_rewrite_outbound: Γελ είλαη hook, είλαη κία function πνπ κπνξνχκε λα πξνζζέζνπκε ζην

settings.php γηα λα κεηαβάιινπκε φινπο

ηνπο ζπλδέζκνπο πνπ έρνπλ παξαρζεί απφ ην Drupal. Απηφ ην function θαιείηαη απφ

ην url().

hook_access: Οξίδεη ηνπο πεξηνξηζκνχο ζηελ πξφζβαζε.

hook_actions_delete: Δθηειεί θψδηθά κεηά απφ ηε δηαγξαθή

ελφο action.

hook_action_info: Γειψλεη πιεξνθνξίεο ζρεηηθά κε ηα

actions.

hook_action_info_alter: Σξνπνπνηεί ηα actions πνπ δειψζεθαλ απφ

έλα άιιν module.

hook_block: Γειψλεη έλα κπινθ ή έλα ζχλνιν απφ

κπινθ.

hook_boot: Δθηειεί εξγαζίεο εγθαηάζηαζεο.

hook_comment: Αληαπνθξίλεηαη ζηηο ελέξγεηεο ησλ ρνιίσλ.

Page 179: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

179

hook_cron: Δθηειεί πεξηνδηθέο ελέξγεηεο.

hook_db_rewrite_sql: Δπαλαγξάθεη εξσηήκαηα ηεο βάζεο

δεδνκέλσλ. πλήζσο γηα έιεγρν ηεο πξφζβαζεο.

hook_delete: Αληαπνθξίλεηαη ζηε δηαγξαθή θφκβνπ.

hook_disable: Δθηειεί ηηο απαξαίηεηεο ελέξγεηεο πξηλ

απελεξγνπνηεζεί ην module.

hook_elements: Δπηηξέπεη ηα modules λα δειψζνπλ ηηο

δηθνχο ηνπο ηχπνπο ησλ ζηνηρείσλ ησλ

Forms API θαη λα θαζνξίζνπλ ηηο πξνθαζνξηζκέλεο ηηκέο.

Hook_enable: Γηελεξγεί ηηο απαξαίηεηεο ελέξγεηεο κεηά απφ ηελ ελεξγνπνίεζε ηνπ module.

hook_exit: Γηελεξγεί δηεξγαζίεο θαζαξηζκνχ.

hook_file_download: Διέγρεη ηελ πξφζβαζε ζηε ιήςε

ηδησηηθψλ αξρείσλ θαη θαζνξίδεη ηηο HTTP θεθαιίδεο.

hook_filter: Οξίδεη ηα θίιηξα πεξηερνκέλνπ.

hook_filter_tips: Παξέρεη ζπκβνπιέο γηα ηε ρξήζηε ησλ θίιηξσλ.

hook_flush_caches: Πξνζζέηεη κία ιίζηα απφ πίλαθεο πνπ βξίζθνληαη ζηε κλήκε cache γηα λα

εθθαζαξηζηνχλ.

hook_footer: Δηζάγεη ην θιείζηκν ζε HTML.

hook_form: Πξνβάιεη κία θφξκα επεμεξγαζίαο ελφο

θφκβνπ.

hook_forms: Καζνξίδεη ηηο form_ids ζηηο builder

functions.

hook_form_alter:

Δθηειεί ηξνπνπνηήζεηο πξηλ ε θφξκα

θαηαζηεί.

hook_form_FORM_ID_alter:

Παξέρεη κία ζπγθεθξηκέλε ηξνπνπνίεζε

ηεο θφξκαο αληί γηα ην globalhook_form_alter().

hook_help:

Παξέρεη βνήζεηα ζην ρξήζηε ζε απεπζείαο

ζχλδεζε.

hook_hook_info:

Δθζέηεη κία ιίζηα απφ γεγνλφηα ζηα νπνία

νη ρξήζηεο κπνξνχλ λα αλαζέζνπλ ελέξγεηεο.

hook_init: Δθηειεί εξγαζίεο εγθαηάζηαζεο.

hook_insert: Αληαπνθξίλεηαη ζηελ εηζαγσγή θφκβνπ.

Page 180: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

180

hook_install:

Δγθαζηζηά ηελ ηξέρνπζα έθδνζε ηνπ ζρήκαηνο ηεο βάζεο δεδνκέλσλ, θαη φηη

άιιεο δηεξγαζίεο εγθαηάζηαζεο ππάξρνπλ.

hook_link: Οξίδεη ηνπο εζσηεξηθνχο ζπλδέζκνπο ηνπ

Drupal.

hook_link_alter:

Γηελεξγεί ηξνπνπνηήζεηο πξηλ λα

παξαζρεζνχλ νη ζχλδεζκνη ζε έλαλ θφκβν

ή ηα ζρφιηα.

hook_load: Φνξηψλεη πιεξνθνξίεο ζπγθεθξηκέλσλ

ηχπσλ θφκβσλ.

hook_locale:

Δπηηξέπεη ζηα modules λα νξίζνπλ ηηο

δηθέο ηνπο νκάδεο θεηκέλνπ φπνπ κπνξνχλ

λα κεηαθξαζηνχλ.

hook_mail:

Πξνεηνηκάδεη έλα κήλπκα βαζηζκέλν ζε

παξακέηξνπο, ην νπνίν θαιείηαη απφ ην drupal_mail().

hook_mail_alter: Σξνπνπνηεί νπνηαδήπνηε φςε ησλ email

πνπ απνζηέιινληαη απφ ην Drupal.

hook_menu: Οξίδεη ηα αληηθείκελα ησλ κελνχ θαη ηηο

επαλαθιήζεηο ησλ ζειίδσλ.

hook_menu_alter:

Σξνπνπνηεί ηα δεδνκέλα πνπ έρνπλ

απνζεθεπηεί ζηνλ πίλαθα {menu_router} αθνπ επηθαιεζζεί ην after hook_menu.

hook_menu_link_alter:

Σξνπνπνηεί ηα δεδνκέλα πνπ έρνπλ

απνζεθεπηεί ζηνλ πίλαθα {menu_links}

απφ ην menu_link_save().

hook_nodeapi: Δλεξγεί ζηνπο θφκβνπο πνπ έρνπλ νξηζηεί

απφ άιια modules.

hook_node_access_records: Θέηεη ηηο άδεηεο πνπ ζα γξαθηνχλ ζηελ

βάζε δεδνκέλσλ γηα έλαλ θφκβν.

hook_node_grants: Δλεκεξψλεη ην ζχζηεκα πξφζβαζεο ηνπ

θφκβνπ γηα ην ηη άδεηεο έρεη έλαο ρξήζηεο.

hook_node_info: Οξίδεη ηνπο ηχπνπο θφκβνπ πνπ

παξέρνληαη απφ module.

hook_node_operations: Πξνζζέηεη καδηθέο ιεηηνπξγίεο θφκβνπ.

hook_node_type: Δλεξγεί ζηηο αιιαγέο ηνπ ηχπνπ θφκβνπ.

hook_openid: Δπηηξέπεη ζηα modules λα ηξνπνπνηήζνπλ ηηο παξακέηξνπο ησλ αηηεκάησλ OpenID.

hook_perm: Οξίδεη ηηο άδεηεο ηνπ ρξήζηε.

Page 181: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

181

hook_ping: Δθηειεί ηε ιεηηνπξγία ping ζε έλαλ άιιν δηαθνκηζηή.

hook_prepare:

Απηφ είλαη έλα hook ην νπνίν ρξεζηκνπνηείηαη απφ modules θφκβσλ.

Καιείηαη κεηά ηε θφξησζε αιιά πξηλ ηελ

εκθάληζε ηνπ θφκβνπ ζηε θφξκα πξνζζήθεο/επεμεξγαζίαο.

hook_preprocess: Πξνεπεμεξγάδεηαη ηηο κεηαβιεηέο ηνπ

ζέκαηνο γηα ηα αξρεία πξνηχπσλ.

hook_preprocess_HOOK:

Πξνεπεμεξγάδεηαη ηηο κεηαβιεηέο ηνπ

ζέκαηνο γηα έλα ζπγθεθξηκέλν hook ζέκαηνο.

hook_profile_alter: Σξνπνπνηεί ηα αληηθείκελα πξνθίι πξηλ

απηά απνδνζνχλ.

hook_requirements: Διέγρεη ηηο απαηηήζεηο ηηο εγθαηάζηαζεο

θαη θάλεη αλαθνξά θαηάζηαζεο.

hook_schema: Οξίδεη ηελ ηξέρνπζα έθδνζε ηνπ ζρήκαηνο

ηεο βάζεο δεδνκέλσλ.

hook_schema_alter: Γηελεξγεί ηξνπνπνηήζεηο ζε πθηζηάκελα

ζρήκαηα βάζεο δεδνκέλσλ.

hook_search: Οξίδεη κία πξνζαξκνζκέλε ξνπηίλα

αλαδήηεζεο.

hook_search_page: Παξαθάκπηεη ηελ απφδνζε ησλ

απνηειεζκάησλ αλαδήηεζεο.

hook_search_preprocess: Πξνεπεμεξγάδεηαη θείκελν γηα ην

επξεηήξην αλαδήηεζεο.

hook_system_info_alter:

Σξνπνπνηεί ηελ πιεξνθνξία πνπ

αλαιχζεθε απφ ηα αξρεία πιεξνθνξίαο

ηνπ module θαη ηνπ ζέκαηνο.

hook_taxonomy: Δλεξγεί ζηηο αιιαγέο ηαμηλφκεζεο.

hook_term_path:

Δπηηξέπεη ζηα modules λα παξέρνπλ έλα ελαιιαθηηθφ path γηα ηνπο φξνπο ηνπο

νπνίνπο δηαρεηξίδεηαη.

hook_theme: Καηαρσξεί ηηο εθηειέζεηο ηνπ ζέκαηνο

ελφο module ή ελφο ζέκαηνο.

hook_theme_registry_alter:

Σξνπνπνηεί ηηο πιεξνθνξίεο ηνπ κεηξψνπ

ηνπ ζέκαηνο πνπ επηζηξάθεθαλ απφ ην

hook_theme().

hook_translated_menu_link_alter: Σξνπνπνηεί έλαλ ζχλδεζκν κελνχ αθνχ

κεηαθξαζηεί θαη πξηλ απνδνζεί.

hook_translation_link_alter: Γηελεξγεί ηξνπνπνηήζεηο ζε ζπλδέζκνπο

κεηάθξαζεο.

Page 182: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

182

hook_uninstall: Αθαηξεί νπνηαδήπνηε πιεξνθνξία ζέηεη ην module.

hook_update: Αληαπνθξίλεηαη ζηελ ελεκέξσζε ηνπ θφκβνπ.

hook_update_index: Δλεκεξψλεη ην επξεηήξην ηνπ πιήξνπο θεηκέλνπ ηνπ Drupal γη απηφ ην module.

hook_update_last_removed:

Δπηζηξέθεη έλαλ αξηζκφ ν νπνίνο δελ είλαη

πιένλ δηαζέζηκνο, φπσο ην hook_update_N().

hook_update_N: Γηελεξγεί κία κφλν ελεκέξσζε.

hook_update_projects_alter: Σξνπνπνηεί ηε ιίζηα ησλ project πξηλ

πάξεη δεδνκέλα θαη ζπγθξίλεη ηηο εθδφζεηο.

hook_update_status_alter: Σξνπνπνηεί ηηο πιεξνθνξίεο γηα ηηο

δηαζέζηκεο ελεκεξψζεηο γηα ηα projects.

hook_user: Δλεξγεί ζηηο ελέξγεηεο ηνπ ινγαξηαζκνχ

ρξήζηε.

hook_user_operations: Πξνζζέηεη καδηθέο ιεηηνπξγίεο ηνπ

ρξήζηε.

hook_validate: Δπαιεζεχεη ηε θφξκα επεμεξγαζίαο ελφο

θφκβνπ.

hook_view: Πξνβάιεη έλαλ θφκβν.

hook_watchdog: Καηαγξάθεη έλα κήλπκα ζπκβάληνο.

hook_xmlrpc: Δγγξάθεη επαλαθιήζεηο XML-RPC.

module_hook: Καζνξίδεη ην εάλ θάπνην module

εθαξκφδεη έλα hook.

module_implements: Καζνξίδεη ην πνηα modules εθαξκφδνπλ

έλα hook.

module_invoke: Δπηθαιείηαη έλα hook ζε ζπγθεθξηκέλν module.

module_invoke_all:

Δπηθαιείηαη έλα hook ζε φια ηα ελεξγνπνηεκέλα modules πνπ ην

εθαξκφδνπλ.

page_cache_fastpath: Δμάγεη κία απνζεθεπκέλε ζειίδα.

Page 183: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

183

Ο θώδηθαο πνπ έρεη κέζα έλα 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; }

}

Page 184: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

184

/**

* 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"; }

}

//...

}

Page 185: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

185

/**

* 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),

Page 186: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

186

'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)); }

Page 187: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

187

/**

* 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;

} }

}

}

Page 188: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

188

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))));

}

}

Page 189: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

189

//…

}

* 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 γηα λα παξάγεη ην απνηέιεζκα, αλ βέβαηα ν ρξήζηεο έρεη ηα απαξαίηεηα δηθαηψκαηα. Σν απνηέιεζκα απηφ

Page 190: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

190

(πεξηερφκελν ρσξίο κνξθνπνίεζε) πεξλάεη ζηελ 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();

Page 191: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

191

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: Δπηζηξέθεη θείκελν απφ κία ηηκή Binary

Large OBject.

db_distinct_field:

Πξνζζέηεη ηελ ζεκαία (flag) DISTINCT ζην παξερφκελν εξψηεκα θαη επηζηξέθεη ην

ηξνπνπνηεκέλν εξψηεκα.

db_encode_blob: Δπηζηξέθεη κηα ζσζηά δηακνξθσκέλε ηηκή Binary Large OBject.

db_error: Πξνζδηνξίδεη ην εάλ ην πξνεγνχκελν

εξψηεκα δεκηνχξγεζε ζθάικα.

db_escape_string: Πξνεηνηκάδεη ηε ρξήζε εηζαγσγήο απφ ηνλ ρξήζηε ζε κία βάζε δεδνκέλσλ, απνηξέπεη

Page 192: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

192

επηζέζεηο ηχπνπ SQL injection.

db_escape_table:

Πεξηνξίδεη έλα δπλακηθφ πίλαθα, ζηήιε, ή

πεξηνξηζκέλν φλνκα, ζε αζθαιή

ραξαθηήξεο.

db_fetch_array: Πξνζθνκίδεη κία ζεηξά απφ απνηειέζκαηα απφ πξνεγνχκελν εξψηεκα ζαλ ζπζηνηρία.

db_fetch_object: Πξνζθνκίδεη κία ζεηξά απφ απνηειέζκαηα

απφ πξνεγνχκελν εξψηεκα ζαλ αληηθείκελν.

db_is_active:

Δπηζηξέθεη κία ηηκή boolean ε νπνία

εμαξηάηαη απφ ηελ δηαζεζηκφηεηα ηεο βάζεο

δεδνκέλσλ.

db_last_insert_id: Δπηζηξέθεη ην ηειεπηαίν αλαγλσξηζηηθφ πνπ εηζήρζε.

db_lock_table: Κιεηδψλεη έλαλ πίλαθα.

db_placeholders: Παξάγεη δείθηεο γηα έλα array απφ arguments εξσηεκάησλ ελφο κφλν ηχπνπ.

db_prefix_tables: Δπηζπλάπηεη έλα πξφζεκα βάζεο δεδνκέλσλ

κέζσ εξσηήκαηνο ζε φινπο ηνπο πίλαθεο.

db_query: Δθηειεί έλα βαζηθφ εξψηεκα ζηε βάζε

δεδνκέλσλ. active database.

db_query_range: Δθηειεί έλα εξψηεκα πεξηνξηζκέλνπ εχξνπο

ζηελ ελεξγή βάζε δεδνκέλσλ.

db_query_temporary:

Δθηειεί έλα εξψηεκα SELECT θαη

απνζεθεχεη ηα απνηειέζκαηά ηνπ ζε έλαλ

πξνζσξηλφ πίλαθα.

db_result: Δπηζηξέθεη έλα αηνκηθφ πεδίν

απνηειεζκάησλ απφ πξνεγνχκελν εξψηεκα.

db_rewrite_sql: Δπαλαγξάθεη εξσηήκαηα θφκβνπ, ηαμηλφκεζεο θαη ζρνιίσλ.

db_set_active: Δλεξγνπνηεί κία βάζε δεδνκέλσλ γηα

κειινληηθά εξσηήκαηα.

db_status_report: Αλαθέξεη ηελ θαηάζηαζε ηεο βάζεο δεδνκέλσλ.

db_table_exists: Διέγρεη εάλ ππάξρεη ν πίλαθαο.

db_unlock_tables: Ξεθιεηδψλεη φινπο ηνπο θιεηδσκέλνπο πίλαθεο.

db_version: Δπηζηξέθεη ηελ έθδνζε ηνπ δηαθνκηζηή ηεο

βάζεο δεδνκέλσλ ε νπνία ρξεζηκνπνηείηαη.

pager_query: Δθηειεί έλα ζειηδνπνηεκέλν εξψηεκα βάζεο δεδνκέλσλ.

tablesort_sql: Γεκηνπξγεί κία SQL ξήηξα ηνπ είδνπο.

update_sql: Δθηειεί έλα εξψηεκα SQL θαη επηζηξέθεη ην εάλ ήηαλ επηηπρήο ή φρη.

_db_error_page: Βνεζεηηθφ function ην νπνίν δείρλεη κνηξαία

ζθάικαηα ηεο βάζεο δεδνκέλσλ.

_db_query: Βνεζεηηθφ function γηα ην db_query().

_db_query_callback: Βνεζεηηθφ function γηα ην db_query().

_db_rewrite_sql: Βνεζεηηθφ function γηα ην db_rewrite_sql.

Page 193: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

193

ηαζεξέο

λνκα Πεξηγξαθή

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)

θαη ζπκπιεξψλνπκε θάπνηα πεδία ηνπ ζπγθεθξηκέλνπ ηχπνπ πεξηερνκέλνπ φπσο ηνλ ηίηιν, ην θπξίσο ζψκα, αλ επηηξέπνληαη ηα ζρφιηα, ηνλ ζπγγξαθέα θαη αλ ζα δεκνζηνπνηεζεί ή αλ ζα βξίζθεηαη ζηελ

αξρηθή ζειίδα.

Page 194: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

194

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 θαη απηφ

Page 195: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

195

αληηθαηνπηξίδεηαη θαη ζηελ ηαμηλφκεζε, θαζψο κπνξνχλ πνιχ εχθνια λα πξνζηεζνχλ λένη φξνη ζε θάζε θαηεγνξία. Δπίζεο πνιχ εχθνια κπνξνχλ λα πξνζηεζνχλ θαη νιφθιεξεο ηαμηλνκήζεηο

(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).

Page 196: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

196

Μπνξνχκε αιιάδνληαο ηελ 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, φρη.

Page 197: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

197

Λεηηνπξγίεο θαη Μέζνδνη

Όλνκα Πεξηγξαθή

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.

Page 198: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

198

menu_navigation_links: Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα έλα κελνχ

πινήγεζεο.

menu_path_is_external: Δπηζηξέθεη TRUE εάλ ν ζχλδεζκνο είλαη εμσηεξηθφο.

menu_primary_links: Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα λα θαζηζηνχλ σο Πξσηεχνληεο ζχλδεζκνη.

menu_primary_local_tasks: Δπηζηξέθεη ηηο ηνπηθέο δηεξγαζίεο πνπ έρνπλ απνδνζεί

ζην θνξπθαίν επίπεδν.

menu_rebuild:

(Δπαλα) ζπκπιεξψλεη ηνπο πίλαθεο ηεο βάζεο δεδνκέλσλ νη νπνίνη ρξεζηκνπνηνχληαη απφ δηάθνξα

functions ηνπ κελνχ.

menu_router_build: πιιέγεη θαη κεηαβάιιεη ηνπο νξηζκνχο ηνπ κελνχ.

menu_secondary_links: Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα λα θαζηζηνχλ σο Γεπηεξεχνληεο ζχλδεζκνη.

menu_secondary_local_tasks: Δπηζηξέθεη ηηο ηνπηθέο δηεξγαζίεο πνπ έρνπλ απνδνζεί

ζην δεχηεξν επίπεδν.

menu_secondary_menu: Δπηζηξέθεη έλα array απφ ζπλδέζκνπο γηα λα απνδνζνχλ σο δεπηεξεχνληεο ζχλδεζκνη.

menu_set_active_item: Θέηεη ην ελεξγφ path, ην νπνίν νξίδεη ην πνηα ζειίδα ζα

θνξηψζεη.

menu_set_active_menu_name: Θέηεη (ή παίξλεη) ην ελεξγφ κελνχ γηα ηελ ηξέρνπζα ζειίδα – νξίδεη ην ελεξγφ ίρλνο.

menu_set_active_trail: Θέηεη ην ελεξγφ ίρλνο ηεο ηξέρνπζαο ζειίδαο.

menu_set_item: Αληηθαζηζηά ην ζηνηρείν πνπ έρεη απνζεθεπηεί ζηαηηθά

γηα έλα ζπγθεθξηκέλν path.

menu_tab_root_path:

Δπηζηξέθεη ην path ηνπ δξνκνινγεηή, ή ην path ηεο

θαξηέιαο γνλέα κίαο πξνεπηιεγκέλεο ηνπηθήο

εξγαζίαο.

menu_tail_to_arg: Δπηζηξέθεη ην path ζαλ έλα string απφ ην argument πνπ βξηζθφκαζηε.

menu_tree: Απνδίδεη έλα δέληξν κελνχ ην νπνίν βαζίδεηαη ζην

ηξέρνλ path.

menu_tree_all_data: Παίξλεη ηε δνκή δεδνκέλσλ ε νπνία παξνπζηάδεη έλα νλνκαζκέλν δέληξν κελνχ.

menu_tree_check_access: Διέγρεη ηελ πξφζβαζε θαη δηελεξγεί άιιεο δπλακηθέο

ιεηηνπξγίεο γηα θάζε ζχλδεζκν ζην δέληξν.

menu_tree_collect_node_links: Αλαδξνκηθή βνεζεηηθή function – ζπιιέγεη ζπλδέζκνπο θφκβσλ.

menu_tree_data: Γεκηνπξγεί ηα δεδνκέλα πνπ παξνπζηάδνπλ έλα δέληξν

κελνχ.

menu_tree_output: Δπηζηξέθεη έλα απνδνζκέλν δέληξν κελνχ.

menu_tree_page_data:

Παίξλεη ηε δνκή δεδνκέλσλ πνπ παξνπζηάδεη έλα

νλνκαζκέλν δέληξν κελνχ, βαζηζκέλν ζηελ ηξέρνπζα

ζειίδα.

menu_unserialize: Απνζεηξηνπνηεί δεδνκέλα κελνχ, θάλνληαο ρξήζε ελφο ράξηε γηα λα αληηθαηαζηήζεη ηα ζηνηρεία ηνπ path.

menu_valid_path: Δπηθπξψλεη ην path ελφο ζπλδέζκνπ κελνχ ν νπνίνο

δεκηνπξγείηαη ή επεμεξγάδεηαη.

theme_menu_item: Δπηζηξέθεη HTML γηα έλα ζηνηρείν κελνχ θαη ππν-

Page 199: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

199

κελνχ.

theme_menu_item_link: Δπηζηξέθεη HTML γηα έλαλ ζχλδεζκν κελνχ.

theme_menu_local_task: Δπηζηξέθεη HTML γία έλαλ ζχλδεζκν ηνπηθήο

εξγαζίαο.

theme_menu_local_tasks: Δπηζηξέθεη HTML γηα πξσηεχνπζεο θαη

δεπηεξεχνπζεο ηνπηθέο δηεξγαζίεο.

theme_menu_tree: Δπηζηξέθεη HTML γηα έλα wrapper γηα ππφ-δεληξν

κελνχ.

menu_check_access: Διέγρεη ηελ πξφζβαζε ζε έλα ζηνηρείν κελνχ

ρξεζηκνπνηψληαο επαλάθιεζε πξφζβαζεο.

menu_clear_page_cache:

Βνεζεηηθή function γηα λα θαζαξίζεη ηα απνζεθεπκέλα

δεδνκέλα ησλ ζειίδσλ θαη ησλ κπινθ ην πεξηζζφηεξν

δχν θνξέο αλά θφξησζε ζειίδαο.

menu_delete_item: Βνεζεηηθή function γηα for menu_link_delete. Γηαγξάθεη έλαλ ζχλδεζκν κελνχ.

menu_find_router_path: Βξίζθεη ην path ηνπ δξνκνινγεηή πνπ ζα εμππεξεηήζεη

απηφ ην path.

menu_item_localize: Δληνπίδεη ηνλ ηίηιν ηνπ αληηθεηκέλνπ ηνπ δξνκνινγεηή ρξεζηκνπνηψληαο ην t() ή άιιε επαλάθιεζε.

menu_link_build: Γεκηνπξγεί έλαλ ζχλδεζκν απφ έλα ζηνηρείν

δξνκνινγεηή.

menu_link_map_translate:

Απηφ ην function κεηαθξάδεη ηα ζηνηρεία path ζηνλ ράξηε ρξεζηκνπνηψληαο νπνηνδήπνηε βνεζεηηθφ

function to_arg. Απηά ηα functions παίξλνπλ έλα

argument θη επηζηξέθνπλ έλα object.

menu_link_move_children: Δλεκεξψλεη ην παηδί ελφο ζπλδέζκνπ κελνχ φηη

κεηαθηλείηαη.

menu_link_parents_set: Βνεζεηηθφ function πνπ ζέηεη ηηο ηηκέο p1..p9 γηα έλαλ

ζχλδεζκν κελνχ πνπ απνζεθεχεηαη.

menu_link_translate:

Απηφ ην function είλαη παξφκνην κε ην

_menu_translate() αιιά θάλεη πξνεηνηκαζία

ζπγθεθξηκέλνπ ζπλδέζκνπ φπσο ηνπ λα θαιεί ζπλέρεηα

to_arg functions.

menu_load_objects: Φνξηψλεη αληηθείκελα ζηνλ ράξηε φπσο έρνπλ νξηζηεί

ζην $item['load_functions'].

menu_navigation_links_rebuild: Βνεζεηηθφ function ην νπνίν δεκηνπξγεί ζπλδέζκνπο

γηα ηα αληηθείκελα ζηνλ δξνκνινγεηή κελνχ.

menu_router_build:

Βνεζεηηθφ function ην νπνίν δεκηνπξγεί ηνλ πίλαθα

ηνπ δξνκνινγεηή βαζηζκέλν ζηα δεδνκέλα ηνπ

hook_menu.

menu_router_cache: Βνεζεηηθφ function ην νπνίν απνζεθεχεη ην δξνκνινγεηή ηνπ κελνχ εάλ ππάξρεη ζηε κλήκε.

menu_set_expanded_menus: Βνεζεηηθφ function ην νπνίν ελεκεξψλεη κία ιίζηα

απφ κελνχ κε δηεπξπκέλα αληηθείκελα.

menu_site_is_offline: Διέγρεη εάλ ην site βξίζθεηαη ζε θαηάζηαζε

ζπληήξεζεο.

menu_translate: Γηαρεηξίδεηαη κεηαθξάζεηο δπλακηθνχ path θαη έιεγρν

πξφζβαζεο κελνχ.

menu_tree_check_access: Αλαδξνκηθφ βνεζεηηθφ function γηα ην

Page 200: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

200

menu_tree_check_access()

menu_tree_cid: Βνεζεηηθφ function γηα ην menu_tree_check_access().

menu_tree_data: Αλαδξνκηθφ βνεζεηηθφ function ην νπνίν δεκηνπξγεί

ηα δεδνκέλα πνπ αληηπξνζσπεχνπλ ην δέληξν κελνχ.

menu_update_parental_status: Διέγρεη θαη ελεκεξψλεη ηελ θαηάζηαζε ηνπ

has_children γηα ηνλ γνλέα ηνπ ζπλδέζκνπ.

Constants

λνκα Πεξηγξαθή

MENU_ACCESS_DENIED: Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ –

Απαγνξεχεηαη ε πξφζβαζε ζην ζηνηρείν κελνχ.

MENU_CALLBACK: Σχπνο κελνχ – Μία θξπθή, εζσηεξηθή επαλάθιεζε, ε

νπνία ζπλήζσο ρξεζηκνπνηείηαη γηα θιήζεηο API.

MENU_CREATED_BY_ADMIN: Δζσηεξηθή flag κελνχ – ην ζηνηρείν ηνπ κελνχ δεκηνπξγήζεθε απφ ηνλ δηαρεηξηζηή.

MENU_DEFAULT_LOCAL_TASK: Σχπνο κελνχ – Η πξνεπηιεγκέλε ηνπηθή εξγαζία, πνπ

είλαη ελεξγή απφ ηελ αξρή.

MENU_FOUND: Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ – Βξέζεθε ην ζηνηρείν ηνπ κελνχ.

MENU_IS_LOCAL_TASK: Δζσηεξηθή flag κελνχ – ην ζηνηρείν κελνχ είλαη κία

ηνπηθή εξγαζία.

MENU_IS_ROOT: Δζσηεξηθή flag κελνχ – ην ζηνηρείν κελνχ είλαη ε ξίδα ηνπ δέληξνπ κελνχ.

MENU_LINKS_TO_PARENT: Δζσηεξηθή flag κελνχ – ην ζηνηρείν κελνχ δείρλεη πίζσ

ζηνλ γνλέα ηνπ.

MENU_LOCAL_TASK: Σχπνο κελνχ – Μία εξγαζία γηα ην ζηνηρείν γνλέα.

MENU_MAX_DEPTH: Σν κέγηζην βάζνο ελφο δέληξνπ ζπλδέζκσλ κελνχ -

Σαηξηάδεη ηνλ αξηζκφ ησλ p ζηειψλ.

MENU_MAX_PARTS: Ο κέγηζηνο αξηζκφο απφ ζηνηρεία path γηα κία

επαλάθιεζε κελνχ.

MENU_MODIFIED_BY_ADMIN: Δζσηεξηθή flag κελνχ – Σν ζηνηρείν κελνχ κπνξεί λα

ηξνπνπνηεζεί απφ ηνλ δηαρεηξηζηή.

MENU_NORMAL_ITEM: Σχπνο κελνχ – Έλα θαλνληθφ ζηνηρείν κελνχ ην νπνίν

εκθαλίδεηαη ζην κελνχ θαη ζηα ππνιείκκαηα.

MENU_NOT_FOUND: Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ –Σν ζηνηρείν

ηνπ κελνχ δελ βξέζεθε.

MENU_SITE_OFFLINE:

Δζσηεξηθφο θψδηθαο θαηάζηαζεο κελνχ – Σν ζηνηρείν

ηνπ κελνχ είλαη κε πξνζβάζηκν δηφηη ην site βξίζθεηαη εθηφο ζχλδεζεο.

MENU_SUGGESTED_ITEM: Σχπνο κελνχ – Έλα θαλνληθφ ζηνηρείν κελνχ, θξπθφ

κέρξη λα ελεξγνπνηεζεί απφ ηνλ δηαρεηξηζηή.

MENU_VISIBLE_IN_BREADCRUMB: Δζσηεξηθή flag κελνχ – Σν ζηνηρείν ηνπ κελνχ είλαη νξαηφ ζηα ππνιείκκαηα.

MENU_VISIBLE_IN_TREE: Δζσηεξηθή flag κελνχ – Σν ζηνηρείν ηνπ κελνχ είλαη

νξαηφ ζην δέληξν ηνπ κελνχ.

Page 201: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

201

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‖.

Page 202: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

202

Καη ν θσδηαθο πνπ απνηειεηηε ην 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'),

Page 203: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

203

'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.

Page 204: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

204

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;

Page 205: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

205

$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,

Page 206: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

206

'#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 θαη ησλ εξγαιείσλ ηνπ θάλακε εηζαγσγή ησλ θεηκέλσλ θαη ηνλ εηθφλσλ καο. Η

επεμεξγαζία ζειίδαο γηλφηαλ ζηε πεξηνρή Γηαρείξηζε/Πεξηερφκελα.

Page 207: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

207

15.12 Γεκηνπξγία κπινθ

Σα κπινθ ζην Drupal, δεκηνπξγνχληαη απηφκαηα απφ ηηο εγθαηεζηεκέλεο κνλάδεο (modules).

Δίλαη κπινθ πιεξνθνξηψλ, ηα νπνία ηνπνζεηνχληαη ζε δηάθνξεο ζέζεηο ηεο ζειίδαο καο, νη νπνίεο εμαξηψληαη απφ ηηο ζεκαηηθέο παξαιιαγέο. ηε πεξηνρή δηαρείξηζε/Μπινθ/Πξνζζήθε κπινθ

δεκηνπξγήζακε ηα κπινθ φπνπ ρξεζηκνπνηήζακε. Βάδνληαο πεξηγξαθή ηνπ κπινθ, ηίηινο ηνπ κπινθ

θαη ην ζψκα πνπ ζέινπκε λα έρεη. Μεηά απφ ξπζκίζεηο νξαηφηεηαο ζειίδαο ξπζκίζακε ην θάζε κπινθ ζε πνηεο ζειίδεο ζα είλαη νξαηφ θ ζε πνηεο φρη. Μεηά απφ ηε πεξηνρή Γηαρείξηζε/Μπινθ/Λίζηα

θαηαηάμακε ηα κπινθ θαη ηα ηνπνζεηήζακε ζηηο πεξηνρέο πνπ επηζπκνχζακε. Τπάξρεη επίζεο ε

δπλαηφηεηα ξχζκηζεο ζπγθεθξηκέλσλ επηινγψλ ζε

απηή ηελ πεξηνρή.

Δηθόλα 30: Η Αξρηθή ζειίδα ηνπ Drupal

15.13 Αξρηθή ζειίδα

ηελ Αξρηθή ζειίδα πνπ είλαη θαη νη πξψηε πνπ βιέπεη έλαο ρξήζηεο κφιηο κπεη ζηελ ηζηνζειίδα καο,

βιέπνπκε πάλσ πάλσ Σαβέξλα - Ρεκπεηάδηθν: ‗Καιψο νξίζαηε‘ Πνην θάησ βιέπνπκε κηα κηθξή εηζαγσγή θαη ελεκέξσζε γηα ηη ζα βξεη θάπνηνο πνπ ζα επηζθεθζεί ην Ρεκπεηάδηθν.

Οη θαηεγνξίεο είλαη νη εμήο:

1. Πξφγξακκα

2. Μελνχ 3. Αξρείν

4. Γηνξγάλσζε εθδειψζεσλ

5. Δπηθνηλσλία

Page 208: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

208

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 Πεξηνξηζκέλε Πεξηνξηζκέλε

Page 209: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

209

πκβαηό κε XHTML Ναη Ναη

Τπνζηήξημε UTF-8 Ναη Ναη

Αλαθνξέο Βάζεο

Γεδνκέλσλ

Ναη Γσξεάλ Πξφζζεην

Metadata Ναη Ναη

Φηιηθά URL Ναη Ναη

Δπαλεγγξαθή URL Ναη Ναη

Άιια Υαξαθηεξηζηηθά

Δγγξηζε

Πεξηερνκέλνπ

Ναη Γσξεάλ Πξφζζεην

Ιζηνξηθό Δθδόζεσλ Ναη Γσξεάλ Πξφζζεην

Δκπνξηθή

Τπνζηήξημε /

Δθπαίδεπζε

Ναη Ναη

Μεηαθνξά θαη

Απόζεζε

Πεξηερνκέλνπ

Γσξεάλ Πξφζζεην Όρη

πλδξνκέο Γσξεάλ Πξφζζεην Όρη

Δμηζνξξόπεζε

Φνξηίνπ

Ναη Όρη

ηαηηζηηθά Web Ναη Όρη

Τπεξεζίεο Web

Πξνζθελίνπ

Πεξηνξηζκέλεο Πεξηνξηζκέλεο

RSS Ναη Ναη

Page 210: Πηπρηαθή Δξγαζία Σίηινοnefeli.lib.teicrete.gr/browse/stef/epp/2012/... · presentation and functionality of Symfony and Drupal languages. The analysis of their

Πτυχιακή Εργασία τμήματος Εφαρμοσμζνης Πληροφορικής και Πολυμζσων

210

ΒΙΒΛΙΟΓΡΑΦΙΑ

[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