कोई Drupal 7 नियंत्रण प्रवाह का एक वास्तु अवलोकन प्रदान कर सकता है? शायद एक फ़्लोचार्ट के अर्थ में कि कोई पृष्ठ कैसे उत्पन्न होता है। ड्रुपल कैसे काम करता है, इस संबंध में आप किन अतिरिक्त संसाधनों से सलाह लेंगे?
कोई Drupal 7 नियंत्रण प्रवाह का एक वास्तु अवलोकन प्रदान कर सकता है? शायद एक फ़्लोचार्ट के अर्थ में कि कोई पृष्ठ कैसे उत्पन्न होता है। ड्रुपल कैसे काम करता है, इस संबंध में आप किन अतिरिक्त संसाधनों से सलाह लेंगे?
जवाबों:
ड्रुपल इस मोर्चे पर भ्रामक हो सकता है, आंशिक रूप से क्योंकि इसमें अपेक्षाकृत गहरा कार्य ढेर है। यद्यपि यह प्रक्रियात्मक PHP है, यह पूरी तरह से घटना / श्रोता है जो इसकी वास्तुकला में संचालित है, और आपको देखने के लिए मुख्य PHP स्क्रिप्ट में कोई सरल "प्रवाह" नहीं है। मैंने हाल ही में इस विषय पर एक प्रस्तुति दी है , और स्लाइड स्लाइडशेयर पर पोस्ट की गई हैं, लेकिन एक त्वरित उच्च-स्तरीय सारांश उपयोगी हो सकता है।
उस पूरी प्रक्रिया के दौरान, ड्रुपल और थर्ड-पार्टी प्लगइन मॉड्यूल घटनाओं को बंद कर रहे हैं, और उन्हें जवाब देने के लिए सुन रहे हैं। Drupal इसे 'हुक' प्रणाली कहता है, और यह फ़ंक्शन नामकरण सम्मेलनों का उपयोग करके कार्यान्वित किया जाता है। उदाहरण के लिए, 'ब्लॉग' मॉड्यूल, ब्लॉग_युज़र () नामक फ़ंक्शन को लागू करके संबंधित 'उपयोगकर्ता' को रोक सकता है। Drupal parlance में , इसे hook_user () कहा जाता है ।
यह थोड़ा क्लिंक है, लेकिन एक PHP क्वर्की (यह सभी लोड किए गए कार्यों का एक आंतरिक हैशटेबल है) के कारण, यह ड्रुपल को केवल इंस्टॉल किए गए प्लगइन्स की सूची पर पुनरावृति करके श्रोताओं के लिए जल्दी से जांचने की अनुमति देता है। प्रत्येक प्लगइन के लिए यह उचित रूप से नामित पैटर्न पर function_exists () कॉल कर सकता है, और यदि यह मौजूद है तो फ़ंक्शन को कॉल कर सकता है। ("मैं 'लॉगिन' ईवेंट को फायर कर रहा हूं। क्या 'mymodule_login' फ़ंक्शन मौजूद है? मैं इसे कॉल करूँगा? क्या 'yourmodule_login' मौजूद है? नहीं? 'Nextmodule_login' के बारे में कैसे?" आदि: फिर से, एक स्पर्श क्लंकी लेकिन यह बहुत अच्छा काम करता है।
ड्रुपल में होने वाली हर चीज उन घटनाओं में से एक होने के कारण होती है। MenuAPI केवल इस बारे में जानता है कि अलग-अलग प्लगइन मॉड्यूल द्वारा urls / पाथ क्या संभाला जाता है क्योंकि यह 'मेनू' ईवेंट (हुक_मेनू) को फायर करता है और सभी मेटाडेटा प्लगइन मॉड्यूल के साथ प्रतिक्रिया करता है। ("मैं url 'समाचार / हाल ही में' का ध्यान रखूंगा, और यहाँ फ़ंक्शन को कॉल करने के लिए जब उस पृष्ठ को बनाने की आवश्यकता हो ...") सामग्री केवल इसलिए बच जाती है क्योंकि Drupal का FormAPI पृष्ठ बनाने के लिए ज़िम्मेदार है, और आग मॉड्यूल को जवाब देने के लिए 'एक फॉर्म सबमिट किया गया' इवेंट था। प्रति घंटा रखरखाव होता है क्योंकि हुक_क्रॉन () ट्रिगर होता है, और फ़ंक्शन नाम के रूप में mymodulename_cron () के साथ किसी भी मॉड्यूल को इसका फ़ंक्शन कहा जाएगा।
बाकी सब कुछ अंततः केवल विवरण हैं - महत्वपूर्ण विवरण, लेकिन उस विषय पर विविधताएं। index.php नियंत्रक है, मेनू सिस्टम यह निर्धारित करता है कि "वर्तमान पृष्ठ" क्या है, और उस पृष्ठ के निर्माण की प्रक्रिया में बहुत सारी घटनाओं को निकाल दिया जाता है। प्लगइन मॉड्यूल उन घटनाओं को हुक कर सकते हैं और वर्कफ़्लो को बदल सकते हैं / अतिरिक्त जानकारी / आदि की आपूर्ति कर सकते हैं। यही कारण है कि बहुत सारे Drupal संसाधन मॉड्यूल बनाने पर ध्यान केंद्रित करते हैं। मॉड्यूल के बिना, द्रुपाल वास्तव में कहने के अलावा कुछ भी नहीं करता है, 'किसी ने एक पृष्ठ के लिए कहा! क्या यह मौजूद है? नहीं? ठीक है, मैं 404 की सेवा करूंगा। '
Drupal कैसे काम करता है, यह समझने के लिए, आपको Drupal के पृष्ठ सेवारत तंत्र को समझने की आवश्यकता है।
संक्षेप में, सभी कॉल / urls / अनुरोधों को index.php द्वारा सेवा दी जाती है, जो विभिन्न फ़ाइलों / मॉड्यूलों को शामिल करके Drupal को लोड करता है और फिर अनुरोध / url की सेवा के लिए मॉड्यूल में परिभाषित उपयुक्त फ़ंक्शन को कॉल करता है।
यहाँ प्रो ड्रुपल डेवलपमेंट नामक पुस्तक से एक्सट्रैक्ट निकाला गया है, जो ड्रुपल के बूटस्ट्रैप प्रक्रिया को समझाता है,
बूटस्ट्रैप प्रक्रिया
ड्रुपल बूटस्ट्रैप चरणों की एक श्रृंखला के माध्यम से जाकर हर अनुरोध पर खुद को बूटस्ट्रैप करता है। ये चरण bootstrap.inc में परिभाषित किए गए हैं और निम्न अनुभागों में वर्णित हैं।
प्रारंभिक कॉन्फ़िगरेशन
यह चरण Drupal के आंतरिक कॉन्फ़िगरेशन सरणी को पॉप्युलेट करता है और साइट का आधार URL ($ base_url) स्थापित करता है। Settings.php फ़ाइल को शामिल__ce () के माध्यम से पार्स किया गया है, और वहां स्थापित किसी भी चर या स्ट्रिंग ओवरराइड को लागू किया जाता है। विवरण के लिए फ़ाइल साइटों / सभी / डिफ़ॉल्ट / default.settings.php के "चर ओवरराइड्स" और "स्ट्रिंग ओवरराइड" अनुभाग देखें।
प्रारंभिक पृष्ठ कैश
स्केलेबिलिटी के उच्च स्तर की आवश्यकता वाली स्थितियों में, एक डेटाबेस कनेक्शन यहां तक कि प्रयास करने से पहले एक कैशिंग सिस्टम को लागू करने की आवश्यकता हो सकती है। प्रारंभिक पृष्ठ कैश चरण आपको पृष्ठ_केचे_ फास्टपाथ () नामक एक फ़ंक्शन वाली PHP फ़ाइल को शामिल करने (शामिल करने के साथ) की अनुमति देता है, जो ब्राउज़र पर सामग्री लेता है और देता है। प्रारंभिक पृष्ठ कैश को TRUE में page_cache_fastpath चर सेट करके सक्षम किया जाता है, और शामिल की जाने वाली फ़ाइल को कैश_inc चर को फ़ाइल के पथ पर सेट करके परिभाषित किया जाता है। उदाहरण के लिए कैशिंग पर अध्याय देखें।
डेटाबेस को इनिशियलाइज़ करें
डेटाबेस चरण के दौरान, डेटाबेस का प्रकार निर्धारित किया जाता है, और एक प्रारंभिक कनेक्शन बनाया जाता है जो डेटाबेस प्रश्नों के लिए उपयोग किया जाएगा।
होस्टनाम / आईपी-आधारित अभिगम नियंत्रण
Drupal प्रति-होस्टनाम / IP पते के आधार पर मेजबानों पर प्रतिबंध लगाने की अनुमति देता है। एक्सेस कंट्रोल चरण में, यह देखने के लिए त्वरित जांच की जाती है कि अनुरोध प्रतिबंधित मेजबान से आ रहा है या नहीं; यदि हां, तो प्रवेश निषेध है।
आरंभिक सत्र हैंडलिंग
Drupal PHP के अंतर्निहित सत्र हैंडलिंग का लाभ उठाता है, लेकिन डेटाबेस-समर्थित सत्र हैंडलिंग को कार्यान्वित करने के लिए अपने स्वयं के कुछ हैंडलर को ओवरराइड करता है। सत्र चरण में सत्रों को आरंभ या पुन: स्थापित किया जाता है। वर्तमान उपयोगकर्ता का प्रतिनिधित्व करने वाली वैश्विक $ उपयोगकर्ता वस्तु को भी यहां आरंभीकृत किया गया है, हालांकि दक्षता के लिए सभी गुण उपलब्ध नहीं हैं (उन्हें जरूरत पड़ने पर user_load () फ़ंक्शन के लिए स्पष्ट कॉल द्वारा जोड़ा जाता है)।
लेट पेज कैश
देर से पेज कैश चरण में, Drupal यह निर्धारित करने के लिए पर्याप्त सहायक कोड लोड करता है कि पेज कैश से पेज की सेवा करें या नहीं। इसमें डेटाबेस से सेटिंग्स को उस सरणी में मर्ज करना शामिल है जो आरंभिक कॉन्फ़िगरेशन चरण और लोडिंग या पार्सिंग मॉड्यूल कोड के दौरान बनाया गया था। यदि सत्र इंगित करता है कि अनाम उपयोगकर्ता द्वारा अनुरोध जारी किया गया था और पेज कैशिंग सक्षम है, तो पृष्ठ कैश से वापस आ जाता है और निष्पादन बंद हो जाता है।
भाषा निर्धारण
भाषा निर्धारण चरण में, ड्रुपल के बहुभाषी समर्थन को आरंभीकृत किया जाता है और निर्णय लिया जाता है कि साइट और उपयोगकर्ता सेटिंग्स के आधार पर वर्तमान पृष्ठ की सेवा के लिए किस भाषा का उपयोग किया जाएगा। Drupal भाषा के समर्थन को निर्धारित करने के लिए कई विकल्पों का समर्थन करता है, जैसे कि पथ उपसर्ग और डोमेन-स्तरीय भाषा बातचीत।
पथ
पथ चरण में, कोड जो पथ और पथ अलियासिंग को संभालता है लोड किया गया है। यह चरण मानव-पठनीय URL को हल करने में सक्षम बनाता है और आंतरिक Drupal पथ कैशिंग और लुकअप को संभालता है।
पूर्ण
यह चरण सामान्य कार्यों, थीम समर्थन, और कॉलबैक मैपिंग, फ़ाइल हैंडलिंग, यूनिकोड, PHP छवि टूलकिट्स, प्रपत्र निर्माण और प्रसंस्करण, मेल हैंडलिंग, स्वचालित रूप से सॉर्ट करने योग्य तालिकाओं और परिणाम पेजिंग के लिए लाइब्रेरी लोड करके बूटस्ट्रैप प्रक्रिया को पूरा करता है। Drupal की कस्टम त्रुटि हैंडलर सेट है, और सभी सक्षम मॉड्यूल लोड किए गए हैं। अंत में, Drupal init हुक फायर करता है, ताकि मॉड्यूल को अनुरोध के आधिकारिक प्रसंस्करण शुरू होने से पहले अधिसूचित होने का अवसर मिले।
एक बार ड्रुपल ने बूटस्ट्रैपिंग पूरी कर ली है, फ्रेमवर्क के सभी घटक उपलब्ध हैं। यह ब्राउज़र के अनुरोध को लेने और इसे PHP फ़ंक्शन को सौंपने का समय है जो इसे संभाल लेगा। URL और फ़ंक्शंस के बीच की मैपिंग जो उन्हें संभालती है, कॉलबैक रजिस्ट्री का उपयोग करके पूरा किया जाता है जो URL मैपिंग और एक्सेस कंट्रोल दोनों का ध्यान रखता है। मॉड्यूल मेनू हुक (अधिक विवरण के लिए, अध्याय 4 देखें) का उपयोग करके अपने कॉलबैक को पंजीकृत करते हैं।
जब ड्रुपल ने निर्धारित किया है कि कॉलबैक मौजूद है, जिसके लिए ब्राउज़र का URL सफलतापूर्वक मानचित्र का अनुरोध करता है और उपयोगकर्ता को उस कॉलबैक तक पहुंचने की अनुमति होती है, तो नियंत्रण कॉलबैक फ़ंक्शन को सौंप दिया जाता है।
एक अनुरोध प्रसंस्करण
कॉलबैक फ़ंक्शन अनुरोध को पूरा करने के लिए आवश्यक डेटा को संसाधित करने और संचय करने के लिए जो कुछ भी आवश्यक है, वह करता है। उदाहरण के लिए, यदि http://example.com/ q = नोड / 3 जैसी सामग्री के लिए अनुरोध प्राप्त होता है, तो URL को नोड.mpage_view () नोड नोड्यूल में फ़ंक्शन के लिए मैप किया जाता है। आगे की प्रक्रिया डेटाबेस से उस नोड के लिए डेटा पुनर्प्राप्त करेगी और इसे डेटा संरचना में डाल देगी। फिर, यह थीमिंग का समय है।
डेटा को आकार देना
आलिंगन में HTML, (XML या अन्य आउटपुट स्वरूप) में पुनर्प्राप्त, हेरफेर किए गए या बनाए गए डेटा को बदलना शामिल है। वेब पेज को सही लुक और फील देने के लिए एडमिनिस्ट्रेटर ने जो थीम चुनी है, ड्रुपल उसका इस्तेमाल करेगा। परिणामी आउटपुट तब वेब ब्राउज़र (या अन्य HTTP क्लाइंट) को भेजा जाता है।
ईटन का जवाब एक अच्छा अवलोकन प्रदान करता है। (मैं यहाँ नया हूँ इसलिए मैं उसे मॉडरेट नहीं कर सकता, इस प्रकार टिप्पणी।)
मेरे लिए क्रूर "अहा" क्षण सब कुछ महसूस कर रहा था index.php के माध्यम से होता है, और फिर मॉड्यूल के झरना के माध्यम से (कोर पहले, फिर साइट द्वारा)। कोर कार्यक्षमता का विस्तार करने के लिए इसे फिर से लिखना नहीं है। इसके बजाय मॉड्यूल को / साइटों / सभी / मॉड्यूल / या साइटों / [आपका] / मॉड्यूल में कॉपी करें और THAT का विस्तार करें, या उन स्थानों में एक नया मॉड्यूल बनाएं। विषयों के लिए भी। मॉड्यूल निर्देशिकाओं में tpl, css आदि के रूप में डिस्प्ले कोड भी हो सकते हैं।
यदि आप RVC, Django आदि जैसे MVC प्रकार की रूपरेखाओं का सख्ती करने के लिए उपयोग किया जाता है, तो यह सब थोड़ा भ्रमित हो जाता है। मॉड्यूल बहुत सारे डिस्प्ले कोड में मिक्स कर सकते हैं, और यदि आप किसी और के मॉड्यूल या टेम्प्लेट को देख रहे हैं, तो आप अंततः स्टैक के माध्यम से पीछे की ओर चलते हैं। यह PHP में काम करने की सुंदरता / दर्द है।
विडंबना यह है कि, "बस एक ऐप बनाएं" यह सीखने का सबसे खराब तरीका हो सकता है। Drupal बॉक्स से बाहर बहुत कुछ करता है जो केवल तब तक अस्पष्ट है जब तक आप नियंत्रण प्रवाह का पता नहीं लगा लेते हैं। एक tpl फ़ाइल में कुछ भी नहीं है जो आपको बताता है कि एल () जैसे मज़ेदार नाम वाला एक फ़ंक्शन कहाँ से आता है।
यह इस बात पर निर्भर करता है कि आप कितनी गहरी समझ की तलाश कर रहे हैं; यदि आपके पास php का अच्छा ज्ञान है, तो मैं खुद ही कोड के माध्यम से पढ़ने का सुझाव दूंगा, जो index.php से शुरू होगा, और उसके बाद शामिल होंगे / bootstrap.inc, और फिर उस निर्देशिका में कुछ अन्य स्क्रिप्ट।
कुंजी में फ़ाइलें शामिल हैं:
मॉड्यूल / निर्देशिका में कुछ प्रमुख कार्यक्षमता भी है; विशेष रूप से, मॉड्यूल / नोड / नोड। नोड्यूल नोड सिस्टम का आधार बनाता है, जो सामान्य रूप से साइट सामग्री को एनकैप्सुलेट करने के लिए उपयोग किया जाता है।
कोड, सामान्य रूप से, बहुत अच्छी तरह से टिप्पणी की गई और स्पष्ट है। टिप्पणी के भीतर Doxygen markup के उपयोग का अर्थ है कि कोड प्रभावी रूप से विहित प्रलेखन है।
यह एक संपादक का उपयोग करके ऐसा करने में भी मदद करता है जो किसी फ़ंक्शन की परिभाषा पर जल्दी से कूद सकता है। सीटीजी के साथ संयोजन में विम का उपयोग करना मेरे लिए काम करता है; आपको ctags को index .inc, .module, आदि फाइलों को php फाइलों के रूप में बताना होगा।
इस विषय पर सर्वश्रेष्ठ पुस्तकें "प्रो ड्रुपल डेवलपमेंट" और "ड्रुपल का उपयोग करना" हैं।
"प्रो ड्रुपल डेवलपमेंट" में ड्रुपल के प्रत्येक एपीआई (रूप, थीम इत्यादि) के कई अच्छे प्रवाह और संपूर्ण सारांश शामिल हैं। यह विशेष रूप से अपने स्वयं के मॉड्यूल और थीम बनाने वाले लोगों के लिए शिक्षाप्रद होने का इरादा है, लेकिन औसत PHP-प्रेमी डेवलपर के लिए बहुत सारे मूल्य हैं जो ड्रुपल को समझना चाहते हैं। इसके अलावा, मैंने अपने द्वारा बनाई गई प्रत्येक साइट के लिए एक कस्टम मॉड्यूल बनाया है, बस विभिन्न रूपों पर चुनिंदा रूप से छिपी फ़ील्ड जैसी चीजों पर अतिरिक्त नियंत्रण हासिल करने के लिए (जो आप आमतौर पर अंत के लिए नोड रूपों को सरल बनाने के लिए करना चाहते हैं- उपयोगकर्ताओं), इसलिए आपकी टोपी के नीचे यह ज्ञान होना अच्छा है।
"ड्रुपल का उपयोग करना" उस साइट डेवलपर के उद्देश्य से है, जो यह जानना चाहता है कि गैलरियों, ब्लॉग्स और सोशल नेटवर्किंग साइट्स जैसे अच्छे सामान का निर्माण कैसे किया जाए। यह कई उपयोग-मामलों से गुजरता है और दिखाता है कि प्रत्येक काम करने के लिए मौजूदा मॉड्यूल को कैसे कॉन्फ़िगर किया जाए। इस प्रक्रिया में यह आपको आवश्यक ऐड-ऑन मॉड्यूल "कंटेंट कंस्ट्रक्शन किट" (CCK) और "व्यूज," कस्टम ब्लॉक और टेम्प्लेट बनाने के तरीके, और एक Drupal साइट को बनाए रखने के इनस-आउट के साथ परिचित करता है। मैं इस पुस्तक को विशेष रूप से उन लोगों के लिए सुझाता हूं जो गति के लिए उठना चाहते हैं और वास्तव में तुरंत यूएसई ड्रुपल का उपयोग करते हैं। इस प्रक्रिया में आपको Drupal के आंतरिक संगठन की समझ प्राप्त होती है।
यहां नया योगदानकर्ता, वार्तालाप पर 2 साल की देरी ;-)
Https://stackoverflow.com/a/1070325/1154755 पर जवाब देना
कोर कार्यक्षमता का विस्तार करने के लिए इसे फिर से लिखना नहीं है। इसके बजाय मॉड्यूल को / साइटों / सभी / मॉड्यूल / या साइटों / [आपका] / मॉड्यूल में कॉपी करें और THAT का विस्तार करें, या उन स्थानों में एक नया मॉड्यूल बनाएं। विषयों के लिए भी।
दरअसल, मुझे इसे अपडेट करने के लिए कभी भी कोर मॉड्यूल कॉपी नहीं करना पड़ा। ड्रुपल हुक आप सभी की जरूरत होनी चाहिए।
विषयों के लिए, हाँ, कभी-कभी यह जाने का एकमात्र तरीका होता है, लेकिन अक्सर, आप अपनी ज़रूरत के अनुसार परिणाम प्राप्त करने के लिए एक सबहेम का निर्माण कर सकते हैं।