Fórum OpenCart Brasil

Por um e-commerce livre, confiável e profissional

#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:
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
$adictionalValue = $this->calcDistanceAndPrice($address);
Logo mais abaixo você encontra a linha: if ($status) {
Adicione o seguinte código logo abaixo dessa linha:
Código: Selecionar todos
$shipping = $this->config->get('shipping_distance_cost') + $adictionalValue;
Agora, no array $quote_data['distance'] você modifica o 'cost':
Código: Selecionar todos
'cost'         => $shipping,
e o começo de 'text' fica assim:
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+
#89439
Olá amigo! Poderia me dar uma "mão" sobre essa dica? segui os passos indicados mas caso eu não tenha percebido algum erro, não consegui fazer funcionar. A extensão aparece no admin mas não aparece no finalizar compra. Também não tenho certeza que fiz certo os 3 passos finais, segui a minha lógica.
fico grato, desde já

Gente preciso de ajuda urgente. Na migraç&a[…]

Caro @reds , muito obrigado pela resposta.

PHP 8+ incompatibilidade

Toda tradução para a versão 3[…]

Ola @alex3257 Se você precisa apenas ver […]