ฉันจะหลีกเลี่ยงการแก้ไข 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 นาทีก็มีส่วนต่อประสานกับคู่ค้าที่ตอบสนองต่อคำขอของฉันอย่างเหมาะสมเพราะบันทึก (ที่น่าตกใจฉันรู้) บันทึกนั้นดี

ฉันชอบการบันทึกพิเศษและฉันต้องการเก็บไว้ อะไรคือวิธีที่สะอาดตรงไปตรงมาและที่สำคัญที่สุดคือ Drupal ที่ได้รับการรับรองในการทำสิ่งนั้น?


2
ฉันไม่เห็นว่าทำไมสิ่งนี้จึงถูกลดระดับลง ใช่การแก้ไขแกนไม่ได้รับการสนับสนุน แต่ @OhkaBaka ยอมรับว่านี่คือการขอคำแนะนำเกี่ยวกับวิธีการจัดการและให้ตัวอย่างจริง นอกเหนือจากความต้องการในการแก้ไขปัญหาแล้วยังมีเหตุผลที่ถูกต้องสำหรับการแก้ไขแกน มีข้อบกพร่องบางอย่างใน core w / แพทช์การทำงานในคิวปัญหาที่เพิ่งจะไม่ได้ใช้และมีบางสิ่งที่ไม่มีการแก้ไขปัญหาจริงๆ
mpdonadio

1
คำตอบด้านล่างนั้นยอดเยี่ยม อย่างไรก็ตามสิ่งหนึ่งที่ฉันจะเพิ่มคือคุณไม่จำเป็นต้องเปิดการบันทึกตลอดเวลาบนไซต์สดของคุณ ปิดใช้งานโมดูลที่กำหนดเองของคุณเมื่อคุณไม่ได้ใช้งานหรือใช้โปรแกรมแก้ไขหรือโมดูลของคุณกับไซต์ dev ของคุณเท่านั้น การลดการเปลี่ยนแปลงและการจัดทำเอกสารอย่างระมัดระวังจะทำให้คุณมีสติ
greg_1_anderson

@ greg_1_anderson - คุณจะพบว่าวิธีการแก้ปัญหาของฉันด้านล่างนี้ได้ผ่านการใช้ตัวแปร log_level (แม้ว่าการใช้ค่าคงที่จะชัดเจนกว่านี้ แต่ฉันไม่ได้เน้นที่รูปแบบ) วิธีนี้คุณสามารถใช้วิธี wrapper วิธีเดียวกันกับ dev / live และส่วนที่เหลือของรหัสของคุณสามารถพึ่งพาได้โดยไม่ต้องเปลี่ยนฟังก์ชั่นการโทร สิ่งที่คุณต้องทำก็คือตั้งค่าระดับการบันทึกของโมดูลของคุณโดยใช้variable_set()หรือกลไกที่คล้ายกันซึ่งสามารถส่งออกได้ถ้าจำเป็น :]
David Watson

1
@ David: ใช่แล้วมันยอดเยี่ยมมาก ฉันชอบที่จะให้โมดูล dev ถูกปิดการใช้งานในการถ่ายทอดสดและเปิดใช้งานพวกเขาในโพสต์ sql-sync เบ็ดต่อdrupalcode.org/project/drush.git/blob/HEAD:/examples/ …เทคนิคของคุณก็มีคะแนนสูงสุดเช่นกัน คิดว่าฉันจะทำ variable_set ใน drush hook post-sync มากกว่าคุณสมบัติ การใช้โปรแกรมปะแก้บนระบบ dev เท่านั้นดังที่ฉันได้กล่าวไว้ข้างต้นอาจเป็นความคิดที่ไม่ดีเว้นแต่คุณจะแน่ใจว่าระบบนั้นเป็นระบบเริ่มต้น มิฉะนั้นการแข่งขันนั้นอาจเกิดขึ้นโดยไม่ตั้งใจและถูกผลัก อุ๊ยตาย
greg_1_anderson

@ greg_1_anderson - ฉันตั้งใจจะดูว่ามีตะขอดังกล่าวอยู่จริงหรือไม่และไม่รู้ว่ามีตัวอย่างอยู่แล้ว ขอบคุณมากสำหรับลิงค์! ตอนนี้ฉันรู้แล้วว่าเป็นไปได้ฉันยอมรับว่าการตั้งค่านี้ในระดับสภาพแวดล้อมเป็นวิธีที่แน่นอนทั้งสำหรับเหตุผลที่คุณแนะนำและเพื่อช่วยให้การกำหนดค่าไซต์ทั่วไปแยกออกจากการตั้งค่าเฉพาะสภาพแวดล้อม
David Watson

คำตอบ:


11

