philos Δημοσ. 27 Μαΐου 2018 Δημοσ. 27 Μαΐου 2018 (επεξεργασμένο) Λοιπόν, έχουμε ένα σύστημα που πρέπει να τσεκάρει αν ο χρήστης πληρεί δύο προϋποθέσεις σε ένα forum ώστε να του εμφανιστεί μια σημείωση κι εν συνεχεία ένα no permission message. Η μία προϋπόθεση είναι ο αριθμός μηνυμάτων του και η άλλη προϋπόθεση οι μέρες που έχει κάνει register σε ένα site. Τα admin control panel settings είναι τα εξής: Ένα με varname sc_limit_pm_vm_and_or (παίρνει τιμές "and" ή "or"). Όταν είναι and σημαίνει ότι αν δεν πληρούνται και οι δύο προυποθέσεις, τότε εμφάνισε το notice. Αν είναι or, σημαίνει ότι αν ικανοποιείται έστω μια από τις δύο προϋποθέσεις, τότε ΝΑ ΜΗΝ εμφανίζεται το notice. Ένα με varname sc_limit_pm_vm_posts που είναι ο ελάχιστος αριθμός μηνυμάτων (πρώτη προϋπόθεση) δλδ ένας integer που ορίζεις στο admin control panel. Ένα με varname sc_limit_pm_vm_days που είναι οι ελάχιστες ημέρες εγγραφής (δεύτερη προϋπόθεση), δλδ ένας integer που ορίζεις στο admin control panel. Το TIMENOW constant θεωρήστε ότι είναι η τρέχουμε unix timestamp, όπως ορίζεται στην time(); Στέκει ο κώδικάς μου παιδιά; Τον είχα ενεργοποιήσει πριν μήνες, αλλά είχα λάβει report από μέλος ότι ενώ πληρούσε τα κριτήρια, του εμφανιζόταν το notice (βασικά βάσει αυτού του κώδικα - αλγορίθμου, εμφανίζω και no permission messages). Ορίστε ο κώδικας: $can_use_pm_and = (bool) !($vbulletin->options['sc_limit_pm_vm_posts'] < $vbulletin->userinfo['posts'] AND $vbulletin->options['sc_limit_pm_vm_days'] < intval((abs($vbulletin->userinfo['joindate'] - TIMENOW)/60/60/24))); $can_use_pm_or = (bool) ($vbulletin->options['sc_limit_pm_vm_posts'] > $vbulletin->userinfo['posts'] OR $vbulletin->options['sc_limit_pm_vm_days'] > intval((abs($vbulletin->userinfo['joindate'] - TIMENOW)/60/60/24))); if ($vbulletin->options['sc_limit_pm_vm_and_or'] == 'and' AND $can_use_pm_and) { $show['sc_limit_pm_vm_notice'] = true; } else if ($vbulletin->options['sc_limit_pm_vm_and_or'] == 'or' AND $can_use_pm_or) { $show['sc_limit_pm_vm_notice'] = true; } Επεξ/σία 27 Μαΐου 2018 από philos
NoD Δημοσ. 5 Ιουνίου 2018 Δημοσ. 5 Ιουνίου 2018 (επεξεργασμένο) Αποκλείεται να δουλεύει όπως περιμένεις γιατί καταρχήν χρησιμοποιείς AND και OR που έχουν χαμηλότερο precedence από το = που σημαίνει ότι η τιμή που θα έχουν οι μεταβλητές σου θα είναι ότι τιμή έχει το πρώτο condition. Δοκίμασε && και || αντίστοιχα. Άκυρο είδα τις παρενθέσεις, sorry βλέπω τον κώδικα από κινητό. Επεξ/σία 5 Ιουνίου 2018 από NoD
elvizakos Δημοσ. 21 Ιουνίου 2018 Δημοσ. 21 Ιουνίου 2018 Για αρχή δεν χρειάζεσαι τον τελεστή bool γιατί το AND θα επιστρέψει true ή false έτσι κι αλλιώς. Επίσης, αυτό: intval((abs($vbulletin->userinfo['joindate'] - TIMENOW)/60/60/24)) θα μπορούσε να γραφτεί: ((int) ((TIMENOW - $vbulletin->userinfo['joindate']) / 86400)) (αν και δε νομίζω πως σε νοιάζει και πολύ αν θα είναι float ή integer). Και τώρα: όπως το έχεις, αν το $vbulletin->options['sc_limit_pm_vm_and_or'] έχει τιμή "and" , τότε το $show['sc_limit_pm_vm_notice'] θα πάρει τιμή true αν τα post του μέλους είναι λιγότερα από το όριο των post Ή οι μέρες από το join του, είναι λιγότερες από το όριο. Αν θέλεις το $show['sc_limit_pm_vm_notice'] να πάρει τιμή true στην περίπτωση που τα post του μέλους είναι περισσότερα από το όριο των post ΚΑΙ οι μέρες από το join του, είναι περισσότερες από το όριο, τότε θα πρέπει να αφαιρέσεις το "!" από την έκφρασή σου. Αν θέλεις το $show['sc_limit_pm_vm_notice'] να πάρει τιμή true στην περίπτωση που τα post του μέλους είναι λιγότερα από το όριο των post ΚΑΙ οι μέρες από το join του, είναι λιγότερες από το όριο, τότε θα πρέπει να αλλάξεις το AND σε OR. Τέλος εγώ θα το έφτιαχνα κάπως έτσι: <?php switch ($vbulletin->options['sc_limit_pm_vm_and_or']){ case 'and': if ( ( ($vbulletin->userinfo["posts"] > $vbulletin->options["sc_limit_pm_vm_posts"]) // Αν τα post είναι περισσότερα από το όριο && // και ($vbulletin->options['sc_limit_pm_vm_days'] < ((int)(($TIMENOW - $vbulletin->userinfo['joindate']) / 86400))) // Ο χρόνος από την δημιουργία λογαριασμού (σε ημέρες) είναι μεγαλύτερος από το όριο ) ) $show['sc_limit_pm_vm_notice'] = true; break; case 'or': if ( ( ($vbulletin->userinfo["posts"] < $vbulletin->options["sc_limit_pm_vm_posts"]) // Αν τα post είναι λιγότερα από το όριο || // ή ($vbulletin->options['sc_limit_pm_vm_days'] < ((int)(($TIMENOW - $vbulletin->userinfo['joindate']) / 86400))) // Ο χρόνος από την δημιουργία λογαριασμού (σε ημέρες) είναι μικρότερος από το όριο ) ) $show['sc_limit_pm_vm_notice'] = true; break; } ?>
ktf Δημοσ. 23 Ιουνίου 2018 Δημοσ. 23 Ιουνίου 2018 Το πρόβλημά σου είναι ότι ο operator που συγκρίνει τις ημέρες είναι reversed σε μία από τις 2 περιπτώσεις. Γενικά ο κώδικας αυτός είναι πολύ δυσανάγνωστος και είναι λογικό τα bugs να μην είναι τόσο προφανή. Μια πιο verbose λύση, που είναι πιο αναγνώσιμη: $permissions_rule = $vbulletin->options['sc_limit_pm_vm_and_or']; $post_limit = $vbulletin->options['sc_limit_pm_vm_posts']; $account_age_limit = $vbulletin->options['sc_limit_pm_vm_days']; $user_post_count = $vbulletin->userinfo['posts']; $user_join_date = $vbulletin->userinfo['joindate']; $day = 60 * 60 * 24; $permission_denied = false; $account_age = ($user_join_date - TIMENOW) / $day; $too_many_posts = $user_post_count > $post_limit; $fresh_account = $account_age < $account_age_limit; if ($permissions_rule === 'and') { $permission_denied = $too_many_posts && $fresh_account; } else if ($permissions_rule === 'or') { $permission_denied = $too_many_posts || $fresh_account; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα