- 21 Mar 2018, 18:56
#77562
Passos práticos para calcular frete com base na distância, para OpenCart 3.
Primeiro precisamos do número da residência para calcular a distância corretamente, pois uma rua ou avenida pode se extender por vários quilômetros. No formulário de cadastro do OpenCart não há esse campo, então vamos adicioná-lo.
No menu de navegação do painel administrativo clique em Clientes > Personalizar Cadastro.
Clique no (+) para adicionar um campo e preencha o formulário da seguinte maneira:
NOME DO CAMPO: Nº
LOCALIZAÇÃO DO CAMPO: Endereço do cliente
TIPO DE CAMPO: Texto em uma linha
VALOR PADRÃO: 0
VALIDAÇÃO REGEX: /[A-Za-z0-9_.]/
EXIBIR PARA: marque todos
OBRIGATÓRIO PARA: marque todos
SITUAÇÃO: Habilitado
POSIÇÃO: 2
---------------------------------------------------------
Pronto, agora salve. Agora vamos para os arquivos.
Acesse as pastas abaixo e faça o que está descrito:
1 - admin/controller/extension/shipping/
copie o arquivo flat.php
renomeie a cópia para distance.php
abra o arquivo distance.php em um editor de código (Notepad++, Brackets, etc.) e mude o nome da classe de ControllerExtensionShippingFlat para ControllerExtensionShippingDistance (observe que apenas o final mudou, de Flat para Distance, assim como o nome do arquivo).
Para facilitar, localize todas as palavras "flat" e substituia por "distance". Use o comando Ctrl + H e substitua tudo. Salve e feche o arquivo.
2 - admin/language/pt-br/extension/shipping/
copie o arquivo flat.php
renomeie a cópia para distance.php
abra o arquivo distance.php e faça a troca das variáveis. "Frete fixo" muda para "Frete por Distância" e assim por diante, exceto o "entry_cost", pois nesse exemplo eu trabalho com um valor fixo + um valor por quilômetro. Salve e feche o arquivo.
3 - admin/view/template/extension/shipping/
copie o arquivo flat.twig
renomeie a cópia para distance.twig
abra no editor, pressione Ctrl + H e substitua todos as palavras "flat" por "distance".
Salve e feche o arquivo
-------------------------------------------
Finalizamos a primeira parte.
No menu do painel administrativo clique em Extensões > Extensões.
Em "Selecione o tipo de extensão" selecione Fretes.
Instale a nova extensão chamada "Frete por distância" clicando no (+) e logo após clique no lápis azul para editar.
Como eu havia dito anteriormente, meu frete é calculado com um valor fixo + um valor por quilômetro. Caso você queira trabalhar apenas com o valor por km defina o valor fixo como zero. eu preenchi da seguinte maneira:
VALOR FIXO: 7.75 (Observação: use ponto ao invés de vírgula, é padrão inglês)
GRUPO DE IMPOSTOS: --- Vazio ---
REGIÃO GEOGRÁFICA: Todas as regiões
SITUAÇÃO: Habilitado
POSIÇÃO: 1
-------------------------------------------------
Salve.
Acabamos a parte administrativa, vamos para a parte que aparecerá para o cliente.
Antes, uma observação: no carrinho de compras, por padrão, tem uma opção chamada "Calcular Frete", ela não funciona com esse frete personalizado e eu não me preocupei em retirá-la. Caso você queira manter essa opção é importante que você tenha bons conhecimentos de programação e da estrutura do OpenCart para conseguir fazer funcionar.
Acesse as pastas abaixo e faça o que está descrito:
1 - catalog/model/extension/shipping/
copie o arquivo flat.php e renomeie a cópia para distance.php
Mude o nome da classe para de ModelExtensionShippingFlat para ModelExtensionShippingDistance
Antes da função getQuote() adicione o código a seguir:
O código está comentado. O servidor deve estar com a diretiva PHP allow_url_fopen = 1
Caso não esteja, você vai saber, vai dar um erro na parte do frete, no carrinho de compras:
simplexml_load_file(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0
Adicione o código a seguir logo abaixo de function getQuote($address) { :
Adicione o seguinte código logo abaixo dessa linha:
OBS.: Em Cost mudei o valor para $shipping, e em Text mudei apenas a primeira variável após o parênteses.
Pronto. Agora você pode testar o código finalizando uma compra no seu carrinho.
Qualquer erro estarei aqui pra esclarecer.
T+
Primeiro precisamos do número da residência para calcular a distância corretamente, pois uma rua ou avenida pode se extender por vários quilômetros. No formulário de cadastro do OpenCart não há esse campo, então vamos adicioná-lo.
No menu de navegação do painel administrativo clique em Clientes > Personalizar Cadastro.
Clique no (+) para adicionar um campo e preencha o formulário da seguinte maneira:
NOME DO CAMPO: Nº
LOCALIZAÇÃO DO CAMPO: Endereço do cliente
TIPO DE CAMPO: Texto em uma linha
VALOR PADRÃO: 0
VALIDAÇÃO REGEX: /[A-Za-z0-9_.]/
EXIBIR PARA: marque todos
OBRIGATÓRIO PARA: marque todos
SITUAÇÃO: Habilitado
POSIÇÃO: 2
---------------------------------------------------------
Pronto, agora salve. Agora vamos para os arquivos.
Acesse as pastas abaixo e faça o que está descrito:
1 - admin/controller/extension/shipping/
copie o arquivo flat.php
renomeie a cópia para distance.php
abra o arquivo distance.php em um editor de código (Notepad++, Brackets, etc.) e mude o nome da classe de ControllerExtensionShippingFlat para ControllerExtensionShippingDistance (observe que apenas o final mudou, de Flat para Distance, assim como o nome do arquivo).
Para facilitar, localize todas as palavras "flat" e substituia por "distance". Use o comando Ctrl + H e substitua tudo. Salve e feche o arquivo.
2 - admin/language/pt-br/extension/shipping/
copie o arquivo flat.php
renomeie a cópia para distance.php
abra o arquivo distance.php e faça a troca das variáveis. "Frete fixo" muda para "Frete por Distância" e assim por diante, exceto o "entry_cost", pois nesse exemplo eu trabalho com um valor fixo + um valor por quilômetro. Salve e feche o arquivo.
3 - admin/view/template/extension/shipping/
copie o arquivo flat.twig
renomeie a cópia para distance.twig
abra no editor, pressione Ctrl + H e substitua todos as palavras "flat" por "distance".
Salve e feche o arquivo
-------------------------------------------
Finalizamos a primeira parte.
No menu do painel administrativo clique em Extensões > Extensões.
Em "Selecione o tipo de extensão" selecione Fretes.
Instale a nova extensão chamada "Frete por distância" clicando no (+) e logo após clique no lápis azul para editar.
Como eu havia dito anteriormente, meu frete é calculado com um valor fixo + um valor por quilômetro. Caso você queira trabalhar apenas com o valor por km defina o valor fixo como zero. eu preenchi da seguinte maneira:
VALOR FIXO: 7.75 (Observação: use ponto ao invés de vírgula, é padrão inglês)
GRUPO DE IMPOSTOS: --- Vazio ---
REGIÃO GEOGRÁFICA: Todas as regiões
SITUAÇÃO: Habilitado
POSIÇÃO: 1
-------------------------------------------------
Salve.
Acabamos a parte administrativa, vamos para a parte que aparecerá para o cliente.
Antes, uma observação: no carrinho de compras, por padrão, tem uma opção chamada "Calcular Frete", ela não funciona com esse frete personalizado e eu não me preocupei em retirá-la. Caso você queira manter essa opção é importante que você tenha bons conhecimentos de programação e da estrutura do OpenCart para conseguir fazer funcionar.
Acesse as pastas abaixo e faça o que está descrito:
1 - catalog/model/extension/shipping/
copie o arquivo flat.php e renomeie a cópia para distance.php
Mude o nome da classe para de ModelExtensionShippingFlat para ModelExtensionShippingDistance
Antes da função getQuote() adicione o código a seguir:
Código: Selecionar todos
function calcDistanceAndPrice($address){
//obtém o endereço completo do cliente cadastrado na sua loja
//clientes cadastrados antes da implementação dessa função devem atualizar o cadastro, incluindo o número da residência (o nosso custom field, lembra?)
//ATENÇÃO! Eu já criei 3 campos personalizados, o nº é o terceiro, por isso o campo abaixo
//recebe $address['custom_field'][3], se for o seu primeiro, coloque $address['custom_field'][1]
$fullAddress = $address['address_1'] . ', ' . $address['custom_field'][1] . ', ' . $address['city'] . ', ' . $address['zone'] . ' - ' . $address['zone_code'];
$fullAddress = urlencode($fullAddress);
//AQUI VOCÊ COLOCA O ENDEREÇO DE ORIGEM, NORMALMENTE É O ENDEREÇO DA SUA LOJA FÍSICA
$origin = 'Av%20Maria%20A%20G,%20Bela%20Vista,%20Itaborai,%20RJ'; //endereço completo
//VOCÊ PRECISA OBTER UMA CHAVE DA API DISTANCE MATRIX, DO GOOGLE, PARA QUE ISSO FUNCIONE!
//removi minha chave do final da linha abaixo
$resultado = simplexml_load_file('https://maps.googleapis.com/maps/api/distancematrix/xml?origins=' . $origin . '&destinations=' . $fullAddress . '&key=AIzaSyDOOmL-xva2i-*******');
if($resultado->status == 'OK'){
$distance = floatval((string)$resultado->row->element->distance->value) / 1000; //distância em quilômetros
//PREÇO ADICIONAL DO FRETE (valor por km)
//ESSE VALOR SERÁ SOMADO AO VALOR FIXO
$cost = 1.25; //nesse caso, cobro R$ 1,25 por quilômetro + o valor fixo
return $distance * $cost;
}else{
//Aqui tratamos os possiveis erros que podem acontecer, provenientes do Google Maps.
//não irei tratar deles aqui, ok? Caso queira fazer isso utilize o tópico informado no final desse tutorial
return 0;
}
}
O código está comentado. O servidor deve estar com a diretiva PHP allow_url_fopen = 1
Caso não esteja, você vai saber, vai dar um erro na parte do frete, no carrinho de compras:
simplexml_load_file(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0
Adicione o código a seguir logo abaixo de function getQuote($address) { :
Código: Selecionar todos
Logo mais abaixo você encontra a linha: if ($status) {$adictionalValue = $this->calcDistanceAndPrice($address);
Adicione o seguinte código logo abaixo dessa linha:
Código: Selecionar todos
Agora, no array $quote_data['distance'] você modifica o 'cost':$shipping = $this->config->get('shipping_distance_cost') + $adictionalValue;
Código: Selecionar todos
e o começo de 'text' fica assim:'cost' => $shipping,
Código: Selecionar todos
$this->currency->format($this->tax->calculate($shipping
OBS.: Em Cost mudei o valor para $shipping, e em Text mudei apenas a primeira variável após o parênteses.
Pronto. Agora você pode testar o código finalizando uma compra no seu carrinho.
Qualquer erro estarei aqui pra esclarecer.
T+