Como evito editar o núcleo do Drupal?

21

Eu estava construindo uma troca com um serviço XML de parceiros e não consegui acertar o XML, mas como em todas as coisas do Drupal, o log de erros e ações xmlrpc é menos do que robusto.

Então eu fiz isso no includes / 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;
}

Obtive os dados necessários e em 10 minutos a interface do parceiro respondeu adequadamente à minha solicitação porque (chocante eu sei) os logs são bons.

Gosto do registro extra e quero mantê-lo. Qual é a maneira limpa, direta e mais importante, aprovada pelo Drupal de fazer isso?

OhkaBaka
fonte
2
Não vejo por que isso foi rebaixado. Sim, o núcleo de edição não é alterado, mas o @OhkaBaka reconheceu que está pedindo sugestões sobre como gerenciar isso e forneceu um exemplo do mundo real. Juntamente com a necessidade de depurar situações, existem razões legítimas para editar o núcleo. Existem alguns bugs no núcleo com patches de trabalho na fila de problemas que simplesmente não serão aplicados e existem algumas coisas que realmente não têm soluções alternativas.
mpdonadio
1
As respostas abaixo são ótimas. Uma coisa que acrescentarei, no entanto, é que você não precisa que o log esteja ativado o tempo todo no site ativo. Desative seu módulo personalizado quando você não o estiver usando ou aplique seu patch ou módulo apenas ao seu site de desenvolvimento. Minimizar as alterações e documentar cuidadosamente o manterá saudável.
greg_1_anderson
@ greg_1_anderson - Você verá que minha solução abaixo já lida com isso através do uso de uma variável log_level (embora o uso de constantes fosse obviamente mais limpo, eu os omiti para enfatizar o padrão). Dessa forma, você pode usar o mesmo método wrapper no dev / live e o restante do seu código pode depender dele sem alterar as chamadas de função. Tudo o que você precisa é definir o nível de log do seu módulo usando variable_set()um mecanismo semelhante que possa ser exportado, se necessário. :]
David Watson
1
@ David: Sim, isso é incrível. Eu gosto de manter os módulos dev desativados no live e habilitá-los em um gancho pós-sql-sync, por drupalcode.org/project/drush.git/blob/HEAD:/examples/… Sua técnica também obtém as melhores notas, embora eu acho que eu também faria o variable_set em um gancho pós-sincronização drush em vez de um recurso. A aplicação de um patch apenas no sistema dev, como eu disse acima, provavelmente é uma má idéia, a menos que você tenha certeza de que o sistema é realmente um sistema inicial; caso contrário, a partida poderá ser confirmada e enviada acidentalmente. Ai.
greg_1_anderson
@ greg_1_anderson - Na verdade, eu pretendo investigar se esses ganchos existem e não percebi que já havia exemplos; Muito obrigado pelo link! Sabendo agora que isso é possível, concordo que definir isso no nível do ambiente é definitivamente o caminho a seguir, pelos motivos sugeridos e para ajudar a manter a configuração genérica do site dissociada da configuração específica do ambiente.
22812 David Watson

Respostas:

11

O núcleo de hackers é fortemente desencorajado para os não iniciados, pois reduz efetivamente a comunidade de suporte de milhares a uma comunidade de suporte de um (ou qualquer que seja o tamanho da sua equipe). Sem essa prática recomendada, ajudar os novatos no Drupal seria quase impossível. Isso também dificulta a modularidade e, em alguns casos, a segurança.

Dito isto, o núcleo de hackers nem sempre é tão ruim quanto gostamos de fazer parecer. Sem modificar o núcleo, não teríamos distribuições como Pressflow e similares que aumentam o núcleo de maneiras interessantes. É extremamente importante que você saiba exatamente o que está fazendo, que esteja distribuindo seus patches com sua distribuição (de preferência de uma maneira que permita aplicá-los novamente automaticamente após a atualização) e que esteja mantendo a documentação detalhada do que você mudou e por que você mudou.

Dependendo de como você tem as coisas estruturadas, você certamente pode fazer as alterações acima xmlrpc_request(), criar um patch e usar algo como o Drush Make para automatizar a aplicação (observe que o Drush Make está se movendo para o próprio projeto Drush na versão 5.x ), enquanto fornece documentação adicional no makefile e em outros lugares sobre o que a alteração faz e por que é necessária / desejada.

Outro padrão comum para aprimorar as funções principais é criar um invólucro que adicione um pouco de funcionalidade a uma função principal e chamar o invólucro no lugar da implementação do núcleo. Quando possível, isso torna as coisas muito mais modulares. Considere o seguinte:

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

Novamente, dependendo do que você está fazendo, isso pode ou não ser viável, mas quando você se salvou de algumas dores de cabeça ao tentar garantir que o núcleo permaneça corrigido e documentado. Embora, neste caso, uma função pontual como essa pareça um candidato perfeito para um invólucro desse tipo. Se sua implementação for capturada em um módulo, você poderá expandi-lo para controlar o nível de log de toda a sua solução, desativando essa funcionalidade nos sites de produção:

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

Em resumo, você deseja maximizar o que pode fazer com os módulos (e pode fazer muito), mas existem razões legítimas para alterar o núcleo. Isso deve ser feito com cuidado, só isso.

David Watson
fonte
9

Se você precisar alterar os módulos principais ou de contribuição, deverá.

  1. Crie um patch com alterações.
  2. Use um sistema de implantação como o drush make que reaplique automaticamente os patches quando você atualizar o núcleo ou os módulos.
  3. Documento Documento Documento.
googletorp
fonte
1
Eu realmente não esperava uma validação de alteração de núcleo por nenhum trecho da imaginação ... então agora sou forçado a passar para uma pergunta secundária: isso é de alguma maneira melhor do que fazer a mesma coisa em um módulo independente?
OhkaBaka