मैं Drupal core के संपादन से कैसे बचूँ?


21

मैं एक सहयोगी XML सेवा के साथ एक एक्सचेंज का निर्माण कर रहा था, और मुझे XML सही नहीं मिल रहा था, लेकिन जैसा कि सभी चीजों के साथ Drupal, xmlrpc त्रुटि और कार्रवाई लॉगिंग मजबूत से कम है।

इसलिए मैंने इसे शामिल किया / xmlrpc.inc।

function xmlrpc_request($method, $args) {
  $xmlrpc_request = new stdClass();
  $xmlrpc_request->method = $method;
  $xmlrpc_request->args = $args;
  $xmlrpc_request->xml = <<<EOD
<?xml version="1.0"?>
<methodCall>
<methodName>{$xmlrpc_request->method}</methodName>
<params>
EOD;
  foreach ($xmlrpc_request->args as $arg) {
    $xmlrpc_request->xml .= '<param><value>';
    $v = xmlrpc_value($arg);
    $xmlrpc_request->xml .= xmlrpc_value_get_xml($v);
    $xmlrpc_request->xml .= "</value></param>\n";
  }
  $xmlrpc_request->xml .= '</params></methodCall>';

  /* This part here */
  watchdog('xmlrpc',$xmlrpc_request->xml);
  /* End ridiculously tiny hack */

  return $xmlrpc_request;
}

मुझे वह डेटा मिला जिसकी मुझे जरूरत थी और 10 मिनट में पार्टनर इंटरफेस ने मेरे अनुरोध का उचित जवाब दिया क्योंकि (चौंकाने वाला मुझे पता है) लॉग अच्छे हैं।

मुझे अतिरिक्त लॉगिंग पसंद है, और मैं इसे रखना चाहता हूं। ऐसा करने का साफ-सुथरा, सीधा और सबसे महत्वपूर्ण, द्रुपाल-अनुमोदित तरीका क्या है?


2
मैं नहीं देखता कि यह क्यों अस्वीकृत किया गया था। हां, संपादन कोर हतोत्साहित किया जाता है लेकिन @OhBBaka ने स्वीकार किया कि यह इस बारे में सुझाव दे रहा है कि इसे कैसे प्रबंधित किया जाए और वास्तविक दुनिया का उदाहरण दिया जाए। डिबग स्थितियों की आवश्यकता के साथ, संपादन कोर के वैध कारण हैं। इश्यू कतार में कोर w / वर्किंग पैच में कुछ कीड़े हैं जो सिर्फ लागू नहीं होंगे, और कुछ चीजें हैं जो वास्तव में वर्कअराउंड नहीं हैं।
mpdonadio

1
नीचे दिए गए जवाब बहुत अच्छे हैं। हालांकि, मैं एक बात यह जोड़ूंगा कि आपको अपनी लाइव साइट पर हर समय लॉगिंग चालू करने की आवश्यकता नहीं है। अपने कस्टम मॉड्यूल को अक्षम करें जब आप इसका उपयोग नहीं कर रहे हैं, या केवल अपने देव स्थल पर अपना पैच या मॉड्यूल लागू करें। परिवर्तनों को कम करने और ध्यान से दस्तावेजीकरण करने से आप समझदार रहेंगे।
greg_1_anderson

@ greg_1_anderson - आप पाएंगे कि नीचे मेरा समाधान पहले से ही एक log_level चर के उपयोग के माध्यम से इसे संबोधित करता है (हालांकि स्थिरांक का उपयोग स्पष्ट रूप से क्लीनर होगा, मैंने उन्हें पैटर्न पर जोर देने के लिए छोड़ दिया है)। इस तरह आप देव / जियो पर एक ही आवरण विधि का उपयोग कर सकते हैं और आपके बाकी कोड बिना फ़ंक्शन कॉल को बदले उस पर निर्भर कर सकते हैं। आपको केवल अपने मॉड्यूल के लॉगिंग स्तर variable_set()या एक समान तंत्र को सेट करने की आवश्यकता है जिसे यदि आवश्यकता हो तो निर्यात किया जा सकता है। :]
डेविड वॉटसन

1
@ डेविड: हाँ, यह कमाल है। मैं लाइव मॉड्यूल को लाइव पर अक्षम रखना पसंद करता हूं, और उन्हें drupalcode.org/project/drush.git/blob/HEAD:/examples/ प्रति पोस्ट- सीक्वल -सिंक हुक में उन्हें सक्षम करना चाहता हूं। हालांकि, आपकी तकनीक को शीर्ष स्थान भी मिलता है, हालांकि मैं मुझे लगता है कि मैं एक सुविधा के बजाय ड्रुक पोस्ट-सिंक हुक में variable_set भी करूंगा। केवल देव प्रणाली पर एक पैच लागू करना, जैसा कि मैंने ऊपर कहा है, यह संभवतः एक बुरा विचार है जब तक आप सुनिश्चित नहीं करते हैं कि प्रणाली वास्तव में एक खरोंच प्रणाली है; अन्यथा मैच गलती से और धक्का हो सकता है। आउच।
greg_1_anderson 22

@ greg_1_anderson - मुझे वास्तव में इस बात पर ध्यान देना है कि क्या इस तरह के हुक मौजूद हैं, और यह महसूस नहीं किया कि पहले से ही उदाहरण मौजूद थे; लिंक के लिए बहुत धन्यवाद! यह जानते हुए कि यह संभव है, मैं मानता हूं कि पर्यावरण स्तर पर इसे स्थापित करना निश्चित रूप से जाने का तरीका है, दोनों कारणों से जो आप सुझाव देते हैं और पर्यावरण-विशिष्ट कॉन्फ़िगरेशन से उत्पन्न सामान्य साइट कॉन्फ़िगरेशन को बनाए रखने में मदद करने के लिए।
डेविड वॉटसन

