Hola @manueldeco y @nataliabici29,
@nataliabici29 tiene razón en que Currency::save() no es lo ideal para esto. Intentar actualizar solo un campo de un ObjectModel con save() puede ser ineficiente o problemático si no se manejan correctamente todas las validaciones y campos. Además, el simplexml_load_file puede ser bloqueado por la configuración de allow_url_fopen en php.ini o por problemas de certificado SSL del servidor.
Una forma más directa y robusta de actualizar solo la tasa de conversión es usar directamente la capa de la base de datos de PrestaShop. Aquí te muestro cómo podrías hacerlo, integrando un manejo de errores más claro para la carga del XML y la actualización en la base de datos:
// Dentro de un método de módulo o override más controlado
public function updateMnbExchangeRatesSafely()
{
$xml_url = 'https://www.mnb.hu/arfolyamok.xml';
$ch = curl_init($xml_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml_content = curl_exec($ch);
curl_close($ch);
if ($xml_content === false) {
// Manejar error de cURL
Esta solución utiliza curl para obtener el XML (más fiable que allow_url_fopen) y Db::getInstance()->update para actualizar directamente la tabla ps_currency solo el campo conversion_rate. Esto es más eficiente y menos propenso a errores que save() para este propósito específico.
Sin embargo, para una tienda en producción, mantener un script personalizado con actualizaciones de divisas puede ser complicado a largo plazo. Las actualizaciones de PrestaShop o de PHP pueden requerir ajustes constantes. Para evitar estas personalizaciones en el núcleo o en módulos auxiliares, que a veces pueden ser sobrescritas o generar conflictos, te recomendaría considerar este módulo dedicado. Está diseñado específicamente para la integración de tipos de cambio del MNB, es más robusto y se encarga de la compatibilidad y mantenimiento.