Elxis CMS Forum

Ελληνικό Forum => Γενικά Θέματα για το Elxis CMS => Topic started by: michalis1984 on February 01, 2014, 16:13:04

Title: Σύγκριση ημ. δημιουργίας και ημ. επεξεργασίας
Post by: michalis1984 on February 01, 2014, 16:13:04
Σε ένα content plugin θα ήθελα να εμφανίζεται κάτι μόνο όταν η ημερομηνία επεξεργασίας είναι μεγαλύτερη απο μια συγκεκριμένη (σταθερή) περίοδο σε σύγκριση με την ημερομηνία δημιουργίας.

Ας υποθέσουμε ότι θέλουμε να γίνεται αυτό όταν η ημερομηνία επεξεργασίας είναι 3 μέρες+ απο την ημερομηνία δημιουργίας κάποιου άρθρου.

Παίρνουμε τις 2 ημερομηνίες
eFactory::getDate()->formatDate($article->created, $eLang->get($date_format_long));
eFactory::getDate()->formatDate($article->modified, $eLang->get($date_format_long))

Πως όμως θα τις συγκρίνουμε;

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

δηλ. 24/5/2010 - 20/3/2000 με αφαίρεση μας δίνει 24-20=4

Μήπως ξέρετε πως μπορώ να κάνω σωστά τη σύγκριση;

Επίσης με τον ίδιο τρόπο θα μπορούσα να συγκρίνω την τρέχουσα ημερομηνία, με την ημερομηνία δημοσίευσης για να εμφανίζω πχ. ένα σύμβολο "new" για όλα τα άρθρα που έχουν δημισθευτεί τις τελευταίες 24 ώρες.
Title: Re: Σύγκριση ημ. δημιουργίας και ημ. επεξεργασίας
Post by: datahell on February 01, 2014, 21:31:26
Θα πρέπει να συγκρίνεις τις ημερομηνίες πρωτού τις μορφοποιήσεις. Η μορφοποιημένη ημερομηνία θα πρέπει να χρησιμοποιείται ΜΟΝΟ για εμφάνιση στον χρήστη, όχι για υπολογισμούς.

Το Elxis αποθηκεύει τις ημερομηνίες στα άρθρα σε στάνταρ μορφή YYYY-mm-dd hh:ii:ss και ΠΑΝΤΑ στη χρονική ζώνη GMT. Ο πιο εύκολος και απροβλημάτιστός τρόπος να συγκρίνεις δύο τέτοιες ημερομηνίες είναι να τις μετατρέψεις σε timestamp με την συνάρτηση strtotime. Προσοχή: αν ένα άρθρο δεν έχει τροποιηθεί ποτέ η ημερομηνία τροποποίησης είναι η 1970-01-01 00:00:00, εσύ πρέπει να αποκλείσεις αυτά τα άρθρα.

Ας υποθέσουμε ότι θες η διαφορά τους να είναι το λιγότερο 3 ημέρες, αυτό μεταφράζεται σε 259200 δευτερόλεπτα (3 x 86400).

$modified_more = false;
if ($row->modified != '1970-01-01 00:00:00') {
   $dt = strtotime($row->modified) - strtotime($row->created);
    if ($dt >= 259200) { $modified_more = true; }
}

Φαντάζομαι κατανοείς ότι το παραπάνω δεν σου δίνει τα νέα ή τα παλιά άρθρα αλλά μόνο όσα μεταξύ της ημερομηνίας δημιουργίας και τροποιήσης μεσολαβούν τουλάχιστον 3 ημέρες (δεν βλέπω που μπορεί να είναι χρήσιμο αυτό...)

Το τρέχον timestamp το παίρνεις έτσι:
$ts = time();
ή έτσι:
$eDate = eFactory::getDate();
$ts = $eDate->getTS();

Για μορφοποίηση ενός timestamp και εμφάνιση στον χρήστη στην επιλεγμένη ζώνη ώρας του:
$eDate->formatTS($ts);

Αν θες να αλλάξεις την default μορφοποίηση έχεις 13 επιλογές (DATE_FORMAT_1 ως DATE_FORMAT_13 - δες τα κύρια αρχεία γλώσσας):
$eDate->formatTS($ts, $eLang->get('DATE_FORMAT_4'));

Αν θες να εμφανίσεις την ημερομηνία όχι στην ζώνη ώρας του χρήστη αλλά σε αυτή του συστήματος (GMT):
$eDate->formatTS($ts, $eLang->get('DATE_FORMAT_4'), false);

Αν θες να πάρεις τα νέα άρθρα θα δουλέψεις μόνο με την ημερομηνία created. Σε αυτή την περίπτωση δεν χρειάζεται να κάνεις κάποιο υπολογισμό. Απλά στο query προς την database κάνε φθίνουσα ταξινόμηση κατά ημερομηνία δημιουργίας (ORDER BY created DESC).

Η βιβλιοθήκη elxisDate έχει πολλές βοηθητικές συναρτήσεις, άνοιξέ την και δες την.
includes/libraries/elxis/date.class.php
Title: Re: Σύγκριση ημ. δημιουργίας και ημ. επεξεργασίας
Post by: michalis1984 on February 01, 2014, 23:08:43
Πολύ επεξηγηματικός όπως πάντα. Με βοήθησες αρκετά datahell.

Σε ευχαριστώ.