Làm cách nào để tránh chỉnh sửa lõi Drupal?


21

Tôi đã xây dựng một cuộc trao đổi với một dịch vụ XML của đối tác và tôi không thể hiểu đúng về XML, nhưng như với tất cả mọi thứ Drupal, lỗi xmlrpc và ghi nhật ký hành động ít mạnh mẽ hơn.

Vì vậy, tôi đã làm điều này trong bao gồm / 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;
}

Tôi đã nhận được dữ liệu tôi cần và trong 10 phút đã có giao diện đối tác phản hồi phù hợp với yêu cầu của tôi vì (tôi sốc) biết nhật ký là tốt.

Tôi thích đăng nhập thêm, và tôi muốn giữ nó. Cách sạch sẽ, đơn giản và quan trọng nhất, được Drupal chấp thuận là gì?


2
Tôi không thấy lý do tại sao điều này đã bị hạ thấp. Có, lõi chỉnh sửa không được khuyến khích nhưng @OhkaBaka thừa nhận đây là yêu cầu đề xuất về cách quản lý này và cung cấp một ví dụ thực tế. Cùng với nhu cầu gỡ lỗi, có những lý do chính đáng để chỉnh sửa lõi. Có một số lỗi trong các bản vá lỗi làm việc trong hàng đợi vấn đề sẽ không được áp dụng và có một số điều không thực sự có cách giải quyết.
mpdon Arena

1
Các câu trả lời dưới đây là tuyệt vời. Tuy nhiên, một điều tôi sẽ thêm là bạn không cần phải đăng nhập mọi lúc trên trang web trực tiếp của bạn. Vô hiệu hóa mô-đun tùy chỉnh của bạn khi bạn không sử dụng nó, hoặc chỉ áp dụng bản vá hoặc mô-đun của bạn cho trang web dev của bạn. Giảm thiểu các thay đổi và ghi chép cẩn thận sẽ giúp bạn tỉnh táo.
greg_1_anderson

@ greg_1_anderson - Bạn sẽ thấy rằng giải pháp của tôi bên dưới đã giải quyết vấn đề này thông qua việc sử dụng biến log_level (mặc dù sử dụng hằng số rõ ràng sẽ sạch hơn, tôi đã bỏ qua chúng để nhấn mạnh vào mẫu). Bằng cách này, bạn có thể sử dụng cùng một phương thức trình bao bọc trên dev / live và phần còn lại của mã của bạn có thể phụ thuộc vào nó mà không thay đổi các lệnh gọi hàm xung quanh. Tất cả những gì bạn cần là đặt mức ghi nhật ký của mô-đun bằng cách sử dụng variable_set()hoặc một cơ chế tương tự có thể được xuất nếu cần. :]
David Watson

1
@David: Vâng, đó là tuyệt vời. Tôi muốn giữ cho các mô-đun dev bị vô hiệu hóa trực tiếp và bật chúng trong một móc nối đồng bộ hóa sau sql, trên mỗi drupalcode.org/project/drush.git/blob/HEAD:/examples/. Kỹ thuật của bạn cũng đạt điểm cao nhất, mặc dù tôi nghĩ rằng tôi cũng sẽ thực hiện biến_set trong một hook hook sau đồng bộ hóa hơn là một tính năng. Chỉ áp dụng một bản vá trên hệ thống dev, như tôi đã nói ở trên, có lẽ là một ý tưởng tồi trừ khi bạn chắc chắn hệ thống đó thực sự là một hệ thống đầu; nếu không thì trận đấu có thể vô tình được cam kết và đẩy. Ôi.
greg_1_anderson

@ greg_1_anderson - Tôi thực sự có ý định xem xét liệu những cái móc như vậy có tồn tại hay không và đã nhận ra rằng đã có ví dụ tại chỗ; cảm ơn nhiều vì đã liên kết! Bây giờ biết rằng điều này là có thể, tôi đồng ý rằng việc đặt nó ở cấp độ môi trường chắc chắn là cách tốt nhất, vì những lý do bạn đề xuất và để giúp giữ cấu hình trang web chung tách rời khỏi cấu hình dành riêng cho môi trường.
David Watson

