Elxis CMS Forum

Extensions => Templates => Topic started by: farmville450 on May 08, 2016, 11:44:54

Title: Κατασκευή Template
Post by: farmville450 on May 08, 2016, 11:44:54
Καλημέρα κύριοι
Προσπαθώ να κατασκευάσω ένα template και απ' ότι διάβασα στην τεκμηρίωση του Elxis (https://www.elxis.net/docs/el/developers/libraries/elxisdocument.html) ο τρόπος για να καλέσεις τα modules είναι:
1. Καλώνστας τα με τη θέση τους: $eDoc->modules('left');
2. Καλώνστας τα με το όνομά τους: $eDoc->module('mod_language');
Η ερώτηση μου είναι αν γίνεται με κάποιο τρόπο να προστίθεται δυναμικά ένα "style" στην κλάση τους, ανάλογα με τον αριθμό των modules που βρίσκονται στη θέση αυτή.
Για παράδειγμα εάν τα modules που βρίσκονται στη θέση ('user1') είναι 2 τότε να γίνεται το εξής:
Module 1 <div class="module span6"> και Module 2 <div class="module span6">
και αν είναι 3 τότε να γίνεται το εξής:
Module 1 <div class="module span4"> , Module 2 <div class="module span4"> και Module 3 <div class="module span4">
Ευχαριστώ
Title: Re: Κατασκευή Template
Post by: michalis1984 on May 08, 2016, 12:11:21
Η συνάρτηση $eDoc->countModules('left') μπορεί να βοηθήσει το template σου να "βλέπει" σε κάθε περίπτωση πόσα modules υπάρχουν στην θέση left.

countModules
public function countModules($position)
Returns the number of modules assigned to the given modules position (eg. left). This method is a replacement of mosCountModules function from the Elxis 2009.x series.
https://www.elxis.net/docs/el/developers/libraries/elxisdocument.html
Title: Re: Κατασκευή Template
Post by: farmville450 on May 08, 2016, 12:23:50
Αυτό το χρησιμοποίησα και μου επιστρέφει έναν αριθμό.
Το προκαθορισμένο $style του Elxis τοποθετεί μια DIV με class module σε όλα τα modules που βρίσκονται στη θέση 'left' για παράδειγμα. Η ερώτησή μου είναι αν μπορώ με κάποιο τρόπο να επέμβω σε εκείνο το κομμάτι και να προστίθεται δυναμικά μια κλάση ανάλογα με τον αριθμό των modules που βρίσκονται στη θέση αυτή.
Title: Re: Κατασκευή Template
Post by: datahell on May 08, 2016, 22:27:01
Δεν μπορείς να κάνεις ακριβώς αυτό που θες με τον τρόπο που θες. Μπορείς να ορίσεις το στυλ του περιέκτη, όχι όμως και την εφαρμοζόμενη css κλάση.

Ενημερωτικά: Μπορείς να ορίσεις το στυλ σε "none". Σε αυτή την περίπτωση δεν θα σου δημιουργηθεί ο περιέκτης <div class="module"></div> οπότε θα μπορείς να βάλεις τον δικό σου με ότι περιεχόμενο/κλάση θες. Το μειονέκτημα είναι ότι αυτός ο περιέκτης θα εφαρμοστεί γύρω από όλα τα Module και όχι γύρω από το καθένα.

echo '<div class="module anything">';
$eDoc->modules('top', 'none');
echo '</div>';

Αν όμως φορτώσεις ένα ένα τα module μπορείς να κάνεις αυτό που θες:
echo '<div class="module anything">';
$eDoc->module('mod_first', 'none');
echo '</div>';
echo '<div class="module anything">';
$eDoc->module('mod_second', 'none');
echo '</div>';

Υπενθυμίζω ότι μπορούμε να φορτώνουμε τα module τόσο με το όνομά τους, πχ $eDoc->module('mod_something'), όσο και με το id τους, πχ $eDoc->module(24).

Ένας εντελώς διαφορετικός τρόπος είναι με css (πχ αυτό (http://lea.verou.me/2011/01/styling-children-based-on-their-number-with-css3/) - αν και παλιό) ή με javascript (με javascript είναι πολύ εύκολο).

Ιδέα
Η πλησιέστερη λύση με γνώμονα τον τρόπο που θες είναι ο εξής. Βάλε ένα και μόνο module σε κάθε θέση (user1, user2, user3, ...) και εφάρμοσε την παρακάτω μέθοδο.

$num = $eDoc->countModules('user1') + $eDoc->countModules('user2') + $eDoc->countModules('user3');
$css_class = 'module';
if ($num > 0) {
       if ($num == 2) {
            $css_class = 'module span6';
       } else if ($num == 3) {
            $css_class = 'module span8';
      }
}

if ($eDoc->countModules('user1') > 0) {
       echo '<div class="'.$css_class.'">';
       $eDoc->modules('user1', 'none');
       echo '</div>';
}
if ($eDoc->countModules('user2') > 0) {
       echo '<div class="'.$css_class.'">';
       $eDoc->modules('user2', 'none');
       echo '</div>';
}
if ($eDoc->countModules('user3') > 0) {
       echo '<div class="'.$css_class.'">';
       $eDoc->modules('user3', 'none');
       echo '</div>';
}

Τέλος, ο έσχατος τρόπος είναι να κάνεις ένα query στη βάση δεδομένων και να δεις πια ακριβώς module βρίσκονται στη θέση/θέσεις που θες. Κατόπιν τα φορτώνεις ένα ένα με τον τρόπο που έδειξα πριν.
Title: Re: Κατασκευή Template
Post by: farmville450 on May 08, 2016, 23:15:53
Ευχαριστώ πολύ datahell. Ήσουν κατατοπιστικότατος :)
Title: Re: Κατασκευή Template
Post by: webgift on May 09, 2016, 11:07:35
Μια διόρθωση φαντάζομαι από:
if ($num > 0) {
       if ($num == 2) {
            $css_class= 'module span6';
       } else if ($num == 2) {
            $css_class= 'module span8';
      }
}

σε
if ($num > 0) {
       if ($num == 1) {
            $css_class= 'module span6';
       } else if ($num == 2) {
            $css_class= 'module span8';
      }
}
Title: Re: Κατασκευή Template
Post by: farmville450 on May 09, 2016, 12:45:09
Ευχαριστώ πολύ για τις απαντήσεις παιδιά. Σκοπός μου είναι αν κάποια στιγμή τα καταφέρω (μιας και ασχολούμαι με php μόλις ένα μήνα) και τελειώσω την template να τη διαθέσω στην κοινότητα, εξ ου και το ότι δεν ήθελα να περιορίσω τον χρήστη να μπορεί να τοποθετεί ένα module στις θέσεις αυτές. Αν και πιστεύω ότι ελάχιστοι πρόκειται να χρησιμοποιήσουν πάνω από ένα. Όσον αφορά τη μέθοδο ορίζοντας το στυλ σε 'none', δουλεύει μια χαρά. Ωστόσο η ιδέα του datahell είναι σχεδόν αυτό που ήθελα. Ίσως αν κάποια στιγμή τα CSS αρχεία ξεκινήσουν να δέχονται μεταβλητές το πράγμα να γίνει ακόμα πιο εύκολο.
Και πάλι ευχαριστώ.