Το πρόβλημα
Μερικές φορές χρειάζεται να δημιουργήσετε ένα πρότυπο σελίδας για έναν συγκεκριμένο τύπο περιεχομένου, ώστε να μπορείτε να το προσαρμόσετε. Το Drupal σάς επιτρέπει να δημιουργείτε τύπους περιεχομένου για πρότυπα κόμβων εκτός πλαισίου, ακολουθώντας τη σύμβαση ονομασίας node--content-type.html.twig. Αλλά τα πράγματα δεν είναι τόσο απλά για τα πρότυπα σελίδων. Το Drupal δεν εντοπίζει αυτόματα πρότυπα σελίδων για τύπους περιεχομένου αποκλειστικά με βάση τη σύμβαση ονομασίας. Ευτυχώς χρειάζονται μόνο μερικές γραμμές κώδικα και μπορείτε να δημιουργήσετε ένα πρότυπο σελίδας για όποιον τύπο περιεχομένου επιλέξετε.
Πριν ξεκινήσουμε, ας ρίξουμε μια σύντομη ματιά στη διαφορά μεταξύ ενός κόμβου και ενός προτύπου σελίδας.
Σελίδα: το πρότυπο που ελέγχει ολόκληρη τη σελίδα. Αυτό θα περιλαμβάνει μια μεταβλητή $content, η οποία μετά την απόδοση θα είναι ο κόμβος. Κόμβος: το πρότυπο που ελέγχει μόνο το τμήμα περιεχομένου της σελίδας.
Μια λύση
Για να πείτε στο Drupal να χρησιμοποιήσει το πρότυπο σελίδας για έναν τύπο περιεχομένου, μπορείτε να εφαρμόσετε hook_theme_suggestions_page_alter(). Αυτό το άγκιστρο χρησιμοποιείται κάθε φορά που χρησιμοποιείται ένα πρότυπο page.tpl.php και σας επιτρέπει να προτείνετε εναλλακτικά πρότυπα.
Σε αυτήν την περίπτωση, θα το χρησιμοποιήσετε hook_theme_suggestions_page_alter()για να πείτε στο Drupal να χρησιμοποιήσει ένα συγκεκριμένο πρότυπο σελίδας για έναν συγκεκριμένο τύπο περιεχομένου, αντί για το προεπιλεγμένο page.tpl.php.
Ακολουθεί ένα παράδειγμα για το πώς να πείτε στο Drupal να χρησιμοποιήσει ένα πρότυπο για έναν τύπο περιεχομένου. Προσθέστε αυτόν τον κώδικα στο example.themeαρχείο στο θέμα σας και αλλάξτε το άγκιστρο στο όνομα του θέματός σας. Εάν έχετε ήδη εφαρμόσει theme_preprocess_pageστο template.php του θέματός σας, μπορείτε να προσθέσετε τη δήλωση 'if' σε αυτό.
Εδώ είναι η λύση:
/**
* Implements hook_theme_suggestions_page_alter().
*/
function example_theme_suggestions_page_alter(array &$suggestions, array $variables) {
if ($node = \Drupal::routeMatch()->getParameter('node')) {
$suggestions[] = 'page__' . $node->bundle();
}
}
Η λύση εξηγήθηκε
Σε αυτό το παράδειγμα, λέτε στο Drupal ότι θέλετε να χρησιμοποιήσετε ένα πρότυπο με το όνομα του τύπου περιεχομένου όταν προβάλλεται μια σελίδα. Παραδείγματα προτύπων περιλαμβάνουν:
page--article.html.twigγια έναν τύπο περιεχομένου άρθρουpage--gallery.html.twigγια έναν τύπο περιεχομένου γκαλερί
Αυτό προστίθεται στο "theme_hook_suggestions", το οποίο το προσθέτει στη δεξαμενή των πιθανών προτύπων που μπορεί να χρησιμοποιήσει το Drupal. Στις περισσότερες περιπτώσεις θα χρησιμοποιήσει αυτό, εκτός αν έχετε άλλο πρότυπο που πληροί πιο συγκεκριμένα κριτήρια. Για παράδειγμα, μπορεί να έχετε ένα πρότυπο σελίδας για έναν μεμονωμένο κόμβο, το οποίο θα ήταν πιο συγκεκριμένο και θα χρησιμοποιηθεί αντ' αυτού. Για να προσθέσετε μια νέα πρόταση θέματος, εφαρμόστε το hook_theme_suggestions_page_alter()στο αρχείο του θέματός σας .theme.
Ένα άλλο παράδειγμα, εάν έχετε ένα θέμα με το όνομα example, ανοίξτε το αρχείο που ονομάζεται example.theme(ή δημιουργήστε ένα αν δεν υπάρχει). Και στη συνέχεια προσθέτουμε την παρακάτω συνάρτηση.
function example_theme_suggestions_page_alter(array &$suggestions, array $variables)
Και μέσα σε αυτήν τη συνάρτηση, ελέγξτε ότι βλέπετε έναν κόμβο με:
if ($node = \Drupal::routeMatch()->getParameter('node')) {
Και τέλος, προσθέστε τη σύμβαση ονομασίας στις προτάσεις θεμάτων με:
$suggestions[] = 'page__' . $node->bundle();
$node->bundle();θα επιστρέψει το όνομα του τύπου περιεχομένου. Επομένως, το προτεινόμενο πρότυπο σελίδας για τον τύπο περιεχομένου του άρθρου θα είναι:
page__article
Τα πλήρη βήματα
- Άνοιγμα
example.theme(αντικαταστήστε το παράδειγμα με το πραγματικό όνομα θέματός σας) - Προσθέστε το απόσπασμα κώδικα παρακάτω
- Αντικαταστήστε
exampleτο όνομα της συνάρτησηςexample_theme_suggestions_page_alterμε το πραγματικό σας όνομα θέματος - Ανανεώστε την προσωρινή μνήμη
Ο πλήρης κωδικός για example.themeάλλη μια φορά είναι:
/**
* Implements hook_theme_suggestions_page_alter().
*/
function example_theme_suggestions_page_alter(array &$suggestions, array $variables) {
if ($node = \Drupal::routeMatch()->getParameter('node')) {
$suggestions[] = 'page__' . $node->bundle();
}
}
Σχόλια