जवाबों:


11

हैकिंग कोर को दृढ़ता से बिन बुलाए के लिए हतोत्साहित किया जाता है क्योंकि यह प्रभावी रूप से एक के समर्थन समुदाय (या जो भी आपकी टीम का आकार है) के हजारों को कम करता है। इस सर्वोत्तम अभ्यास के बिना, ड्रुपल में उन नए लोगों की मदद करना असंभव होगा। यह प्रतिरूपकता और कुछ मामलों में, सुरक्षा में भी बाधा डालता है।

यह कहा गया है, हैकिंग कोर हमेशा उतनी बुराई नहीं है जितना हम इसे बाहर करना पसंद करते हैं। कोर को संशोधित किए बिना, हमारे पास प्रेसफ्लो जैसे वितरण नहीं होंगे और दिलचस्प तरीकों में यह वृद्धि कोर की तरह होगा। यह केवल महत्वपूर्ण रूप से महत्वपूर्ण है कि आप वास्तव में जानते हैं कि आप क्या कर रहे हैं, कि आप अपने पैच को अपने वितरण के साथ वितरित कर रहे हैं (अधिमानतः एक तरह से जो आपको उन्हें फिर से अपग्रेड करने के लिए फिर से लागू करने की अनुमति देता है), और यह कि आप विस्तृत दस्तावेज रख रहे हैं आपने क्या बदला है और आपने इसे क्यों बदला है।

इस बात पर निर्भर करते हुए कि आपने किस तरह से चीजों को संरचित किया है, आप निश्चित रूप से उपरोक्त बदलाव कर सकते हैं xmlrpc_request(), एक पैच बना सकते हैं, और फिर ड्रश मेक का उपयोग कर सकते हैं इसे लागू करने के लिए स्वचालित करें (ध्यान दें कि ड्रश मेक 5.x रिलीज के लिए ड्रश प्रोजेक्ट में ही चल रहा है। ), मेकफाइल और अन्य जगहों पर अतिरिक्त दस्तावेज की आपूर्ति करते समय, जैसा कि परिवर्तन करता है और यह आवश्यक / वांछित क्यों है।

कोर फ़ंक्शंस को बढ़ाने के लिए एक और सामान्य पैटर्न एक रैपर बनाना है जो एक कोर फ़ंक्शन में थोड़ी कार्यक्षमता जोड़ता है, और कोर के कार्यान्वयन के बदले में रैपर को कॉल करता है। जब संभव है, यह चीजों को बहुत अधिक मॉड्यूलर बनाता है। निम्नलिखित को धयान मे रखते हुए:

/**
 * Wrapper function for xmlrpc_request() to provide logging.
 */
function mymodule_xmlrpc_request($method, $args) {
  $xrr = xmlrpc_request($method, $args);
  watchdog('xmlrpc', $xrr->xml);
  return $xrr;
}

फिर, इस बात पर निर्भर करता है कि आप यह क्या कर रहे हैं या संभव नहीं हो सकता है, लेकिन जब आपने अपने आप को कुछ सिरदर्द से बचाया है, तो यह सुनिश्चित करने की कोशिश में कि कोर पैच और डॉक्यूमेंटेड है। हालांकि इस मामले में, इस तरह के एक बंद समारोह ऐसे आवरण के लिए एक आदर्श उम्मीदवार की तरह लगता है। यदि आपका कार्यान्वयन किसी मॉड्यूल में कैप्चर किया गया है, तो आप अपने संपूर्ण समाधान के लॉग स्तर को नियंत्रित करने के लिए उस पर भी विस्तार कर सकते हैं, उत्पादन के लिए इस कार्यक्षमता को अक्षम करना:

/**
 * Wrapper function for xmlrpc_request() to provide logging (if enabled).
 */
function mymodule_xmlrpc_request($method, $args) {
  $xrr = xmlrpc_request($method, $args);
  if (variable_get('mymodule_log_level', 0) > 0) {
    watchdog('xmlrpc', $xrr->xml);
  }
}

संक्षेप में, आप मॉड्यूल के साथ जो कर सकते हैं उसे अधिकतम करना चाहते हैं (और आप बहुत कुछ कर सकते हैं), लेकिन कोर को बदलने के लिए वैध कारण हैं। यह ध्यान से किया जाना चाहिए, बस।


9

यदि आपको कोर या कंट्राब मॉड्यूल को बदलना चाहिए।

  1. बदलाव के साथ एक पैच बनाएँ।
  2. जब आप कोर या मॉड्यूल को अपडेट करते हैं, तो स्वचालित रूप से पैच को फिर से लागू करने की तरह एक तैनाती प्रणाली का उपयोग करें।
  3. दस्तावेज़ दस्तावेज़।

1
मैं वास्तव में कल्पना के किसी भी खंड द्वारा कोर को बदलने की मान्यता की उम्मीद नहीं कर रहा था ... इसलिए मैं अब एक माध्यमिक प्रश्न पर जाने के लिए मजबूर हूं: क्या यह किसी भी तरह अकेले खड़े मॉड्यूल में एक ही काम करने से बेहतर है?
ओहकाबाका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.