Ενότητες
Οι ενότητες φέρνουν σαφήνεια στις εφαρμογές Nette διευκολύνοντας τον εύκολο διαχωρισμό σε λογικές μονάδες.
Παρόμοια με την οργάνωση των αρχείων σε φακέλους σε ένα σκληρό δίσκο, στη Nette μπορούμε να χωρίσουμε τους παρουσιαστές, τα πρότυπα και άλλες βοηθητικές κλάσεις σε ενότητες. Πώς λειτουργεί αυτό στην πράξη; Απλά με την ενσωμάτωση νέων υποκαταλόγων στη δομή. Ακολουθεί ένα παράδειγμα δομής με δύο ενότητες, Front και Admin:
app/ ├── UI/ │ ├── Admin/ ← Admin module │ │ ├── @layout.latte │ │ ├── Dashboard/ │ │ │ ├── DashboardPresenter.php │ │ │ └── default.latte │ │ └── ... │ ├── Front/ ← Front module │ │ ├── @layout.latte │ │ ├── Home/ │ │ │ ├── HomePresenter.php │ │ │ └── default.latte │ │ └── ...
Αυτή η δομή καταλόγου αντικατοπτρίζεται στα namespaces των κλάσεων, έτσι
για παράδειγμα, η DashboardPresenter
βρίσκεται στο namespace
App\UI\Admin\Dashboard
:
namespace App\UI\Admin\Dashboard;
class DashboardPresenter extends Nette\Application\UI\Presenter
{
// ...
}
Στην εφαρμογή, αναφερόμαστε στον παρουσιαστή Dashboard
μέσα στην
ενότητα Admin
χρησιμοποιώντας τον συμβολισμό της άνω και κάτω
τελείας ως Admin:Dashboard
. Για τη δράση του default
, αναφερόμαστε
σε αυτόν ως Admin:Dashboard:default
.
Η δομή που παρουσιάζεται δεν είναι άκαμπτη- μπορείτε να την προσαρμόσετε πλήρως στις ανάγκες σας στη διαμόρφωση.
Οι ενότητες μπορούν να περιλαμβάνουν όλα τα άλλα αρχεία, όπως
συστατικά και βοηθητικές κλάσεις, εκτός από τους παρουσιαστές και τα
πρότυπα. Αν σκέφτεστε πού να τα τοποθετήσετε αυτά, σκεφτείτε να
χρησιμοποιήσετε έναν φάκελο Accessory
:
app/ ├── UI/ │ ├── Admin/ │ │ ├── Accessory/ │ │ │ ├── FormFactory.php │ │ │ └── AdminLayout.php │ │ ├── Dashboard/ │ │ └── ...
Ενσωματωμένες ενότητες
Οι ενότητες μπορούν να έχουν πολλαπλά επίπεδα ένθεσης, παρόμοια με μια δομή καταλόγου σε ένα δίσκο:
app/ ├── UI/ │ ├── Blog/ ← Blog module │ │ ├── Admin/ ← Admin submodule │ │ │ ├── Dashboard/ │ │ │ └── ... │ │ ├── Front/ ← Front submodule │ │ │ ├── @layout.latte │ │ │ ├── Home/ │ │ │ └── ... │ ├── Forum/ ← Forum module │ │ └── ...
Η ενότητα Blog
χωρίζεται σε υποενότητες Admin
και
Front
. Αυτό αντικατοπτρίζεται επίσης στα namespaces, τα οποία
εμφανίζονται ως App\UI\Blog\Admin
και παρόμοια. Για να αναφερθούμε στον
παρουσιαστή Dashboard
μέσα στην υποενότητα Admin
, αναφερόμαστε
σε αυτόν ως Blog:Admin:Dashboard
.
Η φωλεοποίηση μπορεί να είναι όσο βαθιά χρειάζεται, επιτρέποντας τη δημιουργία υπο-υπομονάδων.
Για παράδειγμα, αν στη διαχείριση έχετε πολλούς παρουσιαστές που
σχετίζονται με τη διαχείριση παραγγελιών, όπως OrderDetail
,
OrderEdit
, OrderDispatch
, κ.λπ., μπορείτε να δημιουργήσετε μια
ενότητα Order
στην οποία θα οργανωθούν παρουσιαστές όπως
Detail
, Edit
, Dispatch
και άλλοι.
Δημιουργία συνδέσμων
Οι σύνδεσμοι στα πρότυπα παρουσιαστή είναι σχετικοί με την τρέχουσα
ενότητα. Έτσι, ο σύνδεσμος Foo:default
οδηγεί στον παρουσιαστή
Foo
στην ίδια ενότητα με τον τρέχοντα παρουσιαστή. Εάν η τρέχουσα
ενότητα είναι Front
, για παράδειγμα, τότε ο σύνδεσμος έχει
ως εξής:
<a n:href="Product:show">link to Front:Product:show</a>
Ένας σύνδεσμος είναι σχετικός ακόμη και αν περιλαμβάνει το όνομα μιας ενότητας, η οποία τότε θεωρείται υποενότητα:
<a n:href="Shop:Product:show">link to Front:Shop:Product:show</a>
Οι απόλυτοι σύνδεσμοι γράφονται ανάλογα με τις απόλυτες διαδρομές στο δίσκο, αλλά με άνω και κάτω τελεία αντί για κάθετους. Έτσι, ένας απόλυτος σύνδεσμος αρχίζει με άνω και κάτω τελεία:
<a n:href=":Admin:Product:show">link to Admin:Product:show</a>
Για να μάθουμε αν βρισκόμαστε σε μια συγκεκριμένη ενότητα ή
υποενότητά της μπορούμε να χρησιμοποιήσουμε τη συνάρτηση
isModuleCurrent(moduleName)
.
<li n:class="isModuleCurrent('MyEshop:Users') ? active">
<a n:href="Product:">...</a>
</li>
Δρομολόγηση
Βλέπε κεφάλαιο για τη δρομολόγηση.
Χαρτογράφηση
Η αντιστοίχιση ορίζει τους κανόνες για την εξαγωγή του ονόματος της
κλάσης από το όνομα του παρουσιαστή. Οι κανόνες αυτοί καθορίζονται στη
διαμόρφωση στο κλειδί
application › mapping
.
Οι δομές καταλόγων που αναφέρθηκαν νωρίτερα σε αυτή τη σελίδα βασίζονται στην ακόλουθη αντιστοίχιση:
application:
mapping: App\UI\*\**Presenter
Πώς λειτουργεί η χαρτογράφηση; Για καλύτερη κατανόηση, ας
φανταστούμε πρώτα μια εφαρμογή χωρίς ενότητες. Θέλουμε οι κλάσεις του
παρουσιαστή να υπάγονται στο χώρο ονομάτων App\UI
, έτσι ώστε ο
παρουσιαστής Home
να αντιστοιχίζεται στην κλάση
App\UI\HomePresenter
. Αυτό μπορεί να επιτευχθεί με αυτή τη διαμόρφωση:
application:
mapping: App\UI\*Presenter
Αυτή η αντιστοίχιση λειτουργεί αντικαθιστώντας τον αστερίσκο στη
μάσκα App\UI\*Presenter
με το όνομα του παρουσιαστή Home
, με
αποτέλεσμα το τελικό όνομα της κλάσης App\UI\HomePresenter
. Απλό!
Ωστόσο, όπως μπορείτε να δείτε στα παραδείγματα σε αυτό και σε άλλα
κεφάλαια, τοποθετούμε τις κλάσεις παρουσιαστή σε επώνυμους
υποκαταλόγους, π.χ. ο παρουσιαστής Home
αντιστοιχίζεται στην
κλάση App\UI\Home\HomePresenter
. Αυτό επιτυγχάνεται με τον διπλασιασμό του
αστερίσκου (απαιτεί Nette Application 3.2):
application:
mapping: App\UI\**Presenter
Τώρα, ας προχωρήσουμε στην αντιστοίχιση των παρουσιαστών σε ενότητες. Μπορούμε να ορίσουμε συγκεκριμένες αντιστοιχίσεις για κάθε ενότητα:
application:
mapping:
Front: App\UI\Front\**Presenter
Admin: App\UI\Admin\**Presenter
Api: App\Api\*Presenter
Σύμφωνα με αυτή τη διαμόρφωση, ο παρουσιαστής Front:Home
αντιστοιχίζεται στην κλάση App\UI\Front\Home\HomePresenter
, ενώ ο
παρουσιαστής Api:OAuth
αντιστοιχίζεται στην κλάση
App\Api\OAuthPresenter
.
Δεδομένου ότι οι ενότητες Front
και Admin
έχουν παρόμοια
προσέγγιση αντιστοίχισης και είναι πιθανό να υπάρχουν περισσότερες
τέτοιες ενότητες, είναι δυνατόν να δημιουργηθεί ένας γενικός κανόνας
που να τις αντικαθιστά. Ένας νέος αστερίσκος για την ενότητα
προστίθεται στη μάσκα κλάσης:
application:
mapping:
*: App\UI\*\**Presenter
Api: App\Api\*Presenter
Για πολυεπίπεδες φωλιασμένες ενότητες, όπως ο παρουσιαστής
Admin:User:Edit
, το τμήμα αστερίσκου επαναλαμβάνεται για κάθε επίπεδο,
με αποτέλεσμα την κλάση App\UI\Admin\User\Edit\EditPresenter
.
Ένας εναλλακτικός συμβολισμός είναι η χρήση ενός πίνακα που αποτελείται από τρία τμήματα αντί για μια συμβολοσειρά. Αυτός ο συμβολισμός είναι ισοδύναμος με τον προηγούμενο:
application:
mapping:
*: [App\UI, *, **Presenter]
Api: [App\Api, '', *Presenter]
Αν έχουμε μόνο έναν κανόνα στη διαμόρφωση, τον γενικό, μπορούμε να γράψουμε συνοπτικά:
application:
mapping: App\UI\*\**Presenter