Ενότητες
Στη Nette, οι ενότητες αντιπροσωπεύουν τις λογικές μονάδες που συνθέτουν μια εφαρμογή. Περιλαμβάνουν παρουσιαστές, πρότυπα, ενδεχομένως επίσης συστατικά και κλάσεις μοντέλων.
Ένας κατάλογος για τους παρουσιαστές και ένας για τα πρότυπα δεν θα ήταν αρκετός για πραγματικά έργα. Το να έχετε δεκάδες αρχεία σε έναν φάκελο είναι τουλάχιστον ανοργάνωτο. Πώς να απαλλαγείτε από αυτό; Απλώς τα χωρίζουμε σε υποκαταλόγους στο δίσκο και σε χώρους ονομάτων στον κώδικα. Και αυτό ακριβώς κάνουν τα modules της Nette.
Ας ξεχάσουμε λοιπόν έναν ενιαίο φάκελο για τους παρουσιαστές και τα
πρότυπα και ας δημιουργήσουμε αντ' αυτού ενότητες, για παράδειγμα
Admin
και Front
.
app/ ├──Presenters/├── Modules/ ← directory with modules │ ├── Admin/ ← module Admin │ │ ├── Presenters/ ← its presenters │ │ │ ├── DashboardPresenter.php │ │ │ └── templates/ │ └── Front/ ← module Front │ └── Presenters/ ← its presenters │ └── ...
Αυτή η δομή καταλόγου θα αντικατοπτρίζεται από τα namespaces των κλάσεων,
έτσι για παράδειγμα το DashboardPresenter
θα βρίσκεται στο namespace
App\Modules\Admin\Presenters
:
namespace App\Modules\Admin\Presenters;
class DashboardPresenter extends Nette\Application\UI\Presenter
{
// ...
}
Ο παρουσιαστής Dashboard
μέσα στην ενότητα Admin
αναφέρεται
μέσα στην εφαρμογή χρησιμοποιώντας τον συμβολισμό της άνω και κάτω
τελείας ως Admin:Dashboard
, και η ενέργεια default
ως
Admin:Dashboard:default
. Και πώς γνωρίζει η Nette proper ότι το Admin:Dashboard
αντιπροσωπεύει την κλάση App\Modules\Admin\Presenters\DashboardPresenter
; Αυτό
καθορίζεται από την αντιστοίχιση στη διαμόρφωση. Έτσι, η
δεδομένη δομή δεν είναι αυστηρά καθορισμένη και μπορείτε να την
τροποποιήσετε ανάλογα με τις ανάγκες σας.
Οι ενότητες μπορούν φυσικά να περιέχουν όλα τα άλλα στοιχεία εκτός από τους παρουσιαστές και τα πρότυπα, όπως συστατικά, κλάσεις μοντέλων κ.λπ.
Ενσωματωμένες ενότητες
Οι ενότητες δεν χρειάζεται να σχηματίζουν μόνο μια επίπεδη δομή, μπορείτε επίσης να δημιουργήσετε υποενότητες, για παράδειγμα:
app/ ├── Modules/ ← directory with modules │ ├── Blog/ ← module Blog │ │ ├── Admin/ ← submodule Admin │ │ │ ├── Presenters/ │ │ │ └── ... │ │ └── Front/ ← submodule Front │ │ ├── Presenters/ │ │ └── ... │ ├── Forum/ ← module Forum │ │ └── ...
Έτσι, η ενότητα Blog
χωρίζεται σε υποενότητες Admin
και
Front
. Και πάλι, αυτό θα αντικατοπτρίζεται στα namespaces, τα οποία θα
είναι App\Modules\Blog\Admin\Presenters
κ.λπ. Ο παρουσιαστής Dashboard
μέσα
στην υποενότητα αναφέρεται ως Blog:Admin:Dashboard
.
Η ένθεση μπορεί να προχωρήσει όσο βαθιά θέλετε, οπότε μπορούν να δημιουργηθούν υπο-υποενότητες.
Δημιουργία συνδέσμων
Οι σύνδεσμοι στα πρότυπα παρουσιαστή είναι σχετικοί με την τρέχουσα
ενότητα. Έτσι, ο σύνδεσμος 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
.
Ας ξεκινήσουμε με ένα δείγμα που δεν χρησιμοποιεί ενότητες. Θα
θέλουμε απλώς οι κλάσεις presenter να έχουν το namespace App\Presenters
. Αυτό
σημαίνει ότι ένας παρουσιαστής όπως το Home
θα πρέπει να
αντιστοιχίζεται στην κλάση App\Presenters\HomePresenter
. Αυτό μπορεί να
επιτευχθεί με την ακόλουθη διαμόρφωση:
application:
mapping:
*: App\Presenters\*Presenter
Το όνομα του παρουσιαστή αντικαθίσταται με τον αστερίσκο στη μάσκα κλάσης και το αποτέλεσμα είναι το όνομα της κλάσης. Εύκολο!
Αν χωρίσουμε τους παρουσιαστές σε ενότητες, μπορούμε να έχουμε τη δική μας χαρτογράφηση για κάθε ενότητα:
application:
mapping:
Front: App\Modules\Front\Presenters\*Presenter
Admin: App\Modules\Admin\Presenters\*Presenter
Api: App\Api\*Presenter
Τώρα ο παρουσιαστής Front:Home
αντιστοιχίζεται στην κλάση
App\Modules\Front\Presenters\HomePresenter
και ο παρουσιαστής Admin:Dashboard
στην
κλάση App\Modules\Admin\Presenters\DashboardPresenter
.
Είναι πιο πρακτικό να δημιουργήσετε έναν γενικό κανόνα (αστέρι) για να αντικαταστήσετε τους δύο πρώτους. Ο επιπλέον αστερίσκος θα προστεθεί στη μάσκα κλάσης μόνο για την ενότητα:
application:
mapping:
*: App\Modules\*\Presenters\*Presenter
Api: App\Api\*Presenter
Τι γίνεται όμως αν χρησιμοποιούμε φωλιασμένες ενότητες και έχουμε
έναν παρουσιαστή Admin:User:Edit
; Σε αυτή την περίπτωση, το τμήμα με τον
αστερίσκο που αντιπροσωπεύει την ενότητα για κάθε επίπεδο απλώς
επαναλαμβάνεται και το αποτέλεσμα είναι η κλάση
App\Modules\Admin\User\Presenters\EditPresenter
.
Ένας εναλλακτικός συμβολισμός είναι η χρήση ενός πίνακα που αποτελείται από τρία τμήματα αντί για συμβολοσειρά. Αυτή η σημειογραφία είναι ισοδύναμη με την προηγούμενη:
application:
mapping:
*: [App\Modules, *, Presenters\*Presenter]
Η προεπιλεγμένη τιμή είναι *: *Module\*Presenter
.