मैं अपनी साइट पर उपयोग के लिए उपलब्धि प्रणाली तैयार करने का सबसे अच्छा तरीका सोच रहा हूं। डेटाबेस संरचना Best way to tell 3 or more consecutive records missing पर पाई जा सकती है और यह धागा वास्तव में डेवलपर्स के विचार प्राप्त करने का एक विस्तार है।उपलब्धियों को कोड करने का सबसे अच्छा तरीका
इस वेबसाइट पर बैज/उपलब्धि सिस्टम के बारे में बहुत सी बातों के साथ मेरी समस्या यह है कि - यह सब बात है और कोई कोड नहीं है। वास्तविक कोड कार्यान्वयन उदाहरण कहां है?
मैं यहां एक ऐसा डिज़ाइन प्रस्तावित करता हूं जो मुझे उम्मीद है कि लोग योगदान दे सकते हैं और उम्मीद है कि विस्तारित उपलब्धि प्रणाली कोडिंग के लिए एक अच्छा डिज़ाइन तैयार कर सकते हैं। मैं यह नहीं कह रहा हूं कि यह सबसे अच्छा है, इससे दूर है, लेकिन यह एक संभावित प्रारंभिक ब्लॉक है।
कृपया अपने विचारों का योगदान करने के लिए स्वतंत्र महसूस करें।
अपने सिस्टम डिजाइन विचार
ऐसा लगता है आम सहमति एक "घटना आधारित प्रणाली" बनाने के लिए है - जब भी एक ज्ञात घटना एक पोस्ट बनाया जाता है, नष्ट कर दिया की तरह होता है, आदि यह कहता है इसलिए जैसे घटना वर्ग ..
$event->trigger('POST_CREATED', array('id' => 8));
घटना वर्ग तो पता चल गया क्या बैज इस घटना के लिए "सुन" रहे हैं, तो यह requires
कि फाइल है, और इसलिए की तरह, उस वर्ग का एक उदाहरण बनाता है:
require '/badges/' . $file;
$badge = new $class;
फिर यह trigger
कहलाते समय प्राप्त डेटा को पास करने वाली डिफ़ॉल्ट घटना को कॉल करता है;
$badge->default_event($data);
बैज
यह तो जहां असली जादू होता है। बैज को सम्मानित किया जाना चाहिए या नहीं, यह निर्धारित करने के लिए प्रत्येक बैज की अपनी क्वेरी/तर्क होता है। प्रत्येक बैज उदा। इस प्रारूप:
class Badge_Name extends Badge
{
const _BADGE_500 = 'POST_500';
const _BADGE_300 = 'POST_300';
const _BADGE_100 = 'POST_100';
function get_user_post_count()
{
$escaped_user_id = mysql_real_escape_string($this->user_id);
$r = mysql_query("SELECT COUNT(*) FROM posts
WHERE userid='$escaped_user_id'");
if ($row = mysql_fetch_row($r))
{
return $row[0];
}
return 0;
}
function default_event($data)
{
$post_count = $this->get_user_post_count();
$this->try_award($post_count);
}
function try_award($post_count)
{
if ($post_count > 500)
{
$this->award(self::_BADGE_500);
}
else if ($post_count > 300)
{
$this->award(self::_BADGE_300);
}
else if ($post_count > 100)
{
$this->award(self::_BADGE_100);
}
}
}
award
समारोह एक विस्तारित वर्ग Badge
जो मूल रूप से देखने के लिए उपयोगकर्ता पहले से ही, कि बिल्ला से सम्मानित किया गया है, अगर नहीं, बिल्ला db तालिका अद्यतन करेगा की जाँच करता है से आता है। बिल्ला वर्ग भी आदि एक उपयोगकर्ता के लिए सभी बैज पुन: प्राप्त करने और एक सरणी में यह लौटने का ख्याल रखता है (ताकि बैज जैसे हो सकता है उपयोगकर्ता प्रोफ़ाइल पर प्रदर्शित)
क्या है जब सिस्टम बहुत पहले एक पहले से ही लागू किया गया है के बारे में लाइव साइट?
एक "क्रॉन" नौकरी क्वेरी भी है जिसे प्रत्येक बैज में जोड़ा जा सकता है। इसका कारण यह है कि जब बैज सिस्टम को पहले लागू किया जाता है और इनिटिलाइज्ड किया जाता है, तो बैज जिन्हें पहले ही अर्जित किया जाना चाहिए था, अभी तक सम्मानित नहीं किया गया है क्योंकि यह एक घटना आधारित प्रणाली है। तो प्रत्येक बैज के लिए मांग की जाने वाली किसी भी चीज को देने के लिए एक सीआरओएन नौकरी की मांग चल रही है।
class Badge_Name_Cron extends Badge_Name
{
function cron_job()
{
$r = mysql_query('SELECT COUNT(*) as post_count, user_id FROM posts');
while ($obj = mysql_fetch_object($r))
{
$this->user_id = $obj->user_id; //make sure we're operating on the right user
$this->try_award($obj->post_count);
}
}
}
ऊपर क्रॉन वर्ग मुख्य बिल्ला वर्ग फैली रूप में, यह तर्क समारोह try_award
कारण फिर से उपयोग कर सकते हैं कारण है कि मैं एक विशेष बनाने के लिए: उदाहरण के लिए ऊपर के लिए क्रॉन जॉब कैसा लगेगा इसके लिए पूछताछ हालांकि हम पिछले घटनाओं, यानी "अनुकरण" कर सकते हैंप्रत्येक उपयोगकर्ता पोस्ट के माध्यम से जाएं और इवेंट क्लास को $event->trigger()
जैसे ट्रिगर करें, यह बहुत धीमा होगा, खासकर कई बैज के लिए। तो हम इसके बजाय एक अनुकूलित क्वेरी बनाते हैं।
क्या उपयोगकर्ता पुरस्कार हो जाता है? सभी घटना
Badge
वर्ग award
समारोह user_id
पर कार्य करता है के आधार पर देने अन्य उपयोगकर्ताओं के बारे में - वे हमेशा पुरस्कार दिया जाएगा। डिफ़ॉल्ट रूप से बैज उस व्यक्ति को दिया जाता है जिसने घटना होने के कारण सत्र सत्र आईडी (यह default_event
फ़ंक्शन के लिए सच है, हालांकि सीआरओएन नौकरी स्पष्ट रूप से सभी उपयोगकर्ताओं और पुरस्कारों के माध्यम से अलग हो जाती है)
तो चलिए लेते हैं एक उदाहरण, एक कोडिंग चुनौती वेबसाइट उपयोगकर्ताओं पर उनकी कोडिंग प्रविष्टि जमा करते हैं। व्यवस्थापक तब प्रविष्टियों का न्याय करता है और पूरा होने पर, परिणाम देखने के लिए चुनौती पृष्ठ पर परिणाम पोस्ट करता है। जब ऐसा होता है, तो POSTED_RESULTS ईवेंट कहा जाता है।
यदि आप पोस्ट की गई सभी प्रविष्टियों के लिए उपयोगकर्ताओं के लिए बैज पुरस्कार देना चाहते हैं, तो कहें, अगर उन्हें शीर्ष 5 में स्थान दिया गया है, तो आपको क्रॉन जॉब का उपयोग करना चाहिए (हालांकि यह ध्यान में रखना चाहिए कि यह सभी उपयोगकर्ताओं के लिए अपडेट नहीं होगा, न सिर्फ उस चुनौती के लिए परिणाम पोस्ट किए गए थे)
यदि आप क्रॉन नौकरी के साथ अद्यतन करने के लिए एक और विशिष्ट क्षेत्र को लक्षित करना चाहते हैं, तो देखते हैं कि क्रॉन जॉब ऑब्जेक्ट में फ़िल्टरिंग पैरामीटर जोड़ने का कोई तरीका है या cron_job प्राप्त करें उनका उपयोग करने के लिए समारोह। उदाहरण के लिए:
class Badge_Top5 extends Badge
{
const _BADGE_NAME = 'top5';
function try_award($position)
{
if ($position <= 5)
{
$this->award(self::_BADGE_NAME);
}
}
}
class Badge_Top5_Cron extends Badge_Top5
{
function cron_job($challenge_id = 0)
{
$where = '';
if ($challenge_id)
{
$escaped_challenge_id = mysql_real_escape_string($challenge_id);
$where = "WHERE challenge_id = '$escaped_challenge_id'";
}
$r = mysql_query("SELECT position, user_id
FROM challenge_entries
$where");
while ($obj = mysql_fetch_object($r))
{
$this->user_id = $obj->user_id; //award the correct user!
$this->try_award($obj->position);
}
}
पैरामीटर की आपूर्ति नहीं होने पर भी क्रॉन फ़ंक्शन काम करेगा।
संबंधित (शायद नकल): http://stackoverflow.com/questions/1744747/achievements-badges-system – Gordon
यह संबंधित है, लेकिन नकल नहीं। कृपया दूसरा पैराग्राफ पढ़ें। "समस्या मैं बैज के बारे में बात करते हैं की बहुत सारी के साथ है/इस वेबसाइट पर उपलब्धि सिस्टम सिर्फ इतना है कि है - यह सब बात है और कोई कोड कहाँ वास्तविक कोड अंतर्गत प्रयोग उदाहरण है।?" –
अच्छी तरह से, कामकाजी कोड लिखना केवल कुछ हद तक व्यवहार्य है। मैं कहूंगा कि लोगों के लिए केवल सिद्धांत ही आपको सामान्य करना होगा, एक बार जब कोई कार्यान्वयन बहुत जटिल होगा। – Gordon