Τεκμηρίωση

Η τεκμηρίωση περιλαμβάνει τις βασικές αρχές του συστήματος και έχει μορφή μόνιμου περιεχομένου. Δεν αποκλείονται όμως οι μελλοντικές διορθώσεις, όσο το monocms συνεχίζει να εξελίσσεται.

Είσοδος στο σύστημα και ασφάλεια

session_name('MON');
session_start();
if (session_name() == 'MON')
if ( !isset($_SESSION['username'])) {
 ...
Η είσοδος του χρήστη με ταυτοποίηση στοιχείων χρήστη, δηλαδή ονόματος χρήστη και κωδικού, ξεκινάει με το session_start(), το οποίο εκκινεί μία νέα ή συνεχίζει μία υπάρχουσα συνεδρία. Η χρήση ονόματος για μία συνεδρία είναι, γενικώς, προαιρετική, αλλά στην περίπτωσή μας πρέπει να γίνει, ώστε το σύστημα να διατηρήσει μία μοναδική διεπαφή με τον χρήστη. Η PHP αποθηκεύει πάντα ένα αντίστοιχο cookie στον περιηγητή του χρήστη, το οποίο διαθέτει ένα μοναδικό αναγνωριστικό. Παρομοίως η συνεδρία, πρέπει να είναι ξεχωριστή από τις συνέδριες που ενδέχεται να υφίστανται στον ιστότοπο.
Στη δεύτερη συνθήκη, εξετάζουμε αν ο χρήστης έχει ήδη πιστοποιηθεί ή όχι, ελέγχοντας την ύπαρξη ή μη αποθηκευμένου ονόματος χρήστη στη συνεδρία. Εφ'όσον με τη χρήση ονόματος συνεδρίας εξασφαλίσαμε οτι η σύνδεση στη συνεδρία δεν επηρρεάζεται από άλλες συνεδρίες, τότε ο έλεγχος μας δίνει αξιόπιστο αποτέλεσμα.

SimpleXML

Η χρήση της SimpleXML είναι πολύ συχνή, φυσικά για την ανάγνωση και εγγραφή των αρχείων xml. Το monocms είναι γεμάτο με στοιχεία και αντικείμενα SimpleXML και ένα από αυτά είναι και η παρακάτω γραμμή:
$monousers = new simpleXMLElement('filesinfo/log.xml',null,true);
Έτσι συγκεντρώνουμε όλα τα δεδομένα των χρηστών, σ' ένα στοιχείο SimpleXML, για να ακολουθήσει η προσπάθεια ταυτοποίησης και η εγγραφή των δεδομένων στο αρχείο καταγραφής. Αν ο συνδυασμός ονόματος και κωδικού που δόθηκε από τον χρήστη, υπάρχει ως συνδυασμός στο στοιχείο αυτό, τοτε μόνο γίνεται η είσοδος στον πίνακα ελέγχου. Να σημειωθεί οτι ενώ το όνομα χρήστη αποθηκεύεται στη συνεδρία και στο αρχείο καταγραφής, ο κωδικός χρήστη δεν αποθηκεύεται ποτέ, ούτε στη συνεδρία, ούτε στο αρχείο καταγραφής. Η λογική της πιστοποίησης του χρήστη βασίζεται στην εντολή password_hash.

Κρυπτογράφηση

Η εντολή password_hash εμφανίστηκε στην PHP 5.5 και χρησιμοποιείται στο monocms για τη δημιουργία ενός κρυπτογραφημένου κωδικού.
password_verify($_POST['password'],$password);
Ο κρυπτογραφημένος κωδικός αποθηκεύεται και συγκρίνεται με τον κωδικό που δίνει ο χρήστης, μέσω της εντολής password_verify. Επιπλέον με την εντολή password_needs_rehash, η PHP ελέγχει αυτόματα αν ο κωδικός πρέπει να ξανά κρυπτογραφηθεί. Οι περιπτώσεις που γίνεται αυτό είναι δύο:
- Όταν έχει εγκατασταθεί μία έκδοση της PHP η οποία έχει διαφορετικό αλγόριθμο κρυπτογράφησης.
- Όταν το αρχείο set-cost.php δίνει διαφορετικό αποτέλεσμα από το υπάρχον "κόστος". Το "κόστος" είναι παράμετρος της εντολής password_hash, αλλά και της εντολής password_needs_rehash και ρυθμίζει την πολυπλοκότητα της κρυπτογράφησης - σαν ένας τρόπος καθυστέρησης στην εκτέλεση της εντολής - και βρίσκεται αποθηκευμένο στον κρυπτογραφημένο κωδικό με τη μορφή ακέραιου αριθμού.
Στην περίπτωση του monocms εξαρτάται από τις επιδόσεις του εξυπηρετητή. Αν δηλαδή γίνει αναβάθμιση υλικού ή το σύστημα μεταφερθεί σε άλλον εξυπηρετητή, πιθανόν το συγκεκριμένο αρχείο να δώσει νέα τιμή στο "κόστος" και ν' αναγκάσει την εντολή password_needs_rehash να κρυπτογραφήσει τον κωδικό, αντικαθιστώντας την παλιά τιμή. Αυτή η διαδικασία γίνεται όταν ο χρήστης εισέρχεται στο σύστημα.
password_needs_rehash($password, PASSWORD_DEFAULT, ["cost" => $cost]);
Με τον παραπάνω τρόπο, αν η τιμή της μεταβλητής $cost είναι διαφορετική από εκείνη που περιέχεται στη μεταβλητή $password, δηλαδή τον κρυπτογραφημένο κωδικό, τότε θ' ακολουθήσει εκ νέου κρυπτογράφηση του κωδικού.

Όπως είπαμε, ο υπολογισμός του "κόστους", γίνεται στο αρχείο set-cost.php:
$phtime = 0.2; // 200 ms

for ($cost = 4; ; $cost++){

// δοκιμή password_hash στον εξυπηρετητή
O χρόνος έχει ορισθεί στα 200ms, δηλαδή 2/10 του δευτερολέπτου. Η πρώτη δοκιμή του password_hash γίνεται με το ελάχιστο "κόστος" που είναι διαθέσιμο, δηλαδή το 4. Αν η δοκιμή ολοκληρωθεί σε χρόνο μικρότερο των 200ms, το "κόστος" αυξάνει κατά 1, και η δοκιμή επαναλαμβάνεται. Όταν ο χρόνος ολοκλήρωσης περάσει τα 200ms, σταματάμε τη δοκιμή και παίρνουμε το αποτέλεσμα, δηλαδή το "κόστος". Ο χρόνος δηλαδή λειτουργεί ως όριο. Αυτό επίσης σημαίνει οτι η διάρκεια ελέγχου του password_verify κατά την προσπάθεια εισόδου του χρήστη και φυσικά η διάρκεια της συνολικής διαδικασίας εισόδου του χρήστη στο σύστημα, θα είναι τουλάχιστον 200ms.

Σημείωση: Στο παράδειγμα της εντολής password_verify, δεν δίνουμε το "κόστος" ως παράμετρο, διότι η τιμή που παίρνει το "κόστος", βρίσκεται αποθηκευμένη στον κρυπτογραφημένο κωδικό, δηλαδή στη μεταβλητή $password.

Τι συμβαίνει όμως αν το monocms εγκατασταθεί σε έναν ταχύτερο εξυπηρετητή; Η ταυτοποίηση και η είσοδος στο σύστημα θα γίνουν γρηγορότερα;

Η απάντηση είναι όχι. Η ταχύτητα της ταυτοποίησης του χρήστη μένει ίδια, σε όποιον εξυπηρετητή κι αν εγκατασταθεί το monocms και αυτό αποτελεί τη βασική αρχή του συστήματος ασφαλείας. Το "κόστος" πιθανόν να αυξηθεί, αλλά ο χρόνος εισόδου δεν θα αλλάξει. Γι'αυτό εξάλλου έχουμε μόνιμα αποθηκευμένη την τιμή των 200ms σε μία μεταβλητή και δεν αποτελεί τιμή που την παίρνουμε από κάποια μέτρηση. Ζητάμε δηλαδή από τον εξυπηρετητή, να δοκιμάσει τις "δυνάμεις" του, μέσα σε χρόνο 200ms και να προσαρμόσει ανάλογα το "κόστος" των εντολών.
Αν ο εξυπηρετητής είναι αργός, η μέτρηση θα μας δώσει χαμηλό "κόστος". Αν είναι γρήγορος, τότε είναι σαφές οτι θα μας δώσει ένα μεγαλύτερο.
Με δυο λόγια ο χρόνος μένει σταθερός για να δίνει ένα σταθερό επίπεδο επιδόσεων για όλους τους εξυπηρετητές και βάσει αυτού να ρυθμίζουμε την ταχύτητα της εντολής password_verify, ώστε ο εξυπηρετητής να μην επιβαρύνεται με ενοχλητικές καθυστερήσεις και ταυτοχρόνως να προστατεύεται από τις επιθέσεις των κακόβουλων χρηστών. Θέλουμε δηλαδή να έχουμε την κατάλληλη ισσοροπία μεταξύ ταχύτητας και ασφάλειας.

Αν αυξήσουμε το χρονικό όριο των 200ms, τότε δυσκολεύουμε επιπλέον τους επίδοξους εισβολείς, αλλά αυξάνουμε τη διάρκεια εισόδου του χρήστη στο σύστημα.

Να σημειωθεί οτι τα 200ms, δεν είναι η συνολική διάρκεια εισόδου στο σύστημα. Είναι το ελάχιστο όριο, δηλαδή η ελάχιστη διάρκεια εισόδου. Η συνολική διάρκεια εισόδου παραμένει άγνωστη και κυμαίνεται από 200ms μέχρι 1 δευτερόλεπτο.
if (($finish-$start) > 1) {

$pass_info = password_get_info($password);
$cost = $pass_info[options][cost];
break;
}
Αν μία δοκιμή του password_hash κρατήσει πάνω από 1 δευτερόλεπτο, το "κόστος" και ο κρυπτογραφημένος κωδικός παραμένουν ίδια. Όπως φαίνεται και στον κώδικα, σε αυτή την περίπτωση, παίρνουμε το "κόστος" του υπάρχοντος κρυπτογραφημένου κωδικού και το αποθηκεύουμε στη μεταβλητή $cost.

Παρακάτω βλέπουμε μία προσπάθεια απόδοσης "κόστους" από τον χρήστη.
password_needs_rehash($password, PASSWORD_DEFAULT, ["cost" => 11]);

Ανακατεύθυνση και έξοδος.

Η χρήση της εντολής exit() γίνεται πολύ προσεκτικά στο data_connect.php. Και αυτό διότι η χρήση του αρχείου εξυπηρετεί την είσοδο ή μη ενός χρήστη, στον πίνακα ελέγχου. Το απότελεσμα των ελέγχων μπορεί να είναι ένα από τα δύο λοιπόν. Οπότε η χρήση της εντολής exit() επιβάλλεται όταν ένας χρήστης δεν έχει πιστοποίηση και άρα του απαγορεύεται οποιαδήποτε ενέργεια.
print '<script type="text/javascript">top.window.location = "login.php";</script>';
exit();
Πλην της βασικής αυτής χρήσης όμως, υπάρχει και μία δεύτερη. Αυτή της φραγής ενός χρήστη, ο οποίος επιχειρεί να συνδεθεί ανεπιτυχώς, περισσότερες φορές από το επιτρεπόμενο όριο. Η εντολή exit() λοιπόν θα χρησιμοποιηθεί σε αυτές τις δύο περιπτώσεις και όχι κάθε φορά που γίνεται ανακατεύθυνση, καθώς αυτό θα παρεμβαλλόταν στην ομαλή λειτουργία της ταυτοποίησης και θα μπορούσε να καταστήσει τη σύνδεση προβληματική.

Φραγή χρήστη

Η φραγή χρήστη απαγορεύει σ'έναν χρήστη να έχει οποιαδήποτε πρόσβαση ακόμα και στην οθόνη εισόδου του συστήματος. Αυτό συμβαίνει οταν επιχειρεί να "σπάσει" την ασφάλεια του συστήματος, υποβάλλοντας επανειλλημένως στοιχεία που δεν ταυτοποιούνται. Στο αρχείο data_connect.php υπάρχουν αποθηκευμένες οι ιδιότητες ελέγχου της συγκεκριμένης λειτουργίας.
// Όριο αποτυχημένων προσπαθειών εισόδου στο σύστημα.
$block = 10;

// Διάρκεια φραγής εισόδου χρήστη σε λεπτά.
$unblock = 15;

// Διεύθυνση ip χρήστη
$user = $_SERVER['REMOTE_ADDR'];
Η διεύθυνση ip χρήστη χρησιμοποιείται γι'αναγνώριση του χρήστη και η διάρκεια φραγής εισόδου χρήστη, απενεργοποιεί τη φραγή μετά το πέρας του συγκεκριμένου χρόνου.


Καταγραφή δραστηριότητας και δεδομένων

Το αρχείο καταγραφής log.xml, χρησιμοποιείται στις εξής περιπτώσεις:

- Για λήψη γενικών πληροφοριών οι οποίες είναι: Ο συνολικός αριθμός των δημοσιεύσεων, ο συνολικός αριθμός των σελίδων, η ημερομηνία της τελευταίας αποτυχημένης προσπάθειας εισόδου στο σύστημα και η ημερομηνία τελευταίας ενημέρωσης των παραπάνω στοιχείων. Π.χ:
get_log('pages');
Η παραπάνω γραμμή εμφανίζει τον συνολικό αριθμό των σελίδων, για χρήση στον πίνακα ελέγχου.

- Για λήψη πληροφοριών λογαριασμού. Η λήψη πληροφοριών λογαριασμού μπορεί να γίνει με τη χρήση είτε του ονόματος χρήστη, είτε του αναγνωριστικού χρήστη. Το αναγνωριστικό χρήστη είναι ένας μοναδικός κωδικός ο οποίος αποθηκεύεται μαζί με τα υπόλοιπα στοιχεία του λογαριασμού. Π.χ:
get_account($_SESSION[userID])['rights'];
Η παραπάνω γραμμή μας δίνει τα "δικαιώματα" ενός συνδεδεμένου χρήστη, χρησιμοποιώντας ως παράμετρο το αναγνωριστικό χρήστη που βρίσκεται αποθηκευμένο στη συνεδρία. Να υπογραμμιστεί οτι το αναγνωριστικό χρήστη το οποίο αποθηκεύουμε στη μνήμη της συνεδρίας, αντιστοιχεί μεν στο όνομα χρήστη, αλλά δεν έχει καμία σχέση με τον κωδικό εισόδου στο σύστημα. Η γνωστοποίηση του αναγνωριστικού χρήστη δεν μπορεί να δώσει καμία πρόσβαση στον πίνακα ελέγχου χωρίς την ταυτοποίηση με τον κωδικό χρήστη και χρησιμοποιείται μόνο εφ'όσον ένας χρήστης έχει εισέλθει ήδη στο σύστημα.

- Για ενημέρωση των παραπάνω δεδομένων, δηλαδή των γενικών πληροφοριών και των πληροφοριών λογαριασμού χρήστη. Π.χ. Ο συνολικός αριθμός των δημοσιεύσεων γίνεται 12.:
update_log(posts,12);
Ο λογαριασμός χρήστη ενημερώνεται με τα τελευταία στοιχεία που δόθηκαν:
update_account($id,'set');
Ο λογαριασμός χρήστη διαγράφεται:
update_account($id,'delete');
Η μεταβλητή $id περιέχει το αναγνωριστικό χρήστη.


XML & HTM

Η αποθήκευση δεδομένων στο monocms γίνεται με τρεις τρόπους:

- Με εγγραφή σε αρχεία xml,
- Με εγγραφή σε αρχεία htm,
- Με προσωρινή αποθήκευση στη μνήμη της συνεδρίας.

Η αποθήκευση στη συνεδρία γίνεται μόνο για δεδομένα που αφορούν τον χρήστη του πίνακα ελέγχου και γίνεται προσωρινά, μέχρι να λήξει η συνεδρία, μέχρι δηλαδή ν'αποσυνδεθεί ο χρήστης. Τα αρχεία xml και htm είναι χρήσιμα για την αποθήκευση δεδομένων για δημοσιεύσεις και σελίδες, κειμένου, τίτλων, εικόνων κλπ. Συγκεκριμένα, προτιμάμε οι δημοσιεύσεις ν' αποθηκεύονται σε αρχεία xml, πλην του κυρίως μέρους, δηλαδή του κειμένου που ο χρήστης γράφει με τον επεξεργαστή κειμένου, το οποίο αποθηκεύεται σε ξεχωριστό αρχείο htm. Σε xml επίσης αποθηκεύεται η πλειοψηφία των δεδομένων μας, όπως οι λογαριασμοί χρηστών, τα δεδομένα του αρχείου καταγραφής καθώς και τα δεδομένα του αρχείου αποτυχημένων προσπαθειών εισόδου στο σύστημα.

Υπάρχουν διάφοροι λόγοι για τους οποίους μπορεί η αποθήκευση κώδικα html σε xml να θεωρηθεί κακή πρακτική, χωρίς ωστόσο να είναι σπάνιο. Γενικώς προτιμούμε ν'αποθηκεύουμε μόνο "καθαρό" κείμενο σε αρχεία xml και όχι κώδικα.

Από την άλλη πλευρά, η simpleXML μας βοηθάει κωδικοποιώντας και αποκωδικοποιώντας αυτόματα τους συχνότερους χαρακτήρες που συνταντώται στην html, όταν χρειάζεται να διαχειριστούμε αυτά τα αρχεία. Η αποθήκευση όμως ενός μεγάλου κειμένου που απαιτεί την κωδικοποίηση των χαρακτήρων της html,εκτός των άλλων σημαίνει και μεγαλύτερος όγκος δεδομένων. H παρακάτω γραμμή, περιέχει κώδικα html, ο οποίος σε περίπτωση αποθήκευσης σε xml, "διογκώνεται" με τον τρόπο που δείχνουμε στο 3ο παράδειγμα.

Αποτέλεσμα στον περιηγητή:
SimpleXML
Κώδικας html, αποθηκευμένος σε αρχείο htm, 48 χαρακτήρες:
&nbsp;&nbsp;<a href="#section-1-1">SimpleXML</a>
Κώδικας html, αποθηκευμένος σε αρχείο xml, 68 χαρακτήρες:
&amp;nbsp;&amp;nbsp;&lt;a href="#section-1-1"&gt;SimpleXML&lt;/a&gt;
Αυτό γίνεται λόγω απαγορευμένων χαρακτήρων στο xml οι οποίοι είναι : '&','<','>'και πρέπει να κωδικοποιηθούν.

Xml δημοσιεύσεων

Η κάθε δημοσίευση διαθέτει ένα xml αρχείο γι'αποθήκευση δεδομένων, καθώς κ'ένα όμοιο αρχείο, με τους χαρακτήρες "nu" μπροστά από την ονομασία του. Πχ, 145829963.xml & nu145829963.xml. Με αυτόν τον τρόπο μπορούμε ν'αποθηκεύουμε δύο εκδοχές του ίδιου άρθρου, μία δημοσιευμένη και μία τροποποιημένη. Στις σελίδες ωστόσο δεν ισχύει το ίδιο, καθώς μόνο η λειτουργία της αποθήκευσης είναι διαθέσιμη.

Οι ονομασίες των αρχείων xml που αποθηκεύουν τα δεδομένα των δημοσιεύσεων και των σελίδων, προέρχονται από την ημερομηνία δημιουργίας τους.
<input type="text" id="uuid" name="uniqueid" value="<?php
if(isset($osbase))
    print $osbase;
else
 echo time()
?>" form="mainform" hidden>

Λογαριασμοί

Οι λογαριασμοί χρήστη επιτρέπουν σε πολλαπλούς χρήστες να εισέλθουν στον πίνακα ελέγχου με το προσωπικό τους όνομα χρήστη και κωδικό. Υπάρχουν δύο είδη λογαριασμού που διακρίνονται βάσει δικαιωμάτων διαχείρισης:

- Ο λογαριασμός διαχειριστή,
- Ο λογαριασμός συντάκτη.

Ως διαχειριστής, ο χρήστης έχει πλήρη δικαιώματα πρόσβασης στον πίνακα ελέγχου. Ο χρήστης με δικαιώματα συντάκτη, έχει πρόσβαση που περιορίζεται στην δημιουργία δημοσιεύσεων και σε κάποιες προσωπικές ρυθμίσεις. Όσον αφορά τη διαχείριση λογαριασμών, ισχύουν οι εξής γενικοί κανόνες:

- Μόνο ο χρήστης με δικαιώματα διαχειριστή έχει πρόσβαση στη διαχείριση λογαριασμών.
- Κάθε διαχειριστής, μπορεί να δημιουργεί και να διαγράφει λογαριασμούς άλλων διαχειριστών και συντακτών.
- Ένας λογαριασμός διαχειριστή, μπορεί να μετατραπεί σε λογαριασμό συντάκτη και αντιστρόφως.
- Ο διαχειριστής μπορεί να διαγράψει τον δικό του λογαριασμό.
- Ο τελευταίος λογαριασμός διαχειριστή, δεν μπορεί να διαγραφεί, ούτε να υποβιβαστεί σε λογαριασμό συντάκτη.


Σελίδες επισκεπτών

Οι σελίδες επισκεπτών βρίσκονται στον αρχικό κατάλογο του ιστοτόπου και στους καταλόγους των δημοσιεύσεων. Οι σελίδες αυτές βασίζονται σε πρότυπα σελίδων, τα οποία τροποποιούνται από τους χρήστες του πίνακα ελέγχου. Οι σελίδες επισκεπτών που το monocms αποθηκεύει, είναι αρχεία με επεκτάσεις .php και είναι τρεις: Η αρχική σελίδα, η απλή σελίδα και η δημοσίευση. Ως απλή σελίδα εννοούμε μία οποιαδήποτε σελίδα του αρχικού καταλόγου, πλην της αρχικής σελίδας, συνήθως με στατικό περιεχόμενο, όπως μία σελίδα με γενικές πληροφορίες για τον ιστότοπο ή μία σελίδα επικοινωνίας, ενώ οι σελίδες δημοσιεύσεων είναι αυτές που το περιεχόμενό τους εμφανίζεται αυτόματα στη ροή της αρχικής σελίδας.
Αυτές οι σελίδες φορτώνουν δεδομένα από τα αποθηκευμένα αρχεία του συστήματος. Η παρακάτω γραμμή φορτώνει τον τίτλο ιστοτόπου,
load_settings()['title'];
Η περιγραφή ιστοτόπου,
load_settings()['description'];
Το μενού περιήγησης,
load_settings()['navigation'];
Στο αρχείο set-general.php βρίσκονται όλες οι πιθανές χρήσεις της λειτουργίας load_settings():
$page_settings = array("title" => $set->general->title ,
                       "description" => $set->general->description ,
                       "results-per-page" => $set->general->indexposts->results ,
                       "lastmodified" => $set->general->indexposts->lastmod ,
                       "navigation" => $set->general->navigation ,
                       "dates" => $set->general->dateshow
);
Στο αρχείο en_code.php βρίσκονται επιπλέον λειτουργίες για τη φόρτωση δεδομένων και επεξεργασία ενός string, για κάθε χρήση, εντός ή εκτός πίνακα ελέγχου. Ένα string αποτελείται από χαρακτήρες που χρησιμοποιούνται ως απλό κείμενο μέσα στον κώδικα PHP, και συνήθως περικλείονται από τους χαρακτήρες ' ' ή " ", τα γνωστά στο διαδίκτυο, μονά ή διπλά εισαγωγικά.

Παράδειγμα φόρτωσης των περιεχομένων της 'meta' περιγραφής μίας σελίδας:
load_meta_description($des);
Φόρτωση στοιχείων όπως π.χ html, από το xml:
load_xml($str);
Φόρτωση των περιεχομένων ενός αρχείου htm:
load_htm($file);
Απλή αφαίρεση των ταμπέλων(tags), με τη χρήση του strip_tags().
remove_tags($str);

Άλλες λειτουργίες

load_navigation();
Με την εντολή αυτή, το σύστημα φορτώνει τον κώδικα περιήγησης στον ιστότοπο, αλλά μόνο στον αρχικό κατάλογο. Οι σελίδες που δημιουργούνται από το σύστημα μπορούν να περιληφθούν στην περιήγηση, με την επιλογή "προσθήκη συνδέσμου περιήγησης" που βρίσκεται στη σελίδα δημιουργίας περιεχομένου σελίδας. Αν η προεπιλεγμένη περιήγηση είναι ενεργοποιημένη στις γενικές ρυθμίσεις, τότε οι σελίδες με ενεργοποιημένη τη συγκεκριμένη επιλογή, περιλαμβάνονται στην περιήγηση. Αν η προεπιλεγμένη περιήγηση είναι απενεργοποιημένη, φορτώνεται αυτόματα το περιεχόμενο της "Δημιουργίας περιήγησης" που βρίσκεται στη σελίδα "Επεξεργασία".
load_navigation('post');
Η ίδια λειτουργία με την προσθήκη της παραμέτρου post, χρησιμοποιείται στο πρότυπο δημοσίευσης, για να φορτώσει την περιήγηση.


Μορφοποίηση

Η μορφοποίηση των παραπάνω τριών σελίδων επηρεάζει συνολικά την εμφάνιση του ιστοτόπου. Η επεξεργασία αυτή γίνεται πολύ εύκολα με τροποποίηση στον κώδικα HTML και στο αρχείο μορφοποίησης style.css. Τα περισσότερα στοιχεία php, στα αρχεία με την ίδια επέκταση(.php), περιλαμβάνουν τα αντίστοιχα σχόλια, ώστε ο χρήστης να γνωρίζει τον σκοπό για τον οποίο ο συγκεκριμένος κώδικας τοποθετήθηκε στο συγκεκριμένο σημείο. Τα υπόλοιπα αποτελούν κώδικα HTML τον οποίο ο χρήστης μπορεί να τροποποιήσει όπως επιθυμεί. Διατηρώντας ανέπαφα τα στοιχεία php στον κώδικα, η λειτουργικότητα της σελίδας δεν επηρρεάζεται. Κάθε στοιχείο php ξεκινά με τους χαρακτήρες '<?php ' και ολοκληρώνεται με τους χαρακτήρες ' ?>'. Π.χ:
<?php load_settings()['title']; ?>
Αν θέλουμε να προσθέσουμε στοιχεία κώδικα, όπως π.χ ένα στοιχείο <div></div> ως περιέκτη του τίτλου ιστοτόπου, τότε ο παρακάτω κώδικας:
<h1><?php load_settings()['title'] ?></h1>
θα γίνει:
<div id="heading"><h1><?php load_settings()['title'] ?></h1></div>
χωρίς να επηρρεάζεται η ομαλή λειτουργία της σελίδας.

Αν επιθυμούμε ν'απομακρύνουμε εντελώς τη λειτουργία της αυτόματης φόρτωσης του τίτλου ιστοτόπου, τότε ο τίτλος ιστοτόπου θα ορίζεται με απ'ευθείας επέμβαση στον κώδικα στη σελίδα "Επεξεργασία" και δεν θα εξαρτάται από τον τίτλο που γράφουμε και αποθηκεύουμε στις "Ρυθμίσεις". Δηλαδή θα μπορούσε να έχει τη μορφή:
<div id="heading"><h1>Νέος τίτλος</h1></div>
Όπως βλέπουμε, σε αυτό το παράδειγμα, λείπει εντελώς ο κώδικας PHP, ο οποίος φορτώνει αυτόματα τον τίτλο ιστοτόπου.

Αυτόματη φόρτωση HTML

Εκτός του κώδικα html ο οποίος είναι αποθηκευμένος στα πρότυπα, υπάρχει κώδικας html ο οποίος παράγεται αυτόματα από τα αρχεία του συστήματος και εμφανίζεται τόσο στον πίνακα ελέγχου, όσο και στις σελίδες που βλέπουν οι επισκέπτες.

Στο αρχείο set-posts.php, υπάρχει το παρακάτω στοιχείο '<div></div>' με την ιδιότητα class="post-date":
<div class="post-date">'.time_el($post_time).'</div>
Η γραμμή αυτή μεταφράζει την ημερομηνία, από τις προεπιλεγμένες τιμές της PHP στ'αγγλικά, στα ελληνικά. Η τιμή της ιδιότητας, post-date, μπορεί να αλλάξει εμφάνιση, με επεξεργασία της αντίστοιχης κλάσης στο αρχείο style.css.

Με παρόμοιο τρόπο εμφανίζονται τα αποτελέσματα στους καταλόγους του πίνακα ελέγχου, όπως το σύνολο των δημοσιεύσεων και των σελίδων ή το σύνολο των λογαριασμών, τα οποία εμφανίζονται σε πίνακες, μορφοποιημένους με html και css. Τα αντίστοιχα αρχεία περιέχουν τον κώδικα html, ενώ το αρχείο cmstyle.css περιλαμβάνει τη μορφοποίηση του συνόλου του πίνακα ελέγχου.

Όπως βλέπουμε, ο κώδικας html υπάρχει σε δύο επίπεδα. Στα αρχεία του συστήματος, και στα πρότυπα που είναι διαθέσιμα προς επεξεργασία, άμεσα, από τον πίνακα ελέγχου. Αν ο χρήστης το επιθυμεί όμως, μπορεί να τροποποιεί τα αρχεία συστήματος, με προσοχή και χωρίς να επηρρεάζει τον κώδικα PHP, ώστε ο παραγόμενος κώδικας html να παίρνει την επιθυμητή μορφή.

Γράφοντας μία δημοσίευση

Η σελίδα δημιουργίας δημοσίευσης περιέχει τα εξής στοιχεία: τίτλος, περιγραφή, ονομασία αρχείου και κυρίως κείμενο.
Ο τίτλος που ο χρήστης συμπληρώνει, αποθηκεύεται ως τίτλος της σελίδας αλλά και ως επικεφαλίδα του δημοσιευμένου άρθρου. Αν μείνει κενός, τότε και τα δύο δεδομένα θα μείνουν κενά. Αν ο χρήστης επιθυμεί να χρησιμοποιήσει διαφορετικό τίτλο σελίδας και επικεφαλίδα, τότε μπορεί να γράψει τον τίτλο που επιθυμεί, για να χρησιμοποιηθεί ως τίτλος σελίδας και από την "Επεξεργασία", να αφαιρέσει την παρακάτω γραμμή από το πρότυπο δημοσίευσης:
echo load_settings()['title']
Με αυτόν τον τρόπο ο τίτλος δεν θα εμφανιστεί στο κείμενο. Ο χρήστης μπορεί να συμπληρώσει τον δικό του τίτλο, στο κυρίως κείμενο της εκάστοστε δημοσίευσης. Π.χ:
<h1>Νέος τίτλος</h1>
Η περιγραφή της δημοσίευσης αποθηκεύεται ως meta περιγραφή της σελίδας:
<meta name="description" content="Μία σύντομη περιγραφή σελίδας, που γράφτηκε απ'τον πίνακα ελέγχου">
Η δημοσίευση αποθηκεύεται με την ονομασία αρχείου, την οποία ο χρήστης συμπληρώνει προαιρετικά. Αν δεν συμπληρωθεί από τον χρήστη, συμπληρώνεται αυτόματα από το σύστημα. Συνήθως όμως η ονομασία αρχείου παίζει ρόλο στην κατάταξη της σελίδας στη μηχανή αναζήτησης, συνεπώς προτιμάμε μία ονομασία αρχείου με συγκεκριμένο νόημα π.χ "sxetika-me-emas", ώστε οι επισκέπτες να αντιλαμβάνονται ευκολότερα το περιεχόμενό μας. Επιπλέον, επιτρέπονται μόνο λατινικοί χαρακτήρες, ενώ η επέκταση του αρχείου συμπληρώνεται αυτόματα.

Το κυρίως κείμενο αποτελεί το σημαντικότερο μέρος μιας δημοσίευσης και περιέχει όλες τις χρήσιμες πληροφορίες του ιστοτόπου μας. Γι' αυτό τον σκοπό είναι διαθέσιμος ο επεξεργαστής κειμένου και html, ο οποίος διαθέτει τη δυνατότητα προβολής, τόσο του κειμένου, όσο και του κώδικα, ενώ περιλαμβάνει και λειτουργίες μορφοποίησης και επεξεργασίας, όπως πχ προσθήκη συνδέσμων ή εικόνων, με εισαγωγή διεύθυνσης, εισαγωγή στοιχείων html κλπ.

Αντίγραφα ασφαλείας

Οι περισσότεροι εξυπηρετητές διατηρούν αυτόματα αντίγραφα ασφαλείας για κάθε ιστοσελίδα που φιλοξενούν. Αν ο χρήστης επιθυμεί να διατηρήσει ένα αντίγραφο στον υπολογιστή του, μπορεί να κάνει λήψη του φακέλου εγκατάστασης του monocms. Πιο συγκεκριμένα αναλύονται οι παρακάτω φάκελοι:

/monofiles/autosaves/: Περιέχει τις πληροφορίες των δημοσιεύσεων.

/monofiles/savedpages/: Περιέχει τις πληροφορίες των σελίδων.

/monofiles/filesinfo/: Περιέχει τις πληροφορίες των λογαριασμών όλων των χρηστών και την καταγραφή της δραστηριότητας.

Μεταφορά συστήματος

Για να μεταφέρουμε και να εγκαταστήσουμε το monocms σε διαφορετικό εξυπηρετητή, αρκεί ν' αντιγράψουμε και να μεταφέρουμε το σύνολο των αρχείων στον κατάλογο ενός νέου χώρου φιλοξενίας. ΠΡΟΣΟΧΗ: Αν θέλουμε να συγχωνεύσουμε δύο ξεχωριστές εγκαταστάσεις σε μία, αυτό δεν είναι εφικτό με απλή αντιγραφή και μεταφορά αρχείων. Για λόγους ασφαλείας, προτείνεται η εκ νέου δημιουργία λογαριασμού χρήστη και όχι η συγχώνευση.

Αν και δεν υπάρχει καμία εγκατεστημένη διαδικασία, η μεταφορά σελίδων και δημοσιεύσεων από ένα σύστημα σε άλλο, μπορεί να επιτευχθεί με απλή μεταφορά των αρχείων στους φακέλους /monofiles/autosaves/ για τις δημοσιεύσεις και /monofiles/savedpages/για τις σελίδες, αρκεί να μην συμπίπτουν οι ονομασίες αρχείων. Σε αυτή την περίπτωση υπάρχει ο κίνδυνος να χαθούν πολύτιμα δεδομένα και γι'αυτό δεν προτείνεται.

Ενημέρωση συστήματος

Η ενημέρωση σε μία νεότερη έκδοση του MonoCMS γίνεται όπως και η εγκατάσταση, με λήψη του πακέτου από τον επίσημο ιστότοπο. Ωστόσο η ενημέρωση από παλαιότερη έκδοση σε μία νεότερη, από την έκδοση 2.4 και μετά, δεν απαιτεί τη μεταφορά όλων των αρχείων στην ιστοσελίδα, αλλά μόνο των αρχείων που βρίσκονται στον φάκελο "monofiles", εκτός κι αν ανακοινωθεί διαφορετικός τρόπος.

Θέματα στο MonoCMS

Με την έλευση της έκδοσης 3.0, η διαχειριση θέματος άλλαξε ριζικά. Το MonoCMS πλέον δεν υποστηρίζει πολλαπλά θέματα. Ο χρήστης δεν επιλέγει θέμα από τις ρυθμίσεις, αλλά μπορεί να μεταβάλλει τη διάταξη της σελίδας, από τη σελίδα θέματος. Με αυτόν τον τρόπο, ο χρήστης επικεντρώνεται περισσότερο στο περιεχόμενο της ιστοσελίδας του και διευκολύνεται στη διαμόρφωση της εμφάνισης.

Σφάλματα και προβλήματα στη χρήση του Monocms

Ασυμβατότητα monocms - Στόχευση σε iframe για IE & Edge

Η μέθοδος η οποία χρησιμοποιείται γι'αποθήκευση δημοσιεύσεων και σελίδων, περιλαμβάνει τη χρήση iframe:
<iframe name="resultt" id="result" src="post.php" onload="iframeLoad();"></iframe>
Η φόρμα μας καταχωρεί τα δεδομένα της στο iframe:
<form action="post.php" method="post" id="mainform" target="resultt"></form>
Η συγκεκριμένη λειτουργία ολοκληρώνεται σωστά στους περισσότερους περιηγητές, όχι όμως στους Internet Explorer και Edge. Στους περιηγητές της Microsoft, η στόχευση δεν λειτουργεί και τα δεδομένα δεν καταχωρούνται, διότι δεν μπορεί να γίνει καμία ενέργεια μέσω του αρχείου του οποίου ζητάμε να διαχειριστεί τη φόρμα μας. Οι δημοσιεύσεις και οι σελίδες δεν μπορούν να δημιουργηθούν ή να τροποποιηθούν, επομένως το monocms δεν είναι "συμβατό" με τους συγκεκριμένους περιηγητές.

Υπάρχουν αναφορές για περιπτώσεις όπου η καταχώριση μπορεί να γίνει επιτυχώς, αλλά με άνοιγμα νέας καρτέλας ή παραθύρου. Η λύση ωστόσο που συνιστάται είναι η χρήση PHP και όχι Javascript, για δύο λόγους.
Πρώτον, διότι δεν είναι βέβαιο οτι υπάρχει κοινή λύση Javascript για όλες τις εκδόσεις των περιηγητών και ειδικά των πιο προσφάτων εκδόσεων και δεύτερον, γιατί η επιμονή του κατασκευαστή να μην υποστηρίζει τη στόχευση σε iframe, δείχνει οτι πρόκειται περισσότερο για επιλογή, παρά για σφάλμα, όπως συχνά χαρακτηρίζεται στο διαδίκτυο. Πιθανόν η μη χρήση iframe, να είναι η ιδανικότερη λύση. Προτείνεται η χρήση των περιηγητών Chrome, Firefox και Safari.

Αδυναμία διαγραφής αρχείου εικόνας

Το monocms έχει παρουσιάσει προβλήματα στη διαχείριση αρχείων εικόνας, οι ονομασίες των οποίων περιέχουν τον χαρακτήρα "+". Συγκεκριμένα, σε ορισμένες περιπτώσεις, η διαγραφή του αρχείου από τον πίνακα ελέγχου δεν μπορεί να ολοκληρωθεί.

Προτείνεται η χρήση αρχείων που δεν περιέχουν τον συγκεκριμένο χαρακτήρα ή η μετονομασία τους από τον χρήστη.


Τελευταία τροποποίηση στις 22 Ιουνίου, 2017.