Tudo o que quer saber antes de instalar.
Uma análise detalhada de como o DataFirefly Fix Dropzone CORS: Correção do Tainted Canvas em Multiloja no PrestaShop 8 funciona, porque o construímos assim e o raciocínio por trás das funcionalidades acima.
O erro, em claro
Está em PrestaShop 8 em multiloja, com vários domínios diferentes, por exemplo loja-pt.com para Portugal e loja-es.com para Espanha, cada um com o seu certificado HTTPS. Abre o back-office a partir de loja-pt.com e clica num produto associado à loja espanhola. As imagens desse produto são servidas a partir de loja-es.com, porque é o domínio canónico dessa loja. Para o navegador, isso é um recurso cross-origin e, como as imagens nativas do PrestaShop não enviam os cabeçalhos CORS certos (Access-Control-Allow-Origin), o canvas que gera a pré-visualização do Dropzone fica «tainted». Na chamada seguinte a ctx.getImageData, o navegador lança um SecurityError, o editor Dropzone parte e o formulário de produto fica inutilizável na zona de imagens. Erro na consola: main.bundle.js:274 Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data. at main.bundle.js:274:137430 at L (main.bundle.js:274:137535) at main.bundle.js:274:123939 at o (main.bundle.js:274:123147) at l.onload (main.bundle.js:274:123297)
Porque é que este erro é real e importante
Muitas lojas com vários domínios convivem há muito com este erro, evitando editar entre domínios (ligando-se sempre ao domínio «certo» de cada produto). Mas, numa equipa a sério, com o catálogo gerido por uma única pessoa e várias lojas internacionais, isso é insustentável. O PrestaShop tem uma correção oficial no Dropzone.vue em certas versões do novo editor Symfony, mas o erro persiste no editor antigo AdminProducts e nem sempre é retroportado para as versões estáveis. Este módulo resolve o problema nos dois editores ao mesmo tempo.
Como funciona a correção, tecnicamente
Ao carregar uma página de produto do back-office, o módulo injeta um ficheiro JS de 70 linhas no cabeçalho, pelo hook displayBackOfficeHeader. O script espera que window.Dropzone esteja definido e substitui depois Dropzone.prototype.displayExistingFile por uma versão intercetada. Essa versão examina o URL recebido: se for cross-origin, analisa-o com new URL(url), força u.protocol e u.host aos de window.location.origin, recompõe o URL e passa-o ao método original. Resultado no navegador: o Dropzone recebe um URL da mesma origem, o canvas mantém-se limpo, o getImageData funciona e a imagem existente aparece normalmente na zona de arrastar e largar. O patch é idempotente (um sinalizador __dfCorsPatched impede a dupla aplicação) e à prova de falhas (URL inválidos voltam ao comportamento original).
Porquê não um patch ao core ou um override
Um override do PrestaShop no controlador de produto seria frágil: partiria a cada atualização importante, e o código do Dropzone não está no controlador PHP. Uma alteração direta ao ficheiro JS do Dropzone seria substituída a cada atualização. O monkey patch do lado do cliente é totalmente não invasivo: nenhum ficheiro do PrestaShop é alterado, nenhum override é colocado e o patch aplica-se em tempo de execução, a partir de fora. Se o PrestaShop atualizar o Dropzone ou a sua integração, o patch continua a funcionar enquanto a assinatura de displayExistingFile não mudar (o que é extremamente estável desde o Dropzone 5.x). Se o método mudar ou se o PrestaShop corrigir de origem, pode desinstalar o módulo sem qualquer vestígio.
Casos de utilização
Loja multipaís com um domínio por mercado (loja-pt.com, loja-es.com, loja-fr.com) gerida por uma equipa centralizada: o erro bloqueia a edição de produtos entre domínios e o módulo resolve de imediato. Marketplace ou rede de marcas em multiloja com vários domínios: mesma configuração, mesma solução. Agência que gere várias lojas de clientes em domínios distintos: o módulo torna o back-office utilizável sem andar a saltar de domínio em domínio. Migração de loja única para vários domínios: instalado preventivamente, evita a má surpresa depois da migração.
Ainda não existem avaliações.