Câu trả lời:


11

Hacking cốt lõi được khuyến khích mạnh mẽ cho những người không quen biết vì nó có hiệu quả làm giảm cộng đồng hỗ trợ của hàng ngàn người xuống cộng đồng hỗ trợ của một người (hoặc bất kể quy mô nhóm của bạn là gì). Nếu không có cách làm tốt nhất này, việc giúp đỡ những người mới sử dụng Drupal sẽ không thể thực hiện được. Nó cũng cản trở tính mô-đun và, trong một số trường hợp, bảo mật.

Điều này đã được nói, hack lõi không phải lúc nào cũng xấu xa như chúng ta muốn làm cho nó ra. Nếu không sửa đổi lõi, chúng tôi sẽ không có các bản phân phối như Pressflow và lõi tăng cường đó theo những cách thú vị. Điều cực kỳ quan trọng là bạn phải biết chính xác những gì bạn đang làm, rằng bạn đang phân phối các bản vá của mình với bản phân phối của bạn (tốt nhất là theo cách cho phép bạn áp dụng lại chúng một cách tự động sau nâng cấp) và bạn đang giữ tài liệu chi tiết về những gì bạn đã thay đổi và tại sao bạn thay đổi nó.

Tùy thuộc vào cách bạn sắp xếp mọi thứ, bạn chắc chắn có thể thực hiện thay đổi ở trên xmlrpc_request(), tạo một bản vá và sau đó sử dụng một cái gì đó như Drush Make để tự động áp dụng nó (lưu ý rằng Drush Make đang chuyển sang dự án Drush cho bản phát hành 5.x ), trong khi cung cấp tài liệu bổ sung trong tệp thực hiện và các nơi khác về những thay đổi đó và lý do cần thiết / mong muốn.

Một mô hình phổ biến khác để tăng cường các chức năng cốt lõi là tạo một trình bao bọc thêm một chút chức năng nhỏ vào chức năng cốt lõi và gọi trình bao bọc thay cho việc triển khai lõi. Khi khả thi, điều này làm cho mọi thứ trở nên mô-đun hơn nhiều. Hãy xem xét những điều sau đây:

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

Một lần nữa, tùy thuộc vào những gì bạn đang làm điều này có thể hoặc không khả thi, nhưng khi bạn đã tự cứu mình một vài vấn đề đau đầu trong việc cố gắng đảm bảo rằng lõi vẫn được vá và ghi lại. Mặc dù trong trường hợp này, một chức năng một lần như thế này có vẻ như là một ứng cử viên hoàn hảo cho một trình bao bọc như vậy. Nếu việc triển khai của bạn được ghi lại trong một mô-đun, bạn thậm chí có thể mở rộng trên nó để kiểm soát mức độ nhật ký của toàn bộ giải pháp của bạn, vô hiệu hóa chức năng này trên các trang web sản xuất:

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

Nói tóm lại, bạn muốn tối đa hóa những gì bạn có thể làm với các mô-đun (và bạn có thể làm rất nhiều), nhưng có những lý do chính đáng để thay đổi cốt lõi. Nó nên được thực hiện với sự cẩn thận, đó là tất cả.


9

Nếu bạn cần thay đổi các mô-đun lõi hoặc đóng góp, bạn nên.

  1. Tạo một bản vá với những thay đổi.
  2. Sử dụng một hệ thống triển khai như drush make sẽ tự động áp dụng lại các bản vá khi bạn cập nhật lõi hoặc mô-đun.
  3. Tài liệu tài liệu tài liệu.

1
Tôi thực sự không mong đợi một sự xác nhận thay đổi lõi bằng bất kỳ sự tưởng tượng nào ... vì vậy bây giờ tôi buộc phải chuyển sang một câu hỏi phụ: Điều này có cách nào tốt hơn là làm điều tương tự trong một mô-đun độc lập không?
OhkaBaka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.