การแฮ็คหลักนั้นไม่ได้รับการสนับสนุนอย่างมากสำหรับผู้ที่ไม่ได้ฝึกหัดเพราะจะช่วยลดชุมชนการสนับสนุนนับพันให้เป็นชุมชนการสนับสนุนอย่างมีประสิทธิภาพ (หรือขนาดของทีมของคุณ) หากปราศจากแนวปฏิบัติที่ดีที่สุดนี้การช่วยเหลือคนใหม่ให้ Drupal คงเป็นไปไม่ได้ นอกจากนี้ยังเป็นอุปสรรคต่อการแยกส่วนและในบางกรณีความปลอดภัย

สิ่งนี้ถูกกล่าวว่าการแฮ็คหลักไม่ใช่ความชั่วร้ายอย่างที่เราต้องการทำให้เป็นจริง หากไม่มีการแก้ไขแกนเราจะไม่มีการแจกแจงเช่นPressflowและแกนเสริมนั้นในรูปแบบที่น่าสนใจ เป็นสิ่งสำคัญอย่างยิ่งที่คุณต้องรู้ว่าคุณกำลังทำอะไรอยู่คุณกำลังแจกจ่ายแพตช์ของคุณด้วยการแจกจ่ายของคุณ (โดยเฉพาะอย่างยิ่งในวิธีที่อนุญาตให้คุณใช้พวกเขาอีกครั้งโดยอัตโนมัติภายหลังการอัปเกรด) และเก็บเอกสารรายละเอียด จากสิ่งที่คุณเปลี่ยนไปและทำไมคุณถึงเปลี่ยนมัน

ขึ้นอยู่กับว่าคุณมีโครงสร้างสิ่งต่าง ๆ อย่างไรคุณสามารถทำการเปลี่ยนแปลงข้างต้นxmlrpc_request()สร้างแพทช์แล้วใช้บางสิ่งเช่นDrush Makeเพื่อทำให้การใช้งานเป็นไปโดยอัตโนมัติ (โปรดทราบว่า Drush Make กำลังเคลื่อนเข้าสู่โครงการ Drush สำหรับรุ่น 5.x ) ในขณะที่จัดหาเอกสารเพิ่มเติมใน makefile และที่อื่น ๆ ตามที่การเปลี่ยนแปลงทำและเหตุผลที่จำเป็น / ต้องการ

อีกรูปแบบทั่วไปเพื่อปรับปรุงฟังก์ชั่นหลักคือการสร้าง wrapper ที่เพิ่มฟังก์ชั่นเล็กน้อยให้กับฟังก์ชั่นหลักและเรียกเสื้อคลุมแทนการใช้งานของแกน เมื่อเป็นไปได้สิ่งนี้จะทำให้สิ่งต่าง ๆ เป็นโมดุลมากขึ้น พิจารณาสิ่งต่อไปนี้:

/**
 * 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;
}

อีกครั้งขึ้นอยู่กับสิ่งที่คุณทำเช่นนี้อาจเป็นไปได้หรืออาจเป็นไปไม่ได้ แต่เมื่อคุณได้ช่วยให้คุณปวดหัวเล็กน้อยในการพยายามทำให้แน่ใจว่าแกนนั้นยังคงได้รับการแก้ไขและบันทึกไว้ แม้ว่าในกรณีนี้ฟังก์ชั่นฟังก์ชั่น One-off แบบนี้ดูเหมือนจะเป็นตัวเลือกที่สมบูรณ์แบบสำหรับเสื้อคลุม หากการใช้งานของคุณถูกบันทึกไว้ในโมดูลคุณสามารถขยายเพื่อควบคุมระดับการบันทึกของโซลูชันทั้งหมดของคุณโดยปิดการใช้งานฟังก์ชั่นนี้ในไซต์การผลิต:

/**
 * 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

หากคุณต้องการที่จะปรับเปลี่ยนหลักหรือcontribโมดูลที่คุณควร

  1. สร้างแพทช์ที่มีการเปลี่ยนแปลง
  2. ใช้ระบบการนำไปใช้งานเช่น drush make ที่จะนำ patch มาใช้ใหม่โดยอัตโนมัติเมื่อคุณอัปเดตคอร์หรือโมดูล
  3. เอกสารเอกสารเอกสาร

1
ฉันไม่ได้คาดหวังว่าการตรวจสอบความถูกต้องของการเปลี่ยนแปลงแกนกลางด้วยจินตนาการใด ๆ ... ดังนั้นตอนนี้ฉันถูกบังคับให้ย้ายไปยังคำถามรอง: สิ่งนี้ดีกว่าทำแบบเดียวกันในโมดูลสแตนด์อะโลนหรือไม่?
OhkaBaka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.