Как мне избежать редактирования ядра Drupal?

21

Я строил обмен с партнерской службой XML, и я не мог правильно понять XML, но, как и во всем Drupal, регистрация ошибок и действий xmlrpc менее надежна.

Так что я сделал это в include / 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 способ сделать это?

OhkaBaka
источник
2
Я не понимаю, почему это было понижено. Да, редактировать ядро ​​не рекомендуется, но @OhkaBaka признал, что он спрашивает предложения о том, как справиться с этим, и предоставил реальный пример. Наряду с необходимостью отладки ситуаций существуют законные причины для редактирования ядра. Есть несколько ошибок в основных и рабочих исправлениях в очереди проблем, которые просто не будут применены, и есть несколько вещей, которые действительно не имеют обходных путей.
mpdonadio
1
Ответы ниже отличные. Однако я добавлю, что вам не нужно постоянно включать ведение журнала на вашем живом сайте. Отключите свой пользовательский модуль, когда вы его не используете, или примените ваш патч или модуль только к вашему сайту разработчика. Сведение к минимуму изменений и тщательное документирование сохранят вам разум.
greg_1_anderson
@ greg_1_anderson - вы обнаружите, что мое решение, приведенное ниже, уже решает эту проблему с помощью переменной log_level (хотя использование констант, очевидно, было бы чище, я опускал их, чтобы сделать акцент на шаблон). Таким образом, вы можете использовать тот же метод-обертку в dev / live, а остальная часть вашего кода может зависеть от него, не меняя при этом вызовы функций. Все, что вам нужно, это установить уровень регистрации вашего модуля с помощью variable_set()или аналогичного механизма, который можно экспортировать, если это необходимо. :]
Дэвид Уотсон
1
@ Дэвид: Да, это круто. Мне нравится держать модули dev отключенными в прямом эфире и включать их в ловушке post-sql-sync, согласно drupalcode.org/project/drush.git/blob/HEAD:/examples/… Ваша техника также получает высшие оценки, хотя я думаю, что я бы также сделал переменную_набор в крючке после синхронизации, а не в функции. Применение патча только к системе разработки, как я уже говорил выше, вероятно, является плохой идеей, если вы не уверены, что система действительно является "чистой" системой; в противном случае матч может быть случайно зафиксирован и сдвинут. Уч.
greg_1_anderson
@ greg_1_anderson - я действительно хотел выяснить, существуют ли такие хуки, и не знал, что уже есть примеры; большое спасибо за ссылку! Теперь, зная, что это возможно, я согласен с тем, что установка этого уровня на уровне среды определенно является подходящим решением, как по предложенным вами причинам, так и для того, чтобы общая конфигурация сайта была отделена от конфигурации конкретной среды.
Дэвид Уотсон,

Ответы:

11

Хакерское ядро ​​настоятельно не рекомендуется для непосвященных, потому что оно эффективно сокращает сообщество поддержки тысяч человек до сообщества поддержки одного (или любого размера вашей команды). Без этой лучшей практики помощь новичкам в Drupal была бы почти невозможна. Это также препятствует модульности и, в некоторых случаях, безопасности.

Как уже было сказано, хакерское ядро ​​не всегда так зло, как нам хотелось бы, чтобы это было. Без модификации ядра у нас не было бы таких дистрибутивов, как Pressflow и т. П., Которые расширяют ядро ​​интересными способами. Просто жизненно важно, чтобы вы точно знали, что делаете, что вы распространяете свои патчи вместе с вашим дистрибутивом (желательно таким образом, чтобы вы могли применить их снова автоматически после обновления), и чтобы вы хранили подробную документацию о том, что вы изменили и почему вы изменили это.

В зависимости от того, как у вас все структурировано, вы, безусловно, можете внести указанные выше изменения xmlrpc_request(), создать патч, а затем использовать что-то вроде Drush Make для автоматизации его применения (обратите внимание, что Drush Make перемещается в сам проект Drush для выпуска 5.x. ), предоставляя дополнительную документацию в make-файле и в других местах о том, что делает изменение и почему оно необходимо / желательно.

Другим распространенным шаблоном для улучшения основных функций является создание оболочки, которая добавляет к ядру небольшую функциональность, и вызывает реализацию оболочки вместо реализации ядра. Когда это возможно, это делает вещи намного более модульными. Учтите следующее:

/**
 * 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. Используйте систему развертывания, такую ​​как drush make, которая будет автоматически повторно применять патчи при обновлении ядра или модулей.
  3. Документ документ документ.
googletorp
источник
1
Я искренне не ожидал подтверждения изменения ядра каким-либо растяжением воображения ... поэтому я вынужден перейти к второстепенному вопросу: лучше ли это, чем делать то же самое в автономном модуле?
OhkaBaka