Estaba creando un intercambio con un servicio XML de socios, y no pude obtener el XML correcto, pero como con todo lo relacionado con Drupal, el registro de errores y acciones de xmlrpc es menos que robusto.
Así que hice esto en incluye / 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;
}
Obtuve los datos que necesitaba y en 10 minutos la interfaz del socio respondió adecuadamente a mi solicitud porque (sorprendentemente lo sé) los registros son buenos.
Me gusta el registro adicional y quiero mantenerlo. ¿Cuál es la forma limpia, directa y, lo más importante, aprobada por Drupal de hacer eso?
variable_set()
o un mecanismo similar que se puede exportar si es necesario. :]Respuestas:
Hackear el núcleo está fuertemente desaconsejado para los no iniciados porque reduce efectivamente la comunidad de soporte de miles a una comunidad de soporte de uno (o lo que sea el tamaño de su equipo). Sin esta mejor práctica, ayudar a los nuevos en Drupal sería casi imposible. También dificulta la modularidad y, en algunos casos, la seguridad.
Dicho esto, el hackear el núcleo no siempre es tan malo como nos gusta hacer que parezca. Sin modificar el núcleo, no tendríamos distribuciones como Pressflow y similares que aumenten el núcleo de maneras interesantes. Es de vital importancia que sepa exactamente lo que está haciendo, que esté distribuyendo sus parches con su distribución (preferiblemente de una manera que le permita aplicarlos nuevamente automáticamente después de la actualización), y que esté manteniendo documentación detallada de lo que has cambiado y por qué lo has cambiado.
Dependiendo de cómo tenga estructuradas las cosas, ciertamente puede hacer el cambio anterior
xmlrpc_request()
, crear un parche y luego usar algo como Drush Make para automatizar su aplicación (tenga en cuenta que Drush Make se está moviendo al proyecto Drush en sí para la versión 5.x) ), al tiempo que proporciona documentación adicional en el archivo MAKE y en otros lugares sobre lo que hace el cambio y por qué es necesario / deseado.Otro patrón común para mejorar las funciones principales es crear un contenedor que agregue un poco de funcionalidad a una función central y llamar al contenedor en lugar de la implementación del núcleo. Cuando es posible, esto hace que las cosas sean mucho más modulares. Considera lo siguiente:
Nuevamente, dependiendo de lo que esté haciendo, esto puede ser factible o no, pero cuando lo hace, se ha ahorrado algunos dolores de cabeza al tratar de asegurarse de que el núcleo permanezca parcheado y documentado. Aunque en este caso, una función única como esta parece ser un candidato perfecto para tal envoltura. Si su implementación se captura en un módulo, incluso podría expandirse para controlar el nivel de registro de toda su solución, deshabilitando esta funcionalidad en los sitios de producción:
En resumen, desea maximizar lo que puede hacer con los módulos (y puede hacer mucho), pero existen razones legítimas para alterar el núcleo. Debe hacerse con cuidado, eso es todo.
fuente
Si necesita modificar los módulos principales o contrib debería hacerlo.
